1dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
2
3dnl Copyright (C) 2007-2012 Free Software Foundation, Inc.
4dnl This file is free software; the Free Software Foundation
5dnl gives unlimited permission to copy and/or distribute it,
6dnl with or without modifications, as long as this notice is preserved.
7
8dnl Written by Eric Blake.
9
10# wchar_h.m4 serial 39
11
12AC_DEFUN([gl_WCHAR_H],
13[
14  AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
15  AC_REQUIRE([gl_WCHAR_H_INLINE_OK])
16  dnl Prepare for creating substitute <wchar.h>.
17  dnl Check for <wchar.h> (missing in Linux uClibc when built without wide
18  dnl character support).
19  dnl <wchar.h> is always overridden, because of GNULIB_POSIXCHECK.
20  gl_CHECK_NEXT_HEADERS([wchar.h])
21  if test $ac_cv_header_wchar_h = yes; then
22    HAVE_WCHAR_H=1
23  else
24    HAVE_WCHAR_H=0
25  fi
26  AC_SUBST([HAVE_WCHAR_H])
27
28  AC_REQUIRE([gl_FEATURES_H])
29
30  AC_REQUIRE([gt_TYPE_WINT_T])
31  if test $gt_cv_c_wint_t = yes; then
32    HAVE_WINT_T=1
33  else
34    HAVE_WINT_T=0
35  fi
36  AC_SUBST([HAVE_WINT_T])
37
38  dnl Check for declarations of anything we want to poison if the
39  dnl corresponding gnulib module is not in use.
40  gl_WARN_ON_USE_PREPARE([[
41/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
42   <wchar.h>.
43   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
44   included before <wchar.h>.  */
45#if !(defined __GLIBC__ && !defined __UCLIBC__)
46# include <stddef.h>
47# include <stdio.h>
48# include <time.h>
49#endif
50#include <wchar.h>
51    ]],
52    [btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb
53     wcsrtombs wcsnrtombs wcwidth wmemchr wmemcmp wmemcpy wmemmove wmemset
54     wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp
55     wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr
56     wcscspn wcsspn wcspbrk wcsstr wcstok wcswidth
57    ])
58])
59
60dnl Check whether <wchar.h> is usable at all.
61AC_DEFUN([gl_WCHAR_H_INLINE_OK],
62[
63  dnl Test whether <wchar.h> suffers due to the transition from '__inline' to
64  dnl 'gnu_inline'. See <http://sourceware.org/bugzilla/show_bug.cgi?id=4022>
65  dnl and <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>. In summary,
66  dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and
67  dnl the option -std=c99 or -std=gnu99, leads to a broken <wchar.h>.
68  AC_CACHE_CHECK([whether <wchar.h> uses 'inline' correctly],
69    [gl_cv_header_wchar_h_correct_inline],
70    [gl_cv_header_wchar_h_correct_inline=yes
71     AC_LANG_CONFTEST([
72       AC_LANG_SOURCE([[#define wcstod renamed_wcstod
73/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
74   <wchar.h>.
75   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
76   included before <wchar.h>.  */
77#include <stddef.h>
78#include <stdio.h>
79#include <time.h>
80#include <wchar.h>
81extern int zero (void);
82int main () { return zero(); }
83]])])
84     if AC_TRY_EVAL([ac_compile]); then
85       mv conftest.$ac_objext conftest1.$ac_objext
86       AC_LANG_CONFTEST([
87         AC_LANG_SOURCE([[#define wcstod renamed_wcstod
88/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
89   <wchar.h>.
90   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
91   included before <wchar.h>.  */
92#include <stddef.h>
93#include <stdio.h>
94#include <time.h>
95#include <wchar.h>
96int zero (void) { return 0; }
97]])])
98       if AC_TRY_EVAL([ac_compile]); then
99         mv conftest.$ac_objext conftest2.$ac_objext
100         if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then
101           :
102         else
103           gl_cv_header_wchar_h_correct_inline=no
104         fi
105       fi
106     fi
107     rm -f conftest1.$ac_objext conftest2.$ac_objext conftest$ac_exeext
108    ])
109  if test $gl_cv_header_wchar_h_correct_inline = no; then
110    AC_MSG_ERROR([<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
111This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
112C99 mode. You have four options:
113  - Add the flag -fgnu89-inline to CC and reconfigure, or
114  - Fix your include files, using parts of
115    <http://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
116  - Use a gcc version older than 4.3, or
117  - Don't use the flags -std=c99 or -std=gnu99.
118Configuration aborted.])
119  fi
120])
121
122AC_DEFUN([gl_WCHAR_MODULE_INDICATOR],
123[
124  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
125  AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
126  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
127  dnl Define it also as a C macro, for the benefit of the unit tests.
128  gl_MODULE_INDICATOR_FOR_TESTS([$1])
129])
130
131AC_DEFUN([gl_WCHAR_H_DEFAULTS],
132[
133  GNULIB_BTOWC=0;       AC_SUBST([GNULIB_BTOWC])
134  GNULIB_WCTOB=0;       AC_SUBST([GNULIB_WCTOB])
135  GNULIB_MBSINIT=0;     AC_SUBST([GNULIB_MBSINIT])
136  GNULIB_MBRTOWC=0;     AC_SUBST([GNULIB_MBRTOWC])
137  GNULIB_MBRLEN=0;      AC_SUBST([GNULIB_MBRLEN])
138  GNULIB_MBSRTOWCS=0;   AC_SUBST([GNULIB_MBSRTOWCS])
139  GNULIB_MBSNRTOWCS=0;  AC_SUBST([GNULIB_MBSNRTOWCS])
140  GNULIB_WCRTOMB=0;     AC_SUBST([GNULIB_WCRTOMB])
141  GNULIB_WCSRTOMBS=0;   AC_SUBST([GNULIB_WCSRTOMBS])
142  GNULIB_WCSNRTOMBS=0;  AC_SUBST([GNULIB_WCSNRTOMBS])
143  GNULIB_WCWIDTH=0;     AC_SUBST([GNULIB_WCWIDTH])
144  GNULIB_WMEMCHR=0;     AC_SUBST([GNULIB_WMEMCHR])
145  GNULIB_WMEMCMP=0;     AC_SUBST([GNULIB_WMEMCMP])
146  GNULIB_WMEMCPY=0;     AC_SUBST([GNULIB_WMEMCPY])
147  GNULIB_WMEMMOVE=0;    AC_SUBST([GNULIB_WMEMMOVE])
148  GNULIB_WMEMSET=0;     AC_SUBST([GNULIB_WMEMSET])
149  GNULIB_WCSLEN=0;      AC_SUBST([GNULIB_WCSLEN])
150  GNULIB_WCSNLEN=0;     AC_SUBST([GNULIB_WCSNLEN])
151  GNULIB_WCSCPY=0;      AC_SUBST([GNULIB_WCSCPY])
152  GNULIB_WCPCPY=0;      AC_SUBST([GNULIB_WCPCPY])
153  GNULIB_WCSNCPY=0;     AC_SUBST([GNULIB_WCSNCPY])
154  GNULIB_WCPNCPY=0;     AC_SUBST([GNULIB_WCPNCPY])
155  GNULIB_WCSCAT=0;      AC_SUBST([GNULIB_WCSCAT])
156  GNULIB_WCSNCAT=0;     AC_SUBST([GNULIB_WCSNCAT])
157  GNULIB_WCSCMP=0;      AC_SUBST([GNULIB_WCSCMP])
158  GNULIB_WCSNCMP=0;     AC_SUBST([GNULIB_WCSNCMP])
159  GNULIB_WCSCASECMP=0;  AC_SUBST([GNULIB_WCSCASECMP])
160  GNULIB_WCSNCASECMP=0; AC_SUBST([GNULIB_WCSNCASECMP])
161  GNULIB_WCSCOLL=0;     AC_SUBST([GNULIB_WCSCOLL])
162  GNULIB_WCSXFRM=0;     AC_SUBST([GNULIB_WCSXFRM])
163  GNULIB_WCSDUP=0;      AC_SUBST([GNULIB_WCSDUP])
164  GNULIB_WCSCHR=0;      AC_SUBST([GNULIB_WCSCHR])
165  GNULIB_WCSRCHR=0;     AC_SUBST([GNULIB_WCSRCHR])
166  GNULIB_WCSCSPN=0;     AC_SUBST([GNULIB_WCSCSPN])
167  GNULIB_WCSSPN=0;      AC_SUBST([GNULIB_WCSSPN])
168  GNULIB_WCSPBRK=0;     AC_SUBST([GNULIB_WCSPBRK])
169  GNULIB_WCSSTR=0;      AC_SUBST([GNULIB_WCSSTR])
170  GNULIB_WCSTOK=0;      AC_SUBST([GNULIB_WCSTOK])
171  GNULIB_WCSWIDTH=0;    AC_SUBST([GNULIB_WCSWIDTH])
172  dnl Assume proper GNU behavior unless another module says otherwise.
173  HAVE_BTOWC=1;         AC_SUBST([HAVE_BTOWC])
174  HAVE_MBSINIT=1;       AC_SUBST([HAVE_MBSINIT])
175  HAVE_MBRTOWC=1;       AC_SUBST([HAVE_MBRTOWC])
176  HAVE_MBRLEN=1;        AC_SUBST([HAVE_MBRLEN])
177  HAVE_MBSRTOWCS=1;     AC_SUBST([HAVE_MBSRTOWCS])
178  HAVE_MBSNRTOWCS=1;    AC_SUBST([HAVE_MBSNRTOWCS])
179  HAVE_WCRTOMB=1;       AC_SUBST([HAVE_WCRTOMB])
180  HAVE_WCSRTOMBS=1;     AC_SUBST([HAVE_WCSRTOMBS])
181  HAVE_WCSNRTOMBS=1;    AC_SUBST([HAVE_WCSNRTOMBS])
182  HAVE_WMEMCHR=1;       AC_SUBST([HAVE_WMEMCHR])
183  HAVE_WMEMCMP=1;       AC_SUBST([HAVE_WMEMCMP])
184  HAVE_WMEMCPY=1;       AC_SUBST([HAVE_WMEMCPY])
185  HAVE_WMEMMOVE=1;      AC_SUBST([HAVE_WMEMMOVE])
186  HAVE_WMEMSET=1;       AC_SUBST([HAVE_WMEMSET])
187  HAVE_WCSLEN=1;        AC_SUBST([HAVE_WCSLEN])
188  HAVE_WCSNLEN=1;       AC_SUBST([HAVE_WCSNLEN])
189  HAVE_WCSCPY=1;        AC_SUBST([HAVE_WCSCPY])
190  HAVE_WCPCPY=1;        AC_SUBST([HAVE_WCPCPY])
191  HAVE_WCSNCPY=1;       AC_SUBST([HAVE_WCSNCPY])
192  HAVE_WCPNCPY=1;       AC_SUBST([HAVE_WCPNCPY])
193  HAVE_WCSCAT=1;        AC_SUBST([HAVE_WCSCAT])
194  HAVE_WCSNCAT=1;       AC_SUBST([HAVE_WCSNCAT])
195  HAVE_WCSCMP=1;        AC_SUBST([HAVE_WCSCMP])
196  HAVE_WCSNCMP=1;       AC_SUBST([HAVE_WCSNCMP])
197  HAVE_WCSCASECMP=1;    AC_SUBST([HAVE_WCSCASECMP])
198  HAVE_WCSNCASECMP=1;   AC_SUBST([HAVE_WCSNCASECMP])
199  HAVE_WCSCOLL=1;       AC_SUBST([HAVE_WCSCOLL])
200  HAVE_WCSXFRM=1;       AC_SUBST([HAVE_WCSXFRM])
201  HAVE_WCSDUP=1;        AC_SUBST([HAVE_WCSDUP])
202  HAVE_WCSCHR=1;        AC_SUBST([HAVE_WCSCHR])
203  HAVE_WCSRCHR=1;       AC_SUBST([HAVE_WCSRCHR])
204  HAVE_WCSCSPN=1;       AC_SUBST([HAVE_WCSCSPN])
205  HAVE_WCSSPN=1;        AC_SUBST([HAVE_WCSSPN])
206  HAVE_WCSPBRK=1;       AC_SUBST([HAVE_WCSPBRK])
207  HAVE_WCSSTR=1;        AC_SUBST([HAVE_WCSSTR])
208  HAVE_WCSTOK=1;        AC_SUBST([HAVE_WCSTOK])
209  HAVE_WCSWIDTH=1;      AC_SUBST([HAVE_WCSWIDTH])
210  HAVE_DECL_WCTOB=1;    AC_SUBST([HAVE_DECL_WCTOB])
211  HAVE_DECL_WCWIDTH=1;  AC_SUBST([HAVE_DECL_WCWIDTH])
212  REPLACE_MBSTATE_T=0;  AC_SUBST([REPLACE_MBSTATE_T])
213  REPLACE_BTOWC=0;      AC_SUBST([REPLACE_BTOWC])
214  REPLACE_WCTOB=0;      AC_SUBST([REPLACE_WCTOB])
215  REPLACE_MBSINIT=0;    AC_SUBST([REPLACE_MBSINIT])
216  REPLACE_MBRTOWC=0;    AC_SUBST([REPLACE_MBRTOWC])
217  REPLACE_MBRLEN=0;     AC_SUBST([REPLACE_MBRLEN])
218  REPLACE_MBSRTOWCS=0;  AC_SUBST([REPLACE_MBSRTOWCS])
219  REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS])
220  REPLACE_WCRTOMB=0;    AC_SUBST([REPLACE_WCRTOMB])
221  REPLACE_WCSRTOMBS=0;  AC_SUBST([REPLACE_WCSRTOMBS])
222  REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS])
223  REPLACE_WCWIDTH=0;    AC_SUBST([REPLACE_WCWIDTH])
224  REPLACE_WCSWIDTH=0;   AC_SUBST([REPLACE_WCSWIDTH])
225])
226