msvcrt: Only create locale categories that have changed in setlocale function.
Signed-off-by: Piotr Caban <piotr@codeweavers.com>
This commit is contained in:
parent
f075043273
commit
f9bae3e5a2
@ -856,7 +856,16 @@ static inline BOOL set_lc_locale_name(MSVCRT_pthreadlocinfo locinfo, int cat)
|
||||
}
|
||||
#endif
|
||||
|
||||
static MSVCRT_pthreadlocinfo create_locinfo(int category, const char *locale)
|
||||
static inline BOOL category_needs_update(int cat, int user_cat,
|
||||
MSVCRT_pthreadlocinfo locinfo, LCID lcid, unsigned short cp)
|
||||
{
|
||||
if(!locinfo) return TRUE;
|
||||
if(user_cat!=cat && user_cat!=MSVCRT_LC_ALL) return FALSE;
|
||||
return lcid!=locinfo->lc_handle[cat] || cp!=locinfo->lc_id[cat].wCodePage;
|
||||
}
|
||||
|
||||
static MSVCRT_pthreadlocinfo create_locinfo(int category,
|
||||
const char *locale, MSVCRT_pthreadlocinfo old_locinfo)
|
||||
{
|
||||
static const DWORD time_data[] = {
|
||||
LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2,
|
||||
@ -988,8 +997,13 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, const char *locale)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(lcid[MSVCRT_LC_COLLATE] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_COLLATE)) {
|
||||
if(update_threadlocinfo_category(lcid[MSVCRT_LC_COLLATE], cp[MSVCRT_LC_COLLATE], locinfo, MSVCRT_LC_COLLATE)) {
|
||||
if(!category_needs_update(MSVCRT_LC_COLLATE, category, old_locinfo,
|
||||
lcid[MSVCRT_LC_COLLATE], cp[MSVCRT_LC_COLLATE])) {
|
||||
locinfo->lc_handle[MSVCRT_LC_COLLATE] = old_locinfo->lc_handle[MSVCRT_LC_COLLATE];
|
||||
locinfo->lc_id[MSVCRT_LC_COLLATE].wCodePage = old_locinfo->lc_id[MSVCRT_LC_COLLATE].wCodePage;
|
||||
} else if(lcid[MSVCRT_LC_COLLATE] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_COLLATE)) {
|
||||
if(update_threadlocinfo_category(lcid[MSVCRT_LC_COLLATE],
|
||||
cp[MSVCRT_LC_COLLATE], locinfo, MSVCRT_LC_COLLATE)) {
|
||||
free_locinfo(locinfo);
|
||||
return NULL;
|
||||
}
|
||||
@ -1003,11 +1017,16 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, const char *locale)
|
||||
} else
|
||||
locinfo->lc_category[MSVCRT_LC_COLLATE].locale = MSVCRT__strdup("C");
|
||||
|
||||
if(lcid[MSVCRT_LC_CTYPE] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_CTYPE)) {
|
||||
if(!category_needs_update(MSVCRT_LC_CTYPE, category, old_locinfo,
|
||||
lcid[MSVCRT_LC_CTYPE], cp[MSVCRT_LC_CTYPE])) {
|
||||
locinfo->lc_handle[MSVCRT_LC_CTYPE] = old_locinfo->lc_handle[MSVCRT_LC_CTYPE];
|
||||
locinfo->lc_id[MSVCRT_LC_CTYPE].wCodePage = old_locinfo->lc_id[MSVCRT_LC_CTYPE].wCodePage;
|
||||
} else if(lcid[MSVCRT_LC_CTYPE] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_CTYPE)) {
|
||||
CPINFO cp_info;
|
||||
int j;
|
||||
|
||||
if(update_threadlocinfo_category(lcid[MSVCRT_LC_CTYPE], cp[MSVCRT_LC_CTYPE], locinfo, MSVCRT_LC_CTYPE)) {
|
||||
if(update_threadlocinfo_category(lcid[MSVCRT_LC_CTYPE],
|
||||
cp[MSVCRT_LC_CTYPE], locinfo, MSVCRT_LC_CTYPE)) {
|
||||
free_locinfo(locinfo);
|
||||
return NULL;
|
||||
}
|
||||
@ -1081,8 +1100,13 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, const char *locale)
|
||||
}
|
||||
}
|
||||
|
||||
if(lcid[MSVCRT_LC_MONETARY] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_MONETARY)) {
|
||||
if(update_threadlocinfo_category(lcid[MSVCRT_LC_MONETARY], cp[MSVCRT_LC_MONETARY], locinfo, MSVCRT_LC_MONETARY)) {
|
||||
if(!category_needs_update(MSVCRT_LC_MONETARY, category, old_locinfo,
|
||||
lcid[MSVCRT_LC_MONETARY], cp[MSVCRT_LC_MONETARY])) {
|
||||
locinfo->lc_handle[MSVCRT_LC_MONETARY] = old_locinfo->lc_handle[MSVCRT_LC_MONETARY];
|
||||
locinfo->lc_id[MSVCRT_LC_MONETARY].wCodePage = old_locinfo->lc_id[MSVCRT_LC_MONETARY].wCodePage;
|
||||
} else if(lcid[MSVCRT_LC_MONETARY] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_MONETARY)) {
|
||||
if(update_threadlocinfo_category(lcid[MSVCRT_LC_MONETARY],
|
||||
cp[MSVCRT_LC_MONETARY], locinfo, MSVCRT_LC_MONETARY)) {
|
||||
free_locinfo(locinfo);
|
||||
return NULL;
|
||||
}
|
||||
@ -1349,8 +1373,13 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, const char *locale)
|
||||
locinfo->lc_category[MSVCRT_LC_MONETARY].locale = MSVCRT__strdup("C");
|
||||
}
|
||||
|
||||
if(lcid[MSVCRT_LC_NUMERIC] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_NUMERIC)) {
|
||||
if(update_threadlocinfo_category(lcid[MSVCRT_LC_NUMERIC], cp[MSVCRT_LC_NUMERIC], locinfo, MSVCRT_LC_NUMERIC)) {
|
||||
if(!category_needs_update(MSVCRT_LC_NUMERIC, category, old_locinfo,
|
||||
lcid[MSVCRT_LC_NUMERIC], cp[MSVCRT_LC_NUMERIC])) {
|
||||
locinfo->lc_handle[MSVCRT_LC_NUMERIC] = old_locinfo->lc_handle[MSVCRT_LC_NUMERIC];
|
||||
locinfo->lc_id[MSVCRT_LC_NUMERIC].wCodePage = old_locinfo->lc_id[MSVCRT_LC_NUMERIC].wCodePage;
|
||||
} else if(lcid[MSVCRT_LC_NUMERIC] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_NUMERIC)) {
|
||||
if(update_threadlocinfo_category(lcid[MSVCRT_LC_NUMERIC],
|
||||
cp[MSVCRT_LC_NUMERIC], locinfo, MSVCRT_LC_NUMERIC)) {
|
||||
free_locinfo(locinfo);
|
||||
return NULL;
|
||||
}
|
||||
@ -1455,8 +1484,14 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, const char *locale)
|
||||
locinfo->lc_category[MSVCRT_LC_NUMERIC].locale = MSVCRT__strdup("C");
|
||||
}
|
||||
|
||||
if(!category_needs_update(MSVCRT_LC_TIME, category, old_locinfo,
|
||||
lcid[MSVCRT_LC_TIME], cp[MSVCRT_LC_TIME])) {
|
||||
locinfo->lc_handle[MSVCRT_LC_TIME] = old_locinfo->lc_handle[MSVCRT_LC_TIME];
|
||||
locinfo->lc_id[MSVCRT_LC_TIME].wCodePage = old_locinfo->lc_id[MSVCRT_LC_TIME].wCodePage;
|
||||
} else {
|
||||
if(lcid[MSVCRT_LC_TIME] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_TIME)) {
|
||||
if(update_threadlocinfo_category(lcid[MSVCRT_LC_TIME], cp[MSVCRT_LC_TIME], locinfo, MSVCRT_LC_TIME)) {
|
||||
if(update_threadlocinfo_category(lcid[MSVCRT_LC_TIME],
|
||||
cp[MSVCRT_LC_TIME], locinfo, MSVCRT_LC_TIME)) {
|
||||
free_locinfo(locinfo);
|
||||
return NULL;
|
||||
}
|
||||
@ -1534,6 +1569,7 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, const char *locale)
|
||||
}
|
||||
}
|
||||
locinfo->lc_time_curr->lcid = lcid[MSVCRT_LC_TIME];
|
||||
}
|
||||
|
||||
return locinfo;
|
||||
}
|
||||
@ -1549,7 +1585,7 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale)
|
||||
if(!loc)
|
||||
return NULL;
|
||||
|
||||
loc->locinfo = create_locinfo(category, locale);
|
||||
loc->locinfo = create_locinfo(category, locale, NULL);
|
||||
if(!loc->locinfo) {
|
||||
MSVCRT_free(loc);
|
||||
return NULL;
|
||||
@ -1586,7 +1622,7 @@ char* CDECL MSVCRT_setlocale(int category, const char* locale)
|
||||
return locinfo->lc_category[category].locale;
|
||||
}
|
||||
|
||||
newlocinfo = create_locinfo(category, locale);
|
||||
newlocinfo = create_locinfo(category, locale, locinfo);
|
||||
if(!newlocinfo) {
|
||||
WARN("%d %s failed\n", category, locale);
|
||||
return NULL;
|
||||
@ -1594,12 +1630,13 @@ char* CDECL MSVCRT_setlocale(int category, const char* locale)
|
||||
|
||||
LOCK_LOCALE;
|
||||
|
||||
switch(category) {
|
||||
case MSVCRT_LC_ALL:
|
||||
case 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_collate_cp = newlocinfo->lc_collate_cp;
|
||||
locinfo->lc_handle[MSVCRT_LC_COLLATE] =
|
||||
newlocinfo->lc_handle[MSVCRT_LC_COLLATE];
|
||||
locinfo->lc_id[MSVCRT_LC_COLLATE] =
|
||||
newlocinfo->lc_id[MSVCRT_LC_COLLATE];
|
||||
swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_COLLATE].locale,
|
||||
(void**)&newlocinfo->lc_category[MSVCRT_LC_COLLATE].locale);
|
||||
swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_COLLATE].refcount,
|
||||
@ -1609,13 +1646,14 @@ char* CDECL MSVCRT_setlocale(int category, const char* locale)
|
||||
swap_pointers((void**)&locinfo->lc_name[MSVCRT_LC_COLLATE],
|
||||
(void**)&newlocinfo->lc_name[MSVCRT_LC_COLLATE]);
|
||||
#endif
|
||||
}
|
||||
|
||||
if(category != MSVCRT_LC_ALL)
|
||||
break;
|
||||
/* fall through */
|
||||
case MSVCRT_LC_CTYPE:
|
||||
if(locinfo->lc_handle[MSVCRT_LC_CTYPE]!=newlocinfo->lc_handle[MSVCRT_LC_CTYPE]
|
||||
|| locinfo->lc_id[MSVCRT_LC_CTYPE].wCodePage!=newlocinfo->lc_id[MSVCRT_LC_CTYPE].wCodePage) {
|
||||
locinfo->lc_handle[MSVCRT_LC_CTYPE] =
|
||||
newlocinfo->lc_handle[MSVCRT_LC_CTYPE];
|
||||
locinfo->lc_id[MSVCRT_LC_CTYPE] =
|
||||
newlocinfo->lc_id[MSVCRT_LC_CTYPE];
|
||||
swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_CTYPE].locale,
|
||||
(void**)&newlocinfo->lc_category[MSVCRT_LC_CTYPE].locale);
|
||||
swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_CTYPE].refcount,
|
||||
@ -1636,13 +1674,14 @@ char* CDECL MSVCRT_setlocale(int category, const char* locale)
|
||||
swap_pointers((void**)&locinfo->lc_name[MSVCRT_LC_CTYPE],
|
||||
(void**)&newlocinfo->lc_name[MSVCRT_LC_CTYPE]);
|
||||
#endif
|
||||
}
|
||||
|
||||
if(category != MSVCRT_LC_ALL)
|
||||
break;
|
||||
/* fall through */
|
||||
case MSVCRT_LC_MONETARY:
|
||||
if(locinfo->lc_handle[MSVCRT_LC_MONETARY]!=newlocinfo->lc_handle[MSVCRT_LC_MONETARY]
|
||||
|| locinfo->lc_id[MSVCRT_LC_MONETARY].wCodePage!=newlocinfo->lc_id[MSVCRT_LC_MONETARY].wCodePage) {
|
||||
locinfo->lc_handle[MSVCRT_LC_MONETARY] =
|
||||
newlocinfo->lc_handle[MSVCRT_LC_MONETARY];
|
||||
locinfo->lc_id[MSVCRT_LC_MONETARY] =
|
||||
newlocinfo->lc_id[MSVCRT_LC_MONETARY];
|
||||
swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_MONETARY].locale,
|
||||
(void**)&newlocinfo->lc_category[MSVCRT_LC_MONETARY].locale);
|
||||
swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_MONETARY].refcount,
|
||||
@ -1691,13 +1730,14 @@ char* CDECL MSVCRT_setlocale(int category, const char* locale)
|
||||
swap_pointers((void**)&locinfo->lc_name[MSVCRT_LC_MONETARY],
|
||||
(void**)&newlocinfo->lc_name[MSVCRT_LC_MONETARY]);
|
||||
#endif
|
||||
}
|
||||
|
||||
if(category != MSVCRT_LC_ALL)
|
||||
break;
|
||||
/* fall through */
|
||||
case MSVCRT_LC_NUMERIC:
|
||||
if(locinfo->lc_handle[MSVCRT_LC_NUMERIC]!=newlocinfo->lc_handle[MSVCRT_LC_NUMERIC]
|
||||
|| locinfo->lc_id[MSVCRT_LC_NUMERIC].wCodePage!=newlocinfo->lc_id[MSVCRT_LC_NUMERIC].wCodePage) {
|
||||
locinfo->lc_handle[MSVCRT_LC_NUMERIC] =
|
||||
newlocinfo->lc_handle[MSVCRT_LC_NUMERIC];
|
||||
locinfo->lc_id[MSVCRT_LC_NUMERIC] =
|
||||
newlocinfo->lc_id[MSVCRT_LC_NUMERIC];
|
||||
swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_NUMERIC].locale,
|
||||
(void**)&newlocinfo->lc_category[MSVCRT_LC_NUMERIC].locale);
|
||||
swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_NUMERIC].refcount,
|
||||
@ -1721,13 +1761,14 @@ char* CDECL MSVCRT_setlocale(int category, const char* locale)
|
||||
swap_pointers((void**)&locinfo->lc_name[MSVCRT_LC_NUMERIC],
|
||||
(void**)&newlocinfo->lc_name[MSVCRT_LC_NUMERIC]);
|
||||
#endif
|
||||
}
|
||||
|
||||
if(category != MSVCRT_LC_ALL)
|
||||
break;
|
||||
/* fall through */
|
||||
case MSVCRT_LC_TIME:
|
||||
if(locinfo->lc_handle[MSVCRT_LC_TIME]!=newlocinfo->lc_handle[MSVCRT_LC_TIME]
|
||||
|| locinfo->lc_id[MSVCRT_LC_TIME].wCodePage!=newlocinfo->lc_id[MSVCRT_LC_TIME].wCodePage) {
|
||||
locinfo->lc_handle[MSVCRT_LC_TIME] =
|
||||
newlocinfo->lc_handle[MSVCRT_LC_TIME];
|
||||
locinfo->lc_id[MSVCRT_LC_TIME] =
|
||||
newlocinfo->lc_id[MSVCRT_LC_TIME];
|
||||
swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_TIME].locale,
|
||||
(void**)&newlocinfo->lc_category[MSVCRT_LC_TIME].locale);
|
||||
swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_TIME].refcount,
|
||||
@ -1739,9 +1780,6 @@ char* CDECL MSVCRT_setlocale(int category, const char* locale)
|
||||
swap_pointers((void**)&locinfo->lc_name[MSVCRT_LC_TIME],
|
||||
(void**)&newlocinfo->lc_name[MSVCRT_LC_TIME]);
|
||||
#endif
|
||||
|
||||
if(category != MSVCRT_LC_ALL)
|
||||
break;
|
||||
}
|
||||
|
||||
free_locinfo(newlocinfo);
|
||||
|
Loading…
x
Reference in New Issue
Block a user