access tests: Fix test failure on native Windows.
[gnulib.git] / m4 / wchar_h.m4
blob08b7c86849b3c2f1ca8f8c4947fd879618f26eff
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
22     HAVE_WCHAR_H=1
23   else
24     HAVE_WCHAR_H=0
25   fi
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
32     HAVE_WINT_T=1
33   else
34     HAVE_WINT_T=0
35   fi
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
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
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
60     ])
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
77      case "$host_os" in
78        *-gnu* | gnu*)
79          AC_LANG_CONFTEST([
80            AC_LANG_SOURCE([[#define wcstod renamed_wcstod
81 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
82    <wchar.h>.
83    BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
84    included before <wchar.h>.  */
85 #include <stddef.h>
86 #include <stdio.h>
87 #include <time.h>
88 #include <wchar.h>
89 extern int zero (void);
90 int main () { return zero(); }
91 ]])])
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
101            AC_LANG_CONFTEST([
102              AC_LANG_SOURCE([[#define wcstod renamed_wcstod
103 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
104    <wchar.h>.
105    BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
106    included before <wchar.h>.  */
107 #include <stddef.h>
108 #include <stdio.h>
109 #include <time.h>
110 #include <wchar.h>
111 int zero (void) { return 0; }
112 ]])])
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
118                :
119              else
120                gl_cv_header_wchar_h_correct_inline=no
121              fi
122            fi
123          fi
124          ac_compile="$save_ac_compile"
125          rm -f conftest[12].c conftest[12].$ac_objext conftest$ac_exeext
126          ;;
127      esac
128     ])
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.])
139   fi
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])