[PATCH v3 resend 7/8] msvcrt: Swap the threadlocinfo pointers in setlocale().

Chip Davis cdavis at codeweavers.com
Sun Feb 2 19:58:05 CST 2020


Do this instead of swapping their contents. This way, the result of
_get_current_locale(), which references the current threadlocinfo, won't
change after a setlocale() call.

Signed-off-by: Chip Davis <cdavis at codeweavers.com>
---
 dlls/msvcr90/tests/msvcr90.c | 334 +++++++++++++----------------------
 dlls/msvcrt/locale.c         | 202 ++-------------------
 2 files changed, 132 insertions(+), 404 deletions(-)

diff --git a/dlls/msvcr90/tests/msvcr90.c b/dlls/msvcr90/tests/msvcr90.c
index 4d0de35749b3..eda774210c7b 100644
--- a/dlls/msvcr90/tests/msvcr90.c
+++ b/dlls/msvcr90/tests/msvcr90.c
@@ -2000,16 +2000,14 @@ static void test__get_current_locale(void)
         return;
     }
 
-    todo_wine {
-        lc_str(LC_COLLATE, "C");
-        lc_str(LC_CTYPE, "C");
-        lc_str(LC_MONETARY, "C");
-        lc_str(LC_NUMERIC, "C");
-        lc_str(LC_TIME, "C");
-    }
+    lc_str(LC_COLLATE, "C");
+    lc_str(LC_CTYPE, "C");
+    lc_str(LC_MONETARY, "C");
+    lc_str(LC_NUMERIC, "C");
+    lc_str(LC_TIME, "C");
 #undef lc_str
 
-    todo_wine ok(l->locinfo->refcount == 2, "refcount = %d\n", l->locinfo->refcount);
+    ok(l->locinfo->refcount == 2, "refcount = %d\n", l->locinfo->refcount);
     ok(l->locinfo == l2->locinfo, "different locinfo pointers\n");
     ok(l->mbcinfo == l2->mbcinfo, "different mbcinfo pointers\n");
 
@@ -2020,17 +2018,13 @@ static void test__get_current_locale(void)
     p_setlocale(LC_COLLATE, "C");
     l2 = p__get_current_locale();
 
-    todo_wine {
-        ok(l->locinfo->refcount == 1, "refcount = %d\n", l->locinfo->refcount);
-        ok(l2->locinfo->refcount == 2, "refcount = %d\n", l2->locinfo->refcount);
-    }
+    ok(l->locinfo->refcount == 1, "refcount = %d\n", l->locinfo->refcount);
+    ok(l2->locinfo->refcount == 2, "refcount = %d\n", l2->locinfo->refcount);
 
-    todo_wine {
-        ok(l->locinfo->lc_category[LC_COLLATE].locale != l2->locinfo->lc_category[LC_COLLATE].locale,
-                "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].locale != l2->locinfo->lc_category[LC_COLLATE].locale,
+            "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 == 1, "refcount = %d\n",
             *l->locinfo->lc_category[LC_COLLATE].refcount);
     todo_wine ok(*l2->locinfo->lc_category[LC_COLLATE].refcount == 2, "refcount = %d\n",
@@ -2044,7 +2038,7 @@ static void test__get_current_locale(void)
                 *l->locinfo->lc_category[i].refcount, i);
     }
 
-    todo_wine ok(l->locinfo->lc_collate_cp != l2->locinfo->lc_collate_cp, "same lc_collate_cp %u, %u\n",
+    ok(l->locinfo->lc_collate_cp != l2->locinfo->lc_collate_cp, "same lc_collate_cp %u, %u\n",
             l->locinfo->lc_collate_cp, l2->locinfo->lc_collate_cp);
 
     ok(l->locinfo->lc_codepage == l2->locinfo->lc_codepage, "different lc_codepages %u, %u\n",
@@ -2061,21 +2055,15 @@ static void test__get_current_locale(void)
 
     ok(l->locinfo->lconv == l2->locinfo->lconv, "different lconv pointers\n");
     ok(l->locinfo->lconv_intl_refcount == l2->locinfo->lconv_intl_refcount, "different lconv_intl_refcount pointers\n");
-    todo_wine ok(l->locinfo->lconv_intl_refcount, "null refcount pointer in non-C locale\n");
-    if(l->locinfo->lconv_intl_refcount)
-        todo_wine ok(*l->locinfo->lconv_intl_refcount == 3, "refcount = %d\n", *l->locinfo->lconv_intl_refcount);
+    todo_wine ok(*l->locinfo->lconv_intl_refcount == 3, "refcount = %d\n", *l->locinfo->lconv_intl_refcount);
 
     ok(l->locinfo->lconv->decimal_point == l2->locinfo->lconv->decimal_point, "different LC_NUMERIC pointers\n");
     ok(l->locinfo->lconv_num_refcount == l2->locinfo->lconv_num_refcount, "different lconv_num_refcount pointers\n");
-    todo_wine ok(l->locinfo->lconv_num_refcount, "null refcount pointer in non-C locale\n");
-    if(l->locinfo->lconv_num_refcount)
-        todo_wine ok(*l->locinfo->lconv_num_refcount == 3, "refcount = %d\n", *l->locinfo->lconv_num_refcount);
+    todo_wine ok(*l->locinfo->lconv_num_refcount == 3, "refcount = %d\n", *l->locinfo->lconv_num_refcount);
 
     ok(l->locinfo->lconv->currency_symbol == l2->locinfo->lconv->currency_symbol, "different LC_MONETARY pointers\n");
     ok(l->locinfo->lconv_mon_refcount == l2->locinfo->lconv_mon_refcount, "different lconv_mon_refcount pointers\n");
-    todo_wine ok(l->locinfo->lconv_mon_refcount, "null refcount pointer in non-C locale\n");
-    if(l->locinfo->lconv_mon_refcount)
-        todo_wine ok(*l->locinfo->lconv_mon_refcount == 3, "refcount = %d\n", *l->locinfo->lconv_mon_refcount);
+    todo_wine ok(*l->locinfo->lconv_mon_refcount == 3, "refcount = %d\n", *l->locinfo->lconv_mon_refcount);
 
     ok(l->locinfo->lc_time_curr == l2->locinfo->lc_time_curr, "different lc_time_curr pointers\n");
     ok(l->locinfo->lc_time_curr->unk == 1, "unk = %d\n", l->locinfo->lc_time_curr->unk);
@@ -2086,18 +2074,14 @@ static void test__get_current_locale(void)
     p_setlocale(LC_CTYPE, "C");
     l2 = p__get_current_locale();
 
-    todo_wine {
-        ok(l->locinfo->refcount == 1, "refcount = %d\n", l->locinfo->refcount);
-        ok(l2->locinfo->refcount == 2, "refcount = %d\n", l2->locinfo->refcount);
-    }
+    ok(l->locinfo->refcount == 1, "refcount = %d\n", l->locinfo->refcount);
+    ok(l2->locinfo->refcount == 2, "refcount = %d\n", l2->locinfo->refcount);
 
     for(i = LC_COLLATE; i < LC_MONETARY; 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].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 == 1, "refcount = %d for category %d\n",
                 *l->locinfo->lc_category[i].refcount, i);
         todo_wine ok(*l2->locinfo->lc_category[i].refcount == 2, "refcount = %d for category %d\n",
@@ -2112,45 +2096,33 @@ static void test__get_current_locale(void)
                 *l->locinfo->lc_category[i].refcount, i);
     }
 
