[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
+ ])
+])
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- wcsnrtombs: work around Solaris 11.4 bug,
Bruno Haible <=