Mercurial > gnulib
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 + ]) +])