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
164
/* This fails on Solaris 8:
165
mbrtowc returns 2, and sets wc to 0x00F0.
166
mbtowc returns 4 (correct) and sets wc to 0x5EDC. */
167
if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
169
char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
173
memset (&state, '\0', sizeof (mbstate_t));
174
if (mbrtowc (&wc, input + 3, 6, &state) != 4
175
&& mbtowc (&wc, input + 3, 6) == 4)
180
[gl_cv_func_mbrtowc_sanitycheck=yes],
181
[gl_cv_func_mbrtowc_sanitycheck=no],
187
dnl Test whether mbrtowc supports a NULL string argument correctly.
188
dnl Result is gl_cv_func_mbrtowc_null_arg.
190
AC_DEFUN([gl_MBRTOWC_NULL_ARG],
192
AC_REQUIRE([AC_PROG_CC])
193
AC_REQUIRE([gt_LOCALE_FR_UTF8])
194
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
195
AC_CACHE_CHECK([whether mbrtowc handles a NULL string argument],
196
[gl_cv_func_mbrtowc_null_arg],
198
dnl Initial guess, used when cross-compiling or when no suitable locale
203
osf*) gl_cv_func_mbrtowc_null_arg="guessing no" ;;
204
# Guess yes otherwise.
205
*) gl_cv_func_mbrtowc_null_arg="guessing yes" ;;
208
if test $LOCALE_FR_UTF8 != none; then
215
if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
221
memset (&state, '\0', sizeof (mbstate_t));
222
wc = (wchar_t) 0xBADFACE;
223
mbrtowc (&wc, NULL, 5, &state);
224
/* Check that wc was not modified. */
225
if (wc != (wchar_t) 0xBADFACE)
229
}], [gl_cv_func_mbrtowc_null_arg=yes], [gl_cv_func_mbrtowc_null_arg=no], [:])
234
dnl Test whether mbrtowc, when parsing the end of a multibyte character,
235
dnl correctly returns the number of bytes that were needed to complete the
236
dnl character (not the total number of bytes of the multibyte character).
237
dnl Result is gl_cv_func_mbrtowc_retval.
239
AC_DEFUN([gl_MBRTOWC_RETVAL],
241
AC_REQUIRE([AC_PROG_CC])
242
AC_REQUIRE([gt_LOCALE_FR_UTF8])
243
AC_REQUIRE([gt_LOCALE_JA])
244
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
245
AC_CACHE_CHECK([whether mbrtowc has a correct return value],
246
[gl_cv_func_mbrtowc_retval],
248
dnl Initial guess, used when cross-compiling or when no suitable locale
252
# Guess no on HP-UX and Solaris.
253
hpux* | solaris*) gl_cv_func_mbrtowc_retval="guessing no" ;;
254
# Guess yes otherwise.
255
*) gl_cv_func_mbrtowc_retval="guessing yes" ;;
258
if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none; then
265
/* This fails on Solaris. */
266
if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
268
char input[] = "B\303\274\303\237er"; /* "Büßer" */
272
memset (&state, '\0', sizeof (mbstate_t));
273
if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
276
if (mbrtowc (&wc, input + 2, 5, &state) != 1)
280
/* This fails on HP-UX 11.11. */
281
if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
283
char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
287
memset (&state, '\0', sizeof (mbstate_t));
288
if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
291
if (mbrtowc (&wc, input + 2, 5, &state) != 2)
297
[gl_cv_func_mbrtowc_retval=yes],
298
[gl_cv_func_mbrtowc_retval=no],
304
dnl Test whether mbrtowc, when parsing a NUL character, correctly returns 0.
305
dnl Result is gl_cv_func_mbrtowc_nul_retval.
307
AC_DEFUN([gl_MBRTOWC_NUL_RETVAL],
309
AC_REQUIRE([AC_PROG_CC])
310
AC_REQUIRE([gt_LOCALE_ZH_CN])
311
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
312
AC_CACHE_CHECK([whether mbrtowc returns 0 when parsing a NUL character],
313
[gl_cv_func_mbrtowc_nul_retval],
315
dnl Initial guess, used when cross-compiling or when no suitable locale
319
# Guess no on Solaris 8 and 9.
320
solaris2.[89]) gl_cv_func_mbrtowc_nul_retval="guessing no" ;;
321
# Guess yes otherwise.
322
*) gl_cv_func_mbrtowc_nul_retval="guessing yes" ;;
325
if test $LOCALE_ZH_CN != none; then
332
/* This fails on Solaris 8 and 9. */
333
if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
338
memset (&state, '\0', sizeof (mbstate_t));
339
if (mbrtowc (&wc, "", 1, &state) != 0)
344
[gl_cv_func_mbrtowc_nul_retval=yes],
345
[gl_cv_func_mbrtowc_nul_retval=no],
351
# Prerequisites of lib/mbrtowc.c.
352
AC_DEFUN([gl_PREREQ_MBRTOWC], [
359
dnl This override of an autoconf macro can be removed when autoconf 2.60 or
360
dnl newer can be assumed everywhere.
362
m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.60]),[-1],[
363
AC_DEFUN([AC_FUNC_MBRTOWC],
365
dnl Same as AC_FUNC_MBRTOWC in autoconf-2.60.
366
AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared],
370
[[#include <wchar.h>]],
375
return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));]])],
376
gl_cv_func_mbrtowc=yes,
377
gl_cv_func_mbrtowc=no)])
378
if test $gl_cv_func_mbrtowc = yes; then
379
AC_DEFINE([HAVE_MBRTOWC], [1],
380
[Define to 1 if mbrtowc and mbstate_t are properly declared.])