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 case "$gl_cv_func_mbrtowc_incomplete_state" in
69 *yes) REPLACE_MBSTATE_T=0 ;;
70 *) REPLACE_MBSTATE_T=1 ;;
75 if test $REPLACE_MBSTATE_T = 1; then
80 dnl Test whether mbrtowc puts the state into non-initial state when parsing an
81 dnl incomplete multibyte character.
82 dnl Result is gl_cv_func_mbrtowc_incomplete_state.
84 AC_DEFUN([gl_MBRTOWC_INCOMPLETE_STATE],
86 AC_REQUIRE([AC_PROG_CC])
87 AC_REQUIRE([gt_LOCALE_JA])
88 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
89 AC_CACHE_CHECK([whether mbrtowc handles incomplete characters],
90 [gl_cv_func_mbrtowc_incomplete_state],
92 dnl Initial guess, used when cross-compiling or when no suitable locale
96 # Guess no on AIX and OSF/1.
97 osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;;
98 # Guess yes otherwise.
99 *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;;
102 if test $LOCALE_JA != none; then
109 if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
111 const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
115 memset (&state, '\0', sizeof (mbstate_t));
116 if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
117 if (mbsinit (&state))
122 [gl_cv_func_mbrtowc_incomplete_state=yes],
123 [gl_cv_func_mbrtowc_incomplete_state=no],
129 dnl Test whether mbrtowc supports a NULL string argument correctly.
130 dnl Result is gl_cv_func_mbrtowc_null_arg.
132 AC_DEFUN([gl_MBRTOWC_NULL_ARG],
134 AC_REQUIRE([AC_PROG_CC])
135 AC_REQUIRE([gt_LOCALE_FR_UTF8])
136 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
137 AC_CACHE_CHECK([whether mbrtowc handles a NULL string argument],
138 [gl_cv_func_mbrtowc_null_arg],
140 dnl Initial guess, used when cross-compiling or when no suitable locale
145 osf*) gl_cv_func_mbrtowc_null_arg="guessing no" ;;
146 # Guess yes otherwise.
147 *) gl_cv_func_mbrtowc_null_arg="guessing yes" ;;
150 if test $LOCALE_FR_UTF8 != none; then
157 if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
163 memset (&state, '\0', sizeof (mbstate_t));
164 wc = (wchar_t) 0xBADFACE;
165 mbrtowc (&wc, NULL, 5, &state);
166 /* Check that wc was not modified. */
167 if (wc != (wchar_t) 0xBADFACE)
171 }], [gl_cv_func_mbrtowc_null_arg=yes], [gl_cv_func_mbrtowc_null_arg=no], [])
176 dnl Test whether mbrtowc, when parsing the end of a multibyte character,
177 dnl correctly returns the number of bytes that were needed to complete the
178 dnl character (not the total number of bytes of the multibyte character).
179 dnl Result is gl_cv_func_mbrtowc_retval.
181 AC_DEFUN([gl_MBRTOWC_RETVAL],
183 AC_REQUIRE([AC_PROG_CC])
184 AC_REQUIRE([gt_LOCALE_FR_UTF8])
185 AC_REQUIRE([gt_LOCALE_JA])
186 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
187 AC_CACHE_CHECK([whether mbrtowc has a correct return value],
188 [gl_cv_func_mbrtowc_retval],
190 dnl Initial guess, used when cross-compiling or when no suitable locale
194 # Guess no on HP-UX and Solaris.
195 hpux* | solaris*) gl_cv_func_mbrtowc_retval="guessing no" ;;
196 # Guess yes otherwise.
197 *) gl_cv_func_mbrtowc_retval="guessing yes" ;;
200 if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none; then
207 /* This fails on Solaris. */
208 if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
210 char input[] = "B\303\274\303\237er"; /* "Büßer" */
214 memset (&state, '\0', sizeof (mbstate_t));
215 if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
218 if (mbrtowc (&wc, input + 2, 5, &state) != 1)
222 /* This fails on HP-UX 11.11. */
223 if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
225 char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
229 memset (&state, '\0', sizeof (mbstate_t));
230 if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
233 if (mbrtowc (&wc, input + 2, 5, &state) != 2)
239 [gl_cv_func_mbrtowc_retval=yes],
240 [gl_cv_func_mbrtowc_retval=no],
246 dnl Test whether mbrtowc, when parsing a NUL character, correctly returns 0.
247 dnl Result is gl_cv_func_mbrtowc_nul_retval.
249 AC_DEFUN([gl_MBRTOWC_NUL_RETVAL],
251 AC_REQUIRE([AC_PROG_CC])
252 AC_REQUIRE([gt_LOCALE_ZH_CN])
253 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
254 AC_CACHE_CHECK([whether mbrtowc returns 0 when parsing a NUL character],
255 [gl_cv_func_mbrtowc_nul_retval],
257 dnl Initial guess, used when cross-compiling or when no suitable locale
261 # Guess no on Solaris 9.
262 solaris2.9) gl_cv_func_mbrtowc_nul_retval="guessing no" ;;
263 # Guess yes otherwise.
264 *) gl_cv_func_mbrtowc_nul_retval="guessing yes" ;;
267 if test $LOCALE_ZH_CN != none; then
274 /* This fails on Solaris 9. */
275 if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
280 memset (&state, '\0', sizeof (mbstate_t));
281 if (mbrtowc (&wc, "", 1, &state) != 0)
286 [gl_cv_func_mbrtowc_nul_retval=yes],
287 [gl_cv_func_mbrtowc_nul_retval=no],
293 # Prerequisites of lib/mbrtowc.c.
294 AC_DEFUN([gl_PREREQ_MBRTOWC], [
301 dnl This override of an autoconf macro can be removed when autoconf 2.60 or
302 dnl newer can be assumed everywhere.
304 m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.60]),[-1],[
305 AC_DEFUN([AC_FUNC_MBRTOWC],
307 dnl Same as AC_FUNC_MBRTOWC in autoconf-2.60.
308 AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared],
312 [[#include <wchar.h>]],
317 return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));]])],
318 gl_cv_func_mbrtowc=yes,
319 gl_cv_func_mbrtowc=no)])
320 if test $gl_cv_func_mbrtowc = yes; then
321 AC_DEFINE([HAVE_MBRTOWC], [1],
322 [Define to 1 if mbrtowc and mbstate_t are properly declared.])