Put more information about failed tests into the test return codes.
[gnulib.git] / m4 / mbrlen.m4
1 # mbrlen.m4 serial 4
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.
6
7 AC_DEFUN([gl_FUNC_MBRLEN],
8 [
9   AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
10
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
15     HAVE_MBRLEN=0
16   else
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
20     dnl the same.
21     if test $REPLACE_MBRTOWC = 1; then
22       REPLACE_MBRLEN=1
23     fi
24   fi
25   if test $HAVE_MBRLEN = 0 || test $REPLACE_MBRLEN = 1; then
26     gl_REPLACE_WCHAR_H
27     AC_LIBOBJ([mbrlen])
28     gl_PREREQ_MBRLEN
29   fi
30 ])
31
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.
35
36 AC_DEFUN([gl_MBRLEN_INCOMPLETE_STATE],
37 [
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],
43     [
44       dnl Initial guess, used when cross-compiling or when no suitable locale
45       dnl is present.
46 changequote(,)dnl
47       case "$host_os" in
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" ;;
52       esac
53 changequote([,])dnl
54       if test $LOCALE_JA != none; then
55         AC_RUN_IFELSE(
56           [AC_LANG_SOURCE([[
57 #include <locale.h>
58 #include <string.h>
59 #include <wchar.h>
60 int main ()
61 {
62   if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
63     {
64       const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
65       mbstate_t state;
66
67       memset (&state, '\0', sizeof (mbstate_t));
68       if (mbrlen (input + 1, 1, &state) == (size_t)(-2))
69         if (mbsinit (&state))
70           return 1;
71     }
72   return 0;
73 }]])],
74           [gl_cv_func_mbrlen_incomplete_state=yes],
75           [gl_cv_func_mbrlen_incomplete_state=no],
76           [])
77       fi
78     ])
79 ])
80
81 dnl Test whether mbrlen, when parsing the end of a multibyte character,
82 dnl correctly returns the number of bytes that were needed to complete the
83 dnl character (not the total number of bytes of the multibyte character).
84 dnl Result is gl_cv_func_mbrlen_retval.
85
86 AC_DEFUN([gl_MBRLEN_RETVAL],
87 [
88   AC_REQUIRE([AC_PROG_CC])
89   AC_REQUIRE([gt_LOCALE_FR_UTF8])
90   AC_REQUIRE([gt_LOCALE_JA])
91   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
92   AC_CACHE_CHECK([whether mbrlen has a correct return value],
93     [gl_cv_func_mbrlen_retval],
94     [
95       dnl Initial guess, used when cross-compiling or when no suitable locale
96       dnl is present.
97 changequote(,)dnl
98       case "$host_os" in
99                           # Guess no on HP-UX and Solaris.
100         hpux* | solaris*) gl_cv_func_mbrlen_retval="guessing no" ;;
101                           # Guess yes otherwise.
102         *)                gl_cv_func_mbrlen_retval="guessing yes" ;;
103       esac
104 changequote([,])dnl
105       if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none; then
106         AC_RUN_IFELSE(
107           [AC_LANG_SOURCE([[
108 #include <locale.h>
109 #include <string.h>
110 #include <wchar.h>
111 int main ()
112 {
113   int result = 0;
114   /* This fails on Solaris.  */
115   if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
116     {
117       char input[] = "B\303\274\303\237er"; /* "Büßer" */
118       mbstate_t state;
119
120       memset (&state, '\0', sizeof (mbstate_t));
121       if (mbrlen (input + 1, 1, &state) == (size_t)(-2))
122         {
123           input[1] = '\0';
124           if (mbrlen (input + 2, 5, &state) != 1)
125             result |= 1;
126         }
127     }
128   /* This fails on HP-UX 11.11.  */
129   if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
130     {
131       char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
132       mbstate_t state;
133
134       memset (&state, '\0', sizeof (mbstate_t));
135       if (mbrlen (input + 1, 1, &state) == (size_t)(-2))
136         {
137           input[1] = '\0';
138           if (mbrlen (input + 2, 5, &state) != 2)
139             result |= 2;
140         }
141     }
142   return result;
143 }]])],
144           [gl_cv_func_mbrlen_retval=yes],
145           [gl_cv_func_mbrlen_retval=no],
146           [])
147       fi
148     ])
149 ])
150
151 dnl Test whether mbrlen, when parsing a NUL character, correctly returns 0.
152 dnl Result is gl_cv_func_mbrlen_nul_retval.
153
154 AC_DEFUN([gl_MBRLEN_NUL_RETVAL],
155 [
156   AC_REQUIRE([AC_PROG_CC])
157   AC_REQUIRE([gt_LOCALE_ZH_CN])
158   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
159   AC_CACHE_CHECK([whether mbrlen returns 0 when parsing a NUL character],
160     [gl_cv_func_mbrlen_nul_retval],
161     [
162       dnl Initial guess, used when cross-compiling or when no suitable locale
163       dnl is present.
164 changequote(,)dnl
165       case "$host_os" in
166                     # Guess no on Solaris 9.
167         solaris2.9) gl_cv_func_mbrlen_nul_retval="guessing no" ;;
168                     # Guess yes otherwise.
169         *)          gl_cv_func_mbrlen_nul_retval="guessing yes" ;;
170       esac
171 changequote([,])dnl
172       if test $LOCALE_ZH_CN != none; then
173         AC_RUN_IFELSE(
174           [AC_LANG_SOURCE([[
175 #include <locale.h>
176 #include <string.h>
177 #include <wchar.h>
178 int main ()
179 {
180   /* This crashes on Solaris 9 inside __mbrtowc_dense_gb18030.  */
181   if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
182     {
183       mbstate_t state;
184
185       memset (&state, '\0', sizeof (mbstate_t));
186       if (mbrlen ("", 1, &state) != 0)
187         return 1;
188     }
189   return 0;
190 }]])],
191           [gl_cv_func_mbrlen_nul_retval=yes],
192           [gl_cv_func_mbrlen_nul_retval=no],
193           [])
194       fi
195     ])
196 ])
197
198 # Prerequisites of lib/mbrlen.c.
199 AC_DEFUN([gl_PREREQ_MBRLEN], [
200   :
201 ])