Charles Davis : msvcrt: Make locale name string refcounted for C locale.

Alexandre Julliard julliard at winehq.org
Wed Nov 18 15:48:01 CST 2020


Module: wine
Branch: master
Commit: db55e0701628b08050fb479acb399e6eebf2e42f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=db55e0701628b08050fb479acb399e6eebf2e42f

Author: Charles Davis <cdavis at codeweavers.com>
Date:   Wed Nov 18 17:25:39 2020 +0100

msvcrt: Make locale name string refcounted for C locale.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcr90/tests/msvcr90.c | 64 +++++++++++++++-----------------------------
 dlls/msvcrt/locale.c         | 28 ++++++++++++++-----
 2 files changed, 44 insertions(+), 48 deletions(-)

diff --git a/dlls/msvcr90/tests/msvcr90.c b/dlls/msvcr90/tests/msvcr90.c
index 504dbf53d8f..476ad222fcf 100644
--- a/dlls/msvcr90/tests/msvcr90.c
+++ b/dlls/msvcr90/tests/msvcr90.c
@@ -2036,15 +2036,11 @@ static void test__get_current_locale(void)
                 "same locale name pointers for LC_COLLATE\n");
         ok(l->locinfo->lc_category[LC_COLLATE].refcount != l2->locinfo->lc_category[LC_COLLATE].refcount,
                 "same refcount pointers for LC_COLLATE\n");
-        ok(!!l->locinfo->lc_category[LC_COLLATE].refcount, "null refcount pointer for LC_COLLATE\n");
-        if(l->locinfo->lc_category[LC_COLLATE].refcount)
-            ok(*l->locinfo->lc_category[LC_COLLATE].refcount == 1, "refcount = %d\n",
-                    *l->locinfo->lc_category[LC_COLLATE].refcount);
-        ok(!!l2->locinfo->lc_category[LC_COLLATE].refcount, "null refcount pointer for LC_COLLATE\n");
-        if(l2->locinfo->lc_category[LC_COLLATE].refcount)
-            ok(*l2->locinfo->lc_category[LC_COLLATE].refcount == 2, "refcount = %d\n",
-                    *l2->locinfo->lc_category[LC_COLLATE].refcount);
+        ok(*l2->locinfo->lc_category[LC_COLLATE].refcount == 2, "refcount = %d\n",
+                *l2->locinfo->lc_category[LC_COLLATE].refcount);
     }
+    ok(*l->locinfo->lc_category[LC_COLLATE].refcount == 1, "refcount = %d\n",
+            *l->locinfo->lc_category[LC_COLLATE].refcount);
     for(i = LC_CTYPE; i <= LC_MAX; i++) {
         ok(l->locinfo->lc_category[i].locale == l2->locinfo->lc_category[i].locale,
                 "different locale name pointers for category %d\n", i);
@@ -2107,15 +2103,11 @@ static void test__get_current_locale(void)
                     "same locale name pointers for category %d\n", i);
             ok(l->locinfo->lc_category[i].refcount != l2->locinfo->lc_category[i].refcount,
                     "same refcount pointers for category %d\n", i);
-            ok(!!l->locinfo->lc_category[i].refcount, "null refcount pointer for category %d\n", i);
-            if(l->locinfo->lc_category[i].refcount)
-                ok(*l->locinfo->lc_category[i].refcount == 1, "refcount = %d for category %d\n",
-                        *l->locinfo->lc_category[i].refcount, i);
-            ok(!!l2->locinfo->lc_category[i].refcount, "null refcount pointer for category %d\n", i);
-            if(l2->locinfo->lc_category[i].refcount)
-                ok(*l2->locinfo->lc_category[i].refcount == 2, "refcount = %d for category %d\n",
-                        *l2->locinfo->lc_category[i].refcount, i);
+            ok(*l2->locinfo->lc_category[i].refcount == 2, "refcount = %d for category %d\n",
+                    *l2->locinfo->lc_category[i].refcount, i);
         }
