]> Savannah Git Hosting - gnulib.git/commitdiff
c32rtomb: Add a sanity check, working around Solaris 11 OmniOS.
authorBruno Haible <bruno@clisp.org>
Sun, 9 Jun 2024 17:16:01 +0000 (19:16 +0200)
committerBruno Haible <bruno@clisp.org>
Thu, 13 Jun 2024 15:01:04 +0000 (17:01 +0200)
* m4/c32rtomb.m4 (gl_CHECK_FUNC_C32RTOMB): New macro, extracted from
gl_FUNC_C32RTOMB.
(gl_C32RTOMB_SANITYCHECK): New macro.
(gl_FUNC_C32RTOMB): Require gl_CHECK_FUNC_C32RTOMB and
gl_C32RTOMB_SANITYCHECK. If HAVE_WORKING_C32RTOMB is 0, set
REPLACE_C32RTOMB.
* lib/c32rtomb.c (c32rtomb): Together with HAVE_WORKING_MBRTOC32, test
also HAVE_WORKING_C32RTOMB.

* m4/mbrtoc32.m4 (gl_PREREQ_MBRTOC32): Require gl_C32RTOMB_SANITYCHECK.
* lib/mbrtoc32.c (mbrtoc32): Together with HAVE_WORKING_MBRTOC32, test
also HAVE_WORKING_C32RTOMB.
* modules/mbrtoc32 (Files): Add m4/c32rtomb.m4.

* lib/btoc32.c (btoc32): Together with HAVE_WORKING_MBRTOC32, test also
HAVE_WORKING_C32RTOMB.

* lib/mbsrtoc32s.c: Together with HAVE_WORKING_MBRTOC32, test also
HAVE_WORKING_C32RTOMB.

* lib/mbsnrtoc32s.c: Together with HAVE_WORKING_MBRTOC32, test also
HAVE_WORKING_C32RTOMB.

