kernel32: implement IsValidLocaleName (with tests)

Austin English austinenglish at gmail.com
Thu Jul 26 22:00:24 CDT 2012


-- 
-Austin
-------------- next part --------------
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index a916309..f948dfa 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -779,6 +779,7 @@
 @ stdcall IsValidCodePage(long)
 @ stdcall IsValidLanguageGroup(long long)
 @ stdcall IsValidLocale(long long)
+@ stdcall IsValidLocaleName(wstr)
 # @ stub IsValidUILanguage
 @ stdcall IsWow64Process(ptr ptr)
 @ stdcall K32EmptyWorkingSet(long)
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index 90603f2..2925dda 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -2210,6 +2210,23 @@ BOOL WINAPI IsValidLocale( LCID lcid, DWORD flags )
                             (LPCWSTR)LOCALE_ILANGUAGE, LANGIDFROMLCID(lcid)) != 0;
 }
 
+/******************************************************************************
+ *           IsValidLocaleName   (KERNEL32.@)
+ */
+BOOL WINAPI IsValidLocaleName( LPCWSTR locale )
+{
+    struct locale_name locale_name;
+
+    /* string parsing */
+    parse_locale_name( locale, &locale_name );
+
+    TRACE( "found lcid %x for %s, matches %d\n",
+           locale_name.lcid, debugstr_w(locale), locale_name.matches );
+
+    if ( !locale_name.matches )
+        return FALSE;
+    return TRUE;
+}
 
 static BOOL CALLBACK enum_lang_proc_a( HMODULE hModule, LPCSTR type,
                                        LPCSTR name, WORD LangID, LONG_PTR lParam )
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 34b5fd8..7eb65f1 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -86,6 +86,7 @@ static INT (WINAPI *pIdnToNameprepUnicode)(DWORD, LPCWSTR, INT, LPWSTR, INT);
 static INT (WINAPI *pIdnToAscii)(DWORD, LPCWSTR, INT, LPWSTR, INT);
 static INT (WINAPI *pIdnToUnicode)(DWORD, LPCWSTR, INT, LPWSTR, INT);
 static INT (WINAPI *pGetLocaleInfoEx)(LPCWSTR, LCTYPE, LPWSTR, INT);
+static BOOL (WINAPI *pIsValidLocaleName)(LPCWSTR);
 
 static void InitFunctionPointers(void)
 {
@@ -104,6 +105,7 @@ static void InitFunctionPointers(void)
   pIdnToAscii = (void*)GetProcAddress(hKernel32, "IdnToAscii");
   pIdnToUnicode = (void*)GetProcAddress(hKernel32, "IdnToUnicode");
   pGetLocaleInfoEx = (void*)GetProcAddress(hKernel32, "GetLocaleInfoEx");
+  pIsValidLocaleName = (void*)GetProcAddress(hKernel32, "IsValidLocaleName");
 }
 
 #define eq(received, expected, label, type) \
@@ -3431,6 +3433,30 @@ todo_wine
     }
 }
 
+static void test_IsValidLocaleName(void)
+{
+    static const WCHAR enW[] = {'e','n',0};
+    static const WCHAR enusW[] = {'e','n','-','U','S',0};
+    static const WCHAR zzW[] = {'z','z',0};
+    static const WCHAR zzzzW[] = {'z','z','-','Z','Z',0};
+    BOOL ret;
+
+    if (!pIsValidLocaleName)
+    {
+        win_skip("IsValidLocaleName not supported\n");
+        return;
+    }
+
+    ret = pIsValidLocaleName(enW);
+    ok(ret, "IsValidLocaleName failed\n");    
+    ret = pIsValidLocaleName(enusW);
+    ok(ret, "IsValidLocaleName failed\n");
+    ret = pIsValidLocaleName(zzW);
+    ok(!ret, "IsValidLocaleName should have failed\n");
+    ret = pIsValidLocaleName(zzzzW);
+    ok(!ret, "IsValidLocaleName should have failed\n");
+}
+
 START_TEST(locale)
 {
   InitFunctionPointers();
@@ -3464,6 +3490,7 @@ START_TEST(locale)
   test_IdnToNameprepUnicode();
   test_IdnToAscii();
   test_IdnToUnicode();
+  test_IsValidLocaleName();
   /* this requires collation table patch to make it MS compatible */
   if (0) test_sorting();
 }


More information about the wine-patches mailing list