[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-devel
Subject:    [PATCH] msvcrt: Try SNAME when matching locale.
From:       Daniel Lehman <dlehman () esri ! com>
Date:       2018-04-30 20:53:33
Message-ID: ce1ab4c0567441059d911609e4f80017 () RED-INF-MXMB-P4 ! esri ! com
[Download RAW message or body]

["0001-msvcrt-Try-SNAME-when-matching-locale.txt" (text/plain)]

From 8a3b0be453a4ff0ca2e71eb0e8a48d1ce4919525 Mon Sep 17 00:00:00 2001
From: Daniel Lehman <dlehman@esri.com>
Date: Wed, 18 Apr 2018 10:58:10 -0700
Subject: [PATCH] msvcrt: Try SNAME when matching locale.

Signed-off-by: Daniel Lehman <dlehman@esri.com>
---
 dlls/msvcrt/locale.c       | 49 ++++++++++++++++++++++++--------------
 dlls/msvcrt/tests/locale.c | 29 ++++++++++++++++++++++
 2 files changed, 60 insertions(+), 18 deletions(-)

diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c
index 6314840489f..2e37a1a1640 100644
--- a/dlls/msvcrt/locale.c
+++ b/dlls/msvcrt/locale.c
@@ -154,30 +154,43 @@ find_best_locale_proc(HMODULE hModule, LPCSTR type, LPCSTR name, WORD LangID, LO
   if(PRIMARYLANGID(LangID) == LANG_NEUTRAL)
     return CONTINUE_LOOKING;
 
-  /* Check Language */
-  if (compare_info(lcid,LOCALE_SISO639LANGNAME,buff,res->search_language, TRUE) ||
-      compare_info(lcid,LOCALE_SABBREVLANGNAME,buff,res->search_language, TRUE) ||
-      compare_info(lcid,LOCALE_SENGLANGUAGE,buff,res->search_language, FALSE))
+  /* Check <language>-<region> */
+  if (compare_info(lcid,LOCALE_SNAME,buff,res->search_language, TRUE))
   {
-    TRACE(":Found language: %s->%s\n", res->search_language, buff);
-    flags |= FOUND_LANGUAGE;
+    TRACE(":Found locale: %s->%s\n", res->search_language, buff);
+    flags |= FOUND_LANGUAGE | FOUND_COUNTRY;
   }
-  else if (res->match_flags & FOUND_LANGUAGE)
+  else if ((res->match_flags & (FOUND_LANGUAGE | FOUND_COUNTRY)) == (FOUND_LANGUAGE | FOUND_COUNTRY))
   {
     return CONTINUE_LOOKING;
   }
-
-  /* Check Country */
-  if (compare_info(lcid,LOCALE_SISO3166CTRYNAME,buff,res->search_country, TRUE) ||
-      compare_info(lcid,LOCALE_SABBREVCTRYNAME,buff,res->search_country, TRUE) ||
-      compare_info(lcid,LOCALE_SENGCOUNTRY,buff,res->search_country, FALSE))
-  {
-    TRACE("Found country:%s->%s\n", res->search_country, buff);
-    flags |= FOUND_COUNTRY;
-  }
-  else if (!flags && (res->match_flags & FOUND_COUNTRY))
+  else
   {
-    return CONTINUE_LOOKING;
+    /* Check Language */
+    if (compare_info(lcid,LOCALE_SISO639LANGNAME,buff,res->search_language, TRUE) ||
+        compare_info(lcid,LOCALE_SABBREVLANGNAME,buff,res->search_language, TRUE) ||
+        compare_info(lcid,LOCALE_SENGLANGUAGE,buff,res->search_language, FALSE))
+    {
+      TRACE(":Found language: %s->%s\n", res->search_language, buff);
+      flags |= FOUND_LANGUAGE;
+    }
+    else if (res->match_flags & FOUND_LANGUAGE)
+    {
+      return CONTINUE_LOOKING;
+    }
+
+    /* Check Country */
+    if (compare_info(lcid,LOCALE_SISO3166CTRYNAME,buff,res->search_country, TRUE) ||
+        compare_info(lcid,LOCALE_SABBREVCTRYNAME,buff,res->search_country, TRUE) ||
+        compare_info(lcid,LOCALE_SENGCOUNTRY,buff,res->search_country, FALSE))
+    {
+      TRACE("Found country:%s->%s\n", res->search_country, buff);
+      flags |= FOUND_COUNTRY;
+    }
+    else if (!flags && (res->match_flags & FOUND_COUNTRY))
+    {
+      return CONTINUE_LOOKING;
+    }
   }
 
   /* Check codepage */
diff --git a/dlls/msvcrt/tests/locale.c b/dlls/msvcrt/tests/locale.c
index 5e6d172b8f2..697125971ce 100644
--- a/dlls/msvcrt/tests/locale.c
+++ b/dlls/msvcrt/tests/locale.c
@@ -614,6 +614,35 @@ static void test_setlocale(void)
 
     ret = setlocale(LC_ALL, "English_United States.UTF8");
     ok(ret == NULL, "ret != NULL\n");
+
+    ret = setlocale(LC_ALL, "en-US");
+    ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
+    if(ret)
+        ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret);
+
+    ret = setlocale(LC_ALL, "en-us");
+    ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
+    if(ret)
+        ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret);
+
+    ret = setlocale(LC_ALL, "en-GB");
+    ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
+    if(ret)
+        ok(!strcmp(ret, "English_United Kingdom.1252")
+        || broken(!strcmp(ret, "English_United States.1252")) /* XP & 2003 */,
+           "ret = %s\n", ret);
+
+    ret = setlocale(LC_ALL, "uz-UZ");
+    ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
+    if(ret)
+        ok(!strcmp(ret, "Uzbek (Cyrillic)_Uzbekistan.1251")
+        || broken(!strcmp(ret, "Uzbek (Latin)_Uzbekistan.1254")) /* XP & 2003 */,
+           "ret = %s\n", ret);
+
+    ret = setlocale(LC_ALL, "uz-Latn-UZ");
+    ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
+    if(ret)
+        ok(!strcmp(ret, "Uzbek (Latin)_Uzbekistan.1254"), "ret = %s\n", ret);
 }
 
 static void test_crtGetStringTypeW(void)
-- 
2.17.0


[Attachment #4 (text/plain)]




[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic