New upstream version 1.9
[debian/gzip] / m4 / wchar_h.m4
1 dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
2
3 dnl Copyright (C) 2007-2018 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.
7
8 dnl Written by Eric Blake.
9
10 # wchar_h.m4 serial 42
11
12 AC_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
62 dnl Check whether <wchar.h> is usable at all.
63 AC_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>
83 extern int zero (void);
84 int 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>
104 int 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).
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     <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.
128 Configuration aborted.])
129   fi
130 ])
131
132 AC_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
141 AC_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 ])