1*a939078aSHiroo HAYASHI# mbsrtowcs.m4 serial 14 2*a939078aSHiroo HAYASHIdnl Copyright (C) 2008-2021 Free Software Foundation, Inc. 3*a939078aSHiroo HAYASHIdnl This file is free software; the Free Software Foundation 4*a939078aSHiroo HAYASHIdnl gives unlimited permission to copy and/or distribute it, 5*a939078aSHiroo HAYASHIdnl with or without modifications, as long as this notice is preserved. 6*a939078aSHiroo HAYASHI 7*a939078aSHiroo HAYASHIAC_DEFUN([gl_FUNC_MBSRTOWCS], 8*a939078aSHiroo HAYASHI[ 9*a939078aSHiroo HAYASHI AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) 10*a939078aSHiroo HAYASHI 11*a939078aSHiroo HAYASHI AC_REQUIRE([AC_TYPE_MBSTATE_T]) 12*a939078aSHiroo HAYASHI gl_MBSTATE_T_BROKEN 13*a939078aSHiroo HAYASHI 14*a939078aSHiroo HAYASHI AC_CHECK_FUNCS_ONCE([mbsrtowcs]) 15*a939078aSHiroo HAYASHI if test $ac_cv_func_mbsrtowcs = no; then 16*a939078aSHiroo HAYASHI HAVE_MBSRTOWCS=0 17*a939078aSHiroo HAYASHI AC_CHECK_DECLS([mbsrtowcs],,, [[ 18*a939078aSHiroo HAYASHI #include <wchar.h> 19*a939078aSHiroo HAYASHI ]]) 20*a939078aSHiroo HAYASHI if test $ac_cv_have_decl_mbsrtowcs = yes; then 21*a939078aSHiroo HAYASHI dnl On Minix 3.1.8, the system's <wchar.h> declares mbsrtowcs() although 22*a939078aSHiroo HAYASHI dnl it does not have the function. Avoid a collision with gnulib's 23*a939078aSHiroo HAYASHI dnl replacement. 24*a939078aSHiroo HAYASHI REPLACE_MBSRTOWCS=1 25*a939078aSHiroo HAYASHI fi 26*a939078aSHiroo HAYASHI else 27*a939078aSHiroo HAYASHI if test $REPLACE_MBSTATE_T = 1; then 28*a939078aSHiroo HAYASHI REPLACE_MBSRTOWCS=1 29*a939078aSHiroo HAYASHI else 30*a939078aSHiroo HAYASHI gl_MBSRTOWCS_WORKS 31*a939078aSHiroo HAYASHI case "$gl_cv_func_mbsrtowcs_works" in 32*a939078aSHiroo HAYASHI *yes) ;; 33*a939078aSHiroo HAYASHI *) REPLACE_MBSRTOWCS=1 ;; 34*a939078aSHiroo HAYASHI esac 35*a939078aSHiroo HAYASHI fi 36*a939078aSHiroo HAYASHI fi 37*a939078aSHiroo HAYASHI]) 38*a939078aSHiroo HAYASHI 39*a939078aSHiroo HAYASHIdnl Test whether mbsrtowcs works. 40*a939078aSHiroo HAYASHIdnl Result is gl_cv_func_mbsrtowcs_works. 41*a939078aSHiroo HAYASHI 42*a939078aSHiroo HAYASHIAC_DEFUN([gl_MBSRTOWCS_WORKS], 43*a939078aSHiroo HAYASHI[ 44*a939078aSHiroo HAYASHI AC_REQUIRE([AC_PROG_CC]) 45*a939078aSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_FR]) 46*a939078aSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_FR_UTF8]) 47*a939078aSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_JA]) 48*a939078aSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_ZH_CN]) 49*a939078aSHiroo HAYASHI AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 50*a939078aSHiroo HAYASHI AC_CACHE_CHECK([whether mbsrtowcs works], 51*a939078aSHiroo HAYASHI [gl_cv_func_mbsrtowcs_works], 52*a939078aSHiroo HAYASHI [ 53*a939078aSHiroo HAYASHI dnl Initial guess, used when cross-compiling or when no suitable locale 54*a939078aSHiroo HAYASHI dnl is present. 55*a939078aSHiroo HAYASHIchangequote(,)dnl 56*a939078aSHiroo HAYASHI case "$host_os" in 57*a939078aSHiroo HAYASHI # Guess no on HP-UX, Solaris, mingw. 58*a939078aSHiroo HAYASHI hpux* | solaris* | mingw*) gl_cv_func_mbsrtowcs_works="guessing no" ;; 59*a939078aSHiroo HAYASHI # Guess yes otherwise. 60*a939078aSHiroo HAYASHI *) gl_cv_func_mbsrtowcs_works="guessing yes" ;; 61*a939078aSHiroo HAYASHI esac 62*a939078aSHiroo HAYASHIchangequote([,])dnl 63*a939078aSHiroo HAYASHI if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then 64*a939078aSHiroo HAYASHI AC_RUN_IFELSE( 65*a939078aSHiroo HAYASHI [AC_LANG_SOURCE([[ 66*a939078aSHiroo HAYASHI#include <locale.h> 67*a939078aSHiroo HAYASHI#include <string.h> 68*a939078aSHiroo HAYASHI#include <wchar.h> 69*a939078aSHiroo HAYASHIint main () 70*a939078aSHiroo HAYASHI{ 71*a939078aSHiroo HAYASHI int result = 0; 72*a939078aSHiroo HAYASHI /* Test whether the function supports a NULL destination argument. 73*a939078aSHiroo HAYASHI This fails on native Windows. */ 74*a939078aSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_FR") != NULL) 75*a939078aSHiroo HAYASHI { 76*a939078aSHiroo HAYASHI const char input[] = "\337er"; 77*a939078aSHiroo HAYASHI const char *src = input; 78*a939078aSHiroo HAYASHI mbstate_t state; 79*a939078aSHiroo HAYASHI 80*a939078aSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 81*a939078aSHiroo HAYASHI if (mbsrtowcs (NULL, &src, 1, &state) != 3 82*a939078aSHiroo HAYASHI || src != input) 83*a939078aSHiroo HAYASHI result |= 1; 84*a939078aSHiroo HAYASHI } 85*a939078aSHiroo HAYASHI /* Test whether the function works when started with a conversion state 86*a939078aSHiroo HAYASHI in non-initial state. This fails on HP-UX 11.11 and Solaris 10. */ 87*a939078aSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) 88*a939078aSHiroo HAYASHI { 89*a939078aSHiroo HAYASHI const char input[] = "B\303\274\303\237er"; 90*a939078aSHiroo HAYASHI mbstate_t state; 91*a939078aSHiroo HAYASHI 92*a939078aSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 93*a939078aSHiroo HAYASHI if (mbrtowc (NULL, input + 1, 1, &state) == (size_t)(-2)) 94*a939078aSHiroo HAYASHI if (!mbsinit (&state)) 95*a939078aSHiroo HAYASHI { 96*a939078aSHiroo HAYASHI const char *src = input + 2; 97*a939078aSHiroo HAYASHI if (mbsrtowcs (NULL, &src, 10, &state) != 4) 98*a939078aSHiroo HAYASHI result |= 2; 99*a939078aSHiroo HAYASHI } 100*a939078aSHiroo HAYASHI } 101*a939078aSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) 102*a939078aSHiroo HAYASHI { 103*a939078aSHiroo HAYASHI const char input[] = "<\306\374\313\334\270\354>"; 104*a939078aSHiroo HAYASHI mbstate_t state; 105*a939078aSHiroo HAYASHI 106*a939078aSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 107*a939078aSHiroo HAYASHI if (mbrtowc (NULL, input + 3, 1, &state) == (size_t)(-2)) 108*a939078aSHiroo HAYASHI if (!mbsinit (&state)) 109*a939078aSHiroo HAYASHI { 110*a939078aSHiroo HAYASHI const char *src = input + 4; 111*a939078aSHiroo HAYASHI if (mbsrtowcs (NULL, &src, 10, &state) != 3) 112*a939078aSHiroo HAYASHI result |= 4; 113*a939078aSHiroo HAYASHI } 114*a939078aSHiroo HAYASHI } 115*a939078aSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) 116*a939078aSHiroo HAYASHI { 117*a939078aSHiroo HAYASHI const char input[] = "B\250\271\201\060\211\070er"; 118*a939078aSHiroo HAYASHI mbstate_t state; 119*a939078aSHiroo HAYASHI 120*a939078aSHiroo HAYASHI memset (&state, '\0', sizeof (mbstate_t)); 121*a939078aSHiroo HAYASHI if (mbrtowc (NULL, input + 1, 1, &state) == (size_t)(-2)) 122*a939078aSHiroo HAYASHI if (!mbsinit (&state)) 123*a939078aSHiroo HAYASHI { 124*a939078aSHiroo HAYASHI const char *src = input + 2; 125*a939078aSHiroo HAYASHI if (mbsrtowcs (NULL, &src, 10, &state) != 4) 126*a939078aSHiroo HAYASHI result |= 8; 127*a939078aSHiroo HAYASHI } 128*a939078aSHiroo HAYASHI } 129*a939078aSHiroo HAYASHI return result; 130*a939078aSHiroo HAYASHI}]])], 131*a939078aSHiroo HAYASHI [gl_cv_func_mbsrtowcs_works=yes], 132*a939078aSHiroo HAYASHI [gl_cv_func_mbsrtowcs_works=no], 133*a939078aSHiroo HAYASHI [:]) 134*a939078aSHiroo HAYASHI fi 135*a939078aSHiroo HAYASHI ]) 136*a939078aSHiroo HAYASHI]) 137*a939078aSHiroo HAYASHI 138*a939078aSHiroo HAYASHI# Prerequisites of lib/mbsrtowcs.c. 139*a939078aSHiroo HAYASHIAC_DEFUN([gl_PREREQ_MBSRTOWCS], [ 140*a939078aSHiroo HAYASHI : 141*a939078aSHiroo HAYASHI]) 142