diff --git a/dlls/msvcrt/ctype.c b/dlls/msvcrt/ctype.c index 9e2d029950e..7322ea47c28 100644 --- a/dlls/msvcrt/ctype.c +++ b/dlls/msvcrt/ctype.c @@ -425,8 +425,7 @@ int CDECL MSVCRT__toupper(int c) int CDECL MSVCRT__tolower_l(int c, MSVCRT__locale_t locale) { MSVCRT_pthreadlocinfo locinfo; - unsigned char str[2], *p = str; - WCHAR wide, lower; + unsigned char str[2], *p = str, ret[2]; if(!locale) locinfo = get_locinfo(); @@ -444,22 +443,15 @@ int CDECL MSVCRT__tolower_l(int c, MSVCRT__locale_t locale) } *p++ = c & 255; - if(!MultiByteToWideChar(locinfo->lc_codepage, - MB_ERR_INVALID_CHARS, (char*)str, p-str, &wide, 1)) - return c; - - lower = tolowerW(wide); - if(lower == wide) - return str[0] + (str[1]<<8); - - switch(WideCharToMultiByte(locinfo->lc_codepage, 0, - &lower, 1, (char*)str, 2, NULL, NULL)) { + switch(__crtLCMapStringA(locinfo->lc_handle[MSVCRT_LC_CTYPE], LCMAP_LOWERCASE, + (char*)str, p-str, (char*)ret, 2, locinfo->lc_codepage, 0)) + { case 0: return c; case 1: - return str[0]; + return ret[0]; default: - return str[0] + (str[1]<<8); + return ret[0] + (ret[1]<<8); } } diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index ef1154ce76b..cc4541cceef 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -1130,6 +1130,7 @@ void __cdecl MSVCRT__free_locale(MSVCRT__locale_t); void free_locinfo(MSVCRT_pthreadlocinfo) DECLSPEC_HIDDEN; void free_mbcinfo(MSVCRT_pthreadmbcinfo) DECLSPEC_HIDDEN; int _setmbcp_l(int, LCID, MSVCRT_pthreadmbcinfo) DECLSPEC_HIDDEN; +int __cdecl __crtLCMapStringA(LCID, DWORD, const char*, int, char*, int, unsigned int, int) DECLSPEC_HIDDEN; #ifndef __WINE_MSVCRT_TEST int __cdecl MSVCRT__write(int,const void*,unsigned int);