From 8a3b0be453a4ff0ca2e71eb0e8a48d1ce4919525 Mon Sep 17 00:00:00 2001 From: Daniel Lehman Date: Wed, 18 Apr 2018 10:58:10 -0700 Subject: [PATCH] msvcrt: Try SNAME when matching locale. Signed-off-by: Daniel Lehman --- dlls/msvcrt/locale.c | 49 ++++++++++++++++++++++++-------------- dlls/msvcrt/tests/locale.c | 29 ++++++++++++++++++++++ 2 files changed, 60 insertions(+), 18 deletions(-) diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c index 6314840489f..2e37a1a1640 100644 --- a/dlls/msvcrt/locale.c +++ b/dlls/msvcrt/locale.c @@ -154,30 +154,43 @@ find_best_locale_proc(HMODULE hModule, LPCSTR type, LPCSTR name, WORD LangID, LO if(PRIMARYLANGID(LangID) == LANG_NEUTRAL) return CONTINUE_LOOKING; - /* Check Language */ - if (compare_info(lcid,LOCALE_SISO639LANGNAME,buff,res->search_language, TRUE) || - compare_info(lcid,LOCALE_SABBREVLANGNAME,buff,res->search_language, TRUE) || - compare_info(lcid,LOCALE_SENGLANGUAGE,buff,res->search_language, FALSE)) + /* Check - */ + if (compare_info(lcid,LOCALE_SNAME,buff,res->search_language, TRUE)) { - TRACE(":Found language: %s->%s\n", res->search_language, buff); - flags |= FOUND_LANGUAGE; + TRACE(":Found locale: %s->%s\n", res->search_language, buff); + flags |= FOUND_LANGUAGE | FOUND_COUNTRY; } - else if (res->match_flags & FOUND_LANGUAGE) + else if ((res->match_flags & (FOUND_LANGUAGE | FOUND_COUNTRY)) == (FOUND_LANGUAGE | FOUND_COUNTRY)) { return CONTINUE_LOOKING; } - - /* Check Country */ - if (compare_info(lcid,LOCALE_SISO3166CTRYNAME,buff,res->search_country, TRUE) || - compare_info(lcid,LOCALE_SABBREVCTRYNAME,buff,res->search_country, TRUE) || - compare_info(lcid,LOCALE_SENGCOUNTRY,buff,res->search_country, FALSE)) - { - TRACE("Found country:%s->%s\n", res->search_country, buff); - flags |= FOUND_COUNTRY; - } - else if (!flags && (res->match_flags & FOUND_COUNTRY)) + else { - return CONTINUE_LOOKING; + /* Check Language */ + if (compare_info(lcid,LOCALE_SISO639LANGNAME,buff,res->search_language, TRUE) || + compare_info(lcid,LOCALE_SABBREVLANGNAME,buff,res->search_language, TRUE) || + compare_info(lcid,LOCALE_SENGLANGUAGE,buff,res->search_language, FALSE)) + { + TRACE(":Found language: %s->%s\n", res->search_language, buff); + flags |= FOUND_LANGUAGE; + } + else if (res->match_flags & FOUND_LANGUAGE) + { + return CONTINUE_LOOKING; + } + + /* Check Country */ + if (compare_info(lcid,LOCALE_SISO3166CTRYNAME,buff,res->search_country, TRUE) || + compare_info(lcid,LOCALE_SABBREVCTRYNAME,buff,res->search_country, TRUE) || + compare_info(lcid,LOCALE_SENGCOUNTRY,buff,res->search_country, FALSE)) + { + TRACE("Found country:%s->%s\n", res->search_country, buff); + flags |= FOUND_COUNTRY; + } + else if (!flags && (res->match_flags & FOUND_COUNTRY)) + { + return CONTINUE_LOOKING; + } } /* Check codepage */ diff --git a/dlls/msvcrt/tests/locale.c b/dlls/msvcrt/tests/locale.c index 5e6d172b8f2..697125971ce 100644 --- a/dlls/msvcrt/tests/locale.c +++ b/dlls/msvcrt/tests/locale.c @@ -614,6 +614,35 @@ static void test_setlocale(void) ret = setlocale(LC_ALL, "English_United States.UTF8"); ok(ret == NULL, "ret != NULL\n"); + + ret = setlocale(LC_ALL, "en-US"); + ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); + if(ret) + ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret); + + ret = setlocale(LC_ALL, "en-us"); + ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); + if(ret) + ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret); + + ret = setlocale(LC_ALL, "en-GB"); + ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); + if(ret) + ok(!strcmp(ret, "English_United Kingdom.1252") + || broken(!strcmp(ret, "English_United States.1252")) /* XP & 2003 */, + "ret = %s\n", ret); + + ret = setlocale(LC_ALL, "uz-UZ"); + ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); + if(ret) + ok(!strcmp(ret, "Uzbek (Cyrillic)_Uzbekistan.1251") + || broken(!strcmp(ret, "Uzbek (Latin)_Uzbekistan.1254")) /* XP & 2003 */, + "ret = %s\n", ret); + + ret = setlocale(LC_ALL, "uz-Latn-UZ"); + ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); + if(ret) + ok(!strcmp(ret, "Uzbek (Latin)_Uzbekistan.1254"), "ret = %s\n", ret); } static void test_crtGetStringTypeW(void) -- 2.17.0