msvcrt: Cache locale string to LCID conversion results.
This commit is contained in:
parent
b9557e9227
commit
e9eec98d5c
|
@ -217,10 +217,17 @@ extern int atoi(const char *);
|
||||||
/* Internal: Find the LCID for a locale specification */
|
/* Internal: Find the LCID for a locale specification */
|
||||||
LCID MSVCRT_locale_to_LCID(const char *locale, unsigned short *codepage)
|
LCID MSVCRT_locale_to_LCID(const char *locale, unsigned short *codepage)
|
||||||
{
|
{
|
||||||
|
thread_data_t *data = msvcrt_get_thread_data();
|
||||||
LCID lcid;
|
LCID lcid;
|
||||||
locale_search_t search;
|
locale_search_t search;
|
||||||
const char *cp, *region;
|
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));
|
memset(&search, 0, sizeof(locale_search_t));
|
||||||
|
|
||||||
cp = strchr(locale, '.');
|
cp = strchr(locale, '.');
|
||||||
|
@ -292,6 +299,12 @@ LCID MSVCRT_locale_to_LCID(const char *locale, unsigned short *codepage)
|
||||||
if (codepage)
|
if (codepage)
|
||||||
*codepage = atoi(search.found_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;
|
return lcid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -237,7 +237,12 @@ struct __thread_data {
|
||||||
void *unk6[3];
|
void *unk6[3];
|
||||||
int unk7;
|
int unk7;
|
||||||
EXCEPTION_RECORD *exc_record;
|
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;
|
typedef struct __thread_data thread_data_t;
|
||||||
|
|
Loading…
Reference in New Issue