+        ok(*l->locinfo->lc_category[i].refcount == 1, "refcount = %d for category %d\n",
+                *l->locinfo->lc_category[i].refcount, i);
     }
     for(i = LC_MONETARY; i <= LC_MAX; i++) {
         ok(l->locinfo->lc_category[i].locale == l2->locinfo->lc_category[i].locale,
@@ -2186,15 +2178,11 @@ static void test__get_current_locale(void)
                     "same locale name pointers for category %d\n", i);
             ok(l->locinfo->lc_category[i].refcount != l2->locinfo->lc_category[i].refcount,
                     "same refcount pointers for category %d\n", i);
-            ok(!!l->locinfo->lc_category[i].refcount, "null refcount pointer for category %d\n", i);
-            if(l->locinfo->lc_category[i].refcount)
-                ok(*l->locinfo->lc_category[i].refcount == 1, "refcount = %d for category %d\n",
-                        *l->locinfo->lc_category[i].refcount, i);
-            ok(!!l2->locinfo->lc_category[i].refcount, "null refcount pointer for category %d\n", i);
-            if(l2->locinfo->lc_category[i].refcount)
-                ok(*l2->locinfo->lc_category[i].refcount == 2, "refcount = %d for category %d\n",
-                        *l2->locinfo->lc_category[i].refcount, i);
+            ok(*l2->locinfo->lc_category[i].refcount == 2, "refcount = %d for category %d\n",
+                    *l2->locinfo->lc_category[i].refcount, i);
         }
+        ok(*l->locinfo->lc_category[i].refcount == 1, "refcount = %d for category %d\n",
+                *l->locinfo->lc_category[i].refcount, i);
     }
     for(i = LC_NUMERIC; i <= LC_MAX; i++) {
         ok(l->locinfo->lc_category[i].locale == l2->locinfo->lc_category[i].locale,
@@ -2273,15 +2261,11 @@ static void test__get_current_locale(void)
                     "same locale name pointers for category %d\n", i);
             ok(l->locinfo->lc_category[i].refcount != l2->locinfo->lc_category[i].refcount,
                     "same refcount pointers for category %d\n", i);
-            ok(!!l->locinfo->lc_category[i].refcount, "null refcount pointer for category %d\n", i);
-            if(l->locinfo->lc_category[i].refcount)
-                ok(*l->locinfo->lc_category[i].refcount == 1, "refcount = %d for category %d\n",
-                        *l->locinfo->lc_category[i].refcount, i);
-            ok(!!l2->locinfo->lc_category[i].refcount, "null refcount pointer for category %d\n", i);
-            if(l2->locinfo->lc_category[i].refcount)
-                ok(*l2->locinfo->lc_category[i].refcount == 2, "refcount = %d for category %d\n",
-                        *l2->locinfo->lc_category[i].refcount, i);
+            ok(*l2->locinfo->lc_category[i].refcount == 2, "refcount = %d for category %d\n",
+                    *l2->locinfo->lc_category[i].refcount, i);
         }
+        ok(*l->locinfo->lc_category[i].refcount == 1, "refcount = %d for category %d\n",
+                *l->locinfo->lc_category[i].refcount, i);
     }
     ok(l->locinfo->lc_category[LC_TIME].locale == l2->locinfo->lc_category[LC_TIME].locale,
             "different locale name pointers for LC_TIME\n");
@@ -2353,21 +2337,17 @@ static void test__get_current_locale(void)
         ok(l2->locinfo->refcount == 2, "refcount = %d\n", l2->locinfo->refcount);
     }
 
-    todo_wine {
-        for(i = LC_MIN+1; i <= LC_MAX; i++) {
+    for(i = LC_MIN+1; i <= LC_MAX; i++) {
+        todo_wine {
             ok(l->locinfo->lc_category[i].locale != l2->locinfo->lc_category[i].locale,
                     "same locale name pointers for category %d\n", i);
             ok(l->locinfo->lc_category[i].refcount != l2->locinfo->lc_category[i].refcount,
                     "same refcount pointers for category %d\n", i);
-            ok(!!l->locinfo->lc_category[i].refcount, "null refcount pointer for category %d\n", i);
-            if(l->locinfo->lc_category[i].refcount)
-                ok(*l->locinfo->lc_category[i].refcount == 1, "refcount = %d for category %d\n",
-                        *l->locinfo->lc_category[i].refcount, i);
-            ok(!!l2->locinfo->lc_category[i].refcount, "null refcount pointer for category %d\n", i);
-            if(l2->locinfo->lc_category[i].refcount)
-                ok(*l2->locinfo->lc_category[i].refcount == 2, "refcount = %d for category %d\n",
-                        *l2->locinfo->lc_category[i].refcount, i);
+            ok(*l2->locinfo->lc_category[i].refcount == 2, "refcount = %d for category %d\n",
+                    *l2->locinfo->lc_category[i].refcount, i);
         }
+        ok(*l->locinfo->lc_category[i].refcount == 1, "refcount = %d for category %d\n",
+                *l->locinfo->lc_category[i].refcount, i);
     }
 
     todo_wine {
diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c
index b24871b9cd7..4b20f097758 100644
--- a/dlls/msvcrt/locale.c
+++ b/dlls/msvcrt/locale.c
@@ -1247,8 +1247,12 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
             free_locinfo(locinfo);
             return NULL;
         }
-    } else
-        locinfo->lc_category[MSVCRT_LC_COLLATE].locale = MSVCRT__strdup("C");
+    } else {
+        if(!init_category_name("C", 1, locinfo, MSVCRT_LC_COLLATE)) {
+            free_locinfo(locinfo);
+            return NULL;
+        }
+    }
 
     if(locale_name[MSVCRT_LC_CTYPE] &&
             !init_category_name(locale_name[MSVCRT_LC_CTYPE],
@@ -1325,7 +1329,10 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
         locinfo->lc_clike = 1;
         locinfo->mb_cur_max = 1;
         locinfo->pctype = MSVCRT__ctype+1;
-        locinfo->lc_category[MSVCRT_LC_CTYPE].locale = MSVCRT__strdup("C");
+        if(!init_category_name("C", 1, locinfo, MSVCRT_LC_CTYPE)) {
+            free_locinfo(locinfo);
+            return NULL;
+        }
 
         for(i=0; i<256; i++) {
             if(locinfo->pctype[i] & MSVCRT__LEADBYTE)
@@ -1617,7 +1624,10 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
         locinfo->lconv->_W_negative_sign[0] = '\0';
 #endif
 
-        locinfo->lc_category[MSVCRT_LC_MONETARY].locale = MSVCRT__strdup("C");
+        if(!init_category_name("C", 1, locinfo, MSVCRT_LC_MONETARY)) {
+            free_locinfo(locinfo);
+            return NULL;
+        }
     }
 
     if(locale_name[MSVCRT_LC_NUMERIC] &&
@@ -1735,7 +1745,10 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
         locinfo->lconv->_W_thousands_sep[0] = '\0';
 #endif
 
-        locinfo->lc_category[MSVCRT_LC_NUMERIC].locale = MSVCRT__strdup("C");
+        if (!init_category_name("C", 1, locinfo, MSVCRT_LC_NUMERIC)) {
+            free_locinfo(locinfo);
+            return NULL;
+        }
     }
 
     if(locale_name[MSVCRT_LC_TIME] &&
@@ -1767,7 +1780,10 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
             return NULL;
         }
     } else {
-        locinfo->lc_category[MSVCRT_LC_TIME].locale = MSVCRT__strdup("C");
+        if(!init_category_name("C", 1, locinfo, MSVCRT_LC_TIME)) {
+            free_locinfo(locinfo);
+            return NULL;
+        }
         locinfo->lc_time_curr = &cloc_time_data;
     }
 




More information about the wine-cvs mailing list