1*820c1a8dSHiroo HAYASHI# mbrtowc.m4 serial 38 -*- coding: utf-8 -*- 2*820c1a8dSHiroo HAYASHIdnl Copyright (C) 2001-2002, 2004-2005, 2008-2021 Free Software Foundation, 3*820c1a8dSHiroo HAYASHIdnl Inc. 4*820c1a8dSHiroo HAYASHIdnl This file is free software; the Free Software Foundation 5*820c1a8dSHiroo HAYASHIdnl gives unlimited permission to copy and/or distribute it, 6*820c1a8dSHiroo HAYASHIdnl with or without modifications, as long as this notice is preserved. 7*820c1a8dSHiroo HAYASHI 8*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_FUNC_MBRTOWC], 9*820c1a8dSHiroo HAYASHI[ 10*820c1a8dSHiroo HAYASHI AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) 11*820c1a8dSHiroo HAYASHI AC_REQUIRE([gl_PTHREADLIB]) 12*820c1a8dSHiroo HAYASHI AC_CHECK_HEADERS_ONCE([threads.h]) 13*820c1a8dSHiroo HAYASHI 14*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_TYPE_MBSTATE_T]) 15*820c1a8dSHiroo HAYASHI gl_MBSTATE_T_BROKEN 16*820c1a8dSHiroo HAYASHI 17*820c1a8dSHiroo HAYASHI AC_CHECK_FUNCS_ONCE([mbrtowc]) 18*820c1a8dSHiroo HAYASHI if test $ac_cv_func_mbrtowc = no; then 19*820c1a8dSHiroo HAYASHI HAVE_MBRTOWC=0 20*820c1a8dSHiroo HAYASHI AC_CHECK_DECLS([mbrtowc],,, [[ 21*820c1a8dSHiroo HAYASHI #include <wchar.h> 22*820c1a8dSHiroo HAYASHI ]]) 23*820c1a8dSHiroo HAYASHI if test $ac_cv_have_decl_mbrtowc = yes; then 24*820c1a8dSHiroo HAYASHI dnl On Minix 3.1.8, the system's <wchar.h> declares mbrtowc() although 25*820c1a8dSHiroo HAYASHI dnl it does not have the function. Avoid a collision with gnulib's 26*820c1a8dSHiroo HAYASHI dnl replacement. 27*820c1a8dSHiroo HAYASHI REPLACE_MBRTOWC=1 28*820c1a8dSHiroo HAYASHI fi 29*820c1a8dSHiroo HAYASHI else 30*820c1a8dSHiroo HAYASHI if test $REPLACE_MBSTATE_T = 1; then 31*820c1a8dSHiroo HAYASHI REPLACE_MBRTOWC=1 32*820c1a8dSHiroo HAYASHI else 33*820c1a8dSHiroo HAYASHI gl_MBRTOWC_NULL_ARG1 34*820c1a8dSHiroo HAYASHI gl_MBRTOWC_NULL_ARG2 35*820c1a8dSHiroo HAYASHI gl_MBRTOWC_RETVAL 36*820c1a8dSHiroo HAYASHI gl_MBRTOWC_NUL_RETVAL 37*820c1a8dSHiroo HAYASHI gl_MBRTOWC_STORES_INCOMPLETE 38*820c1a8dSHiroo HAYASHI gl_MBRTOWC_EMPTY_INPUT 39*820c1a8dSHiroo HAYASHI gl_MBRTOWC_C_LOCALE 40*820c1a8dSHiroo HAYASHI case "$gl_cv_func_mbrtowc_null_arg1" in 41*820c1a8dSHiroo HAYASHI *yes) ;; 42*820c1a8dSHiroo HAYASHI *) AC_DEFINE([MBRTOWC_NULL_ARG1_BUG], [1], 43*820c1a8dSHiroo HAYASHI [Define if the mbrtowc function has the NULL pwc argument bug.]) 44*820c1a8dSHiroo HAYASHI REPLACE_MBRTOWC=1 45*820c1a8dSHiroo HAYASHI ;; 46*820c1a8dSHiroo HAYASHI esac 47*820c1a8dSHiroo HAYASHI case "$gl_cv_func_mbrtowc_null_arg2" in 48*820c1a8dSHiroo HAYASHI *yes) ;; 49*820c1a8dSHiroo HAYASHI *) AC_DEFINE([MBRTOWC_NULL_ARG2_BUG], [1], 50*820c1a8dSHiroo HAYASHI [Define if the mbrtowc function has the NULL string argument bug.]) 51*820c1a8dSHiroo HAYASHI REPLACE_MBRTOWC=1 52*820c1a8dSHiroo HAYASHI ;; 53*820c1a8dSHiroo HAYASHI esac 54*820c1a8dSHiroo HAYASHI case "$gl_cv_func_mbrtowc_retval" in 55*820c1a8dSHiroo HAYASHI *yes) ;; 56*820c1a8dSHiroo HAYASHI *) AC_DEFINE([MBRTOWC_RETVAL_BUG], [1], 57*820c1a8dSHiroo HAYASHI [Define if the mbrtowc function returns a wrong return value.]) 58*820c1a8dSHiroo HAYASHI REPLACE_MBRTOWC=1 59*820c1a8dSHiroo HAYASHI ;; 60*820c1a8dSHiroo HAYASHI esac 61*820c1a8dSHiroo HAYASHI case "$gl_cv_func_mbrtowc_nul_retval" in 62*820c1a8dSHiroo HAYASHI *yes) ;; 63*820c1a8dSHiroo HAYASHI *) AC_DEFINE([MBRTOWC_NUL_RETVAL_BUG], [1], 64*820c1a8dSHiroo HAYASHI [Define if the mbrtowc function does not return 0 for a NUL character.]) 65*820c1a8dSHiroo HAYASHI REPLACE_MBRTOWC=1 66*820c1a8dSHiroo HAYASHI ;; 67*820c1a8dSHiroo HAYASHI esac 68*820c1a8dSHiroo HAYASHI case "$gl_cv_func_mbrtowc_stores_incomplete" in 69*820c1a8dSHiroo HAYASHI *no) ;; 70*820c1a8dSHiroo HAYASHI *) AC_DEFINE([MBRTOWC_STORES_INCOMPLETE_BUG], [1], 71*820c1a8dSHiroo HAYASHI [Define if the mbrtowc function stores a wide character when reporting incomplete input.]) 72*820c1a8dSHiroo HAYASHI REPLACE_MBRTOWC=1 73*820c1a8dSHiroo HAYASHI ;; 74*820c1a8dSHiroo HAYASHI esac 75*820c1a8dSHiroo HAYASHI case "$gl_cv_func_mbrtowc_empty_input" in 76*820c1a8dSHiroo HAYASHI *yes) ;; 77*820c1a8dSHiroo HAYASHI *) AC_DEFINE([MBRTOWC_EMPTY_INPUT_BUG], [1], 78*820c1a8dSHiroo HAYASHI [Define if the mbrtowc function does not return (size_t) -2 79*820c1a8dSHiroo HAYASHI for empty input.]) 80*820c1a8dSHiroo HAYASHI REPLACE_MBRTOWC=1 81*820c1a8dSHiroo HAYASHI ;; 82*820c1a8dSHiroo HAYASHI esac 83*820c1a8dSHiroo HAYASHI case "$gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" in 84*820c1a8dSHiroo HAYASHI *yes) ;; 85*820c1a8dSHiroo HAYASHI *) AC_DEFINE([MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ], [1], 86*820c1a8dSHiroo HAYASHI [Define if the mbrtowc function may signal encoding errors in the C locale.]) 87*820c1a8dSHiroo HAYASHI REPLACE_MBRTOWC=1 88*820c1a8dSHiroo HAYASHI ;; 89*820c1a8dSHiroo HAYASHI esac 90*820c1a8dSHiroo HAYASHI fi 91*820c1a8dSHiroo HAYASHI fi 92*820c1a8dSHiroo HAYASHI if test $REPLACE_MBSTATE_T = 1; then 93*820c1a8dSHiroo HAYASHI case "$host_os" in 94*820c1a8dSHiroo HAYASHI mingw*) LIB_MBRTOWC= ;; 95*820c1a8dSHiroo HAYASHI *) 96*820c1a8dSHiroo HAYASHI gl_WEAK_SYMBOLS 97*820c1a8dSHiroo HAYASHI case "$gl_cv_have_weak" in 98*820c1a8dSHiroo HAYASHI *yes) LIB_MBRTOWC= ;; 99*820c1a8dSHiroo HAYASHI *) LIB_MBRTOWC="$LIBPTHREAD" ;; 100*820c1a8dSHiroo HAYASHI esac 101*820c1a8dSHiroo HAYASHI ;; 102*820c1a8dSHiroo HAYASHI esac 103*820c1a8dSHiroo HAYASHI else 104*820c1a8dSHiroo HAYASHI LIB_MBRTOWC= 105*820c1a8dSHiroo HAYASHI fi 106*820c1a8dSHiroo HAYASHI dnl LIB_MBRTOWC is expected to be '-pthread' or '-lpthread' on AIX 107*820c1a8dSHiroo HAYASHI dnl with gcc or xlc, and empty otherwise. 108*820c1a8dSHiroo HAYASHI AC_SUBST([LIB_MBRTOWC]) 109*820c1a8dSHiroo HAYASHI]) 110*820c1a8dSHiroo HAYASHI 111*820c1a8dSHiroo HAYASHIdnl Test whether mbsinit() and mbrtowc() need to be overridden in a way that 112*820c1a8dSHiroo HAYASHIdnl redefines the semantics of the given mbstate_t type. 113*820c1a8dSHiroo HAYASHIdnl Result is REPLACE_MBSTATE_T. 114*820c1a8dSHiroo HAYASHIdnl When this is set to 1, we replace both mbsinit() and mbrtowc(), in order to 115*820c1a8dSHiroo HAYASHIdnl avoid inconsistencies. 116*820c1a8dSHiroo HAYASHI 117*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MBSTATE_T_BROKEN], 118*820c1a8dSHiroo HAYASHI[ 119*820c1a8dSHiroo HAYASHI AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) 120*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_CANONICAL_HOST]) 121*820c1a8dSHiroo HAYASHI 122*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_TYPE_MBSTATE_T]) 123*820c1a8dSHiroo HAYASHI AC_CHECK_FUNCS_ONCE([mbsinit]) 124*820c1a8dSHiroo HAYASHI AC_CHECK_FUNCS_ONCE([mbrtowc]) 125*820c1a8dSHiroo HAYASHI dnl On native Windows, we know exactly how mbsinit() behaves and don't need 126*820c1a8dSHiroo HAYASHI dnl to override it, even if - like on MSVC - mbsinit() is only defined as 127*820c1a8dSHiroo HAYASHI dnl an inline function, not as a global function. 128*820c1a8dSHiroo HAYASHI if case "$host_os" in 129*820c1a8dSHiroo HAYASHI mingw*) true ;; 130*820c1a8dSHiroo HAYASHI *) test $ac_cv_func_mbsinit = yes ;; 131*820c1a8dSHiroo HAYASHI esac \ 132*820c1a8dSHiroo HAYASHI && test $ac_cv_func_mbrtowc = yes; then 133*820c1a8dSHiroo HAYASHI gl_MBRTOWC_INCOMPLETE_STATE 134*820c1a8dSHiroo HAYASHI gl_MBRTOWC_SANITYCHECK 135*820c1a8dSHiroo HAYASHI REPLACE_MBSTATE_T=0 136*820c1a8dSHiroo HAYASHI case "$gl_cv_func_mbrtowc_incomplete_state" in 137*820c1a8dSHiroo HAYASHI *yes) ;; 138*820c1a8dSHiroo HAYASHI *) REPLACE_MBSTATE_T=1 ;; 139*820c1a8dSHiroo HAYASHI esac 140*820c1a8dSHiroo HAYASHI case "$gl_cv_func_mbrtowc_sanitycheck" in 141*820c1a8dSHiroo HAYASHI *yes) ;; 142*820c1a8dSHiroo HAYASHI *) REPLACE_MBSTATE_T=1 ;; 143*820c1a8dSHiroo HAYASHI esac 144*820c1a8dSHiroo HAYASHI else 145*820c1a8dSHiroo HAYASHI REPLACE_MBSTATE_T=1 146*820c1a8dSHiroo HAYASHI fi 147*820c1a8dSHiroo HAYASHI]) 148*820c1a8dSHiroo HAYASHI 149*820c1a8dSHiroo HAYASHIdnl Test whether mbrtowc puts the state into non-initial state when parsing an 150*820c1a8dSHiroo HAYASHIdnl incomplete multibyte character. 151*820c1a8dSHiroo HAYASHIdnl Result is gl_cv_func_mbrtowc_incomplete_state. 152*820c1a8dSHiroo HAYASHI 153*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MBRTOWC_INCOMPLETE_STATE], 154*820c1a8dSHiroo HAYASHI[ 155*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_PROG_CC]) 156*820c1a8dSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_JA]) 157*820c1a8dSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_FR_UTF8]) 158*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 159*820c1a8dSHiroo HAYASHI AC_CACHE_CHECK([whether mbrtowc handles incomplete characters], 160*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_incomplete_state], 161*820c1a8dSHiroo HAYASHI [ 162*820c1a8dSHiroo HAYASHI dnl Initial guess, used when cross-compiling or when no suitable locale 163*820c1a8dSHiroo HAYASHI dnl is present. 164*820c1a8dSHiroo HAYASHIchangequote(,)dnl 165*820c1a8dSHiroo HAYASHI case "$host_os" in 166*820c1a8dSHiroo HAYASHI # Guess no on AIX and OSF/1. 167*820c1a8dSHiroo HAYASHI aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;; 168*820c1a8dSHiroo HAYASHI # Guess yes otherwise. 169*820c1a8dSHiroo HAYASHI *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;; 170*820c1a8dSHiroo HAYASHI esac 171*820c1a8dSHiroo HAYASHIchangequote([,])dnl 172*820c1a8dSHiroo HAYASHI if test $LOCALE_JA != none; then 173*820c1a8dSHiroo HAYASHI AC_RUN_IFELSE( 174*820c1a8dSHiroo HAYASHI [AC_LANG_SOURCE([[ 175*820c1a8dSHiroo HAYASHI#include <locale.h> 176*820c1a8dSHiroo HAYASHI#include <string.h> 177*820c1a8dSHiroo HAYASHI#include <wchar.h> 178*820c1a8dSHiroo HAYASHIint main () 179*820c1a8dSHiroo HAYASHI{ 180*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) 181*820c1a8dSHiroo HAYASHI { 182*820c1a8dSHiroo HAYASHI const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */ 183*820c1a8dSHiroo HAYASHI mbstate_t state; 184*820c1a8dSHiroo HAYASHI wchar_t wc; 185*820c1a8dSHiroo HAYASHI 186*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 187*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) 188*820c1a8dSHiroo HAYASHI if (mbsinit (&state)) 189*820c1a8dSHiroo HAYASHI return 2; 190*820c1a8dSHiroo HAYASHI } 191*820c1a8dSHiroo HAYASHI return 0; 192*820c1a8dSHiroo HAYASHI}]])], 193*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_incomplete_state=yes], 194*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_incomplete_state=no], 195*820c1a8dSHiroo HAYASHI [:]) 196*820c1a8dSHiroo HAYASHI else 197*820c1a8dSHiroo HAYASHI if test $LOCALE_FR_UTF8 != none; then 198*820c1a8dSHiroo HAYASHI AC_RUN_IFELSE( 199*820c1a8dSHiroo HAYASHI [AC_LANG_SOURCE([[ 200*820c1a8dSHiroo HAYASHI#include <locale.h> 201*820c1a8dSHiroo HAYASHI#include <string.h> 202*820c1a8dSHiroo HAYASHI#include <wchar.h> 203*820c1a8dSHiroo HAYASHIint main () 204*820c1a8dSHiroo HAYASHI{ 205*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) 206*820c1a8dSHiroo HAYASHI { 207*820c1a8dSHiroo HAYASHI const char input[] = "B\303\274\303\237er"; /* "Büßer" */ 208*820c1a8dSHiroo HAYASHI mbstate_t state; 209*820c1a8dSHiroo HAYASHI wchar_t wc; 210*820c1a8dSHiroo HAYASHI 211*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 212*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) 213*820c1a8dSHiroo HAYASHI if (mbsinit (&state)) 214*820c1a8dSHiroo HAYASHI return 2; 215*820c1a8dSHiroo HAYASHI } 216*820c1a8dSHiroo HAYASHI return 0; 217*820c1a8dSHiroo HAYASHI}]])], 218*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_incomplete_state=yes], 219*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_incomplete_state=no], 220*820c1a8dSHiroo HAYASHI [:]) 221*820c1a8dSHiroo HAYASHI fi 222*820c1a8dSHiroo HAYASHI fi 223*820c1a8dSHiroo HAYASHI ]) 224*820c1a8dSHiroo HAYASHI]) 225*820c1a8dSHiroo HAYASHI 226*820c1a8dSHiroo HAYASHIdnl Test whether mbrtowc works not worse than mbtowc. 227*820c1a8dSHiroo HAYASHIdnl Result is gl_cv_func_mbrtowc_sanitycheck. 228*820c1a8dSHiroo HAYASHI 229*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MBRTOWC_SANITYCHECK], 230*820c1a8dSHiroo HAYASHI[ 231*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_PROG_CC]) 232*820c1a8dSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_ZH_CN]) 233*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 234*820c1a8dSHiroo HAYASHI AC_CACHE_CHECK([whether mbrtowc works as well as mbtowc], 235*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_sanitycheck], 236*820c1a8dSHiroo HAYASHI [ 237*820c1a8dSHiroo HAYASHI dnl Initial guess, used when cross-compiling or when no suitable locale 238*820c1a8dSHiroo HAYASHI dnl is present. 239*820c1a8dSHiroo HAYASHIchangequote(,)dnl 240*820c1a8dSHiroo HAYASHI case "$host_os" in 241*820c1a8dSHiroo HAYASHI # Guess no on Solaris 8. 242*820c1a8dSHiroo HAYASHI solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;; 243*820c1a8dSHiroo HAYASHI # Guess yes otherwise. 244*820c1a8dSHiroo HAYASHI *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;; 245*820c1a8dSHiroo HAYASHI esac 246*820c1a8dSHiroo HAYASHIchangequote([,])dnl 247*820c1a8dSHiroo HAYASHI if test $LOCALE_ZH_CN != none; then 248*820c1a8dSHiroo HAYASHI AC_RUN_IFELSE( 249*820c1a8dSHiroo HAYASHI [AC_LANG_SOURCE([[ 250*820c1a8dSHiroo HAYASHI#include <locale.h> 251*820c1a8dSHiroo HAYASHI#include <stdlib.h> 252*820c1a8dSHiroo HAYASHI#include <string.h> 253*820c1a8dSHiroo HAYASHI#include <wchar.h> 254*820c1a8dSHiroo HAYASHIint main () 255*820c1a8dSHiroo HAYASHI{ 256*820c1a8dSHiroo HAYASHI /* This fails on Solaris 8: 257*820c1a8dSHiroo HAYASHI mbrtowc returns 2, and sets wc to 0x00F0. 258*820c1a8dSHiroo HAYASHI mbtowc returns 4 (correct) and sets wc to 0x5EDC. */ 259*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) 260*820c1a8dSHiroo HAYASHI { 261*820c1a8dSHiroo HAYASHI char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */ 262*820c1a8dSHiroo HAYASHI mbstate_t state; 263*820c1a8dSHiroo HAYASHI wchar_t wc; 264*820c1a8dSHiroo HAYASHI 265*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 266*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, input + 3, 6, &state) != 4 267*820c1a8dSHiroo HAYASHI && mbtowc (&wc, input + 3, 6) == 4) 268*820c1a8dSHiroo HAYASHI return 2; 269*820c1a8dSHiroo HAYASHI } 270*820c1a8dSHiroo HAYASHI return 0; 271*820c1a8dSHiroo HAYASHI}]])], 272*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_sanitycheck=yes], 273*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_sanitycheck=no], 274*820c1a8dSHiroo HAYASHI [:]) 275*820c1a8dSHiroo HAYASHI fi 276*820c1a8dSHiroo HAYASHI ]) 277*820c1a8dSHiroo HAYASHI]) 278*820c1a8dSHiroo HAYASHI 279*820c1a8dSHiroo HAYASHIdnl Test whether mbrtowc supports a NULL pwc argument correctly. 280*820c1a8dSHiroo HAYASHIdnl Result is gl_cv_func_mbrtowc_null_arg1. 281*820c1a8dSHiroo HAYASHI 282*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MBRTOWC_NULL_ARG1], 283*820c1a8dSHiroo HAYASHI[ 284*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_PROG_CC]) 285*820c1a8dSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_FR_UTF8]) 286*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 287*820c1a8dSHiroo HAYASHI AC_CACHE_CHECK([whether mbrtowc handles a NULL pwc argument], 288*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_null_arg1], 289*820c1a8dSHiroo HAYASHI [ 290*820c1a8dSHiroo HAYASHI dnl Initial guess, used when cross-compiling or when no suitable locale 291*820c1a8dSHiroo HAYASHI dnl is present. 292*820c1a8dSHiroo HAYASHIchangequote(,)dnl 293*820c1a8dSHiroo HAYASHI case "$host_os" in 294*820c1a8dSHiroo HAYASHI # Guess no on Solaris. 295*820c1a8dSHiroo HAYASHI solaris*) gl_cv_func_mbrtowc_null_arg1="guessing no" ;; 296*820c1a8dSHiroo HAYASHI # Guess yes otherwise. 297*820c1a8dSHiroo HAYASHI *) gl_cv_func_mbrtowc_null_arg1="guessing yes" ;; 298*820c1a8dSHiroo HAYASHI esac 299*820c1a8dSHiroo HAYASHIchangequote([,])dnl 300*820c1a8dSHiroo HAYASHI if test $LOCALE_FR_UTF8 != none; then 301*820c1a8dSHiroo HAYASHI AC_RUN_IFELSE( 302*820c1a8dSHiroo HAYASHI [AC_LANG_SOURCE([[ 303*820c1a8dSHiroo HAYASHI#include <locale.h> 304*820c1a8dSHiroo HAYASHI#include <stdlib.h> 305*820c1a8dSHiroo HAYASHI#include <string.h> 306*820c1a8dSHiroo HAYASHI#include <wchar.h> 307*820c1a8dSHiroo HAYASHIint main () 308*820c1a8dSHiroo HAYASHI{ 309*820c1a8dSHiroo HAYASHI int result = 0; 310*820c1a8dSHiroo HAYASHI 311*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) 312*820c1a8dSHiroo HAYASHI { 313*820c1a8dSHiroo HAYASHI char input[] = "\303\237er"; 314*820c1a8dSHiroo HAYASHI mbstate_t state; 315*820c1a8dSHiroo HAYASHI wchar_t wc; 316*820c1a8dSHiroo HAYASHI size_t ret; 317*820c1a8dSHiroo HAYASHI 318*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 319*820c1a8dSHiroo HAYASHI wc = (wchar_t) 0xBADFACE; 320*820c1a8dSHiroo HAYASHI ret = mbrtowc (&wc, input, 5, &state); 321*820c1a8dSHiroo HAYASHI if (ret != 2) 322*820c1a8dSHiroo HAYASHI result |= 1; 323*820c1a8dSHiroo HAYASHI if (!mbsinit (&state)) 324*820c1a8dSHiroo HAYASHI result |= 2; 325*820c1a8dSHiroo HAYASHI 326*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 327*820c1a8dSHiroo HAYASHI ret = mbrtowc (NULL, input, 5, &state); 328*820c1a8dSHiroo HAYASHI if (ret != 2) /* Solaris 7 fails here: ret is -1. */ 329*820c1a8dSHiroo HAYASHI result |= 4; 330*820c1a8dSHiroo HAYASHI if (!mbsinit (&state)) 331*820c1a8dSHiroo HAYASHI result |= 8; 332*820c1a8dSHiroo HAYASHI } 333*820c1a8dSHiroo HAYASHI return result; 334*820c1a8dSHiroo HAYASHI}]])], 335*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_null_arg1=yes], 336*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_null_arg1=no], 337*820c1a8dSHiroo HAYASHI [:]) 338*820c1a8dSHiroo HAYASHI fi 339*820c1a8dSHiroo HAYASHI ]) 340*820c1a8dSHiroo HAYASHI]) 341*820c1a8dSHiroo HAYASHI 342*820c1a8dSHiroo HAYASHIdnl Test whether mbrtowc supports a NULL string argument correctly. 343*820c1a8dSHiroo HAYASHIdnl Result is gl_cv_func_mbrtowc_null_arg2. 344*820c1a8dSHiroo HAYASHI 345*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MBRTOWC_NULL_ARG2], 346*820c1a8dSHiroo HAYASHI[ 347*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_PROG_CC]) 348*820c1a8dSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_FR_UTF8]) 349*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 350*820c1a8dSHiroo HAYASHI AC_CACHE_CHECK([whether mbrtowc handles a NULL string argument], 351*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_null_arg2], 352*820c1a8dSHiroo HAYASHI [ 353*820c1a8dSHiroo HAYASHI dnl Initial guess, used when cross-compiling or when no suitable locale 354*820c1a8dSHiroo HAYASHI dnl is present. 355*820c1a8dSHiroo HAYASHIchangequote(,)dnl 356*820c1a8dSHiroo HAYASHI case "$host_os" in 357*820c1a8dSHiroo HAYASHI # Guess no on OSF/1. 358*820c1a8dSHiroo HAYASHI osf*) gl_cv_func_mbrtowc_null_arg2="guessing no" ;; 359*820c1a8dSHiroo HAYASHI # Guess yes otherwise. 360*820c1a8dSHiroo HAYASHI *) gl_cv_func_mbrtowc_null_arg2="guessing yes" ;; 361*820c1a8dSHiroo HAYASHI esac 362*820c1a8dSHiroo HAYASHIchangequote([,])dnl 363*820c1a8dSHiroo HAYASHI if test $LOCALE_FR_UTF8 != none; then 364*820c1a8dSHiroo HAYASHI AC_RUN_IFELSE( 365*820c1a8dSHiroo HAYASHI [AC_LANG_SOURCE([[ 366*820c1a8dSHiroo HAYASHI#include <locale.h> 367*820c1a8dSHiroo HAYASHI#include <string.h> 368*820c1a8dSHiroo HAYASHI#include <wchar.h> 369*820c1a8dSHiroo HAYASHIint main () 370*820c1a8dSHiroo HAYASHI{ 371*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) 372*820c1a8dSHiroo HAYASHI { 373*820c1a8dSHiroo HAYASHI mbstate_t state; 374*820c1a8dSHiroo HAYASHI wchar_t wc; 375*820c1a8dSHiroo HAYASHI int ret; 376*820c1a8dSHiroo HAYASHI 377*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 378*820c1a8dSHiroo HAYASHI wc = (wchar_t) 0xBADFACE; 379*820c1a8dSHiroo HAYASHI mbrtowc (&wc, NULL, 5, &state); 380*820c1a8dSHiroo HAYASHI /* Check that wc was not modified. */ 381*820c1a8dSHiroo HAYASHI if (wc != (wchar_t) 0xBADFACE) 382*820c1a8dSHiroo HAYASHI return 2; 383*820c1a8dSHiroo HAYASHI } 384*820c1a8dSHiroo HAYASHI return 0; 385*820c1a8dSHiroo HAYASHI}]])], 386*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_null_arg2=yes], 387*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_null_arg2=no], 388*820c1a8dSHiroo HAYASHI [:]) 389*820c1a8dSHiroo HAYASHI fi 390*820c1a8dSHiroo HAYASHI ]) 391*820c1a8dSHiroo HAYASHI]) 392*820c1a8dSHiroo HAYASHI 393*820c1a8dSHiroo HAYASHIdnl Test whether mbrtowc, when parsing the end of a multibyte character, 394*820c1a8dSHiroo HAYASHIdnl correctly returns the number of bytes that were needed to complete the 395*820c1a8dSHiroo HAYASHIdnl character (not the total number of bytes of the multibyte character). 396*820c1a8dSHiroo HAYASHIdnl Result is gl_cv_func_mbrtowc_retval. 397*820c1a8dSHiroo HAYASHI 398*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MBRTOWC_RETVAL], 399*820c1a8dSHiroo HAYASHI[ 400*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_PROG_CC]) 401*820c1a8dSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_FR_UTF8]) 402*820c1a8dSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_JA]) 403*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_CANONICAL_HOST]) 404*820c1a8dSHiroo HAYASHI AC_CACHE_CHECK([whether mbrtowc has a correct return value], 405*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_retval], 406*820c1a8dSHiroo HAYASHI [ 407*820c1a8dSHiroo HAYASHI dnl Initial guess, used when cross-compiling or when no suitable locale 408*820c1a8dSHiroo HAYASHI dnl is present. 409*820c1a8dSHiroo HAYASHIchangequote(,)dnl 410*820c1a8dSHiroo HAYASHI case "$host_os" in 411*820c1a8dSHiroo HAYASHI # Guess no on HP-UX, Solaris, native Windows. 412*820c1a8dSHiroo HAYASHI hpux* | solaris* | mingw*) gl_cv_func_mbrtowc_retval="guessing no" ;; 413*820c1a8dSHiroo HAYASHI # Guess yes otherwise. 414*820c1a8dSHiroo HAYASHI *) gl_cv_func_mbrtowc_retval="guessing yes" ;; 415*820c1a8dSHiroo HAYASHI esac 416*820c1a8dSHiroo HAYASHIchangequote([,])dnl 417*820c1a8dSHiroo HAYASHI if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none \ 418*820c1a8dSHiroo HAYASHI || { case "$host_os" in mingw*) true;; *) false;; esac; }; then 419*820c1a8dSHiroo HAYASHI AC_RUN_IFELSE( 420*820c1a8dSHiroo HAYASHI [AC_LANG_SOURCE([[ 421*820c1a8dSHiroo HAYASHI#include <locale.h> 422*820c1a8dSHiroo HAYASHI#include <string.h> 423*820c1a8dSHiroo HAYASHI#include <wchar.h> 424*820c1a8dSHiroo HAYASHIint main () 425*820c1a8dSHiroo HAYASHI{ 426*820c1a8dSHiroo HAYASHI int result = 0; 427*820c1a8dSHiroo HAYASHI int found_some_locale = 0; 428*820c1a8dSHiroo HAYASHI /* This fails on Solaris. */ 429*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) 430*820c1a8dSHiroo HAYASHI { 431*820c1a8dSHiroo HAYASHI char input[] = "B\303\274\303\237er"; /* "Büßer" */ 432*820c1a8dSHiroo HAYASHI mbstate_t state; 433*820c1a8dSHiroo HAYASHI wchar_t wc; 434*820c1a8dSHiroo HAYASHI 435*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 436*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) 437*820c1a8dSHiroo HAYASHI { 438*820c1a8dSHiroo HAYASHI input[1] = '\0'; 439*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, input + 2, 5, &state) != 1) 440*820c1a8dSHiroo HAYASHI result |= 1; 441*820c1a8dSHiroo HAYASHI } 442*820c1a8dSHiroo HAYASHI found_some_locale = 1; 443*820c1a8dSHiroo HAYASHI } 444*820c1a8dSHiroo HAYASHI /* This fails on HP-UX 11.11. */ 445*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) 446*820c1a8dSHiroo HAYASHI { 447*820c1a8dSHiroo HAYASHI char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */ 448*820c1a8dSHiroo HAYASHI mbstate_t state; 449*820c1a8dSHiroo HAYASHI wchar_t wc; 450*820c1a8dSHiroo HAYASHI 451*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 452*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) 453*820c1a8dSHiroo HAYASHI { 454*820c1a8dSHiroo HAYASHI input[1] = '\0'; 455*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, input + 2, 5, &state) != 2) 456*820c1a8dSHiroo HAYASHI result |= 2; 457*820c1a8dSHiroo HAYASHI } 458*820c1a8dSHiroo HAYASHI found_some_locale = 1; 459*820c1a8dSHiroo HAYASHI } 460*820c1a8dSHiroo HAYASHI /* This fails on native Windows. */ 461*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL) 462*820c1a8dSHiroo HAYASHI { 463*820c1a8dSHiroo HAYASHI char input[] = "<\223\372\226\173\214\352>"; /* "<日本語>" */ 464*820c1a8dSHiroo HAYASHI mbstate_t state; 465*820c1a8dSHiroo HAYASHI wchar_t wc; 466*820c1a8dSHiroo HAYASHI 467*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 468*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2)) 469*820c1a8dSHiroo HAYASHI { 470*820c1a8dSHiroo HAYASHI input[3] = '\0'; 471*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, input + 4, 4, &state) != 1) 472*820c1a8dSHiroo HAYASHI result |= 4; 473*820c1a8dSHiroo HAYASHI } 474*820c1a8dSHiroo HAYASHI found_some_locale = 1; 475*820c1a8dSHiroo HAYASHI } 476*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL) 477*820c1a8dSHiroo HAYASHI { 478*820c1a8dSHiroo HAYASHI char input[] = "<\244\351\245\273\273\171>"; /* "<日本語>" */ 479*820c1a8dSHiroo HAYASHI mbstate_t state; 480*820c1a8dSHiroo HAYASHI wchar_t wc; 481*820c1a8dSHiroo HAYASHI 482*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 483*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2)) 484*820c1a8dSHiroo HAYASHI { 485*820c1a8dSHiroo HAYASHI input[3] = '\0'; 486*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, input + 4, 4, &state) != 1) 487*820c1a8dSHiroo HAYASHI result |= 8; 488*820c1a8dSHiroo HAYASHI } 489*820c1a8dSHiroo HAYASHI found_some_locale = 1; 490*820c1a8dSHiroo HAYASHI } 491*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "Chinese_China.936") != NULL) 492*820c1a8dSHiroo HAYASHI { 493*820c1a8dSHiroo HAYASHI char input[] = "<\310\325\261\276\325\132>"; /* "<日本語>" */ 494*820c1a8dSHiroo HAYASHI mbstate_t state; 495*820c1a8dSHiroo HAYASHI wchar_t wc; 496*820c1a8dSHiroo HAYASHI 497*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 498*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2)) 499*820c1a8dSHiroo HAYASHI { 500*820c1a8dSHiroo HAYASHI input[3] = '\0'; 501*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, input + 4, 4, &state) != 1) 502*820c1a8dSHiroo HAYASHI result |= 16; 503*820c1a8dSHiroo HAYASHI } 504*820c1a8dSHiroo HAYASHI found_some_locale = 1; 505*820c1a8dSHiroo HAYASHI } 506*820c1a8dSHiroo HAYASHI return (found_some_locale ? result : 77); 507*820c1a8dSHiroo HAYASHI}]])], 508*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_retval=yes], 509*820c1a8dSHiroo HAYASHI [if test $? != 77; then 510*820c1a8dSHiroo HAYASHI gl_cv_func_mbrtowc_retval=no 511*820c1a8dSHiroo HAYASHI fi 512*820c1a8dSHiroo HAYASHI ], 513*820c1a8dSHiroo HAYASHI [:]) 514*820c1a8dSHiroo HAYASHI fi 515*820c1a8dSHiroo HAYASHI ]) 516*820c1a8dSHiroo HAYASHI]) 517*820c1a8dSHiroo HAYASHI 518*820c1a8dSHiroo HAYASHIdnl Test whether mbrtowc, when parsing a NUL character, correctly returns 0. 519*820c1a8dSHiroo HAYASHIdnl Result is gl_cv_func_mbrtowc_nul_retval. 520*820c1a8dSHiroo HAYASHI 521*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MBRTOWC_NUL_RETVAL], 522*820c1a8dSHiroo HAYASHI[ 523*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_PROG_CC]) 524*820c1a8dSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_ZH_CN]) 525*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 526*820c1a8dSHiroo HAYASHI AC_CACHE_CHECK([whether mbrtowc returns 0 when parsing a NUL character], 527*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_nul_retval], 528*820c1a8dSHiroo HAYASHI [ 529*820c1a8dSHiroo HAYASHI dnl Initial guess, used when cross-compiling or when no suitable locale 530*820c1a8dSHiroo HAYASHI dnl is present. 531*820c1a8dSHiroo HAYASHIchangequote(,)dnl 532*820c1a8dSHiroo HAYASHI case "$host_os" in 533*820c1a8dSHiroo HAYASHI # Guess no on Solaris 8 and 9. 534*820c1a8dSHiroo HAYASHI solaris2.[89]) gl_cv_func_mbrtowc_nul_retval="guessing no" ;; 535*820c1a8dSHiroo HAYASHI # Guess yes otherwise. 536*820c1a8dSHiroo HAYASHI *) gl_cv_func_mbrtowc_nul_retval="guessing yes" ;; 537*820c1a8dSHiroo HAYASHI esac 538*820c1a8dSHiroo HAYASHIchangequote([,])dnl 539*820c1a8dSHiroo HAYASHI if test $LOCALE_ZH_CN != none; then 540*820c1a8dSHiroo HAYASHI AC_RUN_IFELSE( 541*820c1a8dSHiroo HAYASHI [AC_LANG_SOURCE([[ 542*820c1a8dSHiroo HAYASHI#include <locale.h> 543*820c1a8dSHiroo HAYASHI#include <string.h> 544*820c1a8dSHiroo HAYASHI#include <wchar.h> 545*820c1a8dSHiroo HAYASHIint main () 546*820c1a8dSHiroo HAYASHI{ 547*820c1a8dSHiroo HAYASHI /* This fails on Solaris 8 and 9. */ 548*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) 549*820c1a8dSHiroo HAYASHI { 550*820c1a8dSHiroo HAYASHI mbstate_t state; 551*820c1a8dSHiroo HAYASHI wchar_t wc; 552*820c1a8dSHiroo HAYASHI 553*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 554*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, "", 1, &state) != 0) 555*820c1a8dSHiroo HAYASHI return 2; 556*820c1a8dSHiroo HAYASHI } 557*820c1a8dSHiroo HAYASHI return 0; 558*820c1a8dSHiroo HAYASHI}]])], 559*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_nul_retval=yes], 560*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_nul_retval=no], 561*820c1a8dSHiroo HAYASHI [:]) 562*820c1a8dSHiroo HAYASHI fi 563*820c1a8dSHiroo HAYASHI ]) 564*820c1a8dSHiroo HAYASHI]) 565*820c1a8dSHiroo HAYASHI 566*820c1a8dSHiroo HAYASHIdnl Test whether mbrtowc stores a wide character when reporting incomplete 567*820c1a8dSHiroo HAYASHIdnl input. 568*820c1a8dSHiroo HAYASHI 569*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MBRTOWC_STORES_INCOMPLETE], 570*820c1a8dSHiroo HAYASHI[ 571*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_PROG_CC]) 572*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 573*820c1a8dSHiroo HAYASHI AC_CACHE_CHECK([whether mbrtowc stores incomplete characters], 574*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_stores_incomplete], 575*820c1a8dSHiroo HAYASHI [ 576*820c1a8dSHiroo HAYASHI dnl Initial guess, used when cross-compiling or when no suitable locale 577*820c1a8dSHiroo HAYASHI dnl is present. 578*820c1a8dSHiroo HAYASHIchangequote(,)dnl 579*820c1a8dSHiroo HAYASHI case "$host_os" in 580*820c1a8dSHiroo HAYASHI # Guess yes on native Windows. 581*820c1a8dSHiroo HAYASHI mingw*) gl_cv_func_mbrtowc_stores_incomplete="guessing yes" ;; 582*820c1a8dSHiroo HAYASHI *) gl_cv_func_mbrtowc_stores_incomplete="guessing no" ;; 583*820c1a8dSHiroo HAYASHI esac 584*820c1a8dSHiroo HAYASHIchangequote([,])dnl 585*820c1a8dSHiroo HAYASHI case "$host_os" in 586*820c1a8dSHiroo HAYASHI mingw*) 587*820c1a8dSHiroo HAYASHI AC_RUN_IFELSE( 588*820c1a8dSHiroo HAYASHI [AC_LANG_SOURCE([[ 589*820c1a8dSHiroo HAYASHI#include <locale.h> 590*820c1a8dSHiroo HAYASHI#include <string.h> 591*820c1a8dSHiroo HAYASHI#include <wchar.h> 592*820c1a8dSHiroo HAYASHIint main () 593*820c1a8dSHiroo HAYASHI{ 594*820c1a8dSHiroo HAYASHI int result = 0; 595*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "French_France.65001") != NULL) 596*820c1a8dSHiroo HAYASHI { 597*820c1a8dSHiroo HAYASHI wchar_t wc = (wchar_t) 0xBADFACE; 598*820c1a8dSHiroo HAYASHI mbstate_t state; 599*820c1a8dSHiroo HAYASHI 600*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 601*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2) 602*820c1a8dSHiroo HAYASHI && wc != (wchar_t) 0xBADFACE) 603*820c1a8dSHiroo HAYASHI result |= 1; 604*820c1a8dSHiroo HAYASHI } 605*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL) 606*820c1a8dSHiroo HAYASHI { 607*820c1a8dSHiroo HAYASHI wchar_t wc = (wchar_t) 0xBADFACE; 608*820c1a8dSHiroo HAYASHI mbstate_t state; 609*820c1a8dSHiroo HAYASHI 610*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 611*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, "\226", 1, &state) == (size_t)(-2) 612*820c1a8dSHiroo HAYASHI && wc != (wchar_t) 0xBADFACE) 613*820c1a8dSHiroo HAYASHI result |= 2; 614*820c1a8dSHiroo HAYASHI } 615*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL) 616*820c1a8dSHiroo HAYASHI { 617*820c1a8dSHiroo HAYASHI wchar_t wc = (wchar_t) 0xBADFACE; 618*820c1a8dSHiroo HAYASHI mbstate_t state; 619*820c1a8dSHiroo HAYASHI 620*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 621*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, "\245", 1, &state) == (size_t)(-2) 622*820c1a8dSHiroo HAYASHI && wc != (wchar_t) 0xBADFACE) 623*820c1a8dSHiroo HAYASHI result |= 4; 624*820c1a8dSHiroo HAYASHI } 625*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "Chinese_China.936") != NULL) 626*820c1a8dSHiroo HAYASHI { 627*820c1a8dSHiroo HAYASHI wchar_t wc = (wchar_t) 0xBADFACE; 628*820c1a8dSHiroo HAYASHI mbstate_t state; 629*820c1a8dSHiroo HAYASHI 630*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 631*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, "\261", 1, &state) == (size_t)(-2) 632*820c1a8dSHiroo HAYASHI && wc != (wchar_t) 0xBADFACE) 633*820c1a8dSHiroo HAYASHI result |= 8; 634*820c1a8dSHiroo HAYASHI } 635*820c1a8dSHiroo HAYASHI return result; 636*820c1a8dSHiroo HAYASHI}]])], 637*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_stores_incomplete=no], 638*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_stores_incomplete=yes], 639*820c1a8dSHiroo HAYASHI [:]) 640*820c1a8dSHiroo HAYASHI ;; 641*820c1a8dSHiroo HAYASHI *) 642*820c1a8dSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_FR_UTF8]) 643*820c1a8dSHiroo HAYASHI if test $LOCALE_FR_UTF8 != none; then 644*820c1a8dSHiroo HAYASHI AC_RUN_IFELSE( 645*820c1a8dSHiroo HAYASHI [AC_LANG_SOURCE([[ 646*820c1a8dSHiroo HAYASHI#include <locale.h> 647*820c1a8dSHiroo HAYASHI#include <string.h> 648*820c1a8dSHiroo HAYASHI#include <wchar.h> 649*820c1a8dSHiroo HAYASHIint main () 650*820c1a8dSHiroo HAYASHI{ 651*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) 652*820c1a8dSHiroo HAYASHI { 653*820c1a8dSHiroo HAYASHI wchar_t wc = (wchar_t) 0xBADFACE; 654*820c1a8dSHiroo HAYASHI mbstate_t state; 655*820c1a8dSHiroo HAYASHI 656*820c1a8dSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 657*820c1a8dSHiroo HAYASHI if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2) 658*820c1a8dSHiroo HAYASHI && wc != (wchar_t) 0xBADFACE) 659*820c1a8dSHiroo HAYASHI return 1; 660*820c1a8dSHiroo HAYASHI } 661*820c1a8dSHiroo HAYASHI return 0; 662*820c1a8dSHiroo HAYASHI}]])], 663*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_stores_incomplete=no], 664*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_stores_incomplete=yes], 665*820c1a8dSHiroo HAYASHI [:]) 666*820c1a8dSHiroo HAYASHI fi 667*820c1a8dSHiroo HAYASHI ;; 668*820c1a8dSHiroo HAYASHI esac 669*820c1a8dSHiroo HAYASHI ]) 670*820c1a8dSHiroo HAYASHI]) 671*820c1a8dSHiroo HAYASHI 672*820c1a8dSHiroo HAYASHIdnl Test whether mbrtowc returns the correct value on empty input. 673*820c1a8dSHiroo HAYASHI 674*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MBRTOWC_EMPTY_INPUT], 675*820c1a8dSHiroo HAYASHI[ 676*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_PROG_CC]) 677*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 678*820c1a8dSHiroo HAYASHI AC_CACHE_CHECK([whether mbrtowc works on empty input], 679*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_empty_input], 680*820c1a8dSHiroo HAYASHI [ 681*820c1a8dSHiroo HAYASHI dnl Initial guess, used when cross-compiling or when no suitable locale 682*820c1a8dSHiroo HAYASHI dnl is present. 683*820c1a8dSHiroo HAYASHIchangequote(,)dnl 684*820c1a8dSHiroo HAYASHI case "$host_os" in 685*820c1a8dSHiroo HAYASHI # Guess no on AIX and glibc systems. 686*820c1a8dSHiroo HAYASHI aix* | *-gnu* | gnu*) gl_cv_func_mbrtowc_empty_input="guessing no" ;; 687*820c1a8dSHiroo HAYASHI # Guess yes on native Windows. 688*820c1a8dSHiroo HAYASHI mingw*) gl_cv_func_mbrtowc_empty_input="guessing yes" ;; 689*820c1a8dSHiroo HAYASHI *) gl_cv_func_mbrtowc_empty_input="guessing yes" ;; 690*820c1a8dSHiroo HAYASHI esac 691*820c1a8dSHiroo HAYASHIchangequote([,])dnl 692*820c1a8dSHiroo HAYASHI AC_RUN_IFELSE( 693*820c1a8dSHiroo HAYASHI [AC_LANG_SOURCE([[ 694*820c1a8dSHiroo HAYASHI #include <wchar.h> 695*820c1a8dSHiroo HAYASHI static wchar_t wc; 696*820c1a8dSHiroo HAYASHI static mbstate_t mbs; 697*820c1a8dSHiroo HAYASHI int 698*820c1a8dSHiroo HAYASHI main (void) 699*820c1a8dSHiroo HAYASHI { 700*820c1a8dSHiroo HAYASHI return mbrtowc (&wc, "", 0, &mbs) != (size_t) -2; 701*820c1a8dSHiroo HAYASHI }]])], 702*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_empty_input=yes], 703*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_empty_input=no], 704*820c1a8dSHiroo HAYASHI [:]) 705*820c1a8dSHiroo HAYASHI ]) 706*820c1a8dSHiroo HAYASHI]) 707*820c1a8dSHiroo HAYASHI 708*820c1a8dSHiroo HAYASHIdnl Test whether mbrtowc reports encoding errors in the C locale. 709*820c1a8dSHiroo HAYASHIdnl Although POSIX was never intended to allow this, the GNU C Library 710*820c1a8dSHiroo HAYASHIdnl and other implementations do it. See: 711*820c1a8dSHiroo HAYASHIdnl https://sourceware.org/bugzilla/show_bug.cgi?id=19932 712*820c1a8dSHiroo HAYASHI 713*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_MBRTOWC_C_LOCALE], 714*820c1a8dSHiroo HAYASHI[ 715*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 716*820c1a8dSHiroo HAYASHI AC_CACHE_CHECK([whether the C locale is free of encoding errors], 717*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_C_locale_sans_EILSEQ], 718*820c1a8dSHiroo HAYASHI [ 719*820c1a8dSHiroo HAYASHI dnl Initial guess, used when cross-compiling or when no suitable locale 720*820c1a8dSHiroo HAYASHI dnl is present. 721*820c1a8dSHiroo HAYASHI gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="$gl_cross_guess_normal" 722*820c1a8dSHiroo HAYASHI 723*820c1a8dSHiroo HAYASHI AC_RUN_IFELSE( 724*820c1a8dSHiroo HAYASHI [AC_LANG_PROGRAM( 725*820c1a8dSHiroo HAYASHI [[#include <limits.h> 726*820c1a8dSHiroo HAYASHI #include <locale.h> 727*820c1a8dSHiroo HAYASHI #include <wchar.h> 728*820c1a8dSHiroo HAYASHI ]], [[ 729*820c1a8dSHiroo HAYASHI int i; 730*820c1a8dSHiroo HAYASHI char *locale = setlocale (LC_ALL, "C"); 731*820c1a8dSHiroo HAYASHI if (! locale) 732*820c1a8dSHiroo HAYASHI return 2; 733*820c1a8dSHiroo HAYASHI for (i = CHAR_MIN; i <= CHAR_MAX; i++) 734*820c1a8dSHiroo HAYASHI { 735*820c1a8dSHiroo HAYASHI char c = i; 736*820c1a8dSHiroo HAYASHI wchar_t wc; 737*820c1a8dSHiroo HAYASHI mbstate_t mbs = { 0, }; 738*820c1a8dSHiroo HAYASHI size_t ss = mbrtowc (&wc, &c, 1, &mbs); 739*820c1a8dSHiroo HAYASHI if (1 < ss) 740*820c1a8dSHiroo HAYASHI return 3; 741*820c1a8dSHiroo HAYASHI } 742*820c1a8dSHiroo HAYASHI return 0; 743*820c1a8dSHiroo HAYASHI ]])], 744*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=yes], 745*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=no], 746*820c1a8dSHiroo HAYASHI [case "$host_os" in 747*820c1a8dSHiroo HAYASHI # Guess yes on native Windows. 748*820c1a8dSHiroo HAYASHI mingw*) gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="guessing yes" ;; 749*820c1a8dSHiroo HAYASHI esac 750*820c1a8dSHiroo HAYASHI ]) 751*820c1a8dSHiroo HAYASHI ]) 752*820c1a8dSHiroo HAYASHI]) 753*820c1a8dSHiroo HAYASHI 754*820c1a8dSHiroo HAYASHI# Prerequisites of lib/mbrtowc.c and lib/lc-charset-dispatch.c. 755*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_PREREQ_MBRTOWC], [ 756*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_C_INLINE]) 757*820c1a8dSHiroo HAYASHI : 758*820c1a8dSHiroo HAYASHI]) 759*820c1a8dSHiroo HAYASHI 760*820c1a8dSHiroo HAYASHI# Prerequisites of lib/mbtowc-lock.c. 761*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_PREREQ_MBTOWC_LOCK], 762*820c1a8dSHiroo HAYASHI[ 763*820c1a8dSHiroo HAYASHI gl_VISIBILITY 764*820c1a8dSHiroo HAYASHI]) 765*820c1a8dSHiroo HAYASHI 766*820c1a8dSHiroo HAYASHI 767*820c1a8dSHiroo HAYASHIdnl From Paul Eggert 768*820c1a8dSHiroo HAYASHI 769*820c1a8dSHiroo HAYASHIdnl This is an override of an autoconf macro. 770*820c1a8dSHiroo HAYASHI 771*820c1a8dSHiroo HAYASHIAC_DEFUN([AC_FUNC_MBRTOWC], 772*820c1a8dSHiroo HAYASHI[ 773*820c1a8dSHiroo HAYASHI dnl Same as AC_FUNC_MBRTOWC in autoconf-2.60. 774*820c1a8dSHiroo HAYASHI AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared], 775*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc], 776*820c1a8dSHiroo HAYASHI [AC_LINK_IFELSE( 777*820c1a8dSHiroo HAYASHI [AC_LANG_PROGRAM( 778*820c1a8dSHiroo HAYASHI [[#include <wchar.h>]], 779*820c1a8dSHiroo HAYASHI [[wchar_t wc; 780*820c1a8dSHiroo HAYASHI char const s[] = ""; 781*820c1a8dSHiroo HAYASHI size_t n = 1; 782*820c1a8dSHiroo HAYASHI mbstate_t state; 783*820c1a8dSHiroo HAYASHI return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));]])], 784*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc=yes], 785*820c1a8dSHiroo HAYASHI [gl_cv_func_mbrtowc=no])]) 786*820c1a8dSHiroo HAYASHI if test $gl_cv_func_mbrtowc = yes; then 787*820c1a8dSHiroo HAYASHI AC_DEFINE([HAVE_MBRTOWC], [1], 788*820c1a8dSHiroo HAYASHI [Define to 1 if mbrtowc and mbstate_t are properly declared.]) 789*820c1a8dSHiroo HAYASHI fi 790*820c1a8dSHiroo HAYASHI]) 791