changeset 39915:6ad3d081a5ab

wcsnrtombs: Work around Solaris 11.4 bug. * m4/wcsnrtombs.m4 (gl_WCSNRTOMBS_WORKS_IN_TRADITIONAL_LOCALE): New macro. (gl_FUNC_WCSNRTOMBS): Invoke it. * doc/posix-functions/wcsnrtombs.texi: Mention the Solaris bug.
author Bruno Haible <bruno@clisp.org>
date Sun, 14 Oct 2018 09:21:24 +0200
parents 32ddb61dde22
children dbcdcd1db895
files ChangeLog doc/posix-functions/wcsnrtombs.texi m4/wcsnrtombs.m4
diffstat 3 files changed, 92 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sun Oct 14 09:19:12 2018 +0200
+++ b/ChangeLog	Sun Oct 14 09:21:24 2018 +0200
@@ -1,3 +1,11 @@
+2018-10-14  Bruno Haible  <bruno@clisp.org>
+
+	wcsnrtombs: Work around Solaris 11.4 bug.
+	* m4/wcsnrtombs.m4 (gl_WCSNRTOMBS_WORKS_IN_TRADITIONAL_LOCALE): New
+	macro.
+	(gl_FUNC_WCSNRTOMBS): Invoke it.
+	* doc/posix-functions/wcsnrtombs.texi: Mention the Solaris bug.
+
 2018-10-14  Bruno Haible  <bruno@clisp.org>
 
 	mbsnrtowcs: Work around Solaris 11.4 bug.
--- a/doc/posix-functions/wcsnrtombs.texi	Sun Oct 14 09:19:12 2018 +0200
+++ b/doc/posix-functions/wcsnrtombs.texi	Sun Oct 14 09:21:24 2018 +0200
@@ -11,6 +11,10 @@
 @item
 This function is missing on some platforms:
 Mac OS X 10.3, FreeBSD 5.2.1, NetBSD 5.0, OpenBSD 3.8, Minix 3.1.8, AIX 4.3.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 11.3, Cygwin 1.5.x, mingw, MSVC 14, Interix 3.5, BeOS, Android 4.4.
+@item
+This function cannot consume valid sequences of wide characters
+on some platforms:
+Solaris 11.4.
 @end itemize
 
 Portability problems not fixed by Gnulib:
--- a/m4/wcsnrtombs.m4	Sun Oct 14 09:19:12 2018 +0200
+++ b/m4/wcsnrtombs.m4	Sun Oct 14 09:21:24 2018 +0200
@@ -1,4 +1,4 @@
-# wcsnrtombs.m4 serial 5
+# wcsnrtombs.m4 serial 6
 dnl Copyright (C) 2008-2018 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -17,6 +17,13 @@
   else
     if test $REPLACE_MBSTATE_T = 1; then
       REPLACE_WCSNRTOMBS=1
+    else
+      gl_WCSNRTOMBS_WORKS_IN_TRADITIONAL_LOCALE
+      case "$gl_cv_func_wcsnrtombs_works_in_traditional_locale" in
+        *yes) ;;
+        *) REPLACE_WCSNRTOMBS=1 ;;
+      esac
+
     fi
   fi
 ])
@@ -25,3 +32,75 @@
 AC_DEFUN([gl_PREREQ_WCSNRTOMBS], [
   :
 ])
+
+dnl Test whether wcsnrtombs works in an ISO-8859-1 locale.
+dnl Result is gl_cv_func_wcsnrtombs_works_in_traditional_locale.
+
+AC_DEFUN([gl_WCSNRTOMBS_WORKS_IN_TRADITIONAL_LOCALE],
+[
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([gt_LOCALE_FR])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  AC_CACHE_CHECK([whether wcsnrtombs works in a traditional locale],
+    [gl_cv_func_wcsnrtombs_works_in_traditional_locale],
+    [
+      dnl Initial guess, used when cross-compiling or when no suitable locale
+      dnl is present.
+changequote(,)dnl
+      case "$host_os" in
+                  # Guess no on Solaris.
+        solaris*) gl_cv_func_wcsnrtombs_works_in_traditional_locale="guessing no" ;;
+                  # Guess yes otherwise.
+        *)        gl_cv_func_wcsnrtombs_works_in_traditional_locale="guessing yes" ;;
+      esac
+changequote([,])dnl
+      if test $LOCALE_FR != none; then
+        AC_RUN_IFELSE(
+          [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+   <wchar.h>.
+   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+   included before <wchar.h>.  */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+int main ()
+{
+  /* This fails on Solaris 11.4.  */
+  if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+    {
+      /* Locale encoding is ISO-8859-1 or ISO-8859-15.  */
+      const char original[] = "B\374\337er"; /* "Büßer" */
+      wchar_t input[10];
+      size_t ret;
+      const wchar_t *src;
+
+      #define BUFSIZE 20
+      char buf[BUFSIZE];
+      memset (buf, '_', BUFSIZE);
+
+      ret = mbstowcs (input, original, 10);
+      if (!(ret == 5))
+        return 1;
+
+      src = input;
+      ret = wcsnrtombs (buf, &src, 6, 2, NULL);
+      if (!(ret == 2))
+        return 2;
+      if (!(src == input + 2))
+        return 3;
+      if (!(memcmp (buf, original, ret) == 0))
+        return 4;
+    }
+  return 0;
+}]])],
+          [gl_cv_func_wcsnrtombs_works_in_traditional_locale=yes],
+          [gl_cv_func_wcsnrtombs_works_in_traditional_locale=no],
+          [:])
+      fi
+    ])
+])