Re: [PATCH 2/2] quotearg: support USE_C_LOCALE variant

Paul Eggert <[email protected]>
Newsgroups gmane.comp.lib.gnulib.bugs
Organization UCLA Computer Science Department
Message-ID <[email protected]>
On 2026-05-25 15:15, Bruno Haible wrote:
> Paul Eggert wrote:
>> -  bool unibyte_locale = MB_CUR_MAX == 1;
>> +  bool unibyte_locale = USE_C_LOCALE || MB_CUR_MAX == 1;
> 
> I think this part causes a regression on platforms where the "C"
> locale uses UTF-8 encoding (macOS, Haiku):

Thanks for mentioning that. I installed the attached to try to fix this.
0001-quotearg-be-nicer-on-macOS-etc.patch (text/x-patch, 4.3 KB)
From 53d4558960659ba7c4e9e2757bfb0977a5027fae Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email protected]>
Date: Mon, 25 May 2026 17:08:48 -0700
Subject: [PATCH] quotearg: be nicer on macOS etc

Problem reported by Bruno Haible in:
https://lists.gnu.org/r/bug-gnulib/2026-05/msg00150.html
* lib/quotearg.c (C_LOCALE_MIGHT_BE_MULTIBYTE): New macro.
(wch, mbstate, mbs_clear, mbrtowch, chisprint, wchisprint
(quotearg_buffer_restyled): Fall back on <wchar.h> and <wctype.h>
functions if USE_C_LOCALE and C_LOCALE_MIGHT_BE_MULTIBYTE.
---
 ChangeLog      | 10 +++++++++
 lib/quotearg.c | 56 ++++++++++++++++++++++++++++++++++----------------
 2 files changed, 48 insertions(+), 18 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index b486911abe..ea72f7062e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2026-05-25  Paul Eggert  <[email protected]>
+
+	quotearg: be nicer on macOS etc
+	Problem reported by Bruno Haible in:
+	https://lists.gnu.org/r/bug-gnulib/2026-05/msg00150.html
+	* lib/quotearg.c (C_LOCALE_MIGHT_BE_MULTIBYTE): New macro.
+	(wch, mbstate, mbs_clear, mbrtowch, chisprint, wchisprint
+	(quotearg_buffer_restyled): Fall back on <wchar.h> and <wctype.h>
+	functions if USE_C_LOCALE and C_LOCALE_MIGHT_BE_MULTIBYTE.
+
 2026-05-25  Bruno Haible  <[email protected]>
 
 	mbuiterf: Implement multi-byte per encoding error (MEE) consistently.
diff --git a/lib/quotearg.c b/lib/quotearg.c
index 21014d4782..3c2bf946ed 100644
--- a/lib/quotearg.c
+++ b/lib/quotearg.c
@@ -39,16 +39,26 @@
 #include <stdlib.h>
 #include <string.h>
 
-/* If USE_C_LOCALE is set to 1, this file defines a function that uses the
+/* If USE_C_LOCALE is nonzero, this file defines a function that uses the
    "C" locale, regardless of the current locale.  Applications
    defining this macro might avoid the need for Gnulib's c32isprint,
-   gettext-h, mbrtoc32, mbsinit, mbszero, wchar-h, and uchar-h modules,
-   but they also need the c-ctype module.  */
+   gettext-h, mbrtoc32, mbsinit, wchar-h, and uchar-h modules,
+   but they also need the c-ctype module, and they rely on
+   the mbszero module defining MUSL_LIBC as needed.  */
 #ifndef USE_C_LOCALE
 # define USE_C_LOCALE 0
 #endif
 
-#if USE_C_LOCALE
+/* On recent-enough Android, Darwin/iOS/macOS and musl,
+   the "C" locale uses UTF-8, contrary to POSIX.  */
+#if (defined __ANDROID__ || (defined __APPLE__ && defined __MACH__) \
+     || defined MUSL_LIBC)
+# define C_LOCALE_MIGHT_BE_MULTIBYTE true
+#else
+# define C_LOCALE_MIGHT_BE_MULTIBYTE false
+#endif
+
+#if USE_C_LOCALE && !C_LOCALE_MIGHT_BE_MULTIBYTE
 # include <c-ctype.h>
 typedef unsigned char wch;
 typedef struct incomplete_mbstate *mbstate;
@@ -58,15 +68,20 @@ typedef struct incomplete_mbstate *mbstate;
 #else
 # include <ctype.h>
 # include <wchar.h>
-# include <uchar.h>
-typedef char32_t wch;
 typedef mbstate_t mbstate;
+# if USE_C_LOCALE
+# include <wctype.h>
+typedef wchar_t wch;
+# else
+#  include <uchar.h>
+typedef char32_t wch;
+# endif
 #endif
 
 static void
 mbs_clear (MAYBE_UNUSED mbstate *ps)
 {
-#if !USE_C_LOCALE
+#if !USE_C_LOCALE || C_LOCALE_MIGHT_BE_MULTIBYTE
   mbszero (ps);
 #endif
 }
@@ -74,30 +89,34 @@ mbs_clear (MAYBE_UNUSED mbstate *ps)
 static size_t
 mbrtowch (wch *pwc, char const *s, size_t n, MAYBE_UNUSED mbstate *ps)
 {
-#if USE_C_LOCALE
-  return n && (*pwc = *s);
-#else
+#if !USE_C_LOCALE
   return mbrtoc32 (pwc, s, n, ps);
+#elif C_LOCALE_MIGHT_BE_MULTIBYTE
+  return mbrtowc (pwc, s, n, ps);
+#else
+  return n && (*pwc = *s);
 #endif
 }
 
 static bool
-wchisprint (wch w)
+chisprint (unsigned char c)
 {
 #if USE_C_LOCALE
-  return c_isprint (w);
+  return c_isprint (c);
 #else
-  return c32isprint (w);
+  return isprint (c) != 0;
 #endif
 }
 
 static bool
-chisprint (unsigned char c)
+wchisprint (wch w)
 {
-#if USE_C_LOCALE
-  return c_isprint (c);
+#if !USE_C_LOCALE
+  return c32isprint (w);
+#elif C_LOCALE_MIGHT_BE_MULTIBYTE
+  return iswprint (w);
 #else
-  return isprint (c) != 0;
+  return chisprint (w);
 #endif
 }
 
@@ -317,7 +336,8 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
                           char const *left_quote,
                           char const *right_quote)
 {
-  bool unibyte_locale = USE_C_LOCALE || MB_CUR_MAX == 1;
+  bool unibyte_locale = ((USE_C_LOCALE && !C_LOCALE_MIGHT_BE_MULTIBYTE)
+                         || MB_CUR_MAX == 1);
 
   size_t len = 0;
   size_t orig_buffersize = 0;
-- 
2.53.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.