summaryrefslogtreecommitdiffstats
path: root/gl/m4/mbrtowc.m4
diff options
context:
space:
mode:
Diffstat (limited to 'gl/m4/mbrtowc.m4')
-rw-r--r--gl/m4/mbrtowc.m4325
1 files changed, 325 insertions, 0 deletions
diff --git a/gl/m4/mbrtowc.m4 b/gl/m4/mbrtowc.m4
new file mode 100644
index 0000000..726497b
--- /dev/null
+++ b/gl/m4/mbrtowc.m4
@@ -0,0 +1,325 @@
1# mbrtowc.m4 serial 13
2dnl Copyright (C) 2001-2002, 2004-2005, 2008, 2009 Free Software Foundation, Inc.
3dnl This file is free software; the Free Software Foundation
4dnl gives unlimited permission to copy and/or distribute it,
5dnl with or without modifications, as long as this notice is preserved.
6
7AC_DEFUN([gl_FUNC_MBRTOWC],
8[
9 AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
10
11 AC_REQUIRE([AC_TYPE_MBSTATE_T])
12 gl_MBSTATE_T_BROKEN
13 if test $REPLACE_MBSTATE_T = 1; then
14 REPLACE_MBRTOWC=1
15 fi
16 AC_CHECK_FUNCS_ONCE([mbrtowc])
17 if test $ac_cv_func_mbrtowc = no; then
18 HAVE_MBRTOWC=0
19 fi
20 if test $HAVE_MBRTOWC != 0 && test $REPLACE_MBRTOWC != 1; then
21 gl_MBRTOWC_NULL_ARG
22 gl_MBRTOWC_RETVAL
23 gl_MBRTOWC_NUL_RETVAL
24 case "$gl_cv_func_mbrtowc_null_arg" in
25 *yes) ;;
26 *) AC_DEFINE([MBRTOWC_NULL_ARG_BUG], [1],
27 [Define if the mbrtowc function has the NULL string argument bug.])
28 REPLACE_MBRTOWC=1
29 ;;
30 esac
31 case "$gl_cv_func_mbrtowc_retval" in
32 *yes) ;;
33 *) AC_DEFINE([MBRTOWC_RETVAL_BUG], [1],
34 [Define if the mbrtowc function returns a wrong return value.])
35 REPLACE_MBRTOWC=1
36 ;;
37 esac
38 case "$gl_cv_func_mbrtowc_nul_retval" in
39 *yes) ;;
40 *) AC_DEFINE([MBRTOWC_NUL_RETVAL_BUG], [1],
41 [Define if the mbrtowc function does not return 0 for a NUL character.])
42 REPLACE_MBRTOWC=1
43 ;;
44 esac
45 fi
46 if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then
47 gl_REPLACE_WCHAR_H
48 AC_LIBOBJ([mbrtowc])
49 gl_PREREQ_MBRTOWC
50 fi
51])
52
53dnl Test whether mbsinit() and mbrtowc() need to be overridden in a way that
54dnl redefines the semantics of the given mbstate_t type.
55dnl Result is REPLACE_MBSTATE_T.
56dnl When this is set to 1, we replace both mbsinit() and mbrtowc(), in order to
57dnl avoid inconsistencies.
58
59AC_DEFUN([gl_MBSTATE_T_BROKEN],
60[
61 AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
62
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 ;;
71 esac
72 else
73 REPLACE_MBSTATE_T=1
74 fi
75 if test $REPLACE_MBSTATE_T = 1; then
76 gl_REPLACE_WCHAR_H
77 fi
78])
79
80dnl Test whether mbrtowc puts the state into non-initial state when parsing an
81dnl incomplete multibyte character.
82dnl Result is gl_cv_func_mbrtowc_incomplete_state.
83
84AC_DEFUN([gl_MBRTOWC_INCOMPLETE_STATE],
85[
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],
91 [
92 dnl Initial guess, used when cross-compiling or when no suitable locale
93 dnl is present.
94changequote(,)dnl
95 case "$host_os" in
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" ;;
100 esac
101changequote([,])dnl
102 if test $LOCALE_JA != none; then
103 AC_TRY_RUN([
104#include <locale.h>
105#include <string.h>
106#include <wchar.h>
107int main ()
108{
109 if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
110 {
111 const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
112 mbstate_t state;
113 wchar_t wc;
114
115 memset (&state, '\0', sizeof (mbstate_t));
116 if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
117 if (mbsinit (&state))
118 return 1;
119 }
120 return 0;
121}],
122 [gl_cv_func_mbrtowc_incomplete_state=yes],
123 [gl_cv_func_mbrtowc_incomplete_state=no],
124 [])
125 fi
126 ])
127])
128
129dnl Test whether mbrtowc supports a NULL string argument correctly.
130dnl Result is gl_cv_func_mbrtowc_null_arg.
131
132AC_DEFUN([gl_MBRTOWC_NULL_ARG],
133[
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],
139 [
140 dnl Initial guess, used when cross-compiling or when no suitable locale
141 dnl is present.
142changequote(,)dnl
143 case "$host_os" in
144 # Guess no on OSF/1.
145 osf*) gl_cv_func_mbrtowc_null_arg="guessing no" ;;
146 # Guess yes otherwise.
147 *) gl_cv_func_mbrtowc_null_arg="guessing yes" ;;
148 esac
149changequote([,])dnl
150 if test $LOCALE_FR_UTF8 != none; then
151 AC_TRY_RUN([
152#include <locale.h>
153#include <string.h>
154#include <wchar.h>
155int main ()
156{
157 if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
158 {
159 mbstate_t state;
160 wchar_t wc;
161 int ret;
162
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)
168 return 1;
169 }
170 return 0;
171}], [gl_cv_func_mbrtowc_null_arg=yes], [gl_cv_func_mbrtowc_null_arg=no], [])
172 fi
173 ])
174])
175
176dnl Test whether mbrtowc, when parsing the end of a multibyte character,
177dnl correctly returns the number of bytes that were needed to complete the
178dnl character (not the total number of bytes of the multibyte character).
179dnl Result is gl_cv_func_mbrtowc_retval.
180
181AC_DEFUN([gl_MBRTOWC_RETVAL],
182[
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],
189 [
190 dnl Initial guess, used when cross-compiling or when no suitable locale
191 dnl is present.
192changequote(,)dnl
193 case "$host_os" in
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" ;;
198 esac
199changequote([,])dnl
200 if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none; then
201 AC_TRY_RUN([
202#include <locale.h>
203#include <string.h>
204#include <wchar.h>
205int main ()
206{
207 /* This fails on Solaris. */
208 if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
209 {
210 char input[] = "B\303\274\303\237er"; /* "Büßer" */
211 mbstate_t state;
212 wchar_t wc;
213
214 memset (&state, '\0', sizeof (mbstate_t));
215 if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
216 {
217 input[1] = '\0';
218 if (mbrtowc (&wc, input + 2, 5, &state) != 1)
219 return 1;
220 }
221 }
222 /* This fails on HP-UX 11.11. */
223 if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
224 {
225 char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
226 mbstate_t state;
227 wchar_t wc;
228
229 memset (&state, '\0', sizeof (mbstate_t));
230 if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
231 {
232 input[1] = '\0';
233 if (mbrtowc (&wc, input + 2, 5, &state) != 2)
234 return 1;
235 }
236 }
237 return 0;
238}],
239 [gl_cv_func_mbrtowc_retval=yes],
240 [gl_cv_func_mbrtowc_retval=no],
241 [])
242 fi
243 ])
244])
245
246dnl Test whether mbrtowc, when parsing a NUL character, correctly returns 0.
247dnl Result is gl_cv_func_mbrtowc_nul_retval.
248
249AC_DEFUN([gl_MBRTOWC_NUL_RETVAL],
250[
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],
256 [
257 dnl Initial guess, used when cross-compiling or when no suitable locale
258 dnl is present.
259changequote(,)dnl
260 case "$host_os" in
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" ;;
265 esac
266changequote([,])dnl
267 if test $LOCALE_ZH_CN != none; then
268 AC_TRY_RUN([
269#include <locale.h>
270#include <string.h>
271#include <wchar.h>
272int main ()
273{
274 /* This fails on Solaris 9. */
275 if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
276 {
277 mbstate_t state;
278 wchar_t wc;
279
280 memset (&state, '\0', sizeof (mbstate_t));
281 if (mbrtowc (&wc, "", 1, &state) != 0)
282 return 1;
283 }
284 return 0;
285}],
286 [gl_cv_func_mbrtowc_nul_retval=yes],
287 [gl_cv_func_mbrtowc_nul_retval=no],
288 [])
289 fi
290 ])
291])
292
293# Prerequisites of lib/mbrtowc.c.
294AC_DEFUN([gl_PREREQ_MBRTOWC], [
295 :
296])
297
298
299dnl From Paul Eggert
300
301dnl This override of an autoconf macro can be removed when autoconf 2.60 or
302dnl newer can be assumed everywhere.
303
304m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.60]),[-1],[
305AC_DEFUN([AC_FUNC_MBRTOWC],
306[
307 dnl Same as AC_FUNC_MBRTOWC in autoconf-2.60.
308 AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared],
309 gl_cv_func_mbrtowc,
310 [AC_LINK_IFELSE(
311 [AC_LANG_PROGRAM(
312 [[#include <wchar.h>]],
313 [[wchar_t wc;
314 char const s[] = "";
315 size_t n = 1;
316 mbstate_t state;
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.])
323 fi
324])
325])