From de56230876d4e06fa78a41a3af6a1c439dfe8f41 Mon Sep 17 00:00:00 2001 From: Takashi Yano Date: Fri, 4 Sep 2020 18:11:01 +0900 Subject: [PATCH] Cygwin: pty: Replace pty specific locale functions with nl_langinfo(). - Remove pty specific functions get_locale_from_env() and get_langinfo(), which are called from setup_locale(), and use nl_langinfo() instead. --- winsup/cygwin/fhandler_tty.cc | 119 ++-------------------------------- 1 file changed, 4 insertions(+), 115 deletions(-) diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index 8bf39c3e6..fd74a9f3d 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -26,6 +26,7 @@ details. */ #include #include "cygwait.h" #include "registry.h" +#include #ifndef PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE #define PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE 0x00020016 @@ -1813,127 +1814,15 @@ cs_names[] = { { 0, "NULL"} }; -static void -get_locale_from_env (char *locale) -{ - const char *env = NULL; - char lang[ENCODING_LEN + 1] = {0, }, country[ENCODING_LEN + 1] = {0, }; - env = getenv ("LC_ALL"); - if (env == NULL || !*env) - env = getenv ("LC_CTYPE"); - if (env == NULL || !*env) - env = getenv ("LANG"); - if (env == NULL || !*env) - { - if (GetLocaleInfo (LOCALE_CUSTOM_UI_DEFAULT, - LOCALE_SISO639LANGNAME, - lang, sizeof (lang))) - GetLocaleInfo (LOCALE_CUSTOM_UI_DEFAULT, - LOCALE_SISO3166CTRYNAME, - country, sizeof (country)); - else if (GetLocaleInfo (LOCALE_CUSTOM_DEFAULT, - LOCALE_SISO639LANGNAME, - lang, sizeof (lang))) - GetLocaleInfo (LOCALE_CUSTOM_DEFAULT, - LOCALE_SISO3166CTRYNAME, - country, sizeof (country)); - else if (GetLocaleInfo (LOCALE_USER_DEFAULT, - LOCALE_SISO639LANGNAME, - lang, sizeof (lang))) - GetLocaleInfo (LOCALE_USER_DEFAULT, - LOCALE_SISO3166CTRYNAME, - country, sizeof (country)); - else if (GetLocaleInfo (LOCALE_SYSTEM_DEFAULT, - LOCALE_SISO639LANGNAME, - lang, sizeof (lang))) - GetLocaleInfo (LOCALE_SYSTEM_DEFAULT, - LOCALE_SISO3166CTRYNAME, - country, sizeof (country)); - if (strlen (lang) && strlen (country)) - __small_sprintf (lang + strlen (lang), "_%s.UTF-8", country); - else - strcpy (lang , "C.UTF-8"); - env = lang; - } - strcpy (locale, env); -} - -static void -get_langinfo (char *locale_out, char *charset_out) -{ - /* Get locale from environment */ - char new_locale[ENCODING_LEN + 1]; - get_locale_from_env (new_locale); - - __locale_t loc; - memset (&loc, 0, sizeof (loc)); - const char *locale = __loadlocale (&loc, LC_CTYPE, new_locale); - if (!locale) - locale = "C"; - - const char *charset; - struct lc_ctype_T *lc_ctype = (struct lc_ctype_T *) loc.lc_cat[LC_CTYPE].ptr; - if (!lc_ctype) - charset = "ASCII"; - else - charset = lc_ctype->codeset; - - /* The following code is borrowed from nl_langinfo() - in newlib/libc/locale/nl_langinfo.c */ - /* Convert charset to Linux compatible codeset string. */ - if (charset[0] == 'A'/*SCII*/) - charset = "ANSI_X3.4-1968"; - else if (charset[0] == 'E') - { - if (strcmp (charset, "EUCJP") == 0) - charset = "EUC-JP"; - else if (strcmp (charset, "EUCKR") == 0) - charset = "EUC-KR"; - else if (strcmp (charset, "EUCCN") == 0) - charset = "GB2312"; - } - else if (charset[0] == 'C'/*Pxxxx*/) - { - if (strcmp (charset + 2, "874") == 0) - charset = "TIS-620"; - else if (strcmp (charset + 2, "20866") == 0) - charset = "KOI8-R"; - else if (strcmp (charset + 2, "21866") == 0) - charset = "KOI8-U"; - else if (strcmp (charset + 2, "101") == 0) - charset = "GEORGIAN-PS"; - else if (strcmp (charset + 2, "102") == 0) - charset = "PT154"; - } - else if (charset[0] == 'S'/*JIS*/) - { - /* Cygwin uses MSFT's implementation of SJIS, which differs - in some codepoints from the real thing, especially - 0x5c: yen sign instead of backslash, - 0x7e: overline instead of tilde. - We can't use the real SJIS since otherwise Win32 - pathnames would become invalid. OTOH, if we return - "SJIS" here, then libiconv will do mb<->wc conversion - differently to our internal functions. Therefore we - return what we really implement, CP932. This is handled - fine by libiconv. */ - charset = "CP932"; - } - - /* Set results */ - strcpy (locale_out, new_locale); - strcpy (charset_out, charset); -} - void fhandler_pty_slave::setup_locale (void) { if (get_ttyp ()->term_code_page != 0) return; - char locale[ENCODING_LEN + 1] = "C"; - char charset[ENCODING_LEN + 1] = "ASCII"; - get_langinfo (locale, charset); + extern void initial_setlocale (); + initial_setlocale (); + const char *charset = nl_langinfo (_NL_CTYPE_CODESET_NAME); /* Set terminal code page from locale */ /* This code is borrowed from mintty: charset.c */ -- 2.28.0