]> sourceware.org Git - newlib-cygwin.git/commitdiff
Cygwin: fix LC_CTYPE in global locale to be a real C.UTF-8 locale
authorCorinna Vinschen <corinna@vinschen.de>
Sat, 3 Dec 2022 15:16:15 +0000 (16:16 +0100)
committerCorinna Vinschen <corinna@vinschen.de>
Sat, 3 Dec 2022 15:16:30 +0000 (16:16 +0100)
https://cygwin.com/pipermail/cygwin/2022-December/252571.html

Cygwin's default locale is "C.UTF-8" as far as LC_CTYPE settings
are concerned.  However, while __global_locale contains fixed
mbtowc and wctomb pointers, the lc_ctype_T pointer is still pointing
to _C_ctype_locale, representing the standard "C" locale.

The problem with this is that the codeset name as well as MB_CUR_MAX
is wrong.

Fix this by introducing a new lc_ctype_T structure called
_C_utf8_ctype_locale, setting the default codeset to "UTF-8" and
MB_CUR_MAX to 6.  Use this as lc_ctype_T pointer in __global_locale
by default on Cygwin.

Fixes: a6a477fa8190 ("POSIX-1.2008 per-thread locales, groundwork part 1")
Co-Authored-By: Takashi Yano <takashi.yano@nifty.ne.jp>
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
newlib/libc/locale/lctype.c
newlib/libc/locale/locale.c
newlib/libc/locale/setlocale.h

index 6446697659b9a3ed4732507bf90274a96998abb3..a07ab68124d2ca5c7884f0bb9e3aa34d1ad46789 100644 (file)
@@ -39,6 +39,22 @@ const struct lc_ctype_T _C_ctype_locale = {
 #endif
 };
 
+#ifdef __CYGWIN__
+static char    numsix[] = { '\6', '\0'};
+
+const struct lc_ctype_T _C_utf8_ctype_locale = {
+       "UTF-8",                        /* codeset */
+       numsix                          /* mb_cur_max */
+#ifdef __HAVE_LOCALE_INFO_EXTENDED__
+       ,
+       { "0", "1", "2", "3", "4",      /* outdigits */
+         "5", "6", "7", "8", "9" },
+       { L"0", L"1", L"2", L"3", L"4", /* woutdigits */
+         L"5", L"6", L"7", L"8", L"9" }
+#endif
+};
+#endif
+
 /* NULL locale indicates global locale (called from setlocale) */
 int
 __ctype_load_locale (struct __locale_t *locale, const char *name,
index e523d2366641825c42f26b587c256341c61369e9..65e2b1833e5ebf7c22762591297af8f3f734b3c6 100644 (file)
@@ -272,10 +272,11 @@ struct __locale_t __global_locale =
     { NULL, NULL },                    /* LC_ALL */
 #ifdef __CYGWIN__
     { &_C_collate_locale, NULL },      /* LC_COLLATE */
+    { &_C_utf8_ctype_locale, NULL },   /* LC_CTYPE */
 #else
     { NULL, NULL },                    /* LC_COLLATE */
-#endif
     { &_C_ctype_locale, NULL },                /* LC_CTYPE */
+#endif
     { &_C_monetary_locale, NULL },     /* LC_MONETARY */
     { &_C_numeric_locale, NULL },      /* LC_NUMERIC */
     { &_C_time_locale, NULL },         /* LC_TIME */
index 9f7fd7c1092458aa09004cf164c9faa07a36b344..3530ec664dc2e6b60d06c94abbbdddf1ae54aa4c 100644 (file)
@@ -64,6 +64,9 @@ struct lc_ctype_T
 #endif
 };
 extern const struct lc_ctype_T _C_ctype_locale;
+#ifdef __CYGWIN__
+extern const struct lc_ctype_T _C_utf8_ctype_locale;
+#endif
 
 struct lc_monetary_T
 {
This page took 0.037643 seconds and 5 git commands to generate.