2 dnl Copyright (C) 2008, 2010-2011 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
27 dnl Test whether mbrlen puts the state into non-initial state when parsing an
28 dnl incomplete multibyte character.
29 dnl Result is gl_cv_func_mbrlen_incomplete_state.
31 AC_DEFUN([gl_MBRLEN_INCOMPLETE_STATE],
33 AC_REQUIRE([AC_PROG_CC])
34 AC_REQUIRE([gt_LOCALE_JA])
35 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
36 AC_CACHE_CHECK([whether mbrlen handles incomplete characters],
37 [gl_cv_func_mbrlen_incomplete_state],
39 dnl Initial guess, used when cross-compiling or when no suitable locale
43 # Guess no on AIX and OSF/1.
44 aix* | osf*) gl_cv_func_mbrlen_incomplete_state="guessing no" ;;
45 # Guess yes otherwise.
46 *) gl_cv_func_mbrlen_incomplete_state="guessing yes" ;;
49 if test $LOCALE_JA != none; then
54 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
56 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
57 included before <wchar.h>. */
64 if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
66 const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
69 memset (&state, '\0', sizeof (mbstate_t));
70 if (mbrlen (input + 1, 1, &state) == (size_t)(-2))
76 [gl_cv_func_mbrlen_incomplete_state=yes],
77 [gl_cv_func_mbrlen_incomplete_state=no],
83 dnl Test whether mbrlen, when parsing the end of a multibyte character,
84 dnl correctly returns the number of bytes that were needed to complete the
85 dnl character (not the total number of bytes of the multibyte character).
86 dnl Result is gl_cv_func_mbrlen_retval.
88 AC_DEFUN([gl_MBRLEN_RETVAL],
90 AC_REQUIRE([AC_PROG_CC])
91 AC_REQUIRE([gt_LOCALE_FR_UTF8])
92 AC_REQUIRE([gt_LOCALE_JA])
93 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
94 AC_CACHE_CHECK([whether mbrlen has a correct return value],
95 [gl_cv_func_mbrlen_retval],
97 dnl Initial guess, used when cross-compiling or when no suitable locale
101 # Guess no on HP-UX and Solaris.
102 hpux* | solaris*) gl_cv_func_mbrlen_retval="guessing no" ;;
103 # Guess yes otherwise.
104 *) gl_cv_func_mbrlen_retval="guessing yes" ;;
107 if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none; then
112 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
114 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
115 included before <wchar.h>. */
123 /* This fails on Solaris. */
124 if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
126 char input[] = "B\303\274\303\237er"; /* "Büßer" */
129 memset (&state, '\0', sizeof (mbstate_t));
130 if (mbrlen (input + 1, 1, &state) == (size_t)(-2))
133 if (mbrlen (input + 2, 5, &state) != 1)
137 /* This fails on HP-UX 11.11. */
138 if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
140 char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
143 memset (&state, '\0', sizeof (mbstate_t));
144 if (mbrlen (input + 1, 1, &state) == (size_t)(-2))
147 if (mbrlen (input + 2, 5, &state) != 2)
153 [gl_cv_func_mbrlen_retval=yes],
154 [gl_cv_func_mbrlen_retval=no],
160 dnl Test whether mbrlen, when parsing a NUL character, correctly returns 0.
161 dnl Result is gl_cv_func_mbrlen_nul_retval.
163 AC_DEFUN([gl_MBRLEN_NUL_RETVAL],
165 AC_REQUIRE([AC_PROG_CC])
166 AC_REQUIRE([gt_LOCALE_ZH_CN])
167 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
168 AC_CACHE_CHECK([whether mbrlen returns 0 when parsing a NUL character],
169 [gl_cv_func_mbrlen_nul_retval],
171 dnl Initial guess, used when cross-compiling or when no suitable locale
175 # Guess no on Solaris 9.
176 solaris2.9) gl_cv_func_mbrlen_nul_retval="guessing no" ;;
177 # Guess yes otherwise.
178 *) gl_cv_func_mbrlen_nul_retval="guessing yes" ;;
181 if test $LOCALE_ZH_CN != none; then
186 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
188 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
189 included before <wchar.h>. */
196 /* This crashes on Solaris 9 inside __mbrtowc_dense_gb18030. */
197 if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
201 memset (&state, '\0', sizeof (mbstate_t));
202 if (mbrlen ("", 1, &state) != 0)
207 [gl_cv_func_mbrlen_nul_retval=yes],
208 [gl_cv_func_mbrlen_nul_retval=no],
214 # Prerequisites of lib/mbrlen.c.
215 AC_DEFUN([gl_PREREQ_MBRLEN], [