diff --git a/dlls/msvcrt/ctype.c b/dlls/msvcrt/ctype.c index 9de24e8311e..94815b8ea18 100644 --- a/dlls/msvcrt/ctype.c +++ b/dlls/msvcrt/ctype.c @@ -379,6 +379,49 @@ int CDECL MSVCRT__toupper(int c) return c - 0x20; /* sic */ } +/********************************************************************* + * _tolower_l (MSVCRT.@) + */ +int CDECL MSVCRT__tolower_l(int c, MSVCRT__locale_t locale) +{ + if(!locale) + locale = get_locale(); + + if(c < 256) + return locale->locinfo->pclmap[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 = tolowerW(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; +} + +/********************************************************************* + * tolower (MSVCRT.@) + */ +int CDECL MSVCRT_tolower(int c) +{ + return MSVCRT__tolower_l(c, NULL); +} + /********************************************************************* * _tolower (MSVCRT.@) */ diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index ebef717b7de..84b0194642b 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -977,7 +977,7 @@ @ cdecl _time64(ptr) MSVCRT__time64 @ extern _timezone MSVCRT___timezone @ cdecl _tolower(long) MSVCRT__tolower -# stub _tolower_l(long ptr) +@ cdecl _tolower_l(long ptr) MSVCRT__tolower_l @ cdecl _toupper(long) MSVCRT__toupper @ cdecl _toupper_l(long ptr) MSVCRT__toupper_l @ cdecl _towlower_l(long ptr) MSVCRT__towlower_l @@ -1425,7 +1425,7 @@ # stub tmpfile_s(ptr) @ cdecl tmpnam(ptr) MSVCRT_tmpnam # stub tmpnam_s(ptr long) -@ cdecl tolower(long) ntdll.tolower +@ cdecl tolower(long) MSVCRT_tolower @ cdecl toupper(long) MSVCRT_toupper @ cdecl towlower(long) ntdll.towlower @ cdecl towupper(long) ntdll.towupper