Cygwin: /proc/locales: use modifier when checking default codeset

Drop usage of newlocale/nl_langinfo_l/freelocale.
Call __set_charset_from_locale instead, and make sure to call it
with modifier, if any, otherwise suffer wrong results.

Fixes: c42b98bdc6 ("Cygwin: introduce /proc/codesets and /proc/locales")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2023-03-26 12:50:57 +02:00
parent a97fbb58e2
commit 4e578fad79
1 changed files with 6 additions and 5 deletions

View File

@ -2121,8 +2121,8 @@ format_proc_locale_proc (LPWSTR win_locale, DWORD info, LPARAM param)
wchar_t currency[9] = { 0 };
char modifier[32] = { 0 };
char posix_loc[32];
char *codeset;
locale_t loc;
char posix_loc_and_modifier[32];
char codeset[32];
wchar_t *cp;
/* Skip language-only locales, e. g. "en" */
@ -2236,8 +2236,8 @@ format_proc_locale_proc (LPWSTR win_locale, DWORD info, LPARAM param)
wcstombs (modifier + 1, iso15924_postfix, 31);
}
loc = newlocale (LC_CTYPE_MASK, posix_loc, (locale_t) 0);
codeset = nl_langinfo_l (CODESET, loc);
stpcpy (stpcpy (posix_loc_and_modifier, posix_loc), modifier);
__set_charset_from_locale (posix_loc_and_modifier, codeset);
*bufptr_p = add_locale (*bufptr_p, posix_loc, codeset, false, modifier,
win_locale);
*bufptr_p = add_locale (*bufptr_p, posix_loc, "UTF-8", true, modifier,
@ -2270,12 +2270,13 @@ format_proc_locale_proc (LPWSTR win_locale, DWORD info, LPARAM param)
else
return TRUE;
stpcpy (stpcpy (posix_loc_and_modifier, posix_loc), modifier);
__set_charset_from_locale (posix_loc_and_modifier, codeset);
*bufptr_p = add_locale (*bufptr_p, posix_loc, codeset, false, modifier,
win_locale);
*bufptr_p = add_locale (*bufptr_p, posix_loc, "UTF-8", true, modifier,
win_locale);
freelocale (loc);
return TRUE;
}