Piotr Caban : msvcrt: Simplify category checks in create_locinfo.
Alexandre Julliard
julliard at winehq.org
Wed Nov 18 15:48:02 CST 2020
Module: wine
Branch: master
Commit: 16598c2af6ddf0e32c5c72b9067cd2f40a470591
URL: https://source.winehq.org/git/wine.git/?a=commit;h=16598c2af6ddf0e32c5c72b9067cd2f40a470591
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed Nov 18 17:26:29 2020 +0100
msvcrt: Simplify category checks in create_locinfo.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/msvcrt/locale.c | 48 ++++++++++++++++++++++++++----------------------
1 file changed, 26 insertions(+), 22 deletions(-)
diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c
index a71172bff00..35285a0f240 100644
--- a/dlls/msvcrt/locale.c
+++ b/dlls/msvcrt/locale.c
@@ -1166,11 +1166,10 @@ void CDECL MSVCRT__free_locale(MSVCRT__locale_t locale)
MSVCRT_free(locale);
}
-static inline BOOL category_needs_update(int cat, int user_cat,
+static inline BOOL category_needs_update(int cat,
const MSVCRT_threadlocinfo *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;
}
@@ -1336,6 +1335,18 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
}
}
+ for(i=1; i<6; i++) {
+ if(category!=MSVCRT_LC_ALL && category!=i) {
+ if(old_locinfo) {
+ lcid[i] = old_locinfo->lc_handle[i];
+ cp[i] = old_locinfo->lc_id[i].wCodePage;
+ } else {
+ lcid[i] = 0;
+ cp[i] = 0;
+ }
+ }
+ }
+
locinfo = MSVCRT_malloc(sizeof(MSVCRT_threadlocinfo));
if(!locinfo)
return NULL;
@@ -1350,11 +1361,11 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
return NULL;
}
- if(!category_needs_update(MSVCRT_LC_COLLATE, category, old_locinfo,
+ if(!category_needs_update(MSVCRT_LC_COLLATE, old_locinfo,
lcid[MSVCRT_LC_COLLATE], cp[MSVCRT_LC_COLLATE])) {
copy_threadlocinfo_category(locinfo, old_locinfo, MSVCRT_LC_COLLATE);
locinfo->lc_collate_cp = old_locinfo->lc_collate_cp;
- } else if(lcid[MSVCRT_LC_COLLATE] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_COLLATE)) {
+ } else if(lcid[MSVCRT_LC_COLLATE]) {
if(!update_threadlocinfo_category(lcid[MSVCRT_LC_COLLATE],
cp[MSVCRT_LC_COLLATE], locinfo, MSVCRT_LC_COLLATE)) {
free_locinfo(locinfo);
@@ -1376,7 +1387,7 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
return NULL;
}
- if(!category_needs_update(MSVCRT_LC_CTYPE, category, old_locinfo,
+ if(!category_needs_update(MSVCRT_LC_CTYPE, old_locinfo,
lcid[MSVCRT_LC_CTYPE], cp[MSVCRT_LC_CTYPE])) {
copy_threadlocinfo_category(locinfo, old_locinfo, MSVCRT_LC_CTYPE);
locinfo->lc_codepage = old_locinfo->lc_codepage;
@@ -1389,7 +1400,7 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
locinfo->pcumap = old_locinfo->pcumap;
if(locinfo->ctype1_refcount)
InterlockedIncrement(locinfo->ctype1_refcount);
- } else if(lcid[MSVCRT_LC_CTYPE] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_CTYPE)) {
+ } else if(lcid[MSVCRT_LC_CTYPE]) {
CPINFO cp_info;
int j;
@@ -1463,22 +1474,15 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
}
}
- if(!category_needs_update(MSVCRT_LC_MONETARY, category, old_locinfo,
+ if(!category_needs_update(MSVCRT_LC_MONETARY, old_locinfo,
lcid[MSVCRT_LC_MONETARY], cp[MSVCRT_LC_MONETARY]) &&
- !category_needs_update(MSVCRT_LC_NUMERIC, category, old_locinfo,
+ !category_needs_update(MSVCRT_LC_NUMERIC, old_locinfo,
lcid[MSVCRT_LC_NUMERIC], cp[MSVCRT_LC_NUMERIC])) {
locinfo->lconv = old_locinfo->lconv;
locinfo->lconv_intl_refcount = old_locinfo->lconv_intl_refcount;
if(locinfo->lconv_intl_refcount)
InterlockedIncrement(locinfo->lconv_intl_refcount);
- } else if((lcid[MSVCRT_LC_MONETARY] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_MONETARY)) ||
- (lcid[MSVCRT_LC_NUMERIC] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_NUMERIC))
- || (!category_needs_update(MSVCRT_LC_MONETARY, category, old_locinfo,
- lcid[MSVCRT_LC_MONETARY], cp[MSVCRT_LC_MONETARY])
- && old_locinfo->lc_handle[MSVCRT_LC_MONETARY])
- || (!category_needs_update(MSVCRT_LC_NUMERIC, category, old_locinfo,
- lcid[MSVCRT_LC_NUMERIC], cp[MSVCRT_LC_NUMERIC])
- && old_locinfo->lc_handle[MSVCRT_LC_NUMERIC])) {
+ } else if(lcid[MSVCRT_LC_MONETARY] || lcid[MSVCRT_LC_NUMERIC]) {
locinfo->lconv = MSVCRT_malloc(sizeof(struct MSVCRT_lconv));
locinfo->lconv_intl_refcount = MSVCRT_malloc(sizeof(int));
if(!locinfo->lconv || !locinfo->lconv_intl_refcount) {
@@ -1502,7 +1506,7 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
return NULL;
}
- if(!category_needs_update(MSVCRT_LC_MONETARY, category, old_locinfo,
+ if(!category_needs_update(MSVCRT_LC_MONETARY, old_locinfo,
lcid[MSVCRT_LC_MONETARY], cp[MSVCRT_LC_MONETARY])) {
copy_threadlocinfo_category(locinfo, old_locinfo, MSVCRT_LC_MONETARY);
locinfo->lconv_mon_refcount = old_locinfo->lconv_mon_refcount;
@@ -1533,7 +1537,7 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
locinfo->lconv->_W_negative_sign = old_locinfo->lconv->_W_negative_sign;
#endif
}
- } else if(lcid[MSVCRT_LC_MONETARY] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_MONETARY)) {
+ } else if(lcid[MSVCRT_LC_MONETARY]) {
if(!update_threadlocinfo_category(lcid[MSVCRT_LC_MONETARY],
cp[MSVCRT_LC_MONETARY], locinfo, MSVCRT_LC_MONETARY)) {
free_locinfo(locinfo);
@@ -1777,7 +1781,7 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
return NULL;
}
- if(!category_needs_update(MSVCRT_LC_NUMERIC, category, old_locinfo,
+ if(!category_needs_update(MSVCRT_LC_NUMERIC, old_locinfo,
lcid[MSVCRT_LC_NUMERIC], cp[MSVCRT_LC_NUMERIC])) {
copy_threadlocinfo_category(locinfo, old_locinfo, MSVCRT_LC_NUMERIC);
locinfo->lconv_num_refcount = old_locinfo->lconv_num_refcount;
@@ -1792,7 +1796,7 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
locinfo->lconv->_W_thousands_sep = old_locinfo->lconv->_W_thousands_sep;
#endif
}
- } else if(lcid[MSVCRT_LC_NUMERIC] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_NUMERIC)) {
+ } else if(lcid[MSVCRT_LC_NUMERIC]) {
if(!update_threadlocinfo_category(lcid[MSVCRT_LC_NUMERIC],
cp[MSVCRT_LC_NUMERIC], locinfo, MSVCRT_LC_NUMERIC)) {
free_locinfo(locinfo);
@@ -1884,13 +1888,13 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
return NULL;
}
- if(!category_needs_update(MSVCRT_LC_TIME, category, old_locinfo,
+ if(!category_needs_update(MSVCRT_LC_TIME, old_locinfo,
lcid[MSVCRT_LC_TIME], cp[MSVCRT_LC_TIME])) {
copy_threadlocinfo_category(locinfo, old_locinfo, MSVCRT_LC_TIME);
locinfo->lc_time_curr = old_locinfo->lc_time_curr;
if(locinfo->lc_time_curr != &cloc_time_data)
InterlockedIncrement(&locinfo->lc_time_curr->refcount);
- } else if(lcid[MSVCRT_LC_TIME] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_TIME)) {
+ } else if(lcid[MSVCRT_LC_TIME]) {
if(!update_threadlocinfo_category(lcid[MSVCRT_LC_TIME],
cp[MSVCRT_LC_TIME], locinfo, MSVCRT_LC_TIME)) {
free_locinfo(locinfo);
More information about the wine-cvs
mailing list