Mercurial > hg > octave-kai > gnulib-hg
changeset 11217:13e9d2ea1d1d
Work around mbrtowc bug in zh_CN.GB18030 locale on Solaris 8.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Thu, 26 Feb 2009 02:21:14 +0100 |
parents | 990c0f0a5097 |
children | d3d4cc78595e |
files | ChangeLog doc/posix-functions/mbrtowc.texi m4/mbrtowc.m4 |
diffstat | 3 files changed, 72 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-02-25 Bruno Haible <bruno@clisp.org> + + Work around mbrtowc bug in zh_CN.GB18030 locale on Solaris 8. + * m4/mbrtowc.m4 (gl_MBRTOWC_SANITYCHECK): New macro. + (gl_MBSTATE_T_BROKEN): Invoke it. Replace mbstate_t when it says "no". + * doc/posix-functions/mbrtowc.texi: Document the Solaris 8 bug. + Reported by Gary V. Vaughan <gary@gnu.org>. + 2009-02-25 Bruno Haible <bruno@clisp.org> Work around broken INT8_MAX, UINT8_MAX etc. values on HP-UX 11.23.
--- a/doc/posix-functions/mbrtowc.texi +++ b/doc/posix-functions/mbrtowc.texi @@ -16,6 +16,10 @@ incomplete multibyte character on some platforms: AIX 5.1, OSF/1 5.1. @item +This function does not produce correct results in the zh_CN.GB18030 locale on +some platforms: +Solaris 8. +@item This function does not ignore the @code{pwc} argument if the string argument is NULL on some platforms: OSF/1 5.1.
--- a/m4/mbrtowc.m4 +++ b/m4/mbrtowc.m4 @@ -1,4 +1,4 @@ -# mbrtowc.m4 serial 13 +# mbrtowc.m4 serial 14 dnl Copyright (C) 2001-2002, 2004-2005, 2008, 2009 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -65,9 +65,15 @@ AC_CHECK_FUNCS_ONCE([mbrtowc]) if test $ac_cv_func_mbsinit = yes && test $ac_cv_func_mbrtowc = yes; then gl_MBRTOWC_INCOMPLETE_STATE + gl_MBRTOWC_SANITYCHECK + REPLACE_MBSTATE_T=0 case "$gl_cv_func_mbrtowc_incomplete_state" in - *yes) REPLACE_MBSTATE_T=0 ;; - *) REPLACE_MBSTATE_T=1 ;; + *yes) ;; + *) REPLACE_MBSTATE_T=1 ;; + esac + case "$gl_cv_func_mbrtowc_sanitycheck" in + *yes) ;; + *) REPLACE_MBSTATE_T=1 ;; esac else REPLACE_MBSTATE_T=1 @@ -126,6 +132,57 @@ ]) ]) +dnl Test whether mbrtowc works not worse than mbtowc. +dnl Result is gl_cv_func_mbrtowc_sanitycheck. + +AC_DEFUN([gl_MBRTOWC_SANITYCHECK], +[ + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([gt_LOCALE_ZH_CN]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_CACHE_CHECK([whether mbrtowc works as well as mbtowc], + [gl_cv_func_mbrtowc_sanitycheck], + [ + 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 8. + solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;; + # Guess yes otherwise. + *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;; + esac +changequote([,])dnl + if test $LOCALE_ZH_CN != none; then + AC_TRY_RUN([ +#include <locale.h> +#include <string.h> +#include <wchar.h> +int main () +{ + /* This fails on Solaris 8: + mbrtowc returns 2, and sets wc to 0x00F0. + mbtowc returns 4 (correct) and sets wc to 0x5EDC. */ + if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) + { + char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */ + mbstate_t state; + wchar_t wc; + + memset (&state, '\0', sizeof (mbstate_t)); + if (mbrtowc (&wc, input + 3, 6, &state) != 4 + && mbtowc (&wc, input + 3, 6) == 4) + return 1; + } + return 0; +}], + [gl_cv_func_mbrtowc_sanitycheck=yes], + [gl_cv_func_mbrtowc_sanitycheck=no], + []) + fi + ]) +]) + dnl Test whether mbrtowc supports a NULL string argument correctly. dnl Result is gl_cv_func_mbrtowc_null_arg.