1dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
2
3dnl Copyright (C) 2007-2018 Free Software Foundation, Inc.
4dnl This file is free software; the Free Software Foundation
5dnl gives unlimited permission to copy and/or distribute it,
6dnl with or without modifications, as long as this notice is preserved.
7
8dnl Written by Eric Blake.
9
10# wchar_h.m4 serial 42
11
12AC_DEFUN([gl_WCHAR_H],
13[
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
22    HAVE_WCHAR_H=1
23  else
24    HAVE_WCHAR_H=0
25  fi
26  AC_SUBST([HAVE_WCHAR_H])
27
28  AC_REQUIRE([gl_FEATURES_H])
29
30  AC_REQUIRE([gt_TYPE_WINT_T])
31  if test $gt_cv_c_wint_t = yes; then
32    HAVE_WINT_T=1
33  else
34    HAVE_WINT_T=0
35  fi
36  AC_SUBST([HAVE_WINT_T])
37
38  AC_REQUIRE([gl_TYPE_WINT_T_PREREQ])
39
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
44   <wchar.h>.
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__)
48# include <stddef.h>
49# include <stdio.h>
50# include <time.h>
51#endif
52#include <wchar.h>
53    ]],
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
59    ])
60])
61
62dnl Check whether <wchar.h> is usable at all.
63AC_DEFUN([gl_WCHAR_H_INLINE_OK],
64[
65  dnl Test whether <wchar.h> suffers due to the transition from '__inline' to
66  dnl 'gnu_inline'. See <https://sourceware.org/bugzilla/show_bug.cgi?id=4022>
67  dnl and <https://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
73     AC_LANG_CONFTEST([
74       AC_LANG_SOURCE([[#define wcstod renamed_wcstod
75/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
76   <wchar.h>.
77   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
78   included before <wchar.h>.  */
79#include <stddef.h>
80#include <stdio.h>
81#include <time.h>
82#include <wchar.h>
83extern int zero (void);
84int main () { return zero(); }
85]])])
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
94       AC_LANG_CONFTEST([
95         AC_LANG_SOURCE([[#define wcstod renamed_wcstod
96/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
97   <wchar.h>.
98   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
99   included before <wchar.h>.  */
100#include <stddef.h>
101#include <stdio.h>
102#include <time.h>
103#include <wchar.h>
104int zero (void) { return 0; }
105]])])
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
110           :
111         else
112           gl_cv_header_wchar_h_correct_inline=no
113         fi
114       fi
115     fi
116     ac_compile="$save_ac_compile"
117     rm -f conftest1.$ac_objext conftest2.$ac_objext conftest$ac_exeext
118    ])
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).
121This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
122C99 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    <https://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.
128Configuration aborted.])
129  fi
130])
131
132AC_DEFUN([gl_WCHAR_MODULE_INDICATOR],
133[
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])
139])
140
141AC_DEFUN([gl_WCHAR_H_DEFAULTS],
142[
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])
238])
239