Re: [PATCH] handle casing of i/I in Turkic languages

Corinna Vinschen <[email protected]> Mon, 2 Feb 2026 14:45:42 +0100
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
Hi Thomas,


thanks for the patch.  Just one point:

On Feb  2 14:21, Thomas Wolff wrote:

> From 99df2722cb39dcf0290dfcd14d7e81ec87853e15 Mon Sep 17 00:00:00 2001
> From: Thomas Wolff <[email protected]>
> Date: Mon, 2 Feb 2026 00:00:00 +0000
> Subject: [PATCH] towupper/towlower: handle special casing of "i"/"I" for
>  Turkic languages

This is a non-trivial patch, so it would be nice to have a non-trivial
commit message explaining what your doing and why.  To the uninformed
reader, the explicit exception for the turk language looks arbitrary.

Care to add a bit of text?


Thanks,
Corinna



> 
> ---
>  newlib/libc/ctype/towctrans.c   |  2 +-
>  newlib/libc/ctype/towctrans_l.c | 23 +++++++++++++++++++----
>  2 files changed, 20 insertions(+), 5 deletions(-)
> 
> diff --git a/newlib/libc/ctype/towctrans.c b/newlib/libc/ctype/towctrans.c
> index 176aa3d9d..2cd34184e 100644
> --- a/newlib/libc/ctype/towctrans.c
> +++ b/newlib/libc/ctype/towctrans.c
> @@ -81,7 +81,7 @@ _towctrans_r (struct _reent *r,
>  	wctrans_t w)
>  {
>    if (w == WCT_TOLOWER || w == WCT_TOUPPER)
> -    return towctrans_l (c, w, 0);
> +    return towctrans_l (c, w, LC_GLOBAL_LOCALE);
>    else
>      {
>        // skipping this because it was causing trouble (cygwin crash)
> diff --git a/newlib/libc/ctype/towctrans_l.c b/newlib/libc/ctype/towctrans_l.c
> index e94d6f492..2b843f302 100644
> --- a/newlib/libc/ctype/towctrans_l.c
> +++ b/newlib/libc/ctype/towctrans_l.c
> @@ -72,9 +72,21 @@ bisearch (wint_t ucs, const struct caseconv_entry *table, int max)
>    return 0;
>  }
>  
> +static int
> +isturk (struct __locale_t *locale)
> +{
> +  const char * loc = getlocalename_l (LC_CTYPE, locale);
> +  if (!loc)
> +    return 0;
> +  return 0 == strncmp (loc, "tr", 2) || 0 == strncmp (loc, "az", 2);
> +}
> +
>  static wint_t
> -toulower (wint_t c)
> +toulower (wint_t c, struct __locale_t *locale)
>  {
> +  if (c == 'I' && isturk (locale))
> +    return 0x131; // LATIN SMALL LETTER DOTLESS I
> +
>    const struct caseconv_entry * cce =
>      bisearch(c, caseconv_table,
>               sizeof(caseconv_table) / sizeof(*caseconv_table) - 1);
> @@ -108,8 +120,11 @@ toulower (wint_t c)
>  }
>  
>  static wint_t
> -touupper (wint_t c)
> +touupper (wint_t c, struct __locale_t *locale)
>  {
> +  if (c == 'i' && isturk (locale))
> +    return 0x130; // LATIN CAPITAL LETTER I WITH DOT ABOVE
> +
>    const struct caseconv_entry * cce =
>      bisearch(c, caseconv_table,
>               sizeof(caseconv_table) / sizeof(*caseconv_table) - 1);
> @@ -151,9 +166,9 @@ towctrans_l (wint_t c, wctrans_t w, struct __locale_t *locale)
>    wint_t u = _jp2uc_l (c, locale);
>    wint_t res;
>    if (w == WCT_TOLOWER)
> -    res = toulower (u);
> +    res = toulower (u, locale);
>    else if (w == WCT_TOUPPER)
> -    res = touupper (u);
> +    res = touupper (u, locale);
>    else
>      {
>        // skipping the errno setting that was previously involved
> -- 
> 2.51.0
>