2 dnl Copyright (C) 2001-2002, 2004-2005, 2008, 2009 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
7 AC_DEFUN([gl_FUNC_MBRTOWC],
9 AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
11 AC_REQUIRE([AC_TYPE_MBSTATE_T])
13 if test $REPLACE_MBSTATE_T = 1; then
16 AC_CHECK_FUNCS_ONCE([mbrtowc])
17 if test $ac_cv_func_mbrtowc = no; then
20 if test $HAVE_MBRTOWC != 0 && test $REPLACE_MBRTOWC != 1; then
24 case "$gl_cv_func_mbrtowc_null_arg" in
26 *) AC_DEFINE([MBRTOWC_NULL_ARG_BUG], [1],
27 [Define if the mbrtowc function has the NULL string argument bug.])
31 case "$gl_cv_func_mbrtowc_retval" in
33 *) AC_DEFINE([MBRTOWC_RETVAL_BUG], [1],
34 [Define if the mbrtowc function returns a wrong return value.])
38 case "$gl_cv_func_mbrtowc_nul_retval" in
40 *) AC_DEFINE([MBRTOWC_NUL_RETVAL_BUG], [1],
41 [Define if the mbrtowc function does not return 0 for a NUL character.])
46 if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then
53 dnl Test whether mbsinit() and mbrtowc() need to be overridden in a way that
54 dnl redefines the semantics of the given mbstate_t type.
55 dnl Result is REPLACE_MBSTATE_T.
56 dnl When this is set to 1, we replace both mbsinit() and mbrtowc(), in order to
57 dnl avoid inconsistencies.
59 AC_DEFUN([gl_MBSTATE_T_BROKEN],
61 AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
63 AC_REQUIRE([AC_TYPE_MBSTATE_T])
64 AC_CHECK_FUNCS_ONCE([mbsinit])
65 AC_CHECK_FUNCS_ONCE([mbrtowc])
66 if test $ac_cv_func_mbsinit = yes && test $ac_cv_func_mbrtowc = yes; then
67 gl_MBRTOWC_INCOMPLETE_STATE
68 gl_MBRTOWC_SANITYCHECK
70 case "$gl_cv_func_mbrtowc_incomplete_state" in
72 *) REPLACE_MBSTATE_T=1 ;;
74 case "$gl_cv_func_mbrtowc_sanitycheck" in
76 *) REPLACE_MBSTATE_T=1 ;;
81 if test $REPLACE_MBSTATE_T = 1; then
86 dnl Test whether mbrtowc puts the state into non-initial state when parsing an
87 dnl incomplete multibyte character.
88 dnl Result is gl_cv_func_mbrtowc_incomplete_state.
90 AC_DEFUN([gl_MBRTOWC_INCOMPLETE_STATE],
92 AC_REQUIRE([AC_PROG_CC])
93 AC_REQUIRE([gt_LOCALE_JA])
94 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
95 AC_CACHE_CHECK([whether mbrtowc handles incomplete characters],
96 [gl_cv_func_mbrtowc_incomplete_state],
98 dnl Initial guess, used when cross-compiling or when no suitable locale
102 # Guess no on AIX and OSF/1.
103 osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;;
104 # Guess yes otherwise.
105 *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;;
108 if test $LOCALE_JA != none; then
115 if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
117 const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
121 memset (&state, '\0', sizeof (mbstate_t));
122 if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
123 if (mbsinit (&state))
128 [gl_cv_func_mbrtowc_incomplete_state=yes],
129 [gl_cv_func_mbrtowc_incomplete_state=no],
135 dnl Test whether mbrtowc works not worse than mbtowc.
136 dnl Result is gl_cv_func_mbrtowc_sanitycheck.
138 AC_DEFUN([gl_MBRTOWC_SANITYCHECK],
140 AC_REQUIRE([AC_PROG_CC])
141 AC_REQUIRE([gt_LOCALE_ZH_CN])
142 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
143 AC_CACHE_CHECK([whether mbrtowc works as well as mbtowc],
144 [gl_cv_func_mbrtowc_sanitycheck],
146 dnl Initial guess, used when cross-compiling or when no suitable locale
150 # Guess no on Solaris 8.
151 solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;;
152 # Guess yes otherwise.
153 *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;;
156 if test $LOCALE_ZH_CN != none; then
163 /* This fails on Solaris 8:
164 mbrtowc returns 2, and sets wc to 0x00F0.
165 mbtowc returns 4 (correct) and sets wc to 0x5EDC. */
166 if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
168 char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
172 memset (&state, '\0', sizeof (mbstate_t));
173 if (mbrtowc (&wc, input + 3, 6, &state) != 4
174 && mbtowc (&wc, input + 3, 6) == 4)
179 [gl_cv_func_mbrtowc_sanitycheck=yes],
180 [gl_cv_func_mbrtowc_sanitycheck=no],
186 dnl Test whether mbrtowc supports a NULL string argument correctly.
187 dnl Result is gl_cv_func_mbrtowc_null_arg.
189 AC_DEFUN([gl_MBRTOWC_NULL_ARG],
191 AC_REQUIRE([AC_PROG_CC])
192 AC_REQUIRE([gt_LOCALE_FR_UTF8])
193 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
194 AC_CACHE_CHECK([whether mbrtowc handles a NULL string argument],
195 [gl_cv_func_mbrtowc_null_arg],
197 dnl Initial guess, used when cross-compiling or when no suitable locale
202 osf*) gl_cv_func_mbrtowc_null_arg="guessing no" ;;
203 # Guess yes otherwise.
204 *) gl_cv_func_mbrtowc_null_arg="guessing yes" ;;
207 if test $LOCALE_FR_UTF8 != none; then
214 if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
220 memset (&state, '\0', sizeof (mbstate_t));
221 wc = (wchar_t) 0xBADFACE;
222 mbrtowc (&wc, NULL, 5, &state);
223 /* Check that wc was not modified. */
224 if (wc != (wchar_t) 0xBADFACE)
228 }], [gl_cv_func_mbrtowc_null_arg=yes], [gl_cv_func_mbrtowc_null_arg=no], [])
233 dnl Test whether mbrtowc, when parsing the end of a multibyte character,
234 dnl correctly returns the number of bytes that were needed to complete the
235 dnl character (not the total number of bytes of the multibyte character).
236 dnl Result is gl_cv_func_mbrtowc_retval.
238 AC_DEFUN([gl_MBRTOWC_RETVAL],
240 AC_REQUIRE([AC_PROG_CC])
241 AC_REQUIRE([gt_LOCALE_FR_UTF8])
242 AC_REQUIRE([gt_LOCALE_JA])
243 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
244 AC_CACHE_CHECK([whether mbrtowc has a correct return value],
245 [gl_cv_func_mbrtowc_retval],
247 dnl Initial guess, used when cross-compiling or when no suitable locale
251 # Guess no on HP-UX and Solaris.
252 hpux* | solaris*) gl_cv_func_mbrtowc_retval="guessing no" ;;
253 # Guess yes otherwise.
254 *) gl_cv_func_mbrtowc_retval="guessing yes" ;;
257 if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none; then
264 /* This fails on Solaris. */
265 if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
267 char input[] = "B\303\274\303\237er"; /* "Büßer" */
271 memset (&state, '\0', sizeof (mbstate_t));
272 if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
275 if (mbrtowc (&wc, input + 2, 5, &state) != 1)
279 /* This fails on HP-UX 11.11. */
280 if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
282 char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
286 memset (&state, '\0', sizeof (mbstate_t));
287 if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
290 if (mbrtowc (&wc, input + 2, 5, &state) != 2)
296 [gl_cv_func_mbrtowc_retval=yes],
297 [gl_cv_func_mbrtowc_retval=no],
303 dnl Test whether mbrtowc, when parsing a NUL character, correctly returns 0.
304 dnl Result is gl_cv_func_mbrtowc_nul_retval.
306 AC_DEFUN([gl_MBRTOWC_NUL_RETVAL],
308 AC_REQUIRE([AC_PROG_CC])
309 AC_REQUIRE([gt_LOCALE_ZH_CN])
310 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
311 AC_CACHE_CHECK([whether mbrtowc returns 0 when parsing a NUL character],
312 [gl_cv_func_mbrtowc_nul_retval],
314 dnl Initial guess, used when cross-compiling or when no suitable locale
318 # Guess no on Solaris 8 and 9.
319 solaris2.[89]) gl_cv_func_mbrtowc_nul_retval="guessing no" ;;
320 # Guess yes otherwise.
321 *) gl_cv_func_mbrtowc_nul_retval="guessing yes" ;;
324 if test $LOCALE_ZH_CN != none; then
331 /* This fails on Solaris 8 and 9. */
332 if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
337 memset (&state, '\0', sizeof (mbstate_t));
338 if (mbrtowc (&wc, "", 1, &state) != 0)
343 [gl_cv_func_mbrtowc_nul_retval=yes],
344 [gl_cv_func_mbrtowc_nul_retval=no],
350 # Prerequisites of lib/mbrtowc.c.
351 AC_DEFUN([gl_PREREQ_MBRTOWC], [
358 dnl This override of an autoconf macro can be removed when autoconf 2.60 or
359 dnl newer can be assumed everywhere.
361 m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.60]),[-1],[
362 AC_DEFUN([AC_FUNC_MBRTOWC],
364 dnl Same as AC_FUNC_MBRTOWC in autoconf-2.60.
365 AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared],
369 [[#include <wchar.h>]],
374 return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));]])],
375 gl_cv_func_mbrtowc=yes,
376 gl_cv_func_mbrtowc=no)])
377 if test $gl_cv_func_mbrtowc = yes; then
378 AC_DEFINE([HAVE_MBRTOWC], [1],
379 [Define to 1 if mbrtowc and mbstate_t are properly declared.])