1 dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
3 dnl Copyright (C) 2007-2020 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 47
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 AC_REQUIRE([gl_TYPE_WINT_T_PREREQ])
40 dnl Check for declarations of anything we want to poison if the
41 dnl corresponding gnulib module is not in use.
42 gl_WARN_ON_USE_PREPARE([[
43 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
45 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
46 included before <wchar.h>. */
47 #if !(defined __GLIBC__ && !defined __UCLIBC__)
54 [btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb
55 wcsrtombs wcsnrtombs wcwidth
56 wmemchr wmemcmp wmemcpy wmemmove wmempcpy wmemset
57 wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp
58 wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr
59 wcscspn wcsspn wcspbrk wcsstr wcstok wcswidth wcsftime
62 AC_REQUIRE([AC_C_RESTRICT])
65 dnl Check whether <wchar.h> is usable at all.
66 AC_DEFUN([gl_WCHAR_H_INLINE_OK],
68 dnl Test whether <wchar.h> suffers due to the transition from '__inline' to
69 dnl 'gnu_inline'. See <https://sourceware.org/bugzilla/show_bug.cgi?id=4022>
70 dnl and <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>. In summary,
71 dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and
72 dnl the option -std=c99 or -std=gnu99, leads to a broken <wchar.h>.
73 AC_REQUIRE([AC_CANONICAL_HOST])
74 AC_CACHE_CHECK([whether <wchar.h> uses 'inline' correctly],
75 [gl_cv_header_wchar_h_correct_inline],
76 [gl_cv_header_wchar_h_correct_inline=yes
80 AC_LANG_SOURCE([[#define wcstod renamed_wcstod
81 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
83 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
84 included before <wchar.h>. */
89 extern int zero (void);
90 int main () { return zero(); }
92 dnl Do not rename the object file from conftest.$ac_objext to
93 dnl conftest1.$ac_objext, as this will cause the link to fail on
94 dnl z/OS when using the XPLINK object format (due to duplicate
95 dnl CSECT names). Instead, temporarily redefine $ac_compile so
96 dnl that the object file has the latter name from the start.
97 save_ac_compile="$ac_compile"
98 ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
99 if echo '#include "conftest.c"' >conftest1.c \
100 && AC_TRY_EVAL([ac_compile]); then
102 AC_LANG_SOURCE([[#define wcstod renamed_wcstod
103 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
105 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
106 included before <wchar.h>. */
111 int zero (void) { return 0; }
113 dnl See note above about renaming object files.
114 ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
115 if echo '#include "conftest.c"' >conftest2.c \
116 && AC_TRY_EVAL([ac_compile]); then
117 if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then
120 gl_cv_header_wchar_h_correct_inline=no
124 ac_compile="$save_ac_compile"
125 rm -f conftest[12].c conftest[12].$ac_objext conftest$ac_exeext
129 if test $gl_cv_header_wchar_h_correct_inline = no; then
130 AC_MSG_ERROR([<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
131 This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
132 C99 mode. You have four options:
133 - Add the flag -fgnu89-inline to CC and reconfigure, or
134 - Fix your include files, using parts of
135 <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
136 - Use a gcc version older than 4.3, or
137 - Don't use the flags -std=c99 or -std=gnu99.
138 Configuration aborted.])
142 AC_DEFUN([gl_WCHAR_MODULE_INDICATOR],
144 dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
145 AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
146 gl_MODULE_INDICATOR_SET_VARIABLE([$1])
147 dnl Define it also as a C macro, for the benefit of the unit tests.
148 gl_MODULE_INDICATOR_FOR_TESTS([$1])
151 AC_DEFUN([gl_WCHAR_H_DEFAULTS],
153 GNULIB_BTOWC=0; AC_SUBST([GNULIB_BTOWC])
154 GNULIB_WCTOB=0; AC_SUBST([GNULIB_WCTOB])
155 GNULIB_MBSINIT=0; AC_SUBST([GNULIB_MBSINIT])
156 GNULIB_MBRTOWC=0; AC_SUBST([GNULIB_MBRTOWC])
157 GNULIB_MBRLEN=0; AC_SUBST([GNULIB_MBRLEN])
158 GNULIB_MBSRTOWCS=0; AC_SUBST([GNULIB_MBSRTOWCS])
159 GNULIB_MBSNRTOWCS=0; AC_SUBST([GNULIB_MBSNRTOWCS])
160 GNULIB_WCRTOMB=0; AC_SUBST([GNULIB_WCRTOMB])
161 GNULIB_WCSRTOMBS=0; AC_SUBST([GNULIB_WCSRTOMBS])
162 GNULIB_WCSNRTOMBS=0; AC_SUBST([GNULIB_WCSNRTOMBS])
163 GNULIB_WCWIDTH=0; AC_SUBST([GNULIB_WCWIDTH])
164 GNULIB_WMEMCHR=0; AC_SUBST([GNULIB_WMEMCHR])
165 GNULIB_WMEMCMP=0; AC_SUBST([GNULIB_WMEMCMP])
166 GNULIB_WMEMCPY=0; AC_SUBST([GNULIB_WMEMCPY])
167 GNULIB_WMEMMOVE=0; AC_SUBST([GNULIB_WMEMMOVE])
168 GNULIB_WMEMPCPY=0; AC_SUBST([GNULIB_WMEMPCPY])
169 GNULIB_WMEMSET=0; AC_SUBST([GNULIB_WMEMSET])
170 GNULIB_WCSLEN=0; AC_SUBST([GNULIB_WCSLEN])
171 GNULIB_WCSNLEN=0; AC_SUBST([GNULIB_WCSNLEN])
172 GNULIB_WCSCPY=0; AC_SUBST([GNULIB_WCSCPY])
173 GNULIB_WCPCPY=0; AC_SUBST([GNULIB_WCPCPY])
174 GNULIB_WCSNCPY=0; AC_SUBST([GNULIB_WCSNCPY])
175 GNULIB_WCPNCPY=0; AC_SUBST([GNULIB_WCPNCPY])
176 GNULIB_WCSCAT=0; AC_SUBST([GNULIB_WCSCAT])
177 GNULIB_WCSNCAT=0; AC_SUBST([GNULIB_WCSNCAT])
178 GNULIB_WCSCMP=0; AC_SUBST([GNULIB_WCSCMP])
179 GNULIB_WCSNCMP=0; AC_SUBST([GNULIB_WCSNCMP])
180 GNULIB_WCSCASECMP=0; AC_SUBST([GNULIB_WCSCASECMP])
181 GNULIB_WCSNCASECMP=0; AC_SUBST([GNULIB_WCSNCASECMP])
182 GNULIB_WCSCOLL=0; AC_SUBST([GNULIB_WCSCOLL])
183 GNULIB_WCSXFRM=0; AC_SUBST([GNULIB_WCSXFRM])
184 GNULIB_WCSDUP=0; AC_SUBST([GNULIB_WCSDUP])
185 GNULIB_WCSCHR=0; AC_SUBST([GNULIB_WCSCHR])
186 GNULIB_WCSRCHR=0; AC_SUBST([GNULIB_WCSRCHR])
187 GNULIB_WCSCSPN=0; AC_SUBST([GNULIB_WCSCSPN])
188 GNULIB_WCSSPN=0; AC_SUBST([GNULIB_WCSSPN])
189 GNULIB_WCSPBRK=0; AC_SUBST([GNULIB_WCSPBRK])
190 GNULIB_WCSSTR=0; AC_SUBST([GNULIB_WCSSTR])
191 GNULIB_WCSTOK=0; AC_SUBST([GNULIB_WCSTOK])
192 GNULIB_WCSWIDTH=0; AC_SUBST([GNULIB_WCSWIDTH])
193 GNULIB_WCSFTIME=0; AC_SUBST([GNULIB_WCSFTIME])
194 dnl Assume proper GNU behavior unless another module says otherwise.
195 HAVE_BTOWC=1; AC_SUBST([HAVE_BTOWC])
196 HAVE_MBSINIT=1; AC_SUBST([HAVE_MBSINIT])
197 HAVE_MBRTOWC=1; AC_SUBST([HAVE_MBRTOWC])
198 HAVE_MBRLEN=1; AC_SUBST([HAVE_MBRLEN])
199 HAVE_MBSRTOWCS=1; AC_SUBST([HAVE_MBSRTOWCS])
200 HAVE_MBSNRTOWCS=1; AC_SUBST([HAVE_MBSNRTOWCS])
201 HAVE_WCRTOMB=1; AC_SUBST([HAVE_WCRTOMB])
202 HAVE_WCSRTOMBS=1; AC_SUBST([HAVE_WCSRTOMBS])
203 HAVE_WCSNRTOMBS=1; AC_SUBST([HAVE_WCSNRTOMBS])
204 HAVE_WMEMCHR=1; AC_SUBST([HAVE_WMEMCHR])
205 HAVE_WMEMCMP=1; AC_SUBST([HAVE_WMEMCMP])
206 HAVE_WMEMCPY=1; AC_SUBST([HAVE_WMEMCPY])
207 HAVE_WMEMMOVE=1; AC_SUBST([HAVE_WMEMMOVE])
208 HAVE_WMEMPCPY=1; AC_SUBST([HAVE_WMEMPCPY])
209 HAVE_WMEMSET=1; AC_SUBST([HAVE_WMEMSET])
210 HAVE_WCSLEN=1; AC_SUBST([HAVE_WCSLEN])
211 HAVE_WCSNLEN=1; AC_SUBST([HAVE_WCSNLEN])
212 HAVE_WCSCPY=1; AC_SUBST([HAVE_WCSCPY])
213 HAVE_WCPCPY=1; AC_SUBST([HAVE_WCPCPY])
214 HAVE_WCSNCPY=1; AC_SUBST([HAVE_WCSNCPY])
215 HAVE_WCPNCPY=1; AC_SUBST([HAVE_WCPNCPY])
216 HAVE_WCSCAT=1; AC_SUBST([HAVE_WCSCAT])
217 HAVE_WCSNCAT=1; AC_SUBST([HAVE_WCSNCAT])
218 HAVE_WCSCMP=1; AC_SUBST([HAVE_WCSCMP])
219 HAVE_WCSNCMP=1; AC_SUBST([HAVE_WCSNCMP])
220 HAVE_WCSCASECMP=1; AC_SUBST([HAVE_WCSCASECMP])
221 HAVE_WCSNCASECMP=1; AC_SUBST([HAVE_WCSNCASECMP])
222 HAVE_WCSCOLL=1; AC_SUBST([HAVE_WCSCOLL])
223 HAVE_WCSXFRM=1; AC_SUBST([HAVE_WCSXFRM])
224 HAVE_WCSDUP=1; AC_SUBST([HAVE_WCSDUP])
225 HAVE_WCSCHR=1; AC_SUBST([HAVE_WCSCHR])
226 HAVE_WCSRCHR=1; AC_SUBST([HAVE_WCSRCHR])
227 HAVE_WCSCSPN=1; AC_SUBST([HAVE_WCSCSPN])
228 HAVE_WCSSPN=1; AC_SUBST([HAVE_WCSSPN])
229 HAVE_WCSPBRK=1; AC_SUBST([HAVE_WCSPBRK])
230 HAVE_WCSSTR=1; AC_SUBST([HAVE_WCSSTR])
231 HAVE_WCSTOK=1; AC_SUBST([HAVE_WCSTOK])
232 HAVE_WCSWIDTH=1; AC_SUBST([HAVE_WCSWIDTH])
233 HAVE_WCSFTIME=1; AC_SUBST([HAVE_WCSFTIME])
234 HAVE_DECL_WCTOB=1; AC_SUBST([HAVE_DECL_WCTOB])
235 HAVE_DECL_WCWIDTH=1; AC_SUBST([HAVE_DECL_WCWIDTH])
236 REPLACE_MBSTATE_T=0; AC_SUBST([REPLACE_MBSTATE_T])
237 REPLACE_BTOWC=0; AC_SUBST([REPLACE_BTOWC])
238 REPLACE_WCTOB=0; AC_SUBST([REPLACE_WCTOB])
239 REPLACE_MBSINIT=0; AC_SUBST([REPLACE_MBSINIT])
240 REPLACE_MBRTOWC=0; AC_SUBST([REPLACE_MBRTOWC])
241 REPLACE_MBRLEN=0; AC_SUBST([REPLACE_MBRLEN])
242 REPLACE_MBSRTOWCS=0; AC_SUBST([REPLACE_MBSRTOWCS])
243 REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS])
244 REPLACE_WCRTOMB=0; AC_SUBST([REPLACE_WCRTOMB])
245 REPLACE_WCSRTOMBS=0; AC_SUBST([REPLACE_WCSRTOMBS])
246 REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS])
247 REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH])
248 REPLACE_WCSWIDTH=0; AC_SUBST([REPLACE_WCSWIDTH])
249 REPLACE_WCSFTIME=0; AC_SUBST([REPLACE_WCSFTIME])
250 REPLACE_WCSTOK=0; AC_SUBST([REPLACE_WCSTOK])