]> git.cworth.org Git - tar/blob - m4/mbrtowc.m4
Imported Upstream version 1.22
[tar] / m4 / mbrtowc.m4
1 # mbrtowc.m4 serial 13
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.
6
7 AC_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
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.
58
59 AC_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
80 dnl Test whether mbrtowc puts the state into non-initial state when parsing an
81 dnl incomplete multibyte character.
82 dnl Result is gl_cv_func_mbrtowc_incomplete_state.
83
84 AC_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.
94 changequote(,)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
101 changequote([,])dnl
102       if test $LOCALE_JA != none; then
103         AC_TRY_RUN([
104 #include <locale.h>
105 #include <string.h>
106 #include <wchar.h>
107 int 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
129 dnl Test whether mbrtowc supports a NULL string argument correctly.
130 dnl Result is gl_cv_func_mbrtowc_null_arg.
131
132 AC_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.
142 changequote(,)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
149 changequote([,])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>
155 int 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
176 dnl Test whether mbrtowc, when parsing the end of a multibyte character,
177 dnl correctly returns the number of bytes that were needed to complete the
178 dnl character (not the total number of bytes of the multibyte character).
179 dnl Result is gl_cv_func_mbrtowc_retval.
180
181 AC_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.
192 changequote(,)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
199 changequote([,])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>
205 int 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
246 dnl Test whether mbrtowc, when parsing a NUL character, correctly returns 0.
247 dnl Result is gl_cv_func_mbrtowc_nul_retval.
248
249 AC_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.
259 changequote(,)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
266 changequote([,])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>
272 int 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.
294 AC_DEFUN([gl_PREREQ_MBRTOWC], [
295   :
296 ])
297
298
299 dnl From Paul Eggert
300
301 dnl This override of an autoconf macro can be removed when autoconf 2.60 or
302 dnl newer can be assumed everywhere.
303
304 m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.60]),[-1],[
305 AC_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 ])