1 dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
3 dnl Copyright (C) 2007-2011 Free Software Foundation, Inc.
4 dnl This file is free software; the Free Software Foundation
5 dnl gives unlimited permission to copy and/or distribute it,
6 dnl with or without modifications, as long as this notice is preserved.
8 dnl Written by Eric Blake.
10 # wchar_h.m4 serial 38
12 AC_DEFUN([gl_WCHAR_H],
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
26 AC_SUBST([HAVE_WCHAR_H])
28 AC_REQUIRE([gl_FEATURES_H])
30 AC_REQUIRE([gt_TYPE_WINT_T])
31 if test $gt_cv_c_wint_t = yes; then
36 AC_SUBST([HAVE_WINT_T])
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
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__)
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
60 dnl Check whether <wchar.h> is usable at all.
61 AC_DEFUN([gl_WCHAR_H_INLINE_OK],
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
72 AC_LANG_SOURCE([[#define wcstod renamed_wcstod
73 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
75 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
76 included before <wchar.h>. */
81 extern int zero (void);
82 int main () { return zero(); }
84 if AC_TRY_EVAL([ac_compile]); then
85 mv conftest.$ac_objext conftest1.$ac_objext
87 AC_LANG_SOURCE([[#define wcstod renamed_wcstod
88 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
90 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
91 included before <wchar.h>. */
96 int zero (void) { return 0; }
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
103 gl_cv_header_wchar_h_correct_inline=no
107 rm -f conftest1.$ac_objext conftest2.$ac_objext conftest$ac_exeext
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).
111 This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
112 C99 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.
118 Configuration aborted.])
122 dnl Unconditionally enables the replacement of <wchar.h>.
123 AC_DEFUN([gl_REPLACE_WCHAR_H],
125 dnl This is a no-op, because <wchar.h> is always overridden.
129 AC_DEFUN([gl_WCHAR_MODULE_INDICATOR],
131 dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
132 AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
133 gl_MODULE_INDICATOR_SET_VARIABLE([$1])
134 dnl Define it also as a C macro, for the benefit of the unit tests.
135 gl_MODULE_INDICATOR_FOR_TESTS([$1])
138 AC_DEFUN([gl_WCHAR_H_DEFAULTS],
140 GNULIB_BTOWC=0; AC_SUBST([GNULIB_BTOWC])
141 GNULIB_WCTOB=0; AC_SUBST([GNULIB_WCTOB])
142 GNULIB_MBSINIT=0; AC_SUBST([GNULIB_MBSINIT])
143 GNULIB_MBRTOWC=0; AC_SUBST([GNULIB_MBRTOWC])
144 GNULIB_MBRLEN=0; AC_SUBST([GNULIB_MBRLEN])
145 GNULIB_MBSRTOWCS=0; AC_SUBST([GNULIB_MBSRTOWCS])
146 GNULIB_MBSNRTOWCS=0; AC_SUBST([GNULIB_MBSNRTOWCS])
147 GNULIB_WCRTOMB=0; AC_SUBST([GNULIB_WCRTOMB])
148 GNULIB_WCSRTOMBS=0; AC_SUBST([GNULIB_WCSRTOMBS])
149 GNULIB_WCSNRTOMBS=0; AC_SUBST([GNULIB_WCSNRTOMBS])
150 GNULIB_WCWIDTH=0; AC_SUBST([GNULIB_WCWIDTH])
151 GNULIB_WMEMCHR=0; AC_SUBST([GNULIB_WMEMCHR])
152 GNULIB_WMEMCMP=0; AC_SUBST([GNULIB_WMEMCMP])
153 GNULIB_WMEMCPY=0; AC_SUBST([GNULIB_WMEMCPY])
154 GNULIB_WMEMMOVE=0; AC_SUBST([GNULIB_WMEMMOVE])
155 GNULIB_WMEMSET=0; AC_SUBST([GNULIB_WMEMSET])
156 GNULIB_WCSLEN=0; AC_SUBST([GNULIB_WCSLEN])
157 GNULIB_WCSNLEN=0; AC_SUBST([GNULIB_WCSNLEN])
158 GNULIB_WCSCPY=0; AC_SUBST([GNULIB_WCSCPY])
159 GNULIB_WCPCPY=0; AC_SUBST([GNULIB_WCPCPY])
160 GNULIB_WCSNCPY=0; AC_SUBST([GNULIB_WCSNCPY])
161 GNULIB_WCPNCPY=0; AC_SUBST([GNULIB_WCPNCPY])
162 GNULIB_WCSCAT=0; AC_SUBST([GNULIB_WCSCAT])
163 GNULIB_WCSNCAT=0; AC_SUBST([GNULIB_WCSNCAT])
164 GNULIB_WCSCMP=0; AC_SUBST([GNULIB_WCSCMP])
165 GNULIB_WCSNCMP=0; AC_SUBST([GNULIB_WCSNCMP])
166 GNULIB_WCSCASECMP=0; AC_SUBST([GNULIB_WCSCASECMP])
167 GNULIB_WCSNCASECMP=0; AC_SUBST([GNULIB_WCSNCASECMP])
168 GNULIB_WCSCOLL=0; AC_SUBST([GNULIB_WCSCOLL])
169 GNULIB_WCSXFRM=0; AC_SUBST([GNULIB_WCSXFRM])
170 GNULIB_WCSDUP=0; AC_SUBST([GNULIB_WCSDUP])
171 GNULIB_WCSCHR=0; AC_SUBST([GNULIB_WCSCHR])
172 GNULIB_WCSRCHR=0; AC_SUBST([GNULIB_WCSRCHR])
173 GNULIB_WCSCSPN=0; AC_SUBST([GNULIB_WCSCSPN])
174 GNULIB_WCSSPN=0; AC_SUBST([GNULIB_WCSSPN])
175 GNULIB_WCSPBRK=0; AC_SUBST([GNULIB_WCSPBRK])
176 GNULIB_WCSSTR=0; AC_SUBST([GNULIB_WCSSTR])
177 dnl Assume proper GNU behavior unless another module says otherwise.
178 HAVE_BTOWC=1; AC_SUBST([HAVE_BTOWC])
179 HAVE_MBSINIT=1; AC_SUBST([HAVE_MBSINIT])
180 HAVE_MBRTOWC=1; AC_SUBST([HAVE_MBRTOWC])
181 HAVE_MBRLEN=1; AC_SUBST([HAVE_MBRLEN])
182 HAVE_MBSRTOWCS=1; AC_SUBST([HAVE_MBSRTOWCS])
183 HAVE_MBSNRTOWCS=1; AC_SUBST([HAVE_MBSNRTOWCS])
184 HAVE_WCRTOMB=1; AC_SUBST([HAVE_WCRTOMB])
185 HAVE_WCSRTOMBS=1; AC_SUBST([HAVE_WCSRTOMBS])
186 HAVE_WCSNRTOMBS=1; AC_SUBST([HAVE_WCSNRTOMBS])
187 HAVE_WMEMCHR=1; AC_SUBST([HAVE_WMEMCHR])
188 HAVE_WMEMCMP=1; AC_SUBST([HAVE_WMEMCMP])
189 HAVE_WMEMCPY=1; AC_SUBST([HAVE_WMEMCPY])
190 HAVE_WMEMMOVE=1; AC_SUBST([HAVE_WMEMMOVE])
191 HAVE_WMEMSET=1; AC_SUBST([HAVE_WMEMSET])
192 HAVE_WCSLEN=1; AC_SUBST([HAVE_WCSLEN])
193 HAVE_WCSNLEN=1; AC_SUBST([HAVE_WCSNLEN])
194 HAVE_WCSCPY=1; AC_SUBST([HAVE_WCSCPY])
195 HAVE_WCPCPY=1; AC_SUBST([HAVE_WCPCPY])
196 HAVE_WCSNCPY=1; AC_SUBST([HAVE_WCSNCPY])
197 HAVE_WCPNCPY=1; AC_SUBST([HAVE_WCPNCPY])
198 HAVE_WCSCAT=1; AC_SUBST([HAVE_WCSCAT])
199 HAVE_WCSNCAT=1; AC_SUBST([HAVE_WCSNCAT])
200 HAVE_WCSCMP=1; AC_SUBST([HAVE_WCSCMP])
201 HAVE_WCSNCMP=1; AC_SUBST([HAVE_WCSNCMP])
202 HAVE_WCSCASECMP=1; AC_SUBST([HAVE_WCSCASECMP])
203 HAVE_WCSNCASECMP=1; AC_SUBST([HAVE_WCSNCASECMP])
204 HAVE_WCSCOLL=1; AC_SUBST([HAVE_WCSCOLL])
205 HAVE_WCSXFRM=1; AC_SUBST([HAVE_WCSXFRM])
206 HAVE_WCSDUP=1; AC_SUBST([HAVE_WCSDUP])
207 HAVE_WCSCHR=1; AC_SUBST([HAVE_WCSCHR])
208 HAVE_WCSRCHR=1; AC_SUBST([HAVE_WCSRCHR])
209 HAVE_WCSCSPN=1; AC_SUBST([HAVE_WCSCSPN])
210 HAVE_WCSSPN=1; AC_SUBST([HAVE_WCSSPN])
211 HAVE_WCSPBRK=1; AC_SUBST([HAVE_WCSPBRK])
212 HAVE_WCSSTR=1; AC_SUBST([HAVE_WCSSTR])
213 HAVE_DECL_WCTOB=1; AC_SUBST([HAVE_DECL_WCTOB])
214 HAVE_DECL_WCWIDTH=1; AC_SUBST([HAVE_DECL_WCWIDTH])
215 REPLACE_MBSTATE_T=0; AC_SUBST([REPLACE_MBSTATE_T])
216 REPLACE_BTOWC=0; AC_SUBST([REPLACE_BTOWC])
217 REPLACE_WCTOB=0; AC_SUBST([REPLACE_WCTOB])
218 REPLACE_MBSINIT=0; AC_SUBST([REPLACE_MBSINIT])
219 REPLACE_MBRTOWC=0; AC_SUBST([REPLACE_MBRTOWC])
220 REPLACE_MBRLEN=0; AC_SUBST([REPLACE_MBRLEN])
221 REPLACE_MBSRTOWCS=0; AC_SUBST([REPLACE_MBSRTOWCS])
222 REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS])
223 REPLACE_WCRTOMB=0; AC_SUBST([REPLACE_WCRTOMB])
224 REPLACE_WCSRTOMBS=0; AC_SUBST([REPLACE_WCSRTOMBS])
225 REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS])
226 REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH])