Alexandre Julliard : kernel32: Use RtlLocaleNameToLcid().
Alexandre Julliard
julliard at winehq.org
Tue Nov 19 16:35:21 CST 2019
Module: wine
Branch: master
Commit: 9f0983ddfc570f20e211ddc257f2c39068266273
URL: https://source.winehq.org/git/wine.git/?a=commit;h=9f0983ddfc570f20e211ddc257f2c39068266273
Author: Alexandre Julliard <julliard at 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);
More information about the wine-cvs
mailing list