summaryrefslogtreecommitdiffstats
path: root/private/crt32/convert/towupper.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/convert/towupper.c')
-rw-r--r--private/crt32/convert/towupper.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/private/crt32/convert/towupper.c b/private/crt32/convert/towupper.c
new file mode 100644
index 000000000..177da7e07
--- /dev/null
+++ b/private/crt32/convert/towupper.c
@@ -0,0 +1,94 @@
+/***
+*towupper.c - convert wide character to upper case
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Defines towupper().
+*
+*Revision History:
+* 10-11-91 ETC Created.
+* 12-10-91 ETC Updated nlsapi; added multithread.
+* 04-06-92 KRS Make work without _INTL also.
+* 01-19-93 CFW Changed LCMapString to LCMapStringW.
+* 06-02-93 SRW ignore _INTL if _NTSUBSET_ defined.
+* 06-11-93 CFW Fix error handling bug.
+* 01-14-94 SRW if _NTSUBSET_ defined call Rtl functions
+*
+*******************************************************************************/
+
+#ifdef _NTSUBSET_
+#include <nt.h>
+#include <ntrtl.h>
+#include <nturtl.h>
+#endif
+#include <cruntime.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <locale.h>
+#ifdef _INTL
+#include <setlocal.h>
+#include <os2dll.h>
+#endif
+
+/***
+*wchar_t towupper(c) - convert wide character to upper case
+*
+*Purpose:
+* towupper() returns the uppercase equivalent of its argument
+*
+*Entry:
+* c - wchar_t value of character to be converted
+*
+*Exit:
+* if c is a lower case letter, returns wchar_t value of upper case
+* representation of c. otherwise, it returns c.
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+wchar_t _CALLTYPE1 towupper (
+ wchar_t c
+ )
+{
+#if defined(_INTL) && !defined(_NTSUBSET_)
+ wchar_t widechar;
+
+ if (c == WEOF)
+ return c;
+
+ _mlock (_LC_CTYPE_LOCK);
+
+ if (_lc_handle[LC_CTYPE] == _CLOCALEHANDLE) {
+ if (iswlower(c))
+ c = c - L'a' + L'A';
+ _munlock (_LC_CTYPE_LOCK);
+ return c;
+ }
+
+ /* if checking case of c does not require API call, do it */
+ if (c < 256) {
+ if (!iswlower(c)) {
+ _munlock (_LC_CTYPE_LOCK);
+ return c;
+ }
+ }
+
+ /* convert wide char to uppercase */
+ if (LCMapStringW(_lc_handle[LC_CTYPE], LCMAP_UPPERCASE,
+ (LPCWSTR)&c, 1, (LPWSTR)&widechar, 1) == 0) {
+ _munlock (_LC_CTYPE_LOCK);
+ return c;
+ }
+
+ _munlock (_LC_CTYPE_LOCK);
+ return widechar;
+#else
+#ifdef _NTSUBSET_
+ return RtlUpcaseUnicodeChar( c );
+#else
+ return (iswlower(c) ? (c - (wchar_t)(L'a' - L'A')) : c);
+#endif
+#endif /* _INTL */
+}