diff --git a/winsup/cygwin/nlsfuncs.cc b/winsup/cygwin/nlsfuncs.cc index 093464a2c..028c13641 100644 --- a/winsup/cygwin/nlsfuncs.cc +++ b/winsup/cygwin/nlsfuncs.cc @@ -79,164 +79,78 @@ __get_lcid_from_locale (const char *name) c = strchr (locale, '_'); if (!c) return last_lcid = (LCID) -1; - if (wincap.has_localenames ()) - { - wchar_t wlocale[ENCODING_LEN + 1]; - /* Convert to RFC 4646 syntax which is the standard for the locale names - replacing LCIDs starting with Vista. */ - *c = '-'; - mbstowcs (wlocale, locale, ENCODING_LEN + 1); - lcid = LocaleNameToLCID (wlocale, 0); - /* Bug on Windows 10: LocaleNameToLCID returns LOCALE_CUSTOM_UNSPECIFIED - for unknown locales. */ - if (lcid == 0 || lcid == LOCALE_CUSTOM_UNSPECIFIED) - { - /* Unfortunately there are a couple of locales for which no form - without a Script part per RFC 4646 exists. - Linux also supports no_NO which is equivalent to nb_NO. */ - struct { - const char *loc; - const wchar_t *wloc; - } sc_only_locale[] = { - { "az-AZ" , L"az-Latn-AZ" }, - { "bs-BA" , L"bs-Latn-BA" }, - { "chr-US", L"chr-Cher-US"}, - { "ff-SN" , L"ff-Latn-SN" }, - { "ha-NG" , L"ha-Latn-NG" }, - { "iu-CA" , L"iu-Latn-CA" }, - { "ku-IQ" , L"ku-Arab-IQ" }, - { "mn-CN" , L"mn-Mong-CN" }, - { "no-NO" , L"nb-NO" }, - { "pa-PK" , L"pa-Arab-PK" }, - { "sd-PK" , L"sd-Arab-PK" }, - { "sr-BA" , L"sr-Cyrl-BA" }, - { "sr-CS" , L"sr-Cyrl-CS" }, - { "sr-ME" , L"sr-Cyrl-ME" }, - { "sr-RS" , L"sr-Cyrl-RS" }, - { "tg-TJ" , L"tg-Cyrl-TJ" }, - { "tzm-DZ", L"tzm-Latn-DZ" }, - { "tzm-MA", L"tzm-Tfng-MA" }, - { "uz-UZ" , L"uz-Latn-UZ" }, - { NULL , NULL } - }; - for (int i = 0; sc_only_locale[i].loc - && sc_only_locale[i].loc[0] <= locale[0]; ++i) - if (!strcmp (locale, sc_only_locale[i].loc)) - { - lcid = LocaleNameToLCID (sc_only_locale[i].wloc, 0); - if (!strncmp (locale, "sr-", 3)) - { - /* Vista/2K8 is missing sr-ME and sr-RS. It has only the - deprecated sr-CS. So we map ME and RS to CS here. */ - if (lcid == 0 || lcid == LOCALE_CUSTOM_UNSPECIFIED) - lcid = LocaleNameToLCID (L"sr-Cyrl-CS", 0); - /* "@latin" modifier for the sr_XY locales changes - collation behaviour so lcid should accommodate that - by being set to the Latin sublang. */ - if (lcid != 0 && lcid != LOCALE_CUSTOM_UNSPECIFIED - && has_modifier ("@latin")) - lcid = MAKELANGID (lcid & 0x3ff, (lcid >> 10) - 1); - } - else if (!strncmp (locale, "uz-", 3)) - { - /* Equivalent for "@cyrillic" modifier in uz_UZ locale */ - if (lcid != 0 && lcid != LOCALE_CUSTOM_UNSPECIFIED - && has_modifier ("@cyrillic")) - lcid = MAKELANGID (lcid & 0x3ff, (lcid >> 10) + 1); - } - break; - } - } - if (lcid && lcid != LOCALE_CUSTOM_UNSPECIFIED) - last_lcid = lcid; - else - last_lcid = (LCID) -1; - debug_printf ("LCID=%04y", last_lcid); - return last_lcid; - } - /* Pre-Vista we have to loop through the LCID values and see if they - match language and TERRITORY. */ - *c++ = '\0'; - /* locale now points to the language, c points to the TERRITORY */ - const char *language = locale; - const char *territory = c; - LCID lang, sublang; - char iso[10]; + wchar_t wlocale[ENCODING_LEN + 1]; - /* In theory the lang part takes 10 bits (0x3ff), but up to Windows 2003 R2 - the highest lang value is 0x81. */ - for (lang = 1; lang <= 0x81; ++lang) - if (GetLocaleInfo (lang, LOCALE_SISO639LANGNAME, iso, 10) - && !strcmp (language, iso)) - break; - if (lang > 0x81) - lcid = 0; - else if (!territory) - lcid = lang; - else + /* Convert to RFC 4646 syntax which is the standard for the locale names + replacing LCIDs starting with Vista. */ + *c = '-'; + mbstowcs (wlocale, locale, ENCODING_LEN + 1); + lcid = LocaleNameToLCID (wlocale, 0); + /* Bug on Windows 10: LocaleNameToLCID returns LOCALE_CUSTOM_UNSPECIFIED + for unknown locales. */ + if (lcid == 0 || lcid == LOCALE_CUSTOM_UNSPECIFIED) { - /* In theory the sublang part takes 7 bits (0x3f), but up to - Windows 2003 R2 the highest sublang value is 0x14. */ - for (sublang = 1; sublang <= 0x14; ++sublang) - { - lcid = (sublang << 10) | lang; - if (GetLocaleInfo (lcid, LOCALE_SISO3166CTRYNAME, iso, 10) - && !strcmp (territory, iso)) - break; - } - if (sublang > 0x14) - lcid = 0; - } - if (lcid == 0 && territory) - { - /* Unfortunately there are four language LCID number areas representing - multiple languages. Fortunately only two of them already existed - pre-Vista. The concealed languages have to be tested explicitly, - since they are not catched by the above loops. - This also enables the serbian ISO 3166 territory codes which have - been changed post 2003, and maps them to the old wrong (SP was never - a valid ISO 3166 code) territory code sr_SP which fortunately has the - same LCID as the newer sr_CS. + /* Unfortunately there are a couple of locales for which no form + without a Script part per RFC 4646 exists. Linux also supports no_NO which is equivalent to nb_NO. */ struct { - const char *loc; - LCID lcid; - } ambiguous_locale[] = { - { "bs_BA", MAKELANGID (LANG_BOSNIAN, 0x05) }, - { "nn_NO", MAKELANGID (LANG_NORWEGIAN, SUBLANG_NORWEGIAN_NYNORSK) }, - { "no_NO", MAKELANGID (LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL) }, - { "sr_BA", MAKELANGID (LANG_BOSNIAN, - SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC) }, - { "sr_CS", MAKELANGID (LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC) }, - { "sr_ME", MAKELANGID (LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC) }, - { "sr_RS", MAKELANGID (LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC) }, - { "sr_SP", MAKELANGID (LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC) }, - { NULL, 0 }, + const char *loc; + const wchar_t *wloc; + } sc_only_locale[] = { + { "az-AZ" , L"az-Latn-AZ" }, + { "bs-BA" , L"bs-Latn-BA" }, + { "chr-US", L"chr-Cher-US"}, + { "ff-SN" , L"ff-Latn-SN" }, + { "ha-NG" , L"ha-Latn-NG" }, + { "iu-CA" , L"iu-Latn-CA" }, + { "ku-IQ" , L"ku-Arab-IQ" }, + { "mn-CN" , L"mn-Mong-CN" }, + { "no-NO" , L"nb-NO" }, + { "pa-PK" , L"pa-Arab-PK" }, + { "sd-PK" , L"sd-Arab-PK" }, + { "sr-BA" , L"sr-Cyrl-BA" }, + { "sr-CS" , L"sr-Cyrl-CS" }, + { "sr-ME" , L"sr-Cyrl-ME" }, + { "sr-RS" , L"sr-Cyrl-RS" }, + { "tg-TJ" , L"tg-Cyrl-TJ" }, + { "tzm-DZ", L"tzm-Latn-DZ" }, + { "tzm-MA", L"tzm-Tfng-MA" }, + { "uz-UZ" , L"uz-Latn-UZ" }, + { NULL , NULL } }; - *--c = '_'; - for (int i = 0; ambiguous_locale[i].loc - && ambiguous_locale[i].loc[0] <= locale[0]; ++i) - if (!strcmp (locale, ambiguous_locale[i].loc) - && GetLocaleInfo (ambiguous_locale[i].lcid, LOCALE_SISO639LANGNAME, - iso, 10)) + for (int i = 0; sc_only_locale[i].loc + && sc_only_locale[i].loc[0] <= locale[0]; ++i) + if (!strcmp (locale, sc_only_locale[i].loc)) { - lcid = ambiguous_locale[i].lcid; - /* "@latin" modifier for the sr_XY locales changes collation - behaviour so lcid should accommodate that by being set to - the Latin sublang. */ - if (!strncmp (locale, "sr_", 3) && has_modifier ("@latin")) - lcid = MAKELANGID (lcid & 0x3ff, (lcid >> 10) - 1); + lcid = LocaleNameToLCID (sc_only_locale[i].wloc, 0); + if (!strncmp (locale, "sr-", 3)) + { + /* Vista/2K8 is missing sr-ME and sr-RS. It has only the + deprecated sr-CS. So we map ME and RS to CS here. */ + if (lcid == 0 || lcid == LOCALE_CUSTOM_UNSPECIFIED) + lcid = LocaleNameToLCID (L"sr-Cyrl-CS", 0); + /* "@latin" modifier for the sr_XY locales changes + collation behaviour so lcid should accommodate that + by being set to the Latin sublang. */ + if (lcid != 0 && lcid != LOCALE_CUSTOM_UNSPECIFIED + && has_modifier ("@latin")) + lcid = MAKELANGID (lcid & 0x3ff, (lcid >> 10) - 1); + } + else if (!strncmp (locale, "uz-", 3)) + { + /* Equivalent for "@cyrillic" modifier in uz_UZ locale */ + if (lcid != 0 && lcid != LOCALE_CUSTOM_UNSPECIFIED + && has_modifier ("@cyrillic")) + lcid = MAKELANGID (lcid & 0x3ff, (lcid >> 10) + 1); + } break; } } - else if (lcid == 0x0443) /* uz_UZ (Uzbek/Uzbekistan) */ - { - /* Equivalent for "@cyrillic" modifier in uz_UZ locale */ - if (lcid != 0 && has_modifier ("@cyrillic")) - lcid = MAKELANGID (lcid & 0x3ff, (lcid >> 10) + 1); - } - last_lcid = lcid ?: (LCID) -1; + if (lcid && lcid != LOCALE_CUSTOM_UNSPECIFIED) + last_lcid = lcid; + else + last_lcid = (LCID) -1; debug_printf ("LCID=%04y", last_lcid); return last_lcid; } diff --git a/winsup/cygwin/wincap.cc b/winsup/cygwin/wincap.cc index 5d0db71cb..dcb2c92db 100644 --- a/winsup/cygwin/wincap.cc +++ b/winsup/cygwin/wincap.cc @@ -25,7 +25,6 @@ wincaps wincap_xpsp2 __attribute__((section (".cygwin_dll_common"), shared)) = { has_gaa_largeaddress_bug:false, has_transactions:false, has_broken_alloc_console:false, - has_localenames:false, has_fast_cwd:false, has_restricted_raw_disk_access:false, use_dont_resolve_hack:true, @@ -52,7 +51,6 @@ wincaps wincap_2003 __attribute__((section (".cygwin_dll_common"), shared)) = { has_gaa_largeaddress_bug:false, has_transactions:false, has_broken_alloc_console:false, - has_localenames:false, has_fast_cwd:false, has_restricted_raw_disk_access:false, use_dont_resolve_hack:true, @@ -79,7 +77,6 @@ wincaps wincap_vista __attribute__((section (".cygwin_dll_common"), shared)) = { has_gaa_largeaddress_bug:true, has_transactions:true, has_broken_alloc_console:false, - has_localenames:true, has_fast_cwd:true, has_restricted_raw_disk_access:true, use_dont_resolve_hack:false, @@ -106,7 +103,6 @@ wincaps wincap_7 __attribute__((section (".cygwin_dll_common"), shared)) = { has_gaa_largeaddress_bug:true, has_transactions:true, has_broken_alloc_console:true, - has_localenames:true, has_fast_cwd:true, has_restricted_raw_disk_access:true, use_dont_resolve_hack:false, @@ -133,7 +129,6 @@ wincaps wincap_8 __attribute__((section (".cygwin_dll_common"), shared)) = { has_gaa_largeaddress_bug:false, has_transactions:true, has_broken_alloc_console:true, - has_localenames:true, has_fast_cwd:true, has_restricted_raw_disk_access:true, use_dont_resolve_hack:false, @@ -160,7 +155,6 @@ wincaps wincap_10 __attribute__((section (".cygwin_dll_common"), shared)) = { has_gaa_largeaddress_bug:false, has_transactions:true, has_broken_alloc_console:true, - has_localenames:true, has_fast_cwd:true, has_restricted_raw_disk_access:true, use_dont_resolve_hack:false, @@ -187,7 +181,6 @@ wincaps wincap_10_1511 __attribute__((section (".cygwin_dll_common"), shared)) = has_gaa_largeaddress_bug:false, has_transactions:true, has_broken_alloc_console:true, - has_localenames:true, has_fast_cwd:true, has_restricted_raw_disk_access:true, use_dont_resolve_hack:false, diff --git a/winsup/cygwin/wincap.h b/winsup/cygwin/wincap.h index 5950e596e..6bed04101 100644 --- a/winsup/cygwin/wincap.h +++ b/winsup/cygwin/wincap.h @@ -18,7 +18,6 @@ struct wincaps unsigned has_gaa_largeaddress_bug : 1; unsigned has_transactions : 1; unsigned has_broken_alloc_console : 1; - unsigned has_localenames : 1; unsigned has_fast_cwd : 1; unsigned has_restricted_raw_disk_access : 1; unsigned use_dont_resolve_hack : 1; @@ -70,7 +69,6 @@ public: bool IMPLEMENT (has_gaa_largeaddress_bug) bool IMPLEMENT (has_transactions) bool IMPLEMENT (has_broken_alloc_console) - bool IMPLEMENT (has_localenames) bool IMPLEMENT (has_fast_cwd) bool IMPLEMENT (has_restricted_raw_disk_access) bool IMPLEMENT (use_dont_resolve_hack)