1 dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
3 dnl Copyright (C) 2007-2021 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 50
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([[
45 [btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb
46 wcsrtombs wcsnrtombs wcwidth
47 wmemchr wmemcmp wmemcpy wmemmove wmempcpy wmemset
48 wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp
49 wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr
50 wcscspn wcsspn wcspbrk wcsstr wcstok wcswidth wcsftime
53 AC_REQUIRE([AC_C_RESTRICT])
55 AC_CHECK_DECLS([wcsdup], [], [], [[
58 if test $ac_cv_have_decl_wcsdup = no; then
63 dnl Check whether <wchar.h> is usable at all.
64 AC_DEFUN([gl_WCHAR_H_INLINE_OK],
66 dnl Test whether <wchar.h> suffers due to the transition from '__inline' to
67 dnl 'gnu_inline'. See <https://sourceware.org/bugzilla/show_bug.cgi?id=4022>
68 dnl and <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>. In summary,
69 dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and
70 dnl the option -std=c99 or -std=gnu99, leads to a broken <wchar.h>.
71 AC_REQUIRE([AC_CANONICAL_HOST])
72 AC_CACHE_CHECK([whether <wchar.h> uses 'inline' correctly],
73 [gl_cv_header_wchar_h_correct_inline],
74 [gl_cv_header_wchar_h_correct_inline=yes
79 #define wcstod renamed_wcstod
81 extern int zero (void);
82 int main () { return zero(); }
84 dnl Do not rename the object file from conftest.$ac_objext to
85 dnl conftest1.$ac_objext, as this will cause the link to fail on
86 dnl z/OS when using the XPLINK object format (due to duplicate
87 dnl CSECT names). Instead, temporarily redefine $ac_compile so
88 dnl that the object file has the latter name from the start.
89 save_ac_compile="$ac_compile"
90 ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
91 if echo '#include "conftest.c"' >conftest1.c \
92 && AC_TRY_EVAL([ac_compile]); then
95 #define wcstod renamed_wcstod
97 int zero (void) { return 0; }
99 dnl See note above about renaming object files.
100 ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
101 if echo '#include "conftest.c"' >conftest2.c \
102 && AC_TRY_EVAL([ac_compile]); then
103 if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then
106 gl_cv_header_wchar_h_correct_inline=no
110 ac_compile="$save_ac_compile"
111 rm -f conftest[12].c conftest[12].$ac_objext conftest$ac_exeext
115 if test $gl_cv_header_wchar_h_correct_inline = no; then
116 AC_MSG_ERROR([<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
117 This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
118 C99 mode. You have four options:
119 - Add the flag -fgnu89-inline to CC and reconfigure, or
120 - Fix your include files, using parts of
121 <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
122 - Use a gcc version older than 4.3, or
123 - Don't use the flags -std=c99 or -std=gnu99.
124 Configuration aborted.])
128 AC_DEFUN([gl_WCHAR_MODULE_INDICATOR],
130 dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
131 AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
132 gl_MODULE_INDICATOR_SET_VARIABLE([$1])
133 dnl Define it also as a C macro, for the benefit of the unit tests.
134 gl_MODULE_INDICATOR_FOR_TESTS([$1])
137 AC_DEFUN([gl_WCHAR_H_DEFAULTS],
139 GNULIB_BTOWC=0; AC_SUBST([GNULIB_BTOWC])
140 GNULIB_WCTOB=0; AC_SUBST([GNULIB_WCTOB])
141 GNULIB_MBSINIT=0; AC_SUBST([GNULIB_MBSINIT])
142 GNULIB_MBRTOWC=0; AC_SUBST([GNULIB_MBRTOWC])
143 GNULIB_MBRLEN=0; AC_SUBST([GNULIB_MBRLEN])
144 GNULIB_MBSRTOWCS=0; AC_SUBST([GNULIB_MBSRTOWCS])
145 GNULIB_MBSNRTOWCS=0; AC_SUBST([GNULIB_MBSNRTOWCS])
146 GNULIB_WCRTOMB=0; AC_SUBST([GNULIB_WCRTOMB])
147 GNULIB_WCSRTOMBS=0; AC_SUBST([GNULIB_WCSRTOMBS])
148 GNULIB_WCSNRTOMBS=0; AC_SUBST([GNULIB_WCSNRTOMBS])
149 GNULIB_WCWIDTH=0; AC_SUBST([GNULIB_WCWIDTH])
150 GNULIB_WMEMCHR=0; AC_SUBST([GNULIB_WMEMCHR])
151 GNULIB_WMEMCMP=0; AC_SUBST([GNULIB_WMEMCMP])
152 GNULIB_WMEMCPY=0; AC_SUBST([GNULIB_WMEMCPY])
153 GNULIB_WMEMMOVE=0; AC_SUBST([GNULIB_WMEMMOVE])
154 GNULIB_WMEMPCPY=0; AC_SUBST([GNULIB_WMEMPCPY])
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 GNULIB_WCSTOK=0; AC_SUBST([GNULIB_WCSTOK])
178 GNULIB_WCSWIDTH=0; AC_SUBST([GNULIB_WCSWIDTH])
179 GNULIB_WCSFTIME=0; AC_SUBST([GNULIB_WCSFTIME])
180 dnl Support Microsoft deprecated alias function names by default.
181 GNULIB_MDA_WCSDUP=1; AC_SUBST([GNULIB_MDA_WCSDUP])
182 dnl Assume proper GNU behavior unless another module says otherwise.
183 HAVE_BTOWC=1; AC_SUBST([HAVE_BTOWC])
184 HAVE_MBSINIT=1; AC_SUBST([HAVE_MBSINIT])
185 HAVE_MBRTOWC=1; AC_SUBST([HAVE_MBRTOWC])
186 HAVE_MBRLEN=1; AC_SUBST([HAVE_MBRLEN])
187 HAVE_MBSRTOWCS=1; AC_SUBST([HAVE_MBSRTOWCS])
188 HAVE_MBSNRTOWCS=1; AC_SUBST([HAVE_MBSNRTOWCS])
189 HAVE_WCRTOMB=1; AC_SUBST([HAVE_WCRTOMB])
190 HAVE_WCSRTOMBS=1; AC_SUBST([HAVE_WCSRTOMBS])
191 HAVE_WCSNRTOMBS=1; AC_SUBST([HAVE_WCSNRTOMBS])
192 HAVE_WMEMCHR=1; AC_SUBST([HAVE_WMEMCHR])
193 HAVE_WMEMCMP=1; AC_SUBST([HAVE_WMEMCMP])
194 HAVE_WMEMCPY=1; AC_SUBST([HAVE_WMEMCPY])
195 HAVE_WMEMMOVE=1; AC_SUBST([HAVE_WMEMMOVE])
196 HAVE_WMEMPCPY=1; AC_SUBST([HAVE_WMEMPCPY])
197 HAVE_WMEMSET=1; AC_SUBST([HAVE_WMEMSET])
198 HAVE_WCSLEN=1; AC_SUBST([HAVE_WCSLEN])
199 HAVE_WCSNLEN=1; AC_SUBST([HAVE_WCSNLEN])
200 HAVE_WCSCPY=1; AC_SUBST([HAVE_WCSCPY])
201 HAVE_WCPCPY=1; AC_SUBST([HAVE_WCPCPY])
202 HAVE_WCSNCPY=1; AC_SUBST([HAVE_WCSNCPY])
203 HAVE_WCPNCPY=1; AC_SUBST([HAVE_WCPNCPY])
204 HAVE_WCSCAT=1; AC_SUBST([HAVE_WCSCAT])
205 HAVE_WCSNCAT=1; AC_SUBST([HAVE_WCSNCAT])
206 HAVE_WCSCMP=1; AC_SUBST([HAVE_WCSCMP])
207 HAVE_WCSNCMP=1; AC_SUBST([HAVE_WCSNCMP])
208 HAVE_WCSCASECMP=1; AC_SUBST([HAVE_WCSCASECMP])
209 HAVE_WCSNCASECMP=1; AC_SUBST([HAVE_WCSNCASECMP])
210 HAVE_WCSCOLL=1; AC_SUBST([HAVE_WCSCOLL])
211 HAVE_WCSXFRM=1; AC_SUBST([HAVE_WCSXFRM])
212 HAVE_WCSDUP=1; AC_SUBST([HAVE_WCSDUP])
213 HAVE_WCSCHR=1; AC_SUBST([HAVE_WCSCHR])
214 HAVE_WCSRCHR=1; AC_SUBST([HAVE_WCSRCHR])
215 HAVE_WCSCSPN=1; AC_SUBST([HAVE_WCSCSPN])
216 HAVE_WCSSPN=1; AC_SUBST([HAVE_WCSSPN])
217 HAVE_WCSPBRK=1; AC_SUBST([HAVE_WCSPBRK])
218 HAVE_WCSSTR=1; AC_SUBST([HAVE_WCSSTR])
219 HAVE_WCSTOK=1; AC_SUBST([HAVE_WCSTOK])
220 HAVE_WCSWIDTH=1; AC_SUBST([HAVE_WCSWIDTH])
221 HAVE_WCSFTIME=1; AC_SUBST([HAVE_WCSFTIME])
222 HAVE_DECL_WCTOB=1; AC_SUBST([HAVE_DECL_WCTOB])
223 HAVE_DECL_WCSDUP=1; AC_SUBST([HAVE_DECL_WCSDUP])
224 HAVE_DECL_WCWIDTH=1; AC_SUBST([HAVE_DECL_WCWIDTH])
225 REPLACE_MBSTATE_T=0; AC_SUBST([REPLACE_MBSTATE_T])
226 REPLACE_BTOWC=0; AC_SUBST([REPLACE_BTOWC])
227 REPLACE_WCTOB=0; AC_SUBST([REPLACE_WCTOB])
228 REPLACE_MBSINIT=0; AC_SUBST([REPLACE_MBSINIT])
229 REPLACE_MBRTOWC=0; AC_SUBST([REPLACE_MBRTOWC])
230 REPLACE_MBRLEN=0; AC_SUBST([REPLACE_MBRLEN])
231 REPLACE_MBSRTOWCS=0; AC_SUBST([REPLACE_MBSRTOWCS])
232 REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS])
233 REPLACE_WCRTOMB=0; AC_SUBST([REPLACE_WCRTOMB])
234 REPLACE_WCSRTOMBS=0; AC_SUBST([REPLACE_WCSRTOMBS])
235 REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS])
236 REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH])
237 REPLACE_WCSWIDTH=0; AC_SUBST([REPLACE_WCSWIDTH])
238 REPLACE_WCSFTIME=0; AC_SUBST([REPLACE_WCSFTIME])
239 REPLACE_WCSTOK=0; AC_SUBST([REPLACE_WCSTOK])