xref: /Universal-ctags/m4/mbrtowc.m4 (revision 820c1a8d46849a90376d8eb15b319ac05439f656)
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