2 dnl Copyright (C) 2008, 2010 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_MBRLEN],
9 AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
11 AC_REQUIRE([AC_TYPE_MBSTATE_T])
12 AC_REQUIRE([gl_FUNC_MBRTOWC])
13 AC_CHECK_FUNCS_ONCE([mbrlen])
14 if test $ac_cv_func_mbrlen = no; then
17 dnl Most bugs affecting the system's mbrtowc function also affect the
18 dnl mbrlen function. So override mbrlen whenever mbrtowc is overridden.
19 dnl We could also run the individual tests below; the results would be
21 if test $REPLACE_MBRTOWC = 1; then
25 if test $HAVE_MBRLEN = 0 || test $REPLACE_MBRLEN = 1; then
32 dnl Test whether mbrlen puts the state into non-initial state when parsing an
33 dnl incomplete multibyte character.
34 dnl Result is gl_cv_func_mbrlen_incomplete_state.
36 AC_DEFUN([gl_MBRLEN_INCOMPLETE_STATE],
38 AC_REQUIRE([AC_PROG_CC])
39 AC_REQUIRE([gt_LOCALE_JA])
40 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
41 AC_CACHE_CHECK([whether mbrlen handles incomplete characters],
42 [gl_cv_func_mbrlen_incomplete_state],
44 dnl Initial guess, used when cross-compiling or when no suitable locale
48 # Guess no on AIX and OSF/1.
49 aix* | osf*) gl_cv_func_mbrlen_incomplete_state="guessing no" ;;
50 # Guess yes otherwise.
51 *) gl_cv_func_mbrlen_incomplete_state="guessing yes" ;;
54 if test $LOCALE_JA != none; then
59 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
61 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
62 included before <wchar.h>. */
69 if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
71 const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
74 memset (&state, '\0', sizeof (mbstate_t));
75 if (mbrlen (input + 1, 1, &state) == (size_t)(-2))
81 [gl_cv_func_mbrlen_incomplete_state=yes],
82 [gl_cv_func_mbrlen_incomplete_state=no],
88 dnl Test whether mbrlen, when parsing the end of a multibyte character,
89 dnl correctly returns the number of bytes that were needed to complete the
90 dnl character (not the total number of bytes of the multibyte character).
91 dnl Result is gl_cv_func_mbrlen_retval.
93 AC_DEFUN([gl_MBRLEN_RETVAL],
95 AC_REQUIRE([AC_PROG_CC])
96 AC_REQUIRE([gt_LOCALE_FR_UTF8])
97 AC_REQUIRE([gt_LOCALE_JA])
98 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
99 AC_CACHE_CHECK([whether mbrlen has a correct return value],
100 [gl_cv_func_mbrlen_retval],
102 dnl Initial guess, used when cross-compiling or when no suitable locale
106 # Guess no on HP-UX and Solaris.
107 hpux* | solaris*) gl_cv_func_mbrlen_retval="guessing no" ;;
108 # Guess yes otherwise.
109 *) gl_cv_func_mbrlen_retval="guessing yes" ;;
112 if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none; then
117 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
119 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
120 included before <wchar.h>. */
128 /* This fails on Solaris. */
129 if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
131 char input[] = "B\303\274\303\237er"; /* "Büßer" */
134 memset (&state, '\0', sizeof (mbstate_t));
135 if (mbrlen (input + 1, 1, &state) == (size_t)(-2))
138 if (mbrlen (input + 2, 5, &state) != 1)
142 /* This fails on HP-UX 11.11. */
143 if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
145 char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
148 memset (&state, '\0', sizeof (mbstate_t));
149 if (mbrlen (input + 1, 1, &state) == (size_t)(-2))
152 if (mbrlen (input + 2, 5, &state) != 2)
158 [gl_cv_func_mbrlen_retval=yes],
159 [gl_cv_func_mbrlen_retval=no],
165 dnl Test whether mbrlen, when parsing a NUL character, correctly returns 0.
166 dnl Result is gl_cv_func_mbrlen_nul_retval.
168 AC_DEFUN([gl_MBRLEN_NUL_RETVAL],
170 AC_REQUIRE([AC_PROG_CC])
171 AC_REQUIRE([gt_LOCALE_ZH_CN])
172 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
173 AC_CACHE_CHECK([whether mbrlen returns 0 when parsing a NUL character],
174 [gl_cv_func_mbrlen_nul_retval],
176 dnl Initial guess, used when cross-compiling or when no suitable locale
180 # Guess no on Solaris 9.
181 solaris2.9) gl_cv_func_mbrlen_nul_retval="guessing no" ;;
182 # Guess yes otherwise.
183 *) gl_cv_func_mbrlen_nul_retval="guessing yes" ;;
186 if test $LOCALE_ZH_CN != none; then
191 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
193 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
194 included before <wchar.h>. */
201 /* This crashes on Solaris 9 inside __mbrtowc_dense_gb18030. */
202 if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
206 memset (&state, '\0', sizeof (mbstate_t));
207 if (mbrlen ("", 1, &state) != 0)
212 [gl_cv_func_mbrlen_nul_retval=yes],
213 [gl_cv_func_mbrlen_nul_retval=no],
219 # Prerequisites of lib/mbrlen.c.
220 AC_DEFUN([gl_PREREQ_MBRLEN], [