Module: wine Branch: master Commit: 9f0983ddfc570f20e211ddc257f2c39068266273 URL: https://source.winehq.org/git/wine.git/?a=commit;h=9f0983ddfc570f20e211ddc25...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Nov 19 10:10:18 2019 +0100
kernel32: Use RtlLocaleNameToLcid().
---
dlls/kernel32/locale.c | 43 +++++++------------------------------------ dlls/kernel32/tests/locale.c | 7 +++++++ 2 files changed, 14 insertions(+), 36 deletions(-)
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c index a465ba6e29..e5e32d3cb5 100644 --- a/dlls/kernel32/locale.c +++ b/dlls/kernel32/locale.c @@ -1182,32 +1182,12 @@ BOOL WINAPI GetUserPreferredUILanguages( DWORD flags, ULONG *count, WCHAR *buffe */ LCID WINAPI LocaleNameToLCID( LPCWSTR name, DWORD flags ) { - struct locale_name locale_name; - static int once; - - if (flags && !once++) - FIXME( "unsupported flags %x\n", flags ); - - if (name == LOCALE_NAME_USER_DEFAULT) - return GetUserDefaultLCID(); + LCID lcid;
- /* string parsing */ - parse_locale_name( name, &locale_name ); - - TRACE( "found lcid %x for %s, matches %d\n", - locale_name.lcid, debugstr_w(name), locale_name.matches ); - - if (!locale_name.matches) - { - SetLastError(ERROR_INVALID_PARAMETER); - return 0; - } - - if (locale_name.matches == 1) - WARN( "locale %s not recognized, defaulting to %s\n", - debugstr_w(name), debugstr_w(locale_name.lang) ); - - return locale_name.lcid; + if (!name) return GetUserDefaultLCID(); + if (!set_ntstatus( RtlLocaleNameToLcid( name, &lcid, 2 ))) return 0; + if (!(flags & LOCALE_ALLOW_NEUTRAL_NAMES)) lcid = ConvertDefaultLocale( lcid ); + return lcid; }
@@ -2570,18 +2550,9 @@ BOOL WINAPI IsValidLocale( LCID lcid, DWORD flags ) */ BOOL WINAPI IsValidLocaleName( LPCWSTR locale ) { - struct locale_name locale_name; - - if (!locale) - return FALSE; - - /* 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 ); + LCID lcid;
- return locale_name.matches > 0; + return !RtlLocaleNameToLcid( locale, &lcid, 2 ); }
/****************************************************************************** diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c index b87f99c1c2..9a13693443 100644 --- a/dlls/kernel32/tests/locale.c +++ b/dlls/kernel32/tests/locale.c @@ -2856,6 +2856,9 @@ static void test_LocaleNameToLCID(void) ok(lcid == MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN), SORT_DEFAULT), "Got wrong lcid for es-es: 0x%x\n", lcid);
/* english neutral name */ + lcid = pLocaleNameToLCID(enW, LOCALE_ALLOW_NEUTRAL_NAMES); + ok(lcid == MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), SORT_DEFAULT) || + broken(lcid == 0) /* Vista */, "got 0x%04x\n", lcid); lcid = pLocaleNameToLCID(enW, 0); ok(lcid == MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT) || broken(lcid == 0) /* Vista */, "got 0x%04x\n", lcid); @@ -2871,6 +2874,7 @@ static void test_LocaleNameToLCID(void) *buffer = 0; ret = pLCIDToLocaleName(lcid, buffer, ARRAY_SIZE(buffer), 0); ok(ret > 0, "%s: got %d\n", wine_dbgstr_w(ptr->name), ret); + todo_wine_if (ptr->todo) ok(!lstrcmpW(ptr->sname, buffer), "%s: got wrong locale name %s\n", wine_dbgstr_w(ptr->name), wine_dbgstr_w(buffer));
@@ -4740,6 +4744,7 @@ static void test_GetLocaleInfoEx(void) static void test_IsValidLocaleName(void) { static const WCHAR enusW[] = {'e','n','-','U','S',0}; + static const WCHAR enW[] = {'e','n',0}; 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}; @@ -4753,6 +4758,8 @@ static void test_IsValidLocaleName(void)
ret = pIsValidLocaleName(enusW); ok(ret, "IsValidLocaleName failed\n"); + ret = pIsValidLocaleName(enW); + ok(ret || broken(!ret), "IsValidLocaleName failed\n"); ret = pIsValidLocaleName(zzW); ok(!ret || broken(ret), "IsValidLocaleName should have failed\n"); ret = pIsValidLocaleName(zz_zzW);