* lib/c32tob.c (c32tob): Together with HAVE_WORKING_MBRTOC32, test also
HAVE_WORKING_C32RTOMB.
* modules/c32tob (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.

* lib/c32srtombs.c: Together with HAVE_WORKING_MBRTOC32, test also
HAVE_WORKING_C32RTOMB.

* lib/c32snrtombs.c: Together with HAVE_WORKING_MBRTOC32, test also
HAVE_WORKING_C32RTOMB.

* lib/c32is-impl.h (FUNC): Together with HAVE_WORKING_MBRTOC32, test
also HAVE_WORKING_C32RTOMB.
* modules/c32isalnum (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.
* modules/c32isalpha (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.
* modules/c32isblank (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.
* modules/c32iscntrl (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.
* modules/c32isdigit (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.
* modules/c32isgraph (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.
* modules/c32islower (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.
* modules/c32isprint (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.
* modules/c32ispunct (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.
* modules/c32isspace (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.
* modules/c32isupper (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.
* modules/c32isxdigit (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.

* lib/c32to-impl.h (FUNC): Together with HAVE_WORKING_MBRTOC32, test
also HAVE_WORKING_C32RTOMB.
* modules/c32tolower (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.
* modules/c32toupper (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.

* lib/c32width.c (c32width): Together with HAVE_WORKING_MBRTOC32, test
also HAVE_WORKING_C32RTOMB.
* modules/c32width (Files): Add m4/c32rtomb.m4.
(configure.ac): Require gl_C32RTOMB_SANITYCHECK.

31 files changed:
ChangeLog
lib/btoc32.c
lib/c32is-impl.h
lib/c32rtomb.c
lib/c32snrtombs.c
lib/c32srtombs.c
lib/c32to-impl.h
lib/c32tob.c
lib/c32width.c
lib/mbrtoc32.c
lib/mbsnrtoc32s.c
lib/mbsrtoc32s.c
m4/c32rtomb.m4
m4/mbrtoc32.m4
modules/c32isalnum
modules/c32isalpha
modules/c32isblank
modules/c32iscntrl
modules/c32isdigit
modules/c32isgraph
modules/c32islower
modules/c32isprint
modules/c32ispunct
modules/c32isspace
modules/c32isupper
modules/c32isxdigit
modules/c32tob
modules/c32tolower
modules/c32toupper
modules/c32width
modules/mbrtoc32

index f5bc255614531ad96dabb4d33b4de97a4373f842..3da31c1e4f5f47c8c2659e2628634f51659b4802 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,79 @@
+2024-06-09  Bruno Haible  <bruno@clisp.org>
+
+       c32rtomb: Add a sanity check, working around Solaris 11 OmniOS.
+       * m4/c32rtomb.m4 (gl_CHECK_FUNC_C32RTOMB): New macro, extracted from
+       gl_FUNC_C32RTOMB.
+       (gl_C32RTOMB_SANITYCHECK): New macro.
+       (gl_FUNC_C32RTOMB): Require gl_CHECK_FUNC_C32RTOMB and
+       gl_C32RTOMB_SANITYCHECK. If HAVE_WORKING_C32RTOMB is 0, set
+       REPLACE_C32RTOMB.
+       * lib/c32rtomb.c (c32rtomb): Together with HAVE_WORKING_MBRTOC32, test
+       also HAVE_WORKING_C32RTOMB.
+       --
+       * m4/mbrtoc32.m4 (gl_PREREQ_MBRTOC32): Require gl_C32RTOMB_SANITYCHECK.
+       * lib/mbrtoc32.c (mbrtoc32): Together with HAVE_WORKING_MBRTOC32, test
+       also HAVE_WORKING_C32RTOMB.
+       * modules/mbrtoc32 (Files): Add m4/c32rtomb.m4.
+       --
+       * lib/btoc32.c (btoc32): Together with HAVE_WORKING_MBRTOC32, test also
+       HAVE_WORKING_C32RTOMB.
+       --
+       * lib/mbsrtoc32s.c: Together with HAVE_WORKING_MBRTOC32, test also
+       HAVE_WORKING_C32RTOMB.
+       --
+       * lib/mbsnrtoc32s.c: Together with HAVE_WORKING_MBRTOC32, test also
+       HAVE_WORKING_C32RTOMB.
+       --
+       * lib/c32tob.c (c32tob): Together with HAVE_WORKING_MBRTOC32, test also
+       HAVE_WORKING_C32RTOMB.
+       * modules/c32tob (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+       --
+       * lib/c32srtombs.c: Together with HAVE_WORKING_MBRTOC32, test also
+       HAVE_WORKING_C32RTOMB.
+       --
+       * lib/c32snrtombs.c: Together with HAVE_WORKING_MBRTOC32, test also
+       HAVE_WORKING_C32RTOMB.
+       --
+       * lib/c32is-impl.h (FUNC): Together with HAVE_WORKING_MBRTOC32, test
+       also HAVE_WORKING_C32RTOMB.
+       * modules/c32isalnum (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+       * modules/c32isalpha (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+       * modules/c32isblank (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+       * modules/c32iscntrl (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+       * modules/c32isdigit (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+       * modules/c32isgraph (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+       * modules/c32islower (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+       * modules/c32isprint (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+       * modules/c32ispunct (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+       * modules/c32isspace (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+       * modules/c32isupper (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+       * modules/c32isxdigit (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+       --
+       * lib/c32to-impl.h (FUNC): Together with HAVE_WORKING_MBRTOC32, test
+       also HAVE_WORKING_C32RTOMB.
+       * modules/c32tolower (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+       * modules/c32toupper (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+       --
+       * lib/c32width.c (c32width): Together with HAVE_WORKING_MBRTOC32, test
+       also HAVE_WORKING_C32RTOMB.
+       * modules/c32width (Files): Add m4/c32rtomb.m4.
+       (configure.ac): Require gl_C32RTOMB_SANITYCHECK.
+
 2024-06-08  Bruno Haible  <bruno@clisp.org>
 
        c32isblank tests: Avoid test failure on NetBSD 10.0.
index 4f223059a751e6ae5a6532052224b2ef5ef2732d..469148c9dc28973f1e23c7802dc404041e425c12 100644 (file)
@@ -36,7 +36,7 @@ _GL_EXTERN_INLINE
 wint_t
 btoc32 (int c)
 {
-#if HAVE_WORKING_MBRTOC32 && !_GL_WCHAR_T_IS_UCS4
+#if HAVE_WORKING_MBRTOC32 && HAVE_WORKING_C32RTOMB && !_GL_WCHAR_T_IS_UCS4
   /* The char32_t encoding of a multibyte character may be different than its
      wchar_t encoding.  */
   if (c != EOF)
index 084b3a02cf79bffa4ecf7670b3d798c4b6db192a..9e9802583fe1efbd64d1260468303cad03cab6dd 100644 (file)
@@ -57,7 +57,7 @@ FUNC (wint_t wc)
   else
     return 0;
 
-#elif HAVE_WORKING_MBRTOC32             /* glibc, Android */
+#elif HAVE_WORKING_MBRTOC32 && HAVE_WORKING_C32RTOMB /* glibc, Android */
   /* mbrtoc32() is essentially defined by the system libc.  */
 
 # if _GL_WCHAR_T_IS_UCS4
index 260bf097f7e269059f59a18087569a0f6714a5f4..c899af1b2e1797d931a18b7c57196af6d9c80ddf 100644 (file)
@@ -36,7 +36,7 @@ size_t
 c32rtomb (char *s, char32_t wc, mbstate_t *ps)
 #undef c32rtomb
 {
-#if HAVE_WORKING_MBRTOC32
+#if HAVE_WORKING_MBRTOC32 && HAVE_WORKING_C32RTOMB
 
 # if C32RTOMB_RETVAL_BUG
   if (s == NULL)
index 23371c4b1e53d83172a0d4157a8402496d83336a..3a0efdfc4dffcf4c7c9f6ba5e19bd7773b87cb53 100644 (file)
@@ -24,7 +24,7 @@
 
 #include <wchar.h>
 
-#if (HAVE_WORKING_MBRTOC32 && !_GL_WCHAR_T_IS_UCS4) || (GL_CHAR32_T_IS_UNICODE && GL_CHAR32_T_VS_WCHAR_T_NEEDS_CONVERSION) || _GL_SMALL_WCHAR_T
+#if (HAVE_WORKING_MBRTOC32 && HAVE_WORKING_C32RTOMB && !_GL_WCHAR_T_IS_UCS4) || (GL_CHAR32_T_IS_UNICODE && GL_CHAR32_T_VS_WCHAR_T_NEEDS_CONVERSION) || _GL_SMALL_WCHAR_T
 /* The char32_t encoding of a multibyte character may be different than its
    wchar_t encoding, or char32_t is wider than wchar_t.  */
 
index 4fc3bb1b9bd09de76bea3de7c5208f7302825297..7cc6f26d042c17eed704d0713cf919c180c4991b 100644 (file)
@@ -24,7 +24,7 @@
 
 #include <wchar.h>
 
-#if (HAVE_WORKING_MBRTOC32 && !_GL_WCHAR_T_IS_UCS4) || (GL_CHAR32_T_IS_UNICODE && GL_CHAR32_T_VS_WCHAR_T_NEEDS_CONVERSION) || _GL_SMALL_WCHAR_T
+#if (HAVE_WORKING_MBRTOC32 && HAVE_WORKING_C32RTOMB && !_GL_WCHAR_T_IS_UCS4) || (GL_CHAR32_T_IS_UNICODE && GL_CHAR32_T_VS_WCHAR_T_NEEDS_CONVERSION) || _GL_SMALL_WCHAR_T
 /* The char32_t encoding of a multibyte character may be different than its
    wchar_t encoding, or char32_t is wider than wchar_t.  */
 
index e94fa7dc9c26b1f0938630b4101f009f5dbcdba0..32039c612d0c4cbab356db82cf1451470ce94435 100644 (file)
@@ -53,7 +53,7 @@ FUNC (wint_t wc)
   else
     return wc;
 
-#elif HAVE_WORKING_MBRTOC32             /* glibc, Android */
+#elif HAVE_WORKING_MBRTOC32 && HAVE_WORKING_C32RTOMB /* glibc, Android */
   /* mbrtoc32() is essentially defined by the system libc.  */
 
 # if _GL_WCHAR_T_IS_UCS4
index 901c9249f86dcaf5dcc10838d6f8e71a0401a696..eb817cc0cc320a8cb171055528dd30781b095c7f 100644 (file)
@@ -36,7 +36,7 @@ _GL_EXTERN_INLINE
 int
 c32tob (wint_t wc)
 {
-#if HAVE_WORKING_MBRTOC32 && !_GL_WCHAR_T_IS_UCS4
+#if HAVE_WORKING_MBRTOC32 && HAVE_WORKING_C32RTOMB && !_GL_WCHAR_T_IS_UCS4
   /* The char32_t encoding of a multibyte character may be different than its
      wchar_t encoding.  */
   if (wc != WEOF)
index 7edf0088f9cef78cc635c1c28e3a47b93f557fe0..37ce1a57dc58f69051681aaf1fa4ceea7a6c2959 100644 (file)
@@ -58,7 +58,7 @@ c32width (char32_t wc)
   else
     return wcwidth (wc);
 
-#elif HAVE_WORKING_MBRTOC32             /* glibc, Android */
+#elif HAVE_WORKING_MBRTOC32 && HAVE_WORKING_C32RTOMB /* glibc, Android */
   /* mbrtoc32() is essentially defined by the system libc.  */
 
 # if _GL_WCHAR_T_IS_UCS4
index d97912876c833a5484505016e04dea9badb0fbf2..771c857d7de7af59f6160d93ed843e3ed1a0d50b 100644 (file)
@@ -117,7 +117,7 @@ mbrtoc32 (char32_t *pwc, const char *s, size_t n, mbstate_t *ps)
   if (ps == NULL)
     ps = &internal_state;
 
-# if HAVE_WORKING_MBRTOC32 && !MBRTOC32_MULTIBYTE_LOCALE_BUG
+# if HAVE_WORKING_MBRTOC32 && HAVE_WORKING_C32RTOMB && !MBRTOC32_MULTIBYTE_LOCALE_BUG
   /* mbrtoc32() may produce different values for wc than mbrtowc().  Therefore
      use mbrtoc32().  */
 
index 47aa70ead25a79366c83d327f9bfe3c982bdcdc4..a4d13042ff38362f7f80cb277d396480ed03be1c 100644 (file)
@@ -23,7 +23,7 @@
 
 #include <wchar.h>
 
-#if (HAVE_WORKING_MBRTOC32 && !_GL_WCHAR_T_IS_UCS4) || (GL_CHAR32_T_IS_UNICODE && GL_CHAR32_T_VS_WCHAR_T_NEEDS_CONVERSION) || _GL_SMALL_WCHAR_T
+#if (HAVE_WORKING_MBRTOC32 && HAVE_WORKING_C32RTOMB && !_GL_WCHAR_T_IS_UCS4) || (GL_CHAR32_T_IS_UNICODE && GL_CHAR32_T_VS_WCHAR_T_NEEDS_CONVERSION) || _GL_SMALL_WCHAR_T
 /* The char32_t encoding of a multibyte character may be different than its
    wchar_t encoding, or char32_t is wider than wchar_t.  */
 
index 896dc51207903d569329deb263668d238d7e5883..e68b5e4f8f158ea103dfdd9f68623a78815bcd7f 100644 (file)
@@ -23,7 +23,7 @@
 
 #include <wchar.h>
 
-#if (HAVE_WORKING_MBRTOC32 && !_GL_WCHAR_T_IS_UCS4) || (GL_CHAR32_T_IS_UNICODE && GL_CHAR32_T_VS_WCHAR_T_NEEDS_CONVERSION) || _GL_SMALL_WCHAR_T
+#if (HAVE_WORKING_MBRTOC32 && HAVE_WORKING_C32RTOMB && !_GL_WCHAR_T_IS_UCS4) || (GL_CHAR32_T_IS_UNICODE && GL_CHAR32_T_VS_WCHAR_T_NEEDS_CONVERSION) || _GL_SMALL_WCHAR_T
 /* The char32_t encoding of a multibyte character may be different than its
    wchar_t encoding, or char32_t is wider than wchar_t.  */
 
index 56faaa578f4b46b1350ef62793aef9f87e2deb8f..7723c58f532ae2a550217c0a37d2dd4e28e9266a 100644 (file)
@@ -1,4 +1,4 @@
-# c32rtomb.m4 serial 7
+# c32rtomb.m4 serial 8
 dnl Copyright (C) 2020-2024 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -10,7 +10,61 @@ AC_DEFUN([gl_FUNC_C32RTOMB],
   AC_REQUIRE([AC_CANONICAL_HOST])
 
   AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+  AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 
+  AC_REQUIRE([gl_CHECK_FUNC_C32RTOMB])
+  if test $gl_cv_func_c32rtomb = no; then
+    HAVE_C32RTOMB=0
+  else
+    dnl When we override mbrtoc32, redefining the meaning of the char32_t
+    dnl values, we need to override c32rtomb as well, for consistency.
+    if test $HAVE_WORKING_MBRTOC32 = 0; then
+      REPLACE_C32RTOMB=1
+    fi
+    AC_CACHE_CHECK([whether c32rtomb return value is correct],
+      [gl_cv_func_c32rtomb_retval],
+      [
+        dnl Initial guess, used when cross-compiling.
+changequote(,)dnl
+        case "$host_os" in
+          # Guess no on AIX.
+          aix*) gl_cv_func_c32rtomb_retval="guessing no" ;;
+          # Guess yes otherwise.
+          *)    gl_cv_func_c32rtomb_retval="guessing yes" ;;
+        esac
+changequote([,])dnl
+        AC_RUN_IFELSE(
+          [AC_LANG_SOURCE([[
+#include <stddef.h>
+#ifdef __HAIKU__
+ #include <stdint.h>
+#endif
+#include <uchar.h>
+int main ()
+{
+  int result = 0;
+  if (c32rtomb (NULL, 0, NULL) != 1)
+    result |= 1;
+  return result;
+}]])],
+          [gl_cv_func_c32rtomb_retval=yes],
+          [gl_cv_func_c32rtomb_retval=no],
+          [:])
+      ])
+    case "$gl_cv_func_c32rtomb_retval" in
+      *yes) ;;
+      *) AC_DEFINE([C32RTOMB_RETVAL_BUG], [1],
+           [Define if the c32rtomb function has an incorrect return value.])
+         REPLACE_C32RTOMB=1 ;;
+    esac
+    if test $HAVE_WORKING_C32RTOMB = 0; then
+      REPLACE_C32RTOMB=1
+    fi
+  fi
+])
+
+AC_DEFUN([gl_CHECK_FUNC_C32RTOMB],
+[
   dnl Cf. gl_CHECK_FUNCS_ANDROID
   AC_CHECK_DECL([c32rtomb], , ,
     [[#ifdef __HAIKU__
@@ -40,29 +94,49 @@ AC_DEFUN([gl_FUNC_C32RTOMB],
   else
     gl_cv_func_c32rtomb=no
   fi
-  if test $gl_cv_func_c32rtomb = no; then
-    HAVE_C32RTOMB=0
+])
+
+dnl Test whether c32rtomb works not worse than wcrtomb.
+dnl Result is HAVE_WORKING_C32RTOMB.
+
+AC_DEFUN([gl_C32RTOMB_SANITYCHECK],
+[
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([gl_TYPE_CHAR32_T])
+  AC_REQUIRE([gl_CHECK_FUNC_C32RTOMB])
+  AC_REQUIRE([gt_LOCALE_ZH_CN])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  if test $GNULIBHEADERS_OVERRIDE_CHAR32_T = 1 || test $gl_cv_func_c32rtomb = no; then
+    HAVE_WORKING_C32RTOMB=0
   else
-    dnl When we override mbrtoc32, redefining the meaning of the char32_t
-    dnl values, we need to override c32rtomb as well, for consistency.
-    if test $HAVE_WORKING_MBRTOC32 = 0; then
-      REPLACE_C32RTOMB=1
-    fi
-    AC_CACHE_CHECK([whether c32rtomb return value is correct],
-      [gl_cv_func_c32rtomb_retval],
+    AC_CACHE_CHECK([whether c32rtomb works as well as wcrtomb],
+      [gl_cv_func_c32rtomb_sanitycheck],
       [
-        dnl Initial guess, used when cross-compiling.
+        dnl Initial guess, used when cross-compiling or when no suitable locale
+        dnl is present.
 changequote(,)dnl
         case "$host_os" in
-          # Guess no on AIX.
-          aix*) gl_cv_func_c32rtomb_retval="guessing no" ;;
+          # Guess no on Solaris derivatives.
+          solaris*)
+            if test -f /etc/release && grep 'Oracle Solaris' /etc/release >/dev/null; then
+              gl_cv_func_c32rtomb_sanitycheck="guessing yes"
+            else
+              gl_cv_func_c32rtomb_sanitycheck="guessing no"
+            fi
+            ;;
           # Guess yes otherwise.
-          *)    gl_cv_func_c32rtomb_retval="guessing yes" ;;
+          *)
+            gl_cv_func_c32rtomb_sanitycheck="guessing yes"
+            ;;
         esac
 changequote([,])dnl
-        AC_RUN_IFELSE(
-          [AC_LANG_SOURCE([[
-#include <stddef.h>
+        if test $LOCALE_ZH_CN != none; then
+          AC_RUN_IFELSE(
+            [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
 #ifdef __HAIKU__
  #include <stdint.h>
 #endif
@@ -70,19 +144,42 @@ changequote([,])dnl
 int main ()
 {
   int result = 0;
-  if (c32rtomb (NULL, 0, NULL) != 1)
-    result |= 1;
+  /* This fails on Solaris 11 OmniOS:
+     c32rtomb returns (size_t)-1.
+     wcrtomb returns 4 (correct).  */
+  if (strcmp ("$LOCALE_ZH_CN", "none") != 0
+      && setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+    {
+      mbstate_t state;
+      wchar_t wc = (wchar_t) 0xBADFACE;
+      char buf[16];
+      memset (&state, '\0', sizeof (mbstate_t));
+      if (mbrtowc (&wc, "\201\060\211\070", 4, &state) == 4
+          && wcrtomb (buf, wc, NULL) == 4
+          && memcmp (buf, "\201\060\211\070", 4) == 0)
+        {
+          char32_t c32 = (wchar_t) 0xBADFACE;
+          memset (&state, '\0', sizeof (mbstate_t));
+          if (mbrtoc32 (&c32, "\201\060\211\070", 4, &state) == 4
+              && c32rtomb (buf, c32, NULL) != 4)
+            result |= 1;
+        }
+    }
   return result;
 }]])],
-          [gl_cv_func_c32rtomb_retval=yes],
-          [gl_cv_func_c32rtomb_retval=no],
-          [:])
+            [gl_cv_func_c32rtomb_sanitycheck=yes],
+            [gl_cv_func_c32rtomb_sanitycheck=no],
+            [:])
+        fi
       ])
-    case "$gl_cv_func_c32rtomb_retval" in
-      *yes) ;;
-      *) AC_DEFINE([C32RTOMB_RETVAL_BUG], [1],
-           [Define if the c32rtomb function has an incorrect return value.])
-         REPLACE_C32RTOMB=1 ;;
+    case "$gl_cv_func_c32rtomb_sanitycheck" in
+      *yes)
+        HAVE_WORKING_C32RTOMB=1
+        AC_DEFINE([HAVE_WORKING_C32RTOMB], [1],
+          [Define if the c32rtomb function basically works.])
+        ;;
+      *) HAVE_WORKING_C32RTOMB=0 ;;
     esac
   fi
+  AC_SUBST([HAVE_WORKING_C32RTOMB])
 ])
index 4681f9ff616489ec50e9e081d8a92dc0a9e8749b..e7ea995633b2cf953a9b8b0c94cd913ed5e19a2f 100644 (file)
@@ -1,4 +1,4 @@
-# mbrtoc32.m4 serial 19
+# mbrtoc32.m4 serial 20
 dnl Copyright (C) 2014-2024 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -229,7 +229,7 @@ AC_DEFUN([gl_MBRTOC32_SANITYCHECK],
   AC_REQUIRE([gl_CHECK_FUNC_MBRTOC32])
   AC_REQUIRE([gt_LOCALE_FR])
   AC_REQUIRE([gt_LOCALE_ZH_CN])
-  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  AC_REQUIRE([AC_CANONICAL_HOST])
   if test $GNULIBHEADERS_OVERRIDE_CHAR32_T = 1 || test $gl_cv_func_mbrtoc32 = no; then
     HAVE_WORKING_MBRTOC32=0
   else
@@ -319,5 +319,6 @@ int main ()
 
 # Prerequisites of lib/mbrtoc32.c and lib/lc-charset-dispatch.c.
 AC_DEFUN([gl_PREREQ_MBRTOC32], [
+  AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
   :
 ])
index f202a37cf0a2c8675c5ac487f3b2166e90e83579..4626d153738495f58159cc638b305e809efcfe94 100644 (file)
@@ -5,6 +5,7 @@ Files:
 lib/c32isalnum.c
 lib/c32is-impl.h
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/mbrtowc.m4
 m4/locale-fr.m4
 m4/locale-ja.m4
@@ -26,6 +27,7 @@ dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
 dnl determined.  It describes how mbrtoc32 is implemented.
 AC_REQUIRE([gl_MBSTATE_T_BROKEN])
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32isalnum])
 
 Makefile.am:
index 1fc1ee58dea3439930796c231c314d4cfddb605c..8d2a33ebce8a4c277476f06f32717e16888f2db6 100644 (file)
@@ -5,6 +5,7 @@ Files:
 lib/c32isalpha.c
 lib/c32is-impl.h
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/mbrtowc.m4
 m4/locale-fr.m4
 m4/locale-ja.m4
@@ -26,6 +27,7 @@ dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
 dnl determined.  It describes how mbrtoc32 is implemented.
 AC_REQUIRE([gl_MBSTATE_T_BROKEN])
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32isalpha])
 
 Makefile.am:
index ad1e7c139fddb13bce48ce81b809f3ac54fbb973..08d9038790b7cc75bdb4b13ebb11d8b5a13ca8db 100644 (file)
@@ -5,6 +5,7 @@ Files:
 lib/c32isblank.c
 lib/c32is-impl.h
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/mbrtowc.m4
 m4/locale-fr.m4
 m4/locale-ja.m4
@@ -27,6 +28,7 @@ dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
 dnl determined.  It describes how mbrtoc32 is implemented.
 AC_REQUIRE([gl_MBSTATE_T_BROKEN])
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32isblank])
 
 Makefile.am:
index 2d423795e91b3da0b75a5edd08f81882a29fd0e5..b1a56eba04334a821f7d28a65d1387a2861dbedc 100644 (file)
@@ -5,6 +5,7 @@ Files:
 lib/c32iscntrl.c
 lib/c32is-impl.h
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/mbrtowc.m4
 m4/locale-fr.m4
 m4/locale-ja.m4
@@ -26,6 +27,7 @@ dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
 dnl determined.  It describes how mbrtoc32 is implemented.
 AC_REQUIRE([gl_MBSTATE_T_BROKEN])
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32iscntrl])
 
 Makefile.am:
index 631f50f9174e63deb07ab6b13328854a195a9f5a..9f295b3ad18bbfa3d9caf5f368eb707377d02f67 100644 (file)
@@ -5,6 +5,7 @@ Files:
 lib/c32isdigit.c
 lib/c32is-impl.h
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/mbrtowc.m4
 m4/locale-fr.m4
 m4/locale-ja.m4
@@ -27,6 +28,7 @@ dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
 dnl determined.  It describes how mbrtoc32 is implemented.
 AC_REQUIRE([gl_MBSTATE_T_BROKEN])
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32isdigit])
 
 Makefile.am:
index 48b5e7b10ad078d4943b0bec35c40028fac724f0..b5a02b040502577c29335ff6670ff8d05296fc0c 100644 (file)
@@ -5,6 +5,7 @@ Files:
 lib/c32isgraph.c
 lib/c32is-impl.h
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/mbrtowc.m4
 m4/locale-fr.m4
 m4/locale-ja.m4
@@ -26,6 +27,7 @@ dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
 dnl determined.  It describes how mbrtoc32 is implemented.
 AC_REQUIRE([gl_MBSTATE_T_BROKEN])
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32isgraph])
 
 Makefile.am:
index 40563f6f0acb9e5c729c7a26157d0ffb67f6e2f7..77f17a861f7ad9d5184ea5860e2199a6d597696c 100644 (file)
@@ -5,6 +5,7 @@ Files:
 lib/c32islower.c
 lib/c32is-impl.h
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/mbrtowc.m4
 m4/locale-fr.m4
 m4/locale-ja.m4
@@ -26,6 +27,7 @@ dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
 dnl determined.  It describes how mbrtoc32 is implemented.
 AC_REQUIRE([gl_MBSTATE_T_BROKEN])
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32islower])
 
 Makefile.am:
index 1fc5d22a6597d1e9ac0e0c54f089480539f455f5..10f74e6887f9573e967d538f60a2aa680187559a 100644 (file)
@@ -5,6 +5,7 @@ Files:
 lib/c32isprint.c
 lib/c32is-impl.h
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/mbrtowc.m4
 m4/locale-fr.m4
 m4/locale-ja.m4
@@ -26,6 +27,7 @@ dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
 dnl determined.  It describes how mbrtoc32 is implemented.
 AC_REQUIRE([gl_MBSTATE_T_BROKEN])
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32isprint])
 
 Makefile.am:
index ff9ee4082597ae6a1625b66e6059786b396ee38f..7a8af0e39294c83c76550cc721bcb49c545f7e68 100644 (file)
@@ -6,6 +6,7 @@ Files:
 lib/c32ispunct.c
 lib/c32is-impl.h
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/mbrtowc.m4
 m4/locale-fr.m4
 m4/locale-ja.m4
@@ -28,6 +29,7 @@ dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
 dnl determined.  It describes how mbrtoc32 is implemented.
 AC_REQUIRE([gl_MBSTATE_T_BROKEN])
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32ispunct])
 
 Makefile.am:
index 1b519e42ce2a37f6edce1e602288afe3d92f2fc6..28befaacc5c120e3e9cc184b58da6d66b5948312 100644 (file)
@@ -5,6 +5,7 @@ Files:
 lib/c32isspace.c
 lib/c32is-impl.h
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/mbrtowc.m4
 m4/locale-fr.m4
 m4/locale-ja.m4
@@ -26,6 +27,7 @@ dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
 dnl determined.  It describes how mbrtoc32 is implemented.
 AC_REQUIRE([gl_MBSTATE_T_BROKEN])
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32isspace])
 
 Makefile.am:
index 08838dcecf85590e35cbb798fa0afe41d871418b..75cd04327ff55695054e15af35df30a76089a735 100644 (file)
@@ -5,6 +5,7 @@ Files:
 lib/c32isupper.c
 lib/c32is-impl.h
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/mbrtowc.m4
 m4/locale-fr.m4
 m4/locale-ja.m4
@@ -26,6 +27,7 @@ dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
 dnl determined.  It describes how mbrtoc32 is implemented.
 AC_REQUIRE([gl_MBSTATE_T_BROKEN])
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32isupper])
 
 Makefile.am:
index e145ce36ce17940837610a99799e08240632f4f0..9447744bb7f720a0b3dcbae51c7077bebd27eb82 100644 (file)
@@ -6,6 +6,7 @@ Files:
 lib/c32isxdigit.c
 lib/c32is-impl.h
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/mbrtowc.m4
 m4/locale-fr.m4
 m4/locale-ja.m4
@@ -28,6 +29,7 @@ dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
 dnl determined.  It describes how mbrtoc32 is implemented.
 AC_REQUIRE([gl_MBSTATE_T_BROKEN])
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32isxdigit])
 
 Makefile.am:
index 11717a78f1ee65eca38589a7b2d030f0f2ffc432..9e8c0a28692dfa7aaaee85cb693b024bb257b15a 100644 (file)
@@ -4,6 +4,7 @@ c32tob() function: convert 32-bit wide character to unibyte character.
 Files:
 lib/c32tob.c
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/locale-fr.m4
 m4/locale-zh.m4
 m4/codeset.m4
@@ -16,6 +17,7 @@ wctob
 
 configure.ac:
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32tob])
 
 Makefile.am:
index 25579f54551a9d8cb8e0e589501a86f7470d531f..e4140f34a81a11371ed97086e3d506a442ab54a4 100644 (file)
@@ -5,6 +5,7 @@ Files:
 lib/c32tolower.c
 lib/c32to-impl.h
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/mbrtowc.m4
 m4/locale-fr.m4
 m4/locale-ja.m4
@@ -26,6 +27,7 @@ dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
 dnl determined.  It describes how mbrtoc32 is implemented.
 AC_REQUIRE([gl_MBSTATE_T_BROKEN])
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32tolower])
 
 Makefile.am:
