Drop has_localenames flag

This commit is contained in:
Corinna Vinschen 2015-12-15 15:15:30 +01:00
parent ed0ff4b940
commit 94f98f18db
3 changed files with 62 additions and 157 deletions

View File

@ -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;
}

View File

@ -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,

View File

@ -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)