Commit e867af3b authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

msvcrt: Optimize tolower function when locale was never changed.

parent ca683382
...@@ -458,7 +458,9 @@ int CDECL MSVCRT__tolower_l(int c, MSVCRT__locale_t locale) ...@@ -458,7 +458,9 @@ int CDECL MSVCRT__tolower_l(int c, MSVCRT__locale_t locale)
*/ */
int CDECL MSVCRT_tolower(int c) int CDECL MSVCRT_tolower(int c)
{ {
return MSVCRT__tolower_l(c, NULL); if(initial_locale)
return c>='A' && c<='Z' ? c-'A'+'a' : c;
return MSVCRT__tolower_l(c, NULL);
} }
/********************************************************************* /*********************************************************************
......
...@@ -48,6 +48,7 @@ int MSVCRT___lc_collate_cp = 0; ...@@ -48,6 +48,7 @@ int MSVCRT___lc_collate_cp = 0;
LCID MSVCRT___lc_handle[MSVCRT_LC_MAX - MSVCRT_LC_MIN + 1] = { 0 }; LCID MSVCRT___lc_handle[MSVCRT_LC_MAX - MSVCRT_LC_MIN + 1] = { 0 };
int MSVCRT___mb_cur_max = 1; int MSVCRT___mb_cur_max = 1;
static unsigned char charmax = CHAR_MAX; static unsigned char charmax = CHAR_MAX;
BOOL initial_locale = TRUE;
#define MSVCRT_LEADBYTE 0x8000 #define MSVCRT_LEADBYTE 0x8000
#define MSVCRT_C1_DEFINED 0x200 #define MSVCRT_C1_DEFINED 0x200
...@@ -1780,6 +1781,9 @@ char* CDECL MSVCRT_setlocale(int category, const char* locale) ...@@ -1780,6 +1781,9 @@ char* CDECL MSVCRT_setlocale(int category, const char* locale)
_lock_locales(); _lock_locales();
if(locale[0] != 'C' || locale[1] != '\0')
initial_locale = FALSE;
if(locinfo->lc_handle[MSVCRT_LC_COLLATE]!=newlocinfo->lc_handle[MSVCRT_LC_COLLATE] if(locinfo->lc_handle[MSVCRT_LC_COLLATE]!=newlocinfo->lc_handle[MSVCRT_LC_COLLATE]
|| locinfo->lc_id[MSVCRT_LC_COLLATE].wCodePage!=newlocinfo->lc_id[MSVCRT_LC_COLLATE].wCodePage) { || locinfo->lc_id[MSVCRT_LC_COLLATE].wCodePage!=newlocinfo->lc_id[MSVCRT_LC_COLLATE].wCodePage) {
locinfo->lc_collate_cp = newlocinfo->lc_collate_cp; locinfo->lc_collate_cp = newlocinfo->lc_collate_cp;
......
...@@ -283,6 +283,7 @@ extern MSVCRT__locale_t MSVCRT_locale DECLSPEC_HIDDEN; ...@@ -283,6 +283,7 @@ extern MSVCRT__locale_t MSVCRT_locale DECLSPEC_HIDDEN;
extern unsigned int MSVCRT___lc_codepage; extern unsigned int MSVCRT___lc_codepage;
extern int MSVCRT___lc_collate_cp; extern int MSVCRT___lc_collate_cp;
extern WORD MSVCRT__ctype [257]; extern WORD MSVCRT__ctype [257];
extern BOOL initial_locale DECLSPEC_HIDDEN;
void msvcrt_set_errno(int) DECLSPEC_HIDDEN; void msvcrt_set_errno(int) DECLSPEC_HIDDEN;
#if _MSVCR_VER >= 80 #if _MSVCR_VER >= 80
......
...@@ -2788,13 +2788,19 @@ static void test_tolower(void) ...@@ -2788,13 +2788,19 @@ static void test_tolower(void)
errno = 0xdeadbeef; errno = 0xdeadbeef;
ret = p_tolower((char)0xF4); ret = p_tolower((char)0xF4);
todo_wine ok(ret == (char)0xF4, "ret = %x\n", ret); ok(ret == (char)0xF4, "ret = %x\n", ret);
todo_wine ok(errno == 0xdeadbeef, "errno = %d\n", errno); ok(errno == 0xdeadbeef, "errno = %d\n", errno);
errno = 0xdeadbeef; errno = 0xdeadbeef;
ret = p_tolower((char)0xD0); ret = p_tolower((char)0xD0);
todo_wine ok(ret == (char)0xD0, "ret = %x\n", ret); ok(ret == (char)0xD0, "ret = %x\n", ret);
todo_wine ok(errno == 0xdeadbeef, "errno = %d\n", errno); ok(errno == 0xdeadbeef, "errno = %d\n", errno);
setlocale(LC_ALL, "C");
errno = 0xdeadbeef;
ret = p_tolower((char)0xF4);
ok(ret == (char)0xF4, "ret = %x\n", ret);
ok(errno == 0xdeadbeef, "errno = %d\n", errno);
/* test C locale after setting locale */ /* test C locale after setting locale */
if(!setlocale(LC_ALL, "us")) { if(!setlocale(LC_ALL, "us")) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment