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 46
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_CACHE_CHECK([whether <wchar.h> uses 'inline' correctly],
74 [gl_cv_header_wchar_h_correct_inline],
75 [gl_cv_header_wchar_h_correct_inline=yes
77 AC_LANG_SOURCE([[#define wcstod renamed_wcstod
78 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
80 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
81 included before <wchar.h>. */
86 extern int zero (void);
87 int main () { return zero(); }
89 dnl Do not rename the object file from conftest.$ac_objext to
90 dnl conftest1.$ac_objext, as this will cause the link to fail on
91 dnl z/OS when using the XPLINK object format (due to duplicate
92 dnl CSECT names). Instead, temporarily redefine $ac_compile so
93 dnl that the object file has the latter name from the start.
94 save_ac_compile="$ac_compile"
95 ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
96 if echo '#include "conftest.c"' >conftest1.c &&
97 AC_TRY_EVAL([ac_compile]); then
99 AC_LANG_SOURCE([[#define wcstod renamed_wcstod
100 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
102 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
103 included before <wchar.h>. */
108 int zero (void) { return 0; }
110 dnl See note above about renaming object files.
111 ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
112 if echo '#include "conftest.c"' >conftest2.c &&
113 AC_TRY_EVAL([ac_compile]); then
114 if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then
117 gl_cv_header_wchar_h_correct_inline=no
121 ac_compile="$save_ac_compile"
122 rm -f conftest[12].c conftest[12].$ac_objext conftest$ac_exeext
124 if test $gl_cv_header_wchar_h_correct_inline = no; then
125 AC_MSG_ERROR([<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
126 This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
127 C99 mode. You have four options:
128 - Add the flag -fgnu89-inline to CC and reconfigure, or
129 - Fix your include files, using parts of
130 <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
131 - Use a gcc version older than 4.3, or
132 - Don't use the flags -std=c99 or -std=gnu99.
133 Configuration aborted.])
137 AC_DEFUN([gl_WCHAR_MODULE_INDICATOR],
139 dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
140 AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
141 gl_MODULE_INDICATOR_SET_VARIABLE([$1])
142 dnl Define it also as a C macro, for the benefit of the unit tests.
143 gl_MODULE_INDICATOR_FOR_TESTS([$1])
146 AC_DEFUN([gl_WCHAR_H_DEFAULTS],
148 GNULIB_BTOWC=0; AC_SUBST([GNULIB_BTOWC])
149 GNULIB_WCTOB=0; AC_SUBST([GNULIB_WCTOB])
150 GNULIB_MBSINIT=0; AC_SUBST([GNULIB_MBSINIT])
151 GNULIB_MBRTOWC=0; AC_SUBST([GNULIB_MBRTOWC])
152 GNULIB_MBRLEN=0; AC_SUBST([GNULIB_MBRLEN])
153 GNULIB_MBSRTOWCS=0; AC_SUBST([GNULIB_MBSRTOWCS])
154 GNULIB_MBSNRTOWCS=0; AC_SUBST([GNULIB_MBSNRTOWCS])
155 GNULIB_WCRTOMB=0; AC_SUBST([GNULIB_WCRTOMB])
156 GNULIB_WCSRTOMBS=0; AC_SUBST([GNULIB_WCSRTOMBS])
157 GNULIB_WCSNRTOMBS=0; AC_SUBST([GNULIB_WCSNRTOMBS])
158 GNULIB_WCWIDTH=0; AC_SUBST([GNULIB_WCWIDTH])
159 GNULIB_WMEMCHR=0; AC_SUBST([GNULIB_WMEMCHR])
160 GNULIB_WMEMCMP=0; AC_SUBST([GNULIB_WMEMCMP])
161 GNULIB_WMEMCPY=0; AC_SUBST([GNULIB_WMEMCPY])
162 GNULIB_WMEMMOVE=0; AC_SUBST([GNULIB_WMEMMOVE])
163 GNULIB_WMEMPCPY=0; AC_SUBST([GNULIB_WMEMPCPY])
164 GNULIB_WMEMSET=0; AC_SUBST([GNULIB_WMEMSET])
165 GNULIB_WCSLEN=0; AC_SUBST([GNULIB_WCSLEN])
166 GNULIB_WCSNLEN=0; AC_SUBST([GNULIB_WCSNLEN])
167 GNULIB_WCSCPY=0; AC_SUBST([GNULIB_WCSCPY])
168 GNULIB_WCPCPY=0; AC_SUBST([GNULIB_WCPCPY])
169 GNULIB_WCSNCPY=0; AC_SUBST([GNULIB_WCSNCPY])
170 GNULIB_WCPNCPY=0; AC_SUBST([GNULIB_WCPNCPY])
171 GNULIB_WCSCAT=0; AC_SUBST([GNULIB_WCSCAT])
172 GNULIB_WCSNCAT=0; AC_SUBST([GNULIB_WCSNCAT])
173 GNULIB_WCSCMP=0; AC_SUBST([GNULIB_WCSCMP])
174 GNULIB_WCSNCMP=0; AC_SUBST([GNULIB_WCSNCMP])
175 GNULIB_WCSCASECMP=0; AC_SUBST([GNULIB_WCSCASECMP])
176 GNULIB_WCSNCASECMP=0; AC_SUBST([GNULIB_WCSNCASECMP])
177 GNULIB_WCSCOLL=0; AC_SUBST([GNULIB_WCSCOLL])
178 GNULIB_WCSXFRM=0; AC_SUBST([GNULIB_WCSXFRM])
179 GNULIB_WCSDUP=0; AC_SUBST([GNULIB_WCSDUP])
180 GNULIB_WCSCHR=0; AC_SUBST([GNULIB_WCSCHR])
181 GNULIB_WCSRCHR=0; AC_SUBST([GNULIB_WCSRCHR])
182 GNULIB_WCSCSPN=0; AC_SUBST([GNULIB_WCSCSPN])
183 GNULIB_WCSSPN=0; AC_SUBST([GNULIB_WCSSPN])
184 GNULIB_WCSPBRK=0; AC_SUBST([GNULIB_WCSPBRK])
185 GNULIB_WCSSTR=0; AC_SUBST([GNULIB_WCSSTR])
186 GNULIB_WCSTOK=0; AC_SUBST([GNULIB_WCSTOK])
187 GNULIB_WCSWIDTH=0; AC_SUBST([GNULIB_WCSWIDTH])
188 GNULIB_WCSFTIME=0; AC_SUBST([GNULIB_WCSFTIME])
189 dnl Assume proper GNU behavior unless another module says otherwise.
190 HAVE_BTOWC=1; AC_SUBST([HAVE_BTOWC])
191 HAVE_MBSINIT=1; AC_SUBST([HAVE_MBSINIT])
192 HAVE_MBRTOWC=1; AC_SUBST([HAVE_MBRTOWC])
193 HAVE_MBRLEN=1; AC_SUBST([HAVE_MBRLEN])
194 HAVE_MBSRTOWCS=1; AC_SUBST([HAVE_MBSRTOWCS])
195 HAVE_MBSNRTOWCS=1; AC_SUBST([HAVE_MBSNRTOWCS])
196 HAVE_WCRTOMB=1; AC_SUBST([HAVE_WCRTOMB])
197 HAVE_WCSRTOMBS=1; AC_SUBST([HAVE_WCSRTOMBS])
198 HAVE_WCSNRTOMBS=1; AC_SUBST([HAVE_WCSNRTOMBS])
199 HAVE_WMEMCHR=1; AC_SUBST([HAVE_WMEMCHR])
200 HAVE_WMEMCMP=1; AC_SUBST([HAVE_WMEMCMP])
201 HAVE_WMEMCPY=1; AC_SUBST([HAVE_WMEMCPY])
202 HAVE_WMEMMOVE=1; AC_SUBST([HAVE_WMEMMOVE])
203 HAVE_WMEMPCPY=1; AC_SUBST([HAVE_WMEMPCPY])
204 HAVE_WMEMSET=1; AC_SUBST([HAVE_WMEMSET])
205 HAVE_WCSLEN=1; AC_SUBST([HAVE_WCSLEN])
206 HAVE_WCSNLEN=1; AC_SUBST([HAVE_WCSNLEN])
207 HAVE_WCSCPY=1; AC_SUBST([HAVE_WCSCPY])
208 HAVE_WCPCPY=1; AC_SUBST([HAVE_WCPCPY])
209 HAVE_WCSNCPY=1; AC_SUBST([HAVE_WCSNCPY])
210 HAVE_WCPNCPY=1; AC_SUBST([HAVE_WCPNCPY])
211 HAVE_WCSCAT=1; AC_SUBST([HAVE_WCSCAT])
212 HAVE_WCSNCAT=1; AC_SUBST([HAVE_WCSNCAT])
213 HAVE_WCSCMP=1; AC_SUBST([HAVE_WCSCMP])
214 HAVE_WCSNCMP=1; AC_SUBST([HAVE_WCSNCMP])
215 HAVE_WCSCASECMP=1; AC_SUBST([HAVE_WCSCASECMP])
216 HAVE_WCSNCASECMP=1; AC_SUBST([HAVE_WCSNCASECMP])
217 HAVE_WCSCOLL=1; AC_SUBST([HAVE_WCSCOLL])
218 HAVE_WCSXFRM=1; AC_SUBST([HAVE_WCSXFRM])
219 HAVE_WCSDUP=1; AC_SUBST([HAVE_WCSDUP])
220 HAVE_WCSCHR=1; AC_SUBST([HAVE_WCSCHR])
221 HAVE_WCSRCHR=1; AC_SUBST([HAVE_WCSRCHR])
222 HAVE_WCSCSPN=1; AC_SUBST([HAVE_WCSCSPN])
223 HAVE_WCSSPN=1; AC_SUBST([HAVE_WCSSPN])
224 HAVE_WCSPBRK=1; AC_SUBST([HAVE_WCSPBRK])
225 HAVE_WCSSTR=1; AC_SUBST([HAVE_WCSSTR])
226 HAVE_WCSTOK=1; AC_SUBST([HAVE_WCSTOK])
227 HAVE_WCSWIDTH=1; AC_SUBST([HAVE_WCSWIDTH])
228 HAVE_WCSFTIME=1; AC_SUBST([HAVE_WCSFTIME])
229 HAVE_DECL_WCTOB=1; AC_SUBST([HAVE_DECL_WCTOB])
230 HAVE_DECL_WCWIDTH=1; AC_SUBST([HAVE_DECL_WCWIDTH])
231 REPLACE_MBSTATE_T=0; AC_SUBST([REPLACE_MBSTATE_T])
232 REPLACE_BTOWC=0; AC_SUBST([REPLACE_BTOWC])
233 REPLACE_WCTOB=0; AC_SUBST([REPLACE_WCTOB])
234 REPLACE_MBSINIT=0; AC_SUBST([REPLACE_MBSINIT])
235 REPLACE_MBRTOWC=0; AC_SUBST([REPLACE_MBRTOWC])
236 REPLACE_MBRLEN=0; AC_SUBST([REPLACE_MBRLEN])
237 REPLACE_MBSRTOWCS=0; AC_SUBST([REPLACE_MBSRTOWCS])
238 REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS])
239 REPLACE_WCRTOMB=0; AC_SUBST([REPLACE_WCRTOMB])
240 REPLACE_WCSRTOMBS=0; AC_SUBST([REPLACE_WCSRTOMBS])
241 REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS])
242 REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH])
243 REPLACE_WCSWIDTH=0; AC_SUBST([REPLACE_WCSWIDTH])
244 REPLACE_WCSFTIME=0; AC_SUBST([REPLACE_WCSFTIME])
245 REPLACE_WCSTOK=0; AC_SUBST([REPLACE_WCSTOK])