1*820c1a8dSHiroo HAYASHI# wcrtomb.m4 serial 17 2*820c1a8dSHiroo HAYASHIdnl Copyright (C) 2008-2021 Free Software Foundation, Inc. 3*820c1a8dSHiroo HAYASHIdnl This file is free software; the Free Software Foundation 4*820c1a8dSHiroo HAYASHIdnl gives unlimited permission to copy and/or distribute it, 5*820c1a8dSHiroo HAYASHIdnl with or without modifications, as long as this notice is preserved. 6*820c1a8dSHiroo HAYASHI 7*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_FUNC_WCRTOMB], 8*820c1a8dSHiroo HAYASHI[ 9*820c1a8dSHiroo HAYASHI AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) 10*820c1a8dSHiroo HAYASHI 11*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_TYPE_MBSTATE_T]) 12*820c1a8dSHiroo HAYASHI gl_MBSTATE_T_BROKEN 13*820c1a8dSHiroo HAYASHI 14*820c1a8dSHiroo HAYASHI AC_CHECK_FUNCS_ONCE([wcrtomb]) 15*820c1a8dSHiroo HAYASHI if test $ac_cv_func_wcrtomb = no; then 16*820c1a8dSHiroo HAYASHI HAVE_WCRTOMB=0 17*820c1a8dSHiroo HAYASHI AC_CHECK_DECLS([wcrtomb],,, [[ 18*820c1a8dSHiroo HAYASHI #include <wchar.h> 19*820c1a8dSHiroo HAYASHI ]]) 20*820c1a8dSHiroo HAYASHI if test $ac_cv_have_decl_wcrtomb = yes; then 21*820c1a8dSHiroo HAYASHI dnl On Minix 3.1.8, the system's <wchar.h> declares wcrtomb() although 22*820c1a8dSHiroo HAYASHI dnl it does not have the function. Avoid a collision with gnulib's 23*820c1a8dSHiroo HAYASHI dnl replacement. 24*820c1a8dSHiroo HAYASHI REPLACE_WCRTOMB=1 25*820c1a8dSHiroo HAYASHI fi 26*820c1a8dSHiroo HAYASHI else 27*820c1a8dSHiroo HAYASHI dnl We don't actually need to override wcrtomb when redefining the semantics 28*820c1a8dSHiroo HAYASHI dnl of the mbstate_t type. Tested on 32-bit AIX. 29*820c1a8dSHiroo HAYASHI dnl if test $REPLACE_MBSTATE_T = 1; then 30*820c1a8dSHiroo HAYASHI dnl REPLACE_WCRTOMB=1 31*820c1a8dSHiroo HAYASHI dnl fi 32*820c1a8dSHiroo HAYASHI if test $REPLACE_WCRTOMB = 0; then 33*820c1a8dSHiroo HAYASHI dnl On Android 4.3, wcrtomb produces wrong characters in the C locale. 34*820c1a8dSHiroo HAYASHI dnl On AIX 4.3, OSF/1 5.1 and Solaris <= 11.3, wcrtomb (NULL, 0, NULL) 35*820c1a8dSHiroo HAYASHI dnl sometimes returns 0 instead of 1. 36*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_PROG_CC]) 37*820c1a8dSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_FR]) 38*820c1a8dSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_FR_UTF8]) 39*820c1a8dSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_JA]) 40*820c1a8dSHiroo HAYASHI AC_REQUIRE([gt_LOCALE_ZH_CN]) 41*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 42*820c1a8dSHiroo HAYASHI AC_CACHE_CHECK([whether wcrtomb works in the C locale], 43*820c1a8dSHiroo HAYASHI [gl_cv_func_wcrtomb_works], 44*820c1a8dSHiroo HAYASHI [AC_RUN_IFELSE( 45*820c1a8dSHiroo HAYASHI [AC_LANG_SOURCE([[ 46*820c1a8dSHiroo HAYASHI#include <string.h> 47*820c1a8dSHiroo HAYASHI#include <stdlib.h> 48*820c1a8dSHiroo HAYASHI#include <wchar.h> 49*820c1a8dSHiroo HAYASHIint main () 50*820c1a8dSHiroo HAYASHI{ 51*820c1a8dSHiroo HAYASHI mbstate_t state; 52*820c1a8dSHiroo HAYASHI char out[64]; 53*820c1a8dSHiroo HAYASHI int count; 54*820c1a8dSHiroo HAYASHI memset (&state, 0, sizeof (state)); 55*820c1a8dSHiroo HAYASHI out[0] = 'x'; 56*820c1a8dSHiroo HAYASHI count = wcrtomb (out, L'a', &state); 57*820c1a8dSHiroo HAYASHI return !(count == 1 && out[0] == 'a'); 58*820c1a8dSHiroo HAYASHI}]])], 59*820c1a8dSHiroo HAYASHI [gl_cv_func_wcrtomb_works=yes], 60*820c1a8dSHiroo HAYASHI [gl_cv_func_wcrtomb_works=no], 61*820c1a8dSHiroo HAYASHI [case "$host_os" in 62*820c1a8dSHiroo HAYASHI # Guess no on Android. 63*820c1a8dSHiroo HAYASHI linux*-android*) gl_cv_func_wcrtomb_works="guessing no";; 64*820c1a8dSHiroo HAYASHI # Guess yes otherwise. 65*820c1a8dSHiroo HAYASHI *) gl_cv_func_wcrtomb_works="guessing yes";; 66*820c1a8dSHiroo HAYASHI esac 67*820c1a8dSHiroo HAYASHI ]) 68*820c1a8dSHiroo HAYASHI ]) 69*820c1a8dSHiroo HAYASHI case "$gl_cv_func_wcrtomb_works" in 70*820c1a8dSHiroo HAYASHI *yes) ;; 71*820c1a8dSHiroo HAYASHI *) AC_DEFINE([WCRTOMB_C_LOCALE_BUG], [1], 72*820c1a8dSHiroo HAYASHI [Define if the wcrtomb function does not work in the C locale.]) 73*820c1a8dSHiroo HAYASHI REPLACE_WCRTOMB=1 ;; 74*820c1a8dSHiroo HAYASHI esac 75*820c1a8dSHiroo HAYASHI fi 76*820c1a8dSHiroo HAYASHI if test $REPLACE_WCRTOMB = 0; then 77*820c1a8dSHiroo HAYASHI AC_CACHE_CHECK([whether wcrtomb return value is correct], 78*820c1a8dSHiroo HAYASHI [gl_cv_func_wcrtomb_retval], 79*820c1a8dSHiroo HAYASHI [ 80*820c1a8dSHiroo HAYASHI dnl Initial guess, used when cross-compiling or when no suitable locale 81*820c1a8dSHiroo HAYASHI dnl is present. 82*820c1a8dSHiroo HAYASHIchangequote(,)dnl 83*820c1a8dSHiroo HAYASHI case "$host_os" in 84*820c1a8dSHiroo HAYASHI # Guess no on AIX 4, OSF/1, Solaris, native Windows. 85*820c1a8dSHiroo HAYASHI aix4* | osf* | solaris* | mingw*) gl_cv_func_wcrtomb_retval="guessing no" ;; 86*820c1a8dSHiroo HAYASHI # Guess yes otherwise. 87*820c1a8dSHiroo HAYASHI *) gl_cv_func_wcrtomb_retval="guessing yes" ;; 88*820c1a8dSHiroo HAYASHI esac 89*820c1a8dSHiroo HAYASHIchangequote([,])dnl 90*820c1a8dSHiroo HAYASHI if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then 91*820c1a8dSHiroo HAYASHI AC_RUN_IFELSE( 92*820c1a8dSHiroo HAYASHI [AC_LANG_SOURCE([[ 93*820c1a8dSHiroo HAYASHI#include <locale.h> 94*820c1a8dSHiroo HAYASHI#include <string.h> 95*820c1a8dSHiroo HAYASHI#include <wchar.h> 96*820c1a8dSHiroo HAYASHI#include <stdlib.h> 97*820c1a8dSHiroo HAYASHIint main () 98*820c1a8dSHiroo HAYASHI{ 99*820c1a8dSHiroo HAYASHI int result = 0; 100*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_FR") != NULL) 101*820c1a8dSHiroo HAYASHI { 102*820c1a8dSHiroo HAYASHI if (wcrtomb (NULL, 0, NULL) != 1) 103*820c1a8dSHiroo HAYASHI result |= 1; 104*820c1a8dSHiroo HAYASHI } 105*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) 106*820c1a8dSHiroo HAYASHI { 107*820c1a8dSHiroo HAYASHI if (wcrtomb (NULL, 0, NULL) != 1) 108*820c1a8dSHiroo HAYASHI result |= 2; 109*820c1a8dSHiroo HAYASHI { 110*820c1a8dSHiroo HAYASHI wchar_t wc = (wchar_t) 0xBADFACE; 111*820c1a8dSHiroo HAYASHI if (mbtowc (&wc, "\303\274", 2) == 2) 112*820c1a8dSHiroo HAYASHI if (wcrtomb (NULL, wc, NULL) != 1) 113*820c1a8dSHiroo HAYASHI result |= 2; 114*820c1a8dSHiroo HAYASHI } 115*820c1a8dSHiroo HAYASHI } 116*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) 117*820c1a8dSHiroo HAYASHI { 118*820c1a8dSHiroo HAYASHI if (wcrtomb (NULL, 0, NULL) != 1) 119*820c1a8dSHiroo HAYASHI result |= 4; 120*820c1a8dSHiroo HAYASHI } 121*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) 122*820c1a8dSHiroo HAYASHI { 123*820c1a8dSHiroo HAYASHI if (wcrtomb (NULL, 0, NULL) != 1) 124*820c1a8dSHiroo HAYASHI result |= 8; 125*820c1a8dSHiroo HAYASHI } 126*820c1a8dSHiroo HAYASHI return result; 127*820c1a8dSHiroo HAYASHI}]])], 128*820c1a8dSHiroo HAYASHI [gl_cv_func_wcrtomb_retval=yes], 129*820c1a8dSHiroo HAYASHI [gl_cv_func_wcrtomb_retval=no], 130*820c1a8dSHiroo HAYASHI [:]) 131*820c1a8dSHiroo HAYASHI fi 132*820c1a8dSHiroo HAYASHI ]) 133*820c1a8dSHiroo HAYASHI case "$gl_cv_func_wcrtomb_retval" in 134*820c1a8dSHiroo HAYASHI *yes) ;; 135*820c1a8dSHiroo HAYASHI *) AC_DEFINE([WCRTOMB_RETVAL_BUG], [1], 136*820c1a8dSHiroo HAYASHI [Define if the wcrtomb function has an incorrect return value.]) 137*820c1a8dSHiroo HAYASHI REPLACE_WCRTOMB=1 ;; 138*820c1a8dSHiroo HAYASHI esac 139*820c1a8dSHiroo HAYASHI fi 140*820c1a8dSHiroo HAYASHI fi 141*820c1a8dSHiroo HAYASHI]) 142*820c1a8dSHiroo HAYASHI 143*820c1a8dSHiroo HAYASHI# Prerequisites of lib/wcrtomb.c. 144*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_PREREQ_WCRTOMB], [ 145*820c1a8dSHiroo HAYASHI : 146*820c1a8dSHiroo HAYASHI]) 147