-    todo_wine {
-        ok(l->locinfo->lc_collate_cp != l2->locinfo->lc_collate_cp, "same lc_collate_cp %u, %u\n",
-                l->locinfo->lc_collate_cp, l2->locinfo->lc_collate_cp);
+    ok(l->locinfo->lc_collate_cp != l2->locinfo->lc_collate_cp, "same lc_collate_cp %u, %u\n",
+            l->locinfo->lc_collate_cp, l2->locinfo->lc_collate_cp);
 
-        ok(l->locinfo->lc_codepage != l2->locinfo->lc_codepage, "same lc_codepages %u, %u\n",
-                l->locinfo->lc_codepage, l2->locinfo->lc_codepage);
-        ok(l->locinfo->lc_clike != l2->locinfo->lc_clike, "same lc_clike values %d, %d\n",
-                l->locinfo->lc_clike, l2->locinfo->lc_clike);
-        ok(l->locinfo->lc_clike, "non-C locale is C-like\n");
-    }
+    ok(l->locinfo->lc_codepage != l2->locinfo->lc_codepage, "same lc_codepages %u, %u\n",
+            l->locinfo->lc_codepage, l2->locinfo->lc_codepage);
+    ok(l->locinfo->lc_clike != l2->locinfo->lc_clike, "same lc_clike values %d, %d\n",
+            l->locinfo->lc_clike, l2->locinfo->lc_clike);
+    ok(l->locinfo->lc_clike, "non-C locale is C-like\n");
     ok(!l2->locinfo->lc_clike, "C locale is not C-like\n");
-    todo_wine {
-        ok(l->locinfo->ctype1 != l2->locinfo->ctype1, "same ctype1 pointers\n");
-        ok(l->locinfo->pclmap != l2->locinfo->pclmap, "same clmap pointers\n");
-        ok(l->locinfo->pcumap != l2->locinfo->pcumap, "same cumap pointers\n");
-        ok(l->locinfo->ctype1_refcount != l2->locinfo->ctype1_refcount, "same ctype1_refcount pointers\n");
-        ok(l->locinfo->ctype1_refcount, "null refcount pointer for non-C locale\n");
-        if(l->locinfo->ctype1_refcount)
-            ok(*l->locinfo->ctype1_refcount == 1, "refcount = %d\n", *l->locinfo->ctype1_refcount);
-    }
+    ok(l->locinfo->ctype1 != l2->locinfo->ctype1, "same ctype1 pointers\n");
+    ok(l->locinfo->pclmap != l2->locinfo->pclmap, "same clmap pointers\n");
+    ok(l->locinfo->pcumap != l2->locinfo->pcumap, "same cumap pointers\n");
+    ok(l->locinfo->ctype1_refcount != l2->locinfo->ctype1_refcount, "same ctype1_refcount pointers\n");
+    ok(*l->locinfo->ctype1_refcount == 1, "refcount = %d\n", *l->locinfo->ctype1_refcount);
     ok(!l2->locinfo->ctype1_refcount, "nonnull refcount pointer for C locale\n");
 
     ok(l->locinfo->lconv == l2->locinfo->lconv, "different lconv pointers\n");
     ok(l->locinfo->lconv_intl_refcount == l2->locinfo->lconv_intl_refcount, "different lconv_intl_refcount pointers\n");
-    todo_wine ok(l->locinfo->lconv_intl_refcount, "null refcount pointer in non-C locale\n");
-    if(l->locinfo->lconv_intl_refcount)
-        todo_wine ok(*l->locinfo->lconv_intl_refcount == 3, "refcount = %d\n", *l->locinfo->lconv_intl_refcount);
+    todo_wine ok(*l->locinfo->lconv_intl_refcount == 3, "refcount = %d\n", *l->locinfo->lconv_intl_refcount);
 
     ok(l->locinfo->lconv->decimal_point == l2->locinfo->lconv->decimal_point, "different LC_NUMERIC pointers\n");
     ok(l->locinfo->lconv_num_refcount == l2->locinfo->lconv_num_refcount, "different lconv_num_refcount pointers\n");
-    todo_wine ok(l->locinfo->lconv_num_refcount, "null refcount pointer in non-C locale\n");
-    if(l->locinfo->lconv_num_refcount)
-        todo_wine ok(*l->locinfo->lconv_num_refcount == 3, "refcount = %d\n", *l->locinfo->lconv_num_refcount);
+    todo_wine ok(*l->locinfo->lconv_num_refcount == 3, "refcount = %d\n", *l->locinfo->lconv_num_refcount);
 
     ok(l->locinfo->lconv->currency_symbol == l2->locinfo->lconv->currency_symbol, "different LC_MONETARY pointers\n");
     ok(l->locinfo->lconv_mon_refcount == l2->locinfo->lconv_mon_refcount, "different lconv_mon_refcount pointers\n");
-    todo_wine ok(l->locinfo->lconv_mon_refcount, "null refcount pointer in non-C locale\n");
-    if(l->locinfo->lconv_mon_refcount)
-        todo_wine ok(*l->locinfo->lconv_mon_refcount == 3, "refcount = %d\n", *l->locinfo->lconv_mon_refcount);
+    todo_wine ok(*l->locinfo->lconv_mon_refcount == 3, "refcount = %d\n", *l->locinfo->lconv_mon_refcount);
 
     ok(l->locinfo->lc_time_curr == l2->locinfo->lc_time_curr, "different lc_time_curr pointers\n");
     ok(l->locinfo->lc_time_curr->unk == 1, "unk = %d\n", l->locinfo->lc_time_curr->unk);
@@ -2161,18 +2133,14 @@ static void test__get_current_locale(void)
     p_setlocale(LC_MONETARY, "C");
     l2 = p__get_current_locale();
 
-    todo_wine {
-        ok(l->locinfo->refcount == 1, "refcount = %d\n", l->locinfo->refcount);
-        ok(l2->locinfo->refcount == 2, "refcount = %d\n", l2->locinfo->refcount);
-    }
+    ok(l->locinfo->refcount == 1, "refcount = %d\n", l->locinfo->refcount);
+    ok(l2->locinfo->refcount == 2, "refcount = %d\n", l2->locinfo->refcount);
 
     for(i = LC_COLLATE; i <= LC_MONETARY; 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].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 == 1, "refcount = %d for category %d\n",
                 *l->locinfo->lc_category[i].refcount, i);
         todo_wine ok(*l2->locinfo->lc_category[i].refcount == 2, "refcount = %d for category %d\n",
@@ -2187,52 +2155,34 @@ static void test__get_current_locale(void)
                 *l->locinfo->lc_category[i].refcount, i);
     }
 
-    todo_wine {
-        ok(l->locinfo->lc_collate_cp != l2->locinfo->lc_collate_cp, "same lc_collate_cp %u, %u\n",
-                l->locinfo->lc_collate_cp, l2->locinfo->lc_collate_cp);
+    ok(l->locinfo->lc_collate_cp != l2->locinfo->lc_collate_cp, "same lc_collate_cp %u, %u\n",
+            l->locinfo->lc_collate_cp, l2->locinfo->lc_collate_cp);
 
-        ok(l->locinfo->lc_codepage != l2->locinfo->lc_codepage, "same lc_codepages %u, %u\n",
-                l->locinfo->lc_codepage, l2->locinfo->lc_codepage);
-        ok(l->locinfo->lc_clike != l2->locinfo->lc_clike, "same lc_clike values %d, %d\n",
-                l->locinfo->lc_clike, l2->locinfo->lc_clike);
-        ok(l->locinfo->lc_clike, "non-C locale is C-like\n");
-    }
+    ok(l->locinfo->lc_codepage != l2->locinfo->lc_codepage, "same lc_codepages %u, %u\n",
+            l->locinfo->lc_codepage, l2->locinfo->lc_codepage);
+    ok(l->locinfo->lc_clike != l2->locinfo->lc_clike, "same lc_clike values %d, %d\n",
+            l->locinfo->lc_clike, l2->locinfo->lc_clike);
+    ok(l->locinfo->lc_clike, "non-C locale is C-like\n");
     ok(!l2->locinfo->lc_clike, "C locale is not C-like\n");
-    todo_wine {
-        ok(l->locinfo->ctype1 != l2->locinfo->ctype1, "same ctype1 pointers\n");
-        ok(l->locinfo->pclmap != l2->locinfo->pclmap, "same clmap pointers\n");
-        ok(l->locinfo->pcumap != l2->locinfo->pcumap, "same cumap pointers\n");
-        ok(l->locinfo->ctype1_refcount != l2->locinfo->ctype1_refcount, "same ctype1_refcount pointers\n");
-        ok(l->locinfo->ctype1_refcount, "null refcount pointer for non-C locale\n");
-        if(l->locinfo->ctype1_refcount)
-            ok(*l->locinfo->ctype1_refcount == 1, "refcount = %d\n", *l->locinfo->ctype1_refcount);
-    }
+    ok(l->locinfo->ctype1 != l2->locinfo->ctype1, "same ctype1 pointers\n");
+    ok(l->locinfo->pclmap != l2->locinfo->pclmap, "same clmap pointers\n");
+    ok(l->locinfo->pcumap != l2->locinfo->pcumap, "same cumap pointers\n");
+    ok(l->locinfo->ctype1_refcount != l2->locinfo->ctype1_refcount, "same ctype1_refcount pointers\n");
+    ok(*l->locinfo->ctype1_refcount == 1, "refcount = %d\n", *l->locinfo->ctype1_refcount);
     ok(!l2->locinfo->ctype1_refcount, "nonnull refcount pointer for C locale\n");
 