index 792df3a096d122ad431d099b9e4cdb39788779a6..16c7a0c7aeb9174b4c25c0a12cd61935ca77343a 100644 (file)
@@ -5,6 +5,7 @@ Files:
 lib/c32toupper.c
 lib/c32to-impl.h
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/mbrtowc.m4
 m4/locale-fr.m4
 m4/locale-ja.m4
@@ -26,6 +27,7 @@ dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
 dnl determined.  It describes how mbrtoc32 is implemented.
 AC_REQUIRE([gl_MBSTATE_T_BROKEN])
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32toupper])
 
 Makefile.am:
index aeee6856e501b6435e38d086f6a390a39f0813f3..1db9002bb4f9a3555f8a648fcf7793136ca6d5db 100644 (file)
@@ -5,6 +5,7 @@ a 32-bit wide character.
 Files:
 lib/c32width.c
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/mbrtowc.m4
 m4/locale-fr.m4
 m4/locale-ja.m4
@@ -23,6 +24,7 @@ dnl Determine REPLACE_MBSTATE_T, from which GNULIB_defined_mbstate_t is
 dnl determined.  It describes how mbrtoc32 is implemented.
 AC_REQUIRE([gl_MBSTATE_T_BROKEN])
 AC_REQUIRE([gl_MBRTOC32_SANITYCHECK])
+AC_REQUIRE([gl_C32RTOMB_SANITYCHECK])
 gl_UCHAR_MODULE_INDICATOR([c32width])
 
 Makefile.am:
index 7315fe15059814aa7b727d2a031c80f10567d7b1..463756d08b8ab9f800ddc70dc7ce4ee3560b2933 100644 (file)
@@ -11,6 +11,7 @@ lib/mbtowc-lock.h
 lib/mbtowc-lock.c
 lib/windows-initguard.h
 m4/mbrtoc32.m4
+m4/c32rtomb.m4
 m4/locale-fr.m4
 m4/locale-zh.m4
 m4/codeset.m4