Module: wine Branch: master Commit: 1e981e5e9c6cfa3f0943cc6d53e8b44e9ed1c297 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1e981e5e9c6cfa3f0943cc6d53...
Author: Piotr Caban piotr@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