-    todo_wine {
-        ok(l->locinfo->lconv != l2->locinfo->lconv, "same lconv pointers\n");
-        ok(l->locinfo->lconv_intl_refcount != l2->locinfo->lconv_intl_refcount, "same lconv_intl_refcount pointers\n");
-        ok(l->locinfo->lconv_intl_refcount, "null refcount pointer in non-C locale\n");
-        if(l->locinfo->lconv_intl_refcount)
-            ok(*l->locinfo->lconv_intl_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_intl_refcount);
-        ok(l2->locinfo->lconv_intl_refcount, "null refcount pointer for C locale\n");
-        if(l2->locinfo->lconv_intl_refcount)
-            ok(*l2->locinfo->lconv_intl_refcount == 2, "refcount = %d\n", *l2->locinfo->lconv_intl_refcount);
-    }
+    ok(l->locinfo->lconv != l2->locinfo->lconv, "same lconv pointers\n");
+    ok(l->locinfo->lconv_intl_refcount != l2->locinfo->lconv_intl_refcount, "same lconv_intl_refcount pointers\n");
+    ok(*l->locinfo->lconv_intl_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_intl_refcount);
+    todo_wine ok(*l2->locinfo->lconv_intl_refcount == 2, "refcount = %d\n", *l2->locinfo->lconv_intl_refcount);
 
     ok(l->locinfo->lconv->decimal_point == l2->locinfo->lconv->decimal_point, "different LC_NUMERIC pointers\n");
     ok(l->locinfo->lconv_num_refcount == l2->locinfo->lconv_num_refcount, "different lconv_num_refcount pointers\n");
-    todo_wine ok(l->locinfo->lconv_num_refcount, "null refcount pointer in non-C locale\n");
-    if(l->locinfo->lconv_num_refcount)
-        todo_wine ok(*l->locinfo->lconv_num_refcount == 3, "refcount = %d\n", *l->locinfo->lconv_num_refcount);
-
-    todo_wine {
-        ok(l->locinfo->lconv->currency_symbol != l2->locinfo->lconv->currency_symbol, "same LC_MONETARY pointers\n");
-        ok(l->locinfo->lconv_mon_refcount != l2->locinfo->lconv_mon_refcount, "same lconv_mon_refcount pointers\n");
-        ok(l->locinfo->lconv_mon_refcount, "null refcount pointer in non-C locale\n");
-        if(l->locinfo->lconv_mon_refcount)
-            ok(*l->locinfo->lconv_mon_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_mon_refcount);
-    }
+    todo_wine ok(*l->locinfo->lconv_num_refcount == 3, "refcount = %d\n", *l->locinfo->lconv_num_refcount);
+
+    ok(l->locinfo->lconv->currency_symbol != l2->locinfo->lconv->currency_symbol, "same LC_MONETARY pointers\n");
+    ok(l->locinfo->lconv_mon_refcount != l2->locinfo->lconv_mon_refcount, "same lconv_mon_refcount pointers\n");
+    ok(*l->locinfo->lconv_mon_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_mon_refcount);
     ok(!l2->locinfo->lconv_mon_refcount, "nonnull refcount pointer for C locale\n");
 
     ok(l->locinfo->lc_time_curr == l2->locinfo->lc_time_curr, "different lc_time_curr pointers\n");
@@ -2244,18 +2194,14 @@ static void test__get_current_locale(void)
     p_setlocale(LC_NUMERIC, "C");
     l2 = p__get_current_locale();
 
-    todo_wine {
-        ok(l->locinfo->refcount == 1, "refcount = %d\n", l->locinfo->refcount);
-        ok(l2->locinfo->refcount == 2, "refcount = %d\n", l2->locinfo->refcount);
-    }
+    ok(l->locinfo->refcount == 1, "refcount = %d\n", l->locinfo->refcount);
+    ok(l2->locinfo->refcount == 2, "refcount = %d\n", l2->locinfo->refcount);
 
     for(i = LC_COLLATE; i <= LC_NUMERIC; 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].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 == 1, "refcount = %d for category %d\n",
                 *l->locinfo->lc_category[i].refcount, i);
         todo_wine ok(*l2->locinfo->lc_category[i].refcount == 2, "refcount = %d for category %d\n",
@@ -2268,53 +2214,35 @@ static void test__get_current_locale(void)
     todo_wine ok(*l->locinfo->lc_category[LC_TIME].refcount == 3, "refcount = %d\n",
             *l->locinfo->lc_category[LC_TIME].refcount);
 
-    todo_wine {
-        ok(l->locinfo->lc_collate_cp != l2->locinfo->lc_collate_cp, "same lc_collate_cp %u, %u\n",
-                l->locinfo->lc_collate_cp, l2->locinfo->lc_collate_cp);
+    ok(l->locinfo->lc_collate_cp != l2->locinfo->lc_collate_cp, "same lc_collate_cp %u, %u\n",
+            l->locinfo->lc_collate_cp, l2->locinfo->lc_collate_cp);
 
-        ok(l->locinfo->lc_codepage != l2->locinfo->lc_codepage, "same lc_codepages %u, %u\n",
-                l->locinfo->lc_codepage, l2->locinfo->lc_codepage);
-        ok(l->locinfo->lc_clike != l2->locinfo->lc_clike, "same lc_clike values %d, %d\n",
-                l->locinfo->lc_clike, l2->locinfo->lc_clike);
-        ok(l->locinfo->lc_clike, "non-C locale is C-like\n");
-    }
+    ok(l->locinfo->lc_codepage != l2->locinfo->lc_codepage, "same lc_codepages %u, %u\n",
+            l->locinfo->lc_codepage, l2->locinfo->lc_codepage);
+    ok(l->locinfo->lc_clike != l2->locinfo->lc_clike, "same lc_clike values %d, %d\n",
+            l->locinfo->lc_clike, l2->locinfo->lc_clike);
+    ok(l->locinfo->lc_clike, "non-C locale is C-like\n");
     ok(!l2->locinfo->lc_clike, "C locale is not C-like\n");
-    todo_wine {
-        ok(l->locinfo->ctype1 != l2->locinfo->ctype1, "same ctype1 pointers\n");
-        ok(l->locinfo->pclmap != l2->locinfo->pclmap, "same clmap pointers\n");
-        ok(l->locinfo->pcumap != l2->locinfo->pcumap, "same cumap pointers\n");
-        ok(l->locinfo->ctype1_refcount != l2->locinfo->ctype1_refcount, "same ctype1_refcount pointers\n");
-        ok(l->locinfo->ctype1_refcount, "null refcount pointer for non-C locale\n");
-        if(l->locinfo->ctype1_refcount)
-            ok(*l->locinfo->ctype1_refcount == 1, "refcount = %d\n", *l->locinfo->ctype1_refcount);
-    }
+    ok(l->locinfo->ctype1 != l2->locinfo->ctype1, "same ctype1 pointers\n");
+    ok(l->locinfo->pclmap != l2->locinfo->pclmap, "same clmap pointers\n");
+    ok(l->locinfo->pcumap != l2->locinfo->pcumap, "same cumap pointers\n");
+    ok(l->locinfo->ctype1_refcount != l2->locinfo->ctype1_refcount, "same ctype1_refcount pointers\n");
+    ok(*l->locinfo->ctype1_refcount == 1, "refcount = %d\n", *l->locinfo->ctype1_refcount);
     ok(!l2->locinfo->ctype1_refcount, "nonnull refcount pointer for C locale\n");
 
-    todo_wine {
-        ok(l->locinfo->lconv != l2->locinfo->lconv, "same lconv pointers\n");
-        ok(l->locinfo->lconv_intl_refcount != l2->locinfo->lconv_intl_refcount, "same lconv_intl_refcount pointers\n");
-        ok(l->locinfo->lconv_intl_refcount, "null refcount pointer in non-C locale\n");
-        if(l->locinfo->lconv_intl_refcount)
-            ok(*l->locinfo->lconv_intl_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_intl_refcount);
-    }
+    ok(l->locinfo->lconv != l2->locinfo->lconv, "same lconv pointers\n");
+    ok(l->locinfo->lconv_intl_refcount != l2->locinfo->lconv_intl_refcount, "same lconv_intl_refcount pointers\n");
+    ok(*l->locinfo->lconv_intl_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_intl_refcount);
     ok(!l2->locinfo->lconv_intl_refcount, "nonnull refcount pointer for C locale\n");
 
-    todo_wine {
-        ok(l->locinfo->lconv->decimal_point != l2->locinfo->lconv->decimal_point, "same LC_NUMERIC pointers\n");
-        ok(l->locinfo->lconv_num_refcount != l2->locinfo->lconv_num_refcount, "same lconv_num_refcount pointers\n");
-        ok(l->locinfo->lconv_num_refcount, "null refcount pointer in non-C locale\n");
-        if(l->locinfo->lconv_num_refcount)
-            ok(*l->locinfo->lconv_num_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_num_refcount);
-    }
+    ok(l->locinfo->lconv->decimal_point != l2->locinfo->lconv->decimal_point, "same LC_NUMERIC pointers\n");
+    ok(l->locinfo->lconv_num_refcount != l2->locinfo->lconv_num_refcount, "same lconv_num_refcount pointers\n");
+    ok(*l->locinfo->lconv_num_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_num_refcount);
     ok(!l2->locinfo->lconv_num_refcount, "nonnull refcount pointer for C locale\n");
 
-    todo_wine {
-        ok(l->locinfo->lconv->currency_symbol != l2->locinfo->lconv->currency_symbol, "same LC_MONETARY pointers\n");
-        ok(l->locinfo->lconv_mon_refcount != l2->locinfo->lconv_mon_refcount, "same lconv_mon_refcount pointers\n");
-        ok(l->locinfo->lconv_mon_refcount, "null refcount pointer in non-C locale\n");
-        if(l->locinfo->lconv_mon_refcount)
-            ok(*l->locinfo->lconv_mon_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_mon_refcount);
-    }
+    ok(l->locinfo->lconv->currency_symbol != l2->locinfo->lconv->currency_symbol, "same LC_MONETARY pointers\n");
+    ok(l->locinfo->lconv_mon_refcount != l2->locinfo->lconv_mon_refcount, "same lconv_mon_refcount pointers\n");
+    ok(*l->locinfo->lconv_mon_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_mon_refcount);
     ok(!l2->locinfo->lconv_mon_refcount, "nonnull refcount pointer for C locale\n");
 
     ok(l->locinfo->lc_time_curr == l2->locinfo->lc_time_curr, "different lc_time_curr pointers\n");
@@ -2326,76 +2254,54 @@ static void test__get_current_locale(void)
     p_setlocale(LC_TIME, "C");
     l2 = p__get_current_locale();
 
-    todo_wine {
-        ok(l->locinfo->refcount == 1, "refcount = %d\n", l->locinfo->refcount);
-        ok(l2->locinfo->refcount == 2, "refcount = %d\n", l2->locinfo->refcount);
-    }
+    ok(l->locinfo->refcount == 1, "refcount = %d\n", l->locinfo->refcount);
+    ok(l2->locinfo->refcount == 2, "refcount = %d\n", l2->locinfo->refcount);
 
     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].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 == 1, "refcount = %d for category %d\n",
                 *l->locinfo->lc_category[i].refcount, i);
         todo_wine ok(*l2->locinfo->lc_category[i].refcount == 2, "refcount = %d for category %d\n",
                 *l2->locinfo->lc_category[i].refcount, i);
     }
 
