public inbox for cygwin-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin/main] Cygwin: locales: ignore @cjkwide and @cjksingle just like @cjknarrow
@ 2023-04-24 20:42 Corinna Vinschen
0 siblings, 0 replies; only message in thread
From: Corinna Vinschen @ 2023-04-24 20:42 UTC (permalink / raw)
To: cygwin-cvs
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=48ae24fd8159109077b71d41e528e08b325ded1f
commit 48ae24fd8159109077b71d41e528e08b325ded1f
Author: Corinna Vinschen <corinna@vinschen.de>
AuthorDate: Mon Apr 24 22:40:00 2023 +0200
Commit: Corinna Vinschen <corinna@vinschen.de>
CommitDate: Mon Apr 24 22:41:41 2023 +0200
Cygwin: locales: ignore @cjkwide and @cjksingle just like @cjknarrow
When the @cjkwide and @cjksingle modifiers have been added, the
patches missed to add checks for the new modifiers in the Cygwin
locale code. Along the same lines, commit c3e7f7609e46 forgot to
add a test for @cjksingle.
Merge check for cjk* modifiers into a macro set andf use that
throughout. Fix comments.
Fixes: f92f048528e6f ("Locale modifier @cjkwide to adjust ambiguous-width in non-CJK locales")
Fixes: c8204b106988f ("Locale modifier "@cjksingle" to enforce single-width CJK width.")
Fixes: c3e7f7609e46 ("Cygwin: locales: fix behaviour for @cjk* and @euro locales")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
winsup/cygwin/nlsfuncs.cc | 34 +++++++++++++++++++++-------------
1 file changed, 21 insertions(+), 13 deletions(-)
diff --git a/winsup/cygwin/nlsfuncs.cc b/winsup/cygwin/nlsfuncs.cc
index b097a6e5fa0a..7d17b1069e39 100644
--- a/winsup/cygwin/nlsfuncs.cc
+++ b/winsup/cygwin/nlsfuncs.cc
@@ -39,6 +39,18 @@ details. */
#define has_modifier(x) ((x)[0] && !strcmp (modifier, (x)))
+/* Check for @cjk* modifier. Try to be as fast as possible */
+#define __is_cjk_modifier(_in, _cmp, _L) ({ \
+ _in[1] == 'c' \
+ && _in[2] == 'j' \
+ && _in[3] == 'k'\
+ && (_cmp (_in + 4, _L##"narrow") == 0 \
+ || _cmp (_in + 4, _L##"wide") == 0 \
+ || _cmp (_in + 4, _L##"single") == 0); \
+})
+#define is_cjk_modifier(_in) __is_cjk_modifier(_in, strcmp, )
+#define w_is_cjk_modifier(_in) __is_cjk_modifier(_in, wcscmp, L)
+
/* ResolveLocaleName does not what we want. It converts anything which
vaguely resembles a locale into some other locale it supports. Bad
examples are: "en-XY" gets converted to "en-US", and worse, "ff-BF" gets
@@ -532,9 +544,8 @@ __set_lc_time_from_win (const char *name,
{
*c = '\0';
char *c2 = strchr (c + 1, '@');
- /* Ignore @cjknarrow modifier since it's a very personal thing between
- Cygwin and newlib... */
- if (c2 && strcmp (c2, "@cjknarrow"))
+ /* Ignore @cjk* modifiers, they are newlib specials. */
+ if (c2 && !is_cjk_modifier (c2))
memmove (c, c2, strlen (c2) + 1);
}
/* Now search in the alphabetically order lc_era array for the
@@ -1075,9 +1086,8 @@ __set_lc_messages_from_win (const char *name,
{
*c = '\0';
c2 = strchr (c + 1, '@');
- /* Ignore @cjknarrow modifier since it's a very personal thing between
- Cygwin and newlib... */
- if (c2 && strcmp (c2, "@cjknarrow"))
+ /* Ignore @cjk* modifiers, they are newlib specials. */
+ if (c2 && !is_cjk_modifier (c2))
memmove (c, c2, strlen (c2) + 1);
}
/* Now search in the alphabetically order lc_msg array for the
@@ -1537,11 +1547,9 @@ __set_charset_from_locale (const char *loc, char *charset)
modifier = strchr (loc, '@');
if ((c = strchr (locale, '.')))
stpcpy (c, modifier ?: "");
- /* Cut out @cjknarrow/@cjkwide modifier, both are newlib specials and
- don't affect the codeset. */
+ /* Ignore @cjk* modifiers, they are newlib specials. */
modifier = strchr (locale, '@');
- if (modifier && (!strcmp (modifier + 1, "cjknarrow")
- || !strcmp (modifier + 1, "cjkwide")))
+ if (modifier && is_cjk_modifier (modifier))
*modifier = '\0';
default_codeset_t srch_dc = { locale, NULL };
@@ -1702,9 +1710,9 @@ __set_locale_from_locale_alias (const char *locale, char *new_locale)
if (mbstowcs (wlocale, locale, ENCODING_LEN + 1) == (size_t) -1)
sys_mbstowcs (wlocale, ENCODING_LEN + 1, locale);
wlocale[ENCODING_LEN] = L'\0';
- /* Ignore @cjknarrow modifier since it's a very personal thing between
- Cygwin and newlib... */
- if ((wc = wcschr (wlocale, L'@')) && !wcscmp (wc + 1, L"cjknarrow"))
+ /* Ignore @cjk* modifiers, they are newlib specials. */
+ wc = wcschr (wlocale, L'@');
+ if (wc && w_is_cjk_modifier (wc))
*wc = L'\0';
while (fgets (alias_buf, LOCALE_ALIAS_LINE_LEN + 1, fp))
{
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-04-24 20:42 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-24 20:42 [newlib-cygwin/main] Cygwin: locales: ignore @cjkwide and @cjksingle just like @cjknarrow Corinna Vinschen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).