From 5dfc2a34eac326bcab6990693eb1935306f86a33 Mon Sep 17 00:00:00 2001 From: Austin English Date: Thu, 26 Jul 2012 20:00:24 -0700 Subject: [PATCH] kernel32: Implement IsValidLocaleName (with tests). --- dlls/kernel32/kernel32.spec | 1 + dlls/kernel32/locale.c | 15 +++++++++++++++ dlls/kernel32/tests/locale.c | 27 +++++++++++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index b8c6a3c69e7..736fbde1e94 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 3867d8d8e51..29e38c98270 100644 --- a/dlls/kernel32/locale.c +++ b/dlls/kernel32/locale.c @@ -2210,6 +2210,21 @@ 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 ); + + return locale_name.matches > 0; +} 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 397b30e3b03..a2a33faa994 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) \ @@ -3435,6 +3437,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(); @@ -3468,6 +3494,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(); }