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