Drop has_localenames flag
This commit is contained in:
		| @@ -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; | ||||
| } | ||||
|   | ||||
| @@ -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, | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user