From 0b35b779151d766f6741bc32d3b6d3c8d81f1cc4 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Thu, 16 Jul 2020 14:46:47 +0200 Subject: [PATCH] msvcrt: Don't use tolowerW in _tolower_l. Signed-off-by: Piotr Caban Signed-off-by: Alexandre Julliard --- dlls/msvcrt/ctype.c | 20 ++++++-------------- dlls/msvcrt/msvcrt.h | 1 + 2 files changed, 7 insertions(+), 14 deletions(-) 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);