kernel32/locale:Fix some bugs about special Chinese test in parse_locale_name()

THuang matrix95 at foxmail.com
Sun Apr 16 02:19:53 CDT 2017


-------------- next part --------------
>From ff871445757367798e6e3920ca5793d4392da091 Mon Sep 17 00:00:00 2001
From: THuang <loagen95 at gmail.com>
Date: Fri, 14 Apr 2017 05:26:50 -0400
Subject: [PATCH] kernel32/locale:Fix some bugs about special Chinese test in
 parse_locale_name()

Signed-off-by: THuang <loagen95 at gmail.com>
---
 dlls/kernel32/locale.c       | 15 +++++++++++++++
 dlls/kernel32/tests/locale.c | 22 ++++++++++++++--------
 2 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index e14aedbe44..d0406d4658 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -457,6 +457,8 @@ static void parse_locale_name( const WCHAR *str, struct locale_name *name )
     static const WCHAR cW[] = {'C',0};
     static const WCHAR latinW[] = {'l','a','t','i','n',0};
     static const WCHAR latnW[] = {'-','L','a','t','n',0};
+    static const WCHAR HantW[] = {'-','H','a','n','t',0};
+    static const WCHAR HansW[] = {'-','H','a','n','s',0};
     WCHAR *p;
 
     TRACE("%s\n", debugstr_w(str));
@@ -487,6 +489,16 @@ static void parse_locale_name( const WCHAR *str, struct locale_name *name )
     else if (*p == '-')  /* Windows format */
     {
         strcpyW( name->win_name, name->lang );
+        if(!strcmpiW(p,HantW)){
+            name->lcid = 0x0c04;
+            name->matches = 1;
+            return ;
+        }
+        if(!strcmpiW(p,HansW)){
+            name->lcid = 0x0804;
+            name->matches = 1;
+            return ;
+        }
         *p++ = 0;
         name->country = p;
         if (!(p = strpbrkW( p, winsepW ))) goto done;
@@ -2849,11 +2861,14 @@ BOOL WINAPI IsValidLocale( LCID lcid, DWORD flags )
 BOOL WINAPI IsValidLocaleName( LPCWSTR locale )
 {
     struct locale_name locale_name;
+    static const WCHAR zhHansW[] = {'z','h','-','H','a','n','s',0};
+    static const WCHAR zhHantW[] = {'z','h','-','H','a','n','t',0};
 
     if (!locale)
         return FALSE;
 
     /* string parsing */
+    if(!strcmpiW(locale,zhHansW) || !strcmpiW(locale,zhHantW)) return TRUE;
     parse_locale_name( locale, &locale_name );
 
     TRACE( "found lcid %x for %s, matches %d\n",
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 86fcc33b70..a1d41935a1 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -2781,40 +2781,40 @@ static void test_LocaleNameToLCID(void)
 
         /* zh-Hant */
         lcid = pLocaleNameToLCID(zhHantW, 0);
-        todo_wine ok(lcid == MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_HONGKONG), SORT_DEFAULT),
+        ok(lcid == MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_HONGKONG), SORT_DEFAULT),
            "%s: got wrong lcid 0x%04x\n", wine_dbgstr_w(zhHantW), lcid);
         ret = pLCIDToLocaleName(lcid, buffer, sizeof(buffer)/sizeof(WCHAR), 0);
         ok(ret > 0, "%s: got %d\n", wine_dbgstr_w(zhHantW), ret);
-        todo_wine ok(!lstrcmpW(zhhkW, buffer), "%s: got wrong locale name %s\n",
+        ok(!lstrcmpW(zhhkW, buffer), "%s: got wrong locale name %s\n",
            wine_dbgstr_w(zhHantW), wine_dbgstr_w(buffer));
 
         /* zh-hant */
         lcid = pLocaleNameToLCID(zhhantW, 0);
-        todo_wine ok(lcid == MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_HONGKONG), SORT_DEFAULT),
+        ok(lcid == MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_HONGKONG), SORT_DEFAULT),
            "%s: got wrong lcid 0x%04x\n", wine_dbgstr_w(zhhantW),
            MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_HONGKONG), SORT_DEFAULT));
         ret = pLCIDToLocaleName(lcid, buffer, sizeof(buffer)/sizeof(WCHAR), 0);
         ok(ret > 0, "%s: got %d\n", wine_dbgstr_w(zhhantW), ret);
-        todo_wine ok(!lstrcmpW(zhhkW, buffer), "%s: got wrong locale name %s\n",
+        ok(!lstrcmpW(zhhkW, buffer), "%s: got wrong locale name %s\n",
            wine_dbgstr_w(zhhantW), wine_dbgstr_w(buffer));
 
         /* zh-Hans */
         lcid = pLocaleNameToLCID(zhHansW, 0);
-        todo_wine ok(lcid == MAKELCID(MAKELANGID(LANG_CHINESE_SIMPLIFIED, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT),
+        ok(lcid == MAKELCID(MAKELANGID(LANG_CHINESE_SIMPLIFIED, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT),
            "%s: got wrong lcid 0x%04x\n", wine_dbgstr_w(zhHansW), lcid);
         ret = pLCIDToLocaleName(lcid, buffer, sizeof(buffer)/sizeof(WCHAR), 0);
         ok(ret > 0, "%s: got %d\n", wine_dbgstr_w(zhHansW), ret);
-        todo_wine ok(!lstrcmpW(zhcnW, buffer), "%s: got wrong locale name %s\n",
+        ok(!lstrcmpW(zhcnW, buffer), "%s: got wrong locale name %s\n",
            wine_dbgstr_w(zhHansW), wine_dbgstr_w(buffer));
 
         /* zh-hans */
         lcid = pLocaleNameToLCID(zhhansW, 0);
-        todo_wine ok(lcid == MAKELCID(MAKELANGID(LANG_CHINESE_SIMPLIFIED, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT),
+        ok(lcid == MAKELCID(MAKELANGID(LANG_CHINESE_SIMPLIFIED, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT),
            "%s: got wrong lcid 0x%04x\n", wine_dbgstr_w(zhhansW),
            MAKELCID(MAKELANGID(LANG_CHINESE_SIMPLIFIED, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT));
         ret = pLCIDToLocaleName(lcid, buffer, sizeof(buffer)/sizeof(WCHAR), 0);
         ok(ret > 0, "%s: got %d\n", wine_dbgstr_w(zhhansW), ret);
-        todo_wine ok(!lstrcmpW(zhcnW, buffer), "%s: got wrong locale name %s\n",
+        ok(!lstrcmpW(zhcnW, buffer), "%s: got wrong locale name %s\n",
            wine_dbgstr_w(zhhansW), wine_dbgstr_w(buffer));
     }
 }
@@ -4516,6 +4516,8 @@ static void test_IsValidLocaleName(void)
     static const WCHAR zzW[] = {'z','z',0};
     static const WCHAR zz_zzW[] = {'z','z','-','Z','Z',0};
     static const WCHAR zzzzW[] = {'z','z','z','z',0};
+    static const WCHAR zhHansW[] = {'z','h','-','H','a','n','s',0};
+    static const WCHAR zhHantW[] = {'z','h','-','H','a','n','t',0};
     BOOL ret;
 
     if (!pIsValidLocaleName)
@@ -4526,6 +4528,10 @@ static void test_IsValidLocaleName(void)
 
     ret = pIsValidLocaleName(enusW);
     ok(ret, "IsValidLocaleName failed\n");
+    ret = pIsValidLocaleName(zhHantW);
+    ok(ret, "IsValidLocaleName failed\n");
+    ret = pIsValidLocaleName(zhHansW);
+    ok(ret, "IsValidLocaleName failed\n");
     ret = pIsValidLocaleName(zzW);
     ok(!ret || broken(ret), "IsValidLocaleName should have failed\n");
     ret = pIsValidLocaleName(zz_zzW);
-- 
2.11.0



More information about the wine-patches mailing list