-    todo_wine {
-        ok(l->locinfo->lc_collate_cp != l2->locinfo->lc_collate_cp, "same lc_collate_cp %u, %u\n",
-                l->locinfo->lc_collate_cp, l2->locinfo->lc_collate_cp);
+    ok(l->locinfo->lc_collate_cp != l2->locinfo->lc_collate_cp, "same lc_collate_cp %u, %u\n",
+            l->locinfo->lc_collate_cp, l2->locinfo->lc_collate_cp);
 
-        ok(l->locinfo->lc_codepage != l2->locinfo->lc_codepage, "same lc_codepages %u, %u\n",
-                l->locinfo->lc_codepage, l2->locinfo->lc_codepage);
-        ok(l->locinfo->lc_clike != l2->locinfo->lc_clike, "same lc_clike values %d, %d\n",
-                l->locinfo->lc_clike, l2->locinfo->lc_clike);
-        ok(l->locinfo->lc_clike, "non-C locale is C-like\n");
-    }
+    ok(l->locinfo->lc_codepage != l2->locinfo->lc_codepage, "same lc_codepages %u, %u\n",
+            l->locinfo->lc_codepage, l2->locinfo->lc_codepage);
+    ok(l->locinfo->lc_clike != l2->locinfo->lc_clike, "same lc_clike values %d, %d\n",
+            l->locinfo->lc_clike, l2->locinfo->lc_clike);
+    ok(l->locinfo->lc_clike, "non-C locale is C-like\n");
     ok(!l2->locinfo->lc_clike, "C locale is not C-like\n");
-    todo_wine {
-        ok(l->locinfo->ctype1 != l2->locinfo->ctype1, "same ctype1 pointers\n");
-        ok(l->locinfo->pclmap != l2->locinfo->pclmap, "same clmap pointers\n");
-        ok(l->locinfo->pcumap != l2->locinfo->pcumap, "same cumap pointers\n");
-        ok(l->locinfo->ctype1_refcount != l2->locinfo->ctype1_refcount, "same ctype1_refcount pointers\n");
-        ok(l->locinfo->ctype1_refcount, "null refcount pointer for non-C locale\n");
-        if(l->locinfo->ctype1_refcount)
-            ok(*l->locinfo->ctype1_refcount == 1, "refcount = %d\n", *l->locinfo->ctype1_refcount);
-    }
+    ok(l->locinfo->ctype1 != l2->locinfo->ctype1, "same ctype1 pointers\n");
+    ok(l->locinfo->pclmap != l2->locinfo->pclmap, "same clmap pointers\n");
+    ok(l->locinfo->pcumap != l2->locinfo->pcumap, "same cumap pointers\n");
+    ok(l->locinfo->ctype1_refcount != l2->locinfo->ctype1_refcount, "same ctype1_refcount pointers\n");
+    ok(*l->locinfo->ctype1_refcount == 1, "refcount = %d\n", *l->locinfo->ctype1_refcount);
     ok(!l2->locinfo->ctype1_refcount, "nonnull refcount pointer for C locale\n");
 
-    todo_wine {
-        ok(l->locinfo->lconv != l2->locinfo->lconv, "same lconv pointers\n");
-        ok(l->locinfo->lconv_intl_refcount != l2->locinfo->lconv_intl_refcount, "same lconv_intl_refcount pointers\n");
-        ok(l->locinfo->lconv_intl_refcount, "null refcount pointer in non-C locale\n");
-        if(l->locinfo->lconv_intl_refcount)
-            ok(*l->locinfo->lconv_intl_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_intl_refcount);
-    }
+    ok(l->locinfo->lconv != l2->locinfo->lconv, "same lconv pointers\n");
+    ok(l->locinfo->lconv_intl_refcount != l2->locinfo->lconv_intl_refcount, "same lconv_intl_refcount pointers\n");
+    ok(*l->locinfo->lconv_intl_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_intl_refcount);
     ok(!l2->locinfo->lconv_intl_refcount, "nonnull refcount pointer for C locale\n");
 
-    todo_wine {
-        ok(l->locinfo->lconv->decimal_point != l2->locinfo->lconv->decimal_point, "same LC_NUMERIC pointers\n");
-        ok(l->locinfo->lconv_num_refcount != l2->locinfo->lconv_num_refcount, "same lconv_num_refcount pointers\n");
-        ok(l->locinfo->lconv_num_refcount, "null refcount pointer in non-C locale\n");
-        if(l->locinfo->lconv_num_refcount)
-            ok(*l->locinfo->lconv_num_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_num_refcount);
-    }
+    ok(l->locinfo->lconv->decimal_point != l2->locinfo->lconv->decimal_point, "same LC_NUMERIC pointers\n");
+    ok(l->locinfo->lconv_num_refcount != l2->locinfo->lconv_num_refcount, "same lconv_num_refcount pointers\n");
+    ok(*l->locinfo->lconv_num_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_num_refcount);
     ok(!l2->locinfo->lconv_num_refcount, "nonnull refcount pointer for C locale\n");
 
-    todo_wine {
-        ok(l->locinfo->lconv->currency_symbol != l2->locinfo->lconv->currency_symbol, "same LC_MONETARY pointers\n");
-        ok(l->locinfo->lconv_mon_refcount != l2->locinfo->lconv_mon_refcount, "same lconv_mon_refcount pointers\n");
-        ok(l->locinfo->lconv_mon_refcount, "null refcount pointer in non-C locale\n");
-        if(l->locinfo->lconv_mon_refcount)
-            ok(*l->locinfo->lconv_mon_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_mon_refcount);
-    }
+    ok(l->locinfo->lconv->currency_symbol != l2->locinfo->lconv->currency_symbol, "same LC_MONETARY pointers\n");
+    ok(l->locinfo->lconv_mon_refcount != l2->locinfo->lconv_mon_refcount, "same lconv_mon_refcount pointers\n");
+    ok(*l->locinfo->lconv_mon_refcount == 1, "refcount = %d\n", *l->locinfo->lconv_mon_refcount);
     ok(!l2->locinfo->lconv_mon_refcount, "nonnull refcount pointer for C locale\n");
 
-    todo_wine ok(l->locinfo->lc_time_curr != l2->locinfo->lc_time_curr, "same lc_time_curr pointers\n");
+    ok(l->locinfo->lc_time_curr != l2->locinfo->lc_time_curr, "same lc_time_curr pointers\n");
     ok(l->locinfo->lc_time_curr->unk == 1, "unk = %d\n", l->locinfo->lc_time_curr->unk);
-    todo_wine ok(l->locinfo->lc_time_curr->refcount == 1, "refcount = %d\n", l->locinfo->lc_time_curr->refcount);
+    ok(l->locinfo->lc_time_curr->refcount == 1, "refcount = %d\n", l->locinfo->lc_time_curr->refcount);
     ok(l2->locinfo->lc_time_curr->unk == 1, "unk = %d\n", l2->locinfo->lc_time_curr->unk);
     todo_wine ok(l2->locinfo->lc_time_curr->refcount == 3 || broken(l2->locinfo->lc_time_curr->refcount == 2),
             "refcount = %d\n", l2->locinfo->lc_time_curr->refcount);
diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c
index 5f7df5b661ce..88cefcefc17e 100644
--- a/dlls/msvcrt/locale.c
+++ b/dlls/msvcrt/locale.c
@@ -512,17 +512,22 @@ static inline void swap_pointers(void **p1, void **p2) {
     *p2 = hlp;
 }
 
