]> 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:11:13 +0000 (17:11 +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 faf496dfb14c31d53f8c0fe8812e2b80af468b7a..fe3cae06d92812f3c37ba4d0d6cac74d3d459bb9 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 c5ed227a8be25d5a160beee5023a3a63bdefb328..50c515ca79beaddbac7703eac27ff195314f6f46 100644 (file)
@@ -1,5 +1,5 @@
 /* Convert unibyte character to 32-bit wide character.
-   Copyright (C) 2020-2023 Free Software Foundation, Inc.
+   Copyright (C) 2020-2024 Free Software Foundation, Inc.
 
    This file is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as
@@ -35,7 +35,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 fd916341ee5e505943905c2eb350f3765a0a187d..9e9802583fe1efbd64d1260468303cad03cab6dd 100644 (file)
@@ -1,5 +1,5 @@
 /* Test whether a 32-bit wide character belongs to a specific character class.
-   Copyright (C) 2020-2023 Free Software Foundation, Inc.
+   Copyright (C) 2020-2024 Free Software Foundation, Inc.
 
    This file is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as
@@ -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 1f6acc97d46fa94da2b3e46084aadafecb63cacd..c899af1b2e1797d931a18b7c57196af6d9c80ddf 100644 (file)
@@ -1,5 +1,5 @@
 /* Convert 32-bit wide character to multibyte character.
-   Copyright (C) 2020-2023 Free Software Foundation, Inc.
+   Copyright (C) 2020-2024 Free Software Foundation, Inc.
 
    This file is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as
@@ -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 1e0bee42f17dd887c81f5b4b5f45f93754ba6731..3a0efdfc4dffcf4c7c9f6ba5e19bd7773b87cb53 100644 (file)
@@ -1,5 +1,5 @@
 /* Convert 32-bit wide string to string.
-   Copyright (C) 2020-2023 Free Software Foundation, Inc.
+   Copyright (C) 2020-2024 Free Software Foundation, Inc.
 
    This file is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as
@@ -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 cc3796100fb0a52bc2c93347a1384196d3008488..7cc6f26d042c17eed704d0713cf919c180c4991b 100644 (file)
@@ -1,5 +1,5 @@
 /* Convert 32-bit wide string to string.
-   Copyright (C) 2020-2023 Free Software Foundation, Inc.
+   Copyright (C) 2020-2024 Free Software Foundation, Inc.
 
    This file is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as
@@ -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 94ca7bdfb5869089af27a1cb2d6b3330656508bb..32039c612d0c4cbab356db82cf1451470ce94435 100644 (file)
@@ -1,5 +1,5 @@
 /* Case mapping of a 32-bit wide character.
-   Copyright (C) 2020-2023 Free Software Foundation, Inc.
+   Copyright (C) 2020-2024 Free Software Foundation, Inc.
 
    This file is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as
@@ -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 f0e0c35ef91af54389df433dbb9cd083fa97989c..f712aa14e8a6a3973c0e1aa42b35560dda8a2692 100644 (file)
@@ -1,5 +1,5 @@
 /* Convert 32-bit wide character to unibyte character.
-   Copyright (C) 2020-2023 Free Software Foundation, Inc.
+   Copyright (C) 2020-2024 Free Software Foundation, Inc.
 
    This file is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as
@@ -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 1bea29dfbaff8ea28df4b7b2b0e85f45931119a6..37ce1a57dc58f69051681aaf1fa4ceea7a6c2959 100644 (file)
@@ -1,5 +1,5 @@
 /* Determine the number of screen columns needed for a 32-bit wide character.
-   Copyright (C) 2020-2023 Free Software Foundation, Inc.
+   Copyright (C) 2020-2024 Free Software Foundation, Inc.
 
    This file is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as
@@ -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 1eb5f85db2c1e9a45eb823338007a53f77f4e67d..0b0f3f3678304756ef9102a74ea0dc9dea5f73c6 100644 (file)
@@ -113,7 +113,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 5baa08fd4eda9328ceebf444f0c87af10e4eb5e2..99cb094a31080cd5f2438e925f59191691226a42 100644 (file)
@@ -1,5 +1,5 @@
 /* Convert string to 32-bit wide string.
-   Copyright (C) 2020-2023 Free Software Foundation, Inc.
+   Copyright (C) 2020-2024 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2020.
 
    This file is free software: you can redistribute it and/or modify
@@ -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 d37e67056b579cb050cac49d9e1a9ac30204d8a0..00c97951246013868e76a2c21423a76098ace266 100644 (file)
@@ -1,5 +1,5 @@
 /* Convert string to 32-bit wide string.
-   Copyright (C) 2020-2023 Free Software Foundation, Inc.
+   Copyright (C) 2020-2024 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2020.
 
    This file is free software: you can redistribute it and/or modify
@@ -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 5073865d4836cc3e3c94be0cd85028dc422f863b..d97ccb8fb632c4b6908b8c7e5d47383277ddc8bc 100644 (file)
@@ -1,5 +1,5 @@
-# c32rtomb.m4 serial 6
-dnl Copyright (C) 2020-2023 Free Software Foundation, Inc.
+# c32rtomb.m4 serial 6.1
+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,
 dnl with or without modifications, as long as this notice is preserved.
@@ -9,7 +9,61 @@ AC_DEFUN([gl_FUNC_C32RTOMB],
   AC_REQUIRE([gl_UCHAR_H_DEFAULTS])
 
   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__
@@ -39,29 +93,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
@@ -69,19 +143,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 f35d38db234fd663d5a4b91bf1e95ba70ffbeaff..2669885f37d760dbaf4991ad93ad2980c2a03ce5 100644 (file)
@@ -1,4 +1,4 @@
-# mbrtoc32.m4 serial 17.1
+# mbrtoc32.m4 serial 17.2
 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 bb78c9ea6a4fafb99ccef1cca6ac44e106a68b26..acb2b29c98bab583a48f82a3cb22e90ab52dba31 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
@@ -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([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 51b1d803597fc63c0f6eed2f0da7ebd685863be9..87b35b1bee82797c50807e1a5ac22e9bef41657a 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
@@ -15,6 +16,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 061e8a7aecb7ecc7ab860e188421ac770d65af4e..7eeacd20705842129c42d5bc2b955e2176198e69 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