Piotr Caban : msvcrt: Added _toupper_l implementation.

Alexandre Julliard julliard at winehq.org
Thu May 12 13:57:48 CDT 2011


Module: wine
Branch: master
Commit: 1e981e5e9c6cfa3f0943cc6d53e8b44e9ed1c297
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1e981e5e9c6cfa3f0943cc6d53e8b44e9ed1c297

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Thu May 12 11:38:23 2011 +0200

msvcrt: Added _toupper_l implementation.

---

 dlls/msvcrt/ctype.c     |   44 ++++++++++++++++++++++++++++++++++++++++++++
 dlls/msvcrt/msvcrt.spec |    4 ++--
 2 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcrt/ctype.c b/dlls/msvcrt/ctype.c
index 2149591..9de24e8 100644
--- a/dlls/msvcrt/ctype.c
+++ b/dlls/msvcrt/ctype.c
@@ -20,6 +20,7 @@
 
 #include "msvcrt.h"
 #include "winnls.h"
+#include "wine/unicode.h"
 
 /* Some abbreviations to make the following table readable */
 #define _C_ MSVCRT__CONTROL
@@ -328,6 +329,49 @@ int CDECL MSVCRT___iscsymf(int c)
 }
 
 /*********************************************************************
+ *		_toupper_l (MSVCRT.@)
+ */
+int CDECL MSVCRT__toupper_l(int c, MSVCRT__locale_t locale)
+{
+    if(!locale)
+        locale = get_locale();
+
+    if(c < 256)
+        return locale->locinfo->pcumap[c];
+
+    if(locale->locinfo->pctype[(c>>8)&255] & MSVCRT__LEADBYTE)
+    {
+        WCHAR wide, upper;
+        char str[2], *p = str;
+        *p++ = (c>>8) & 255;
+        *p++ = c & 255;
+
+        if(!MultiByteToWideChar(locale->locinfo->lc_codepage,
+                    MB_ERR_INVALID_CHARS, str, 2, &wide, 1))
+            return c;
+
+        upper = toupperW(wide);
+        if(upper == wide)
+            return c;
+
+        WideCharToMultiByte(locale->locinfo->lc_codepage, 0,
+                &upper, 1, str, 2, NULL, NULL);
+
+        return str[0] + (str[1]<<8);
+    }
+
+    return c;
+}
+
+/*********************************************************************
+ *		toupper (MSVCRT.@)
+ */
+int CDECL MSVCRT_toupper(int c)
+{
+    return MSVCRT__toupper_l(c, NULL);
+}
+
+/*********************************************************************
  *		_toupper (MSVCRT.@)
  */
 int CDECL MSVCRT__toupper(int c)
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 15de47a..ebef717 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -979,7 +979,7 @@
 @ cdecl _tolower(long) MSVCRT__tolower
 # stub _tolower_l(long ptr)
 @ cdecl _toupper(long) MSVCRT__toupper
-# stub _toupper_l(long ptr)
+@ cdecl _toupper_l(long ptr) MSVCRT__toupper_l
 @ cdecl _towlower_l(long ptr) MSVCRT__towlower_l
 @ cdecl _towupper_l(long ptr) MSVCRT__towupper_l
 @ extern _tzname MSVCRT__tzname
@@ -1426,7 +1426,7 @@
 @ cdecl tmpnam(ptr) MSVCRT_tmpnam
 # stub tmpnam_s(ptr long)
 @ cdecl tolower(long) ntdll.tolower
-@ cdecl toupper(long) ntdll.toupper
+@ cdecl toupper(long) MSVCRT_toupper
 @ cdecl towlower(long) ntdll.towlower
 @ cdecl towupper(long) ntdll.towupper
 @ cdecl ungetc(long ptr) MSVCRT_ungetc




More information about the wine-cvs mailing list