-/* INTERNAL: returns pthreadlocinfo struct */
-MSVCRT_pthreadlocinfo get_locinfo(void) {
+/* INTERNAL: returns pointer to pointer to threadlocinfo struct */
+static MSVCRT_pthreadlocinfo *get_locinfo_ptr(void) {
     thread_data_t *data = msvcrt_get_thread_data();
 
     if(!data || !data->have_locale)
-        return MSVCRT_locale->locinfo;
+        return &MSVCRT_locale->locinfo;
+
+    return &data->locinfo;
+}
 
-    return data->locinfo;
+/* INTERNAL: returns threadlocinfo struct */
+MSVCRT_pthreadlocinfo get_locinfo(void) {
+    return *get_locinfo_ptr();
 }
 
-/* INTERNAL: returns pthreadlocinfo struct */
+/* INTERNAL: returns threadmbcinfo struct */
 MSVCRT_pthreadmbcinfo get_mbcinfo(void) {
     thread_data_t *data = msvcrt_get_thread_data();
 
@@ -1958,191 +1963,8 @@ char* CDECL MSVCRT_setlocale(int category, const char* locale)
     if(locale[0] != 'C' || locale[1] != '\0')
         initial_locale = FALSE;
 
-    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];
-
-#if _MSVCR_VER >= 110
-        swap_pointers((void**)&locinfo->lc_name[MSVCRT_LC_COLLATE],
-                (void**)&newlocinfo->lc_name[MSVCRT_LC_COLLATE]);
-#endif
-    }
-    if(newlocinfo->lc_category[MSVCRT_LC_COLLATE].locale) {
-        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,
-                (void**)&newlocinfo->lc_category[MSVCRT_LC_COLLATE].refcount);
-    }
-
-    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];
-
-        locinfo->lc_codepage = newlocinfo->lc_codepage;
-        locinfo->lc_clike = newlocinfo->lc_clike;
-        locinfo->mb_cur_max = newlocinfo->mb_cur_max;
-
-        swap_pointers((void**)&locinfo->ctype1_refcount,
-                (void**)&newlocinfo->ctype1_refcount);
-        swap_pointers((void**)&locinfo->ctype1, (void**)&newlocinfo->ctype1);
-        swap_pointers((void**)&locinfo->pctype, (void**)&newlocinfo->pctype);
-        swap_pointers((void**)&locinfo->pclmap, (void**)&newlocinfo->pclmap);
-        swap_pointers((void**)&locinfo->pcumap, (void**)&newlocinfo->pcumap);
-
-#if _MSVCR_VER >= 110
-        swap_pointers((void**)&locinfo->lc_name[MSVCRT_LC_CTYPE],
-                (void**)&newlocinfo->lc_name[MSVCRT_LC_CTYPE]);
-#endif
-    }
-    if(newlocinfo->lc_category[MSVCRT_LC_CTYPE].locale) {
-        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,
-                (void**)&newlocinfo->lc_category[MSVCRT_LC_CTYPE].refcount);
-    }
-
-    if(newlocinfo->lc_category[MSVCRT_LC_MONETARY].locale) {
-        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,
-                (void**)&newlocinfo->lc_category[MSVCRT_LC_MONETARY].refcount);
-    }
-
-    if(newlocinfo->lc_category[MSVCRT_LC_NUMERIC].locale) {
-        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,
-                (void**)&newlocinfo->lc_category[MSVCRT_LC_NUMERIC].refcount);
-    }
-
-    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_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_MONETARY] =
-            newlocinfo->lc_handle[MSVCRT_LC_MONETARY];
-        locinfo->lc_id[MSVCRT_LC_MONETARY] =
-            newlocinfo->lc_id[MSVCRT_LC_MONETARY];
-        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->lconv, (void**)&newlocinfo->lconv);
-#if _MSVCR_VER >= 110
-        swap_pointers((void**)&locinfo->lc_name[MSVCRT_LC_MONETARY],
-                (void**)&newlocinfo->lc_name[MSVCRT_LC_MONETARY]);
-        swap_pointers((void**)&locinfo->lc_name[MSVCRT_LC_NUMERIC],
-                (void**)&newlocinfo->lc_name[MSVCRT_LC_NUMERIC]);
-#endif
-    } else {
-        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->lconv->int_curr_symbol,
-                    (void**)&newlocinfo->lconv->int_curr_symbol);
-            swap_pointers((void**)&locinfo->lconv->currency_symbol,
-                    (void**)&newlocinfo->lconv->currency_symbol);
-            swap_pointers((void**)&locinfo->lconv->mon_decimal_point,
-                    (void**)&newlocinfo->lconv->mon_decimal_point);
-            swap_pointers((void**)&locinfo->lconv->mon_thousands_sep,
-                    (void**)&newlocinfo->lconv->mon_thousands_sep);
-            swap_pointers((void**)&locinfo->lconv->mon_grouping,
-                    (void**)&newlocinfo->lconv->mon_grouping);
-            swap_pointers((void**)&locinfo->lconv->positive_sign,
-                    (void**)&newlocinfo->lconv->positive_sign);
-            swap_pointers((void**)&locinfo->lconv->negative_sign,
-                    (void**)&newlocinfo->lconv->negative_sign);
-
-#if _MSVCR_VER >= 100
-            swap_pointers((void**)&locinfo->lconv->_W_int_curr_symbol,
-                    (void**)&newlocinfo->lconv->_W_int_curr_symbol);
-            swap_pointers((void**)&locinfo->lconv->_W_currency_symbol,
-                    (void**)&newlocinfo->lconv->_W_currency_symbol);
-            swap_pointers((void**)&locinfo->lconv->_W_mon_decimal_point,
-                    (void**)&newlocinfo->lconv->_W_mon_decimal_point);
-            swap_pointers((void**)&locinfo->lconv->_W_mon_thousands_sep,
-                    (void**)&newlocinfo->lconv->_W_mon_thousands_sep);
-            swap_pointers((void**)&locinfo->lconv->_W_positive_sign,
-                    (void**)&newlocinfo->lconv->_W_positive_sign);
-            swap_pointers((void**)&locinfo->lconv->_W_negative_sign,
-                    (void**)&newlocinfo->lconv->_W_negative_sign);
-#endif
-
-            locinfo->lconv->int_frac_digits = newlocinfo->lconv->int_frac_digits;
-            locinfo->lconv->frac_digits = newlocinfo->lconv->frac_digits;
-            locinfo->lconv->p_cs_precedes = newlocinfo->lconv->p_cs_precedes;
-            locinfo->lconv->p_sep_by_space = newlocinfo->lconv->p_sep_by_space;
-            locinfo->lconv->n_cs_precedes = newlocinfo->lconv->n_cs_precedes;
-            locinfo->lconv->n_sep_by_space = newlocinfo->lconv->n_sep_by_space;
-            locinfo->lconv->p_sign_posn = newlocinfo->lconv->p_sign_posn;
-            locinfo->lconv->n_sign_posn = newlocinfo->lconv->n_sign_posn;
-
-#if _MSVCR_VER >= 110
-            swap_pointers((void**)&locinfo->lc_name[MSVCRT_LC_MONETARY],
-                    (void**)&newlocinfo->lc_name[MSVCRT_LC_MONETARY]);
-#endif
-        }
-
-        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->lconv->decimal_point,
-                    (void**)&newlocinfo->lconv->decimal_point);
-            swap_pointers((void**)&locinfo->lconv->thousands_sep,
-                    (void**)&newlocinfo->lconv->thousands_sep);
-            swap_pointers((void**)&locinfo->lconv->grouping,
-                    (void**)&newlocinfo->lconv->grouping);
-
-#if _MSVCR_VER >= 100
-            swap_pointers((void**)&locinfo->lconv->_W_decimal_point,
-                    (void**)&newlocinfo->lconv->_W_decimal_point);
-            swap_pointers((void**)&locinfo->lconv->_W_thousands_sep,
-                    (void**)&newlocinfo->lconv->_W_thousands_sep);
-#endif
-
-#if _MSVCR_VER >= 110
-            swap_pointers((void**)&locinfo->lc_name[MSVCRT_LC_NUMERIC],
-                    (void**)&newlocinfo->lc_name[MSVCRT_LC_NUMERIC]);
-#endif
-        }
-    }
-
-    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_time_curr,
-                (void**)&newlocinfo->lc_time_curr);
-
-#if _MSVCR_VER >= 110
-        swap_pointers((void**)&locinfo->lc_name[MSVCRT_LC_TIME],
-                (void**)&newlocinfo->lc_name[MSVCRT_LC_TIME]);
-#endif
-    }
-    if(newlocinfo->lc_category[MSVCRT_LC_TIME].locale) {
-        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,
-                (void**)&newlocinfo->lc_category[MSVCRT_LC_TIME].refcount);
-    }
-
+    locinfo = newlocinfo;
+    swap_pointers(get_locinfo_ptr(), &newlocinfo);
     free_locinfo(newlocinfo);
     _unlock_locales();
 
-- 
2.24.0




More information about the wine-devel mailing list