1 dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
3 dnl Copyright (C) 2007-2017 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 42
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 wmemchr wmemcmp wmemcpy wmemmove wmemset
56 wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp
57 wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr
58 wcscspn wcsspn wcspbrk wcsstr wcstok wcswidth wcsftime
62 dnl Check whether <wchar.h> is usable at all.
63 AC_DEFUN([gl_WCHAR_H_INLINE_OK],
65 dnl Test whether <wchar.h> suffers due to the transition from '__inline' to
66 dnl 'gnu_inline'. See <http://sourceware.org/bugzilla/show_bug.cgi?id=4022>
67 dnl and <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>. In summary,
68 dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and
69 dnl the option -std=c99 or -std=gnu99, leads to a broken <wchar.h>.
70 AC_CACHE_CHECK([whether <wchar.h> uses 'inline' correctly],
71 [gl_cv_header_wchar_h_correct_inline],
72 [gl_cv_header_wchar_h_correct_inline=yes
74 AC_LANG_SOURCE([[#define wcstod renamed_wcstod
75 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
77 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
78 included before <wchar.h>. */
83 extern int zero (void);
84 int main () { return zero(); }
86 dnl Do not rename the object file from conftest.$ac_objext to
87 dnl conftest1.$ac_objext, as this will cause the link to fail on
88 dnl z/OS when using the XPLINK object format (due to duplicate
89 dnl CSECT names). Instead, temporarily redefine $ac_compile so
90 dnl that the object file has the latter name from the start.
91 save_ac_compile="$ac_compile"
92 ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
93 if AC_TRY_EVAL([ac_compile]); then
95 AC_LANG_SOURCE([[#define wcstod renamed_wcstod
96 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
98 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
99 included before <wchar.h>. */
104 int zero (void) { return 0; }
106 dnl See note above about renaming object files.
107 ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
108 if AC_TRY_EVAL([ac_compile]); then
109 if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then
112 gl_cv_header_wchar_h_correct_inline=no
116 ac_compile="$save_ac_compile"
117 rm -f conftest1.$ac_objext conftest2.$ac_objext conftest$ac_exeext
119 if test $gl_cv_header_wchar_h_correct_inline = no; then
120 AC_MSG_ERROR([<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
121 This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
122 C99 mode. You have four options:
123 - Add the flag -fgnu89-inline to CC and reconfigure, or
124 - Fix your include files, using parts of
125 <http://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
126 - Use a gcc version older than 4.3, or
127 - Don't use the flags -std=c99 or -std=gnu99.
128 Configuration aborted.])
132 AC_DEFUN([gl_WCHAR_MODULE_INDICATOR],
134 dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
135 AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
136 gl_MODULE_INDICATOR_SET_VARIABLE([$1])
137 dnl Define it also as a C macro, for the benefit of the unit tests.
138 gl_MODULE_INDICATOR_FOR_TESTS([$1])
141 AC_DEFUN([gl_WCHAR_H_DEFAULTS],
143 GNULIB_BTOWC=0; AC_SUBST([GNULIB_BTOWC])
144 GNULIB_WCTOB=0; AC_SUBST([GNULIB_WCTOB])
145 GNULIB_MBSINIT=0; AC_SUBST([GNULIB_MBSINIT])
146 GNULIB_MBRTOWC=0; AC_SUBST([GNULIB_MBRTOWC])
147 GNULIB_MBRLEN=0; AC_SUBST([GNULIB_MBRLEN])
148 GNULIB_MBSRTOWCS=0; AC_SUBST([GNULIB_MBSRTOWCS])
149 GNULIB_MBSNRTOWCS=0; AC_SUBST([GNULIB_MBSNRTOWCS])
150 GNULIB_WCRTOMB=0; AC_SUBST([GNULIB_WCRTOMB])
151 GNULIB_WCSRTOMBS=0; AC_SUBST([GNULIB_WCSRTOMBS])
152 GNULIB_WCSNRTOMBS=0; AC_SUBST([GNULIB_WCSNRTOMBS])
153 GNULIB_WCWIDTH=0; AC_SUBST([GNULIB_WCWIDTH])
154 GNULIB_WMEMCHR=0; AC_SUBST([GNULIB_WMEMCHR])
155 GNULIB_WMEMCMP=0; AC_SUBST([GNULIB_WMEMCMP])
156 GNULIB_WMEMCPY=0; AC_SUBST([GNULIB_WMEMCPY])
157 GNULIB_WMEMMOVE=0; AC_SUBST([GNULIB_WMEMMOVE])
158 GNULIB_WMEMSET=0; AC_SUBST([GNULIB_WMEMSET])
159 GNULIB_WCSLEN=0; AC_SUBST([GNULIB_WCSLEN])
160 GNULIB_WCSNLEN=0; AC_SUBST([GNULIB_WCSNLEN])
161 GNULIB_WCSCPY=0; AC_SUBST([GNULIB_WCSCPY])
162 GNULIB_WCPCPY=0; AC_SUBST([GNULIB_WCPCPY])
163 GNULIB_WCSNCPY=0; AC_SUBST([GNULIB_WCSNCPY])
164 GNULIB_WCPNCPY=0; AC_SUBST([GNULIB_WCPNCPY])
165 GNULIB_WCSCAT=0; AC_SUBST([GNULIB_WCSCAT])
166 GNULIB_WCSNCAT=0; AC_SUBST([GNULIB_WCSNCAT])
167 GNULIB_WCSCMP=0; AC_SUBST([GNULIB_WCSCMP])
168 GNULIB_WCSNCMP=0; AC_SUBST([GNULIB_WCSNCMP])
169 GNULIB_WCSCASECMP=0; AC_SUBST([GNULIB_WCSCASECMP])
170 GNULIB_WCSNCASECMP=0; AC_SUBST([GNULIB_WCSNCASECMP])
171 GNULIB_WCSCOLL=0; AC_SUBST([GNULIB_WCSCOLL])
172 GNULIB_WCSXFRM=0; AC_SUBST([GNULIB_WCSXFRM])
173 GNULIB_WCSDUP=0; AC_SUBST([GNULIB_WCSDUP])
174 GNULIB_WCSCHR=0; AC_SUBST([GNULIB_WCSCHR])
175 GNULIB_WCSRCHR=0; AC_SUBST([GNULIB_WCSRCHR])
176 GNULIB_WCSCSPN=0; AC_SUBST([GNULIB_WCSCSPN])
177 GNULIB_WCSSPN=0; AC_SUBST([GNULIB_WCSSPN])
178 GNULIB_WCSPBRK=0; AC_SUBST([GNULIB_WCSPBRK])
179 GNULIB_WCSSTR=0; AC_SUBST([GNULIB_WCSSTR])
180 GNULIB_WCSTOK=0; AC_SUBST([GNULIB_WCSTOK])
181 GNULIB_WCSWIDTH=0; AC_SUBST([GNULIB_WCSWIDTH])
182 GNULIB_WCSFTIME=0; AC_SUBST([GNULIB_WCSFTIME])
183 dnl Assume proper GNU behavior unless another module says otherwise.
184 HAVE_BTOWC=1; AC_SUBST([HAVE_BTOWC])
185 HAVE_MBSINIT=1; AC_SUBST([HAVE_MBSINIT])
186 HAVE_MBRTOWC=1; AC_SUBST([HAVE_MBRTOWC])
187 HAVE_MBRLEN=1; AC_SUBST([HAVE_MBRLEN])
188 HAVE_MBSRTOWCS=1; AC_SUBST([HAVE_MBSRTOWCS])
189 HAVE_MBSNRTOWCS=1; AC_SUBST([HAVE_MBSNRTOWCS])
190 HAVE_WCRTOMB=1; AC_SUBST([HAVE_WCRTOMB])
191 HAVE_WCSRTOMBS=1; AC_SUBST([HAVE_WCSRTOMBS])
192 HAVE_WCSNRTOMBS=1; AC_SUBST([HAVE_WCSNRTOMBS])
193 HAVE_WMEMCHR=1; AC_SUBST([HAVE_WMEMCHR])
194 HAVE_WMEMCMP=1; AC_SUBST([HAVE_WMEMCMP])
195 HAVE_WMEMCPY=1; AC_SUBST([HAVE_WMEMCPY])
196 HAVE_WMEMMOVE=1; AC_SUBST([HAVE_WMEMMOVE])
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_WCWIDTH=1; AC_SUBST([HAVE_DECL_WCWIDTH])
224 REPLACE_MBSTATE_T=0; AC_SUBST([REPLACE_MBSTATE_T])
225 REPLACE_BTOWC=0; AC_SUBST([REPLACE_BTOWC])
226 REPLACE_WCTOB=0; AC_SUBST([REPLACE_WCTOB])
227 REPLACE_MBSINIT=0; AC_SUBST([REPLACE_MBSINIT])
228 REPLACE_MBRTOWC=0; AC_SUBST([REPLACE_MBRTOWC])
229 REPLACE_MBRLEN=0; AC_SUBST([REPLACE_MBRLEN])
230 REPLACE_MBSRTOWCS=0; AC_SUBST([REPLACE_MBSRTOWCS])
231 REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS])
232 REPLACE_WCRTOMB=0; AC_SUBST([REPLACE_WCRTOMB])
233 REPLACE_WCSRTOMBS=0; AC_SUBST([REPLACE_WCSRTOMBS])
234 REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS])
235 REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH])
236 REPLACE_WCSWIDTH=0; AC_SUBST([REPLACE_WCSWIDTH])
237 REPLACE_WCSFTIME=0; AC_SUBST([REPLACE_WCSFTIME])