bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

wcsnrtombs: work around Solaris 11.4 bug


From: Bruno Haible
Subject: wcsnrtombs: work around Solaris 11.4 bug
Date: Sun, 14 Oct 2018 09:45:52 +0200
User-agent: KMail/5.1.3 (Linux/4.4.0-137-generic; KDE/5.18.0; x86_64; ; )

2018-10-14  Bruno Haible  <address@hidden>

        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.

diff --git a/doc/posix-functions/wcsnrtombs.texi 
b/doc/posix-functions/wcsnrtombs.texi
index 3c7800a..7641e11 100644
--- a/doc/posix-functions/wcsnrtombs.texi
+++ b/doc/posix-functions/wcsnrtombs.texi
@@ -11,6 +11,10 @@ Portability problems fixed by Gnulib:
 @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.
address@hidden
+This function cannot consume valid sequences of wide characters
+on some platforms:
+Solaris 11.4.
 @end itemize
 
 Portability problems not fixed by Gnulib:
diff --git a/m4/wcsnrtombs.m4 b/m4/wcsnrtombs.m4
index c04e2c1..530f60c 100644
--- a/m4/wcsnrtombs.m4
+++ b/m4/wcsnrtombs.m4
@@ -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 @@ AC_DEFUN([gl_FUNC_WCSNRTOMBS],
   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_FUNC_WCSNRTOMBS],
 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
+    ])
+])




reply via email to

[Prev in Thread] Current Thread [Next in Thread]