msvcrt: Cache locale string to LCID conversion results.

This commit is contained in:
Piotr Caban 2015-06-24 15:13:07 +02:00 committed by Alexandre Julliard
parent b9557e9227
commit e9eec98d5c
2 changed files with 19 additions and 1 deletions

View File

@ -217,10 +217,17 @@ extern int atoi(const char *);
/* Internal: Find the LCID for a locale specification */
LCID MSVCRT_locale_to_LCID(const char *locale, unsigned short *codepage)
{
thread_data_t *data = msvcrt_get_thread_data();
LCID lcid;
locale_search_t search;
const char *cp, *region;
if (!strcmp(locale, data->cached_locale)) {
if (codepage)
*codepage = data->cached_cp;
return data->cached_lcid;
}
memset(&search, 0, sizeof(locale_search_t));
cp = strchr(locale, '.');
@ -292,6 +299,12 @@ LCID MSVCRT_locale_to_LCID(const char *locale, unsigned short *codepage)
if (codepage)
*codepage = atoi(search.found_codepage);
if (strlen(locale) < sizeof(data->cached_locale)) {
strcpy(data->cached_locale, locale);
data->cached_lcid = lcid;
data->cached_cp = codepage ? *codepage : atoi(search.found_codepage);
}
return lcid;
}

View File

@ -237,7 +237,12 @@ struct __thread_data {
void *unk6[3];
int unk7;
EXCEPTION_RECORD *exc_record;
void *unk8[100];
void *unk8[7];
LCID cached_lcid;
int unk9[3];
DWORD cached_cp;
char cached_locale[131];
void *unk10[100];
};
typedef struct __thread_data thread_data_t;