xref: /netbsd-src/external/gpl3/gdb.old/dist/gnulib/import/m4/wchar_h.m4 (revision 7d62b00eb9ad855ffcd7da46b41e23feb5476fac)
1dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
2
3dnl Copyright (C) 2007-2020 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 46
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
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    ])
61
62  AC_REQUIRE([AC_C_RESTRICT])
63])
64
65dnl Check whether <wchar.h> is usable at all.
66AC_DEFUN([gl_WCHAR_H_INLINE_OK],
67[
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_CACHE_CHECK([whether <wchar.h> uses 'inline' correctly],
74    [gl_cv_header_wchar_h_correct_inline],
75    [gl_cv_header_wchar_h_correct_inline=yes
76     AC_LANG_CONFTEST([
77       AC_LANG_SOURCE([[#define wcstod renamed_wcstod
78/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
79   <wchar.h>.
80   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
81   included before <wchar.h>.  */
82#include <stddef.h>
83#include <stdio.h>
84#include <time.h>
85#include <wchar.h>
86extern int zero (void);
87int main () { return zero(); }
88]])])
89     dnl Do not rename the object file from conftest.$ac_objext to
90     dnl conftest1.$ac_objext, as this will cause the link to fail on
91     dnl z/OS when using the XPLINK object format (due to duplicate
92     dnl CSECT names). Instead, temporarily redefine $ac_compile so
93     dnl that the object file has the latter name from the start.
94     save_ac_compile="$ac_compile"
95     ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
96     if echo '#include "conftest.c"' >conftest1.c &&
97        AC_TRY_EVAL([ac_compile]); then
98       AC_LANG_CONFTEST([
99         AC_LANG_SOURCE([[#define wcstod renamed_wcstod
100/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
101   <wchar.h>.
102   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
103   included before <wchar.h>.  */
104#include <stddef.h>
105#include <stdio.h>
106#include <time.h>
107#include <wchar.h>
108int zero (void) { return 0; }
109]])])
110       dnl See note above about renaming object files.
111       ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
112       if echo '#include "conftest.c"' >conftest2.c &&
113          AC_TRY_EVAL([ac_compile]); then
114         if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then
115           :
116         else
117           gl_cv_header_wchar_h_correct_inline=no
118         fi
119       fi
120     fi
121     ac_compile="$save_ac_compile"
122     rm -f conftest[12].c conftest[12].$ac_objext conftest$ac_exeext
123    ])
124  if test $gl_cv_header_wchar_h_correct_inline = no; then
125    AC_MSG_ERROR([<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
126This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
127C99 mode. You have four options:
128  - Add the flag -fgnu89-inline to CC and reconfigure, or
129  - Fix your include files, using parts of
130    <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
131  - Use a gcc version older than 4.3, or
132  - Don't use the flags -std=c99 or -std=gnu99.
133Configuration aborted.])
134  fi
135])
136
137AC_DEFUN([gl_WCHAR_MODULE_INDICATOR],
138[
139  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
140  AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
141  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
142  dnl Define it also as a C macro, for the benefit of the unit tests.
143  gl_MODULE_INDICATOR_FOR_TESTS([$1])
144])
145
146AC_DEFUN([gl_WCHAR_H_DEFAULTS],
147[
148  GNULIB_BTOWC=0;       AC_SUBST([GNULIB_BTOWC])
149  GNULIB_WCTOB=0;       AC_SUBST([GNULIB_WCTOB])
150  GNULIB_MBSINIT=0;     AC_SUBST([GNULIB_MBSINIT])
151  GNULIB_MBRTOWC=0;     AC_SUBST([GNULIB_MBRTOWC])
152  GNULIB_MBRLEN=0;      AC_SUBST([GNULIB_MBRLEN])
153  GNULIB_MBSRTOWCS=0;   AC_SUBST([GNULIB_MBSRTOWCS])
154  GNULIB_MBSNRTOWCS=0;  AC_SUBST([GNULIB_MBSNRTOWCS])
155  GNULIB_WCRTOMB=0;     AC_SUBST([GNULIB_WCRTOMB])
156  GNULIB_WCSRTOMBS=0;   AC_SUBST([GNULIB_WCSRTOMBS])
157  GNULIB_WCSNRTOMBS=0;  AC_SUBST([GNULIB_WCSNRTOMBS])
158  GNULIB_WCWIDTH=0;     AC_SUBST([GNULIB_WCWIDTH])
159  GNULIB_WMEMCHR=0;     AC_SUBST([GNULIB_WMEMCHR])
160  GNULIB_WMEMCMP=0;     AC_SUBST([GNULIB_WMEMCMP])
161  GNULIB_WMEMCPY=0;     AC_SUBST([GNULIB_WMEMCPY])
162  GNULIB_WMEMMOVE=0;    AC_SUBST([GNULIB_WMEMMOVE])
163  GNULIB_WMEMPCPY=0;    AC_SUBST([GNULIB_WMEMPCPY])
164  GNULIB_WMEMSET=0;     AC_SUBST([GNULIB_WMEMSET])
165  GNULIB_WCSLEN=0;      AC_SUBST([GNULIB_WCSLEN])
166  GNULIB_WCSNLEN=0;     AC_SUBST([GNULIB_WCSNLEN])
167  GNULIB_WCSCPY=0;      AC_SUBST([GNULIB_WCSCPY])
168  GNULIB_WCPCPY=0;      AC_SUBST([GNULIB_WCPCPY])
169  GNULIB_WCSNCPY=0;     AC_SUBST([GNULIB_WCSNCPY])
170  GNULIB_WCPNCPY=0;     AC_SUBST([GNULIB_WCPNCPY])
171  GNULIB_WCSCAT=0;      AC_SUBST([GNULIB_WCSCAT])
172  GNULIB_WCSNCAT=0;     AC_SUBST([GNULIB_WCSNCAT])
173  GNULIB_WCSCMP=0;      AC_SUBST([GNULIB_WCSCMP])
174  GNULIB_WCSNCMP=0;     AC_SUBST([GNULIB_WCSNCMP])
175  GNULIB_WCSCASECMP=0;  AC_SUBST([GNULIB_WCSCASECMP])
176  GNULIB_WCSNCASECMP=0; AC_SUBST([GNULIB_WCSNCASECMP])
177  GNULIB_WCSCOLL=0;     AC_SUBST([GNULIB_WCSCOLL])
178  GNULIB_WCSXFRM=0;     AC_SUBST([GNULIB_WCSXFRM])
179  GNULIB_WCSDUP=0;      AC_SUBST([GNULIB_WCSDUP])
180  GNULIB_WCSCHR=0;      AC_SUBST([GNULIB_WCSCHR])
181  GNULIB_WCSRCHR=0;     AC_SUBST([GNULIB_WCSRCHR])
182  GNULIB_WCSCSPN=0;     AC_SUBST([GNULIB_WCSCSPN])
183  GNULIB_WCSSPN=0;      AC_SUBST([GNULIB_WCSSPN])
184  GNULIB_WCSPBRK=0;     AC_SUBST([GNULIB_WCSPBRK])
185  GNULIB_WCSSTR=0;      AC_SUBST([GNULIB_WCSSTR])
186  GNULIB_WCSTOK=0;      AC_SUBST([GNULIB_WCSTOK])
187  GNULIB_WCSWIDTH=0;    AC_SUBST([GNULIB_WCSWIDTH])
188  GNULIB_WCSFTIME=0;    AC_SUBST([GNULIB_WCSFTIME])
189  dnl Assume proper GNU behavior unless another module says otherwise.
190  HAVE_BTOWC=1;         AC_SUBST([HAVE_BTOWC])
191  HAVE_MBSINIT=1;       AC_SUBST([HAVE_MBSINIT])
192  HAVE_MBRTOWC=1;       AC_SUBST([HAVE_MBRTOWC])
193  HAVE_MBRLEN=1;        AC_SUBST([HAVE_MBRLEN])
194  HAVE_MBSRTOWCS=1;     AC_SUBST([HAVE_MBSRTOWCS])
195  HAVE_MBSNRTOWCS=1;    AC_SUBST([HAVE_MBSNRTOWCS])
196  HAVE_WCRTOMB=1;       AC_SUBST([HAVE_WCRTOMB])
197  HAVE_WCSRTOMBS=1;     AC_SUBST([HAVE_WCSRTOMBS])
198  HAVE_WCSNRTOMBS=1;    AC_SUBST([HAVE_WCSNRTOMBS])
199  HAVE_WMEMCHR=1;       AC_SUBST([HAVE_WMEMCHR])
200  HAVE_WMEMCMP=1;       AC_SUBST([HAVE_WMEMCMP])
201  HAVE_WMEMCPY=1;       AC_SUBST([HAVE_WMEMCPY])
202  HAVE_WMEMMOVE=1;      AC_SUBST([HAVE_WMEMMOVE])
203  HAVE_WMEMPCPY=1;      AC_SUBST([HAVE_WMEMPCPY])
204  HAVE_WMEMSET=1;       AC_SUBST([HAVE_WMEMSET])
205  HAVE_WCSLEN=1;        AC_SUBST([HAVE_WCSLEN])
206  HAVE_WCSNLEN=1;       AC_SUBST([HAVE_WCSNLEN])
207  HAVE_WCSCPY=1;        AC_SUBST([HAVE_WCSCPY])
208  HAVE_WCPCPY=1;        AC_SUBST([HAVE_WCPCPY])
209  HAVE_WCSNCPY=1;       AC_SUBST([HAVE_WCSNCPY])
210  HAVE_WCPNCPY=1;       AC_SUBST([HAVE_WCPNCPY])
211  HAVE_WCSCAT=1;        AC_SUBST([HAVE_WCSCAT])
212  HAVE_WCSNCAT=1;       AC_SUBST([HAVE_WCSNCAT])
213  HAVE_WCSCMP=1;        AC_SUBST([HAVE_WCSCMP])
214  HAVE_WCSNCMP=1;       AC_SUBST([HAVE_WCSNCMP])
215  HAVE_WCSCASECMP=1;    AC_SUBST([HAVE_WCSCASECMP])
216  HAVE_WCSNCASECMP=1;   AC_SUBST([HAVE_WCSNCASECMP])
217  HAVE_WCSCOLL=1;       AC_SUBST([HAVE_WCSCOLL])
218  HAVE_WCSXFRM=1;       AC_SUBST([HAVE_WCSXFRM])
219  HAVE_WCSDUP=1;        AC_SUBST([HAVE_WCSDUP])
220  HAVE_WCSCHR=1;        AC_SUBST([HAVE_WCSCHR])
221  HAVE_WCSRCHR=1;       AC_SUBST([HAVE_WCSRCHR])
222  HAVE_WCSCSPN=1;       AC_SUBST([HAVE_WCSCSPN])
223  HAVE_WCSSPN=1;        AC_SUBST([HAVE_WCSSPN])
224  HAVE_WCSPBRK=1;       AC_SUBST([HAVE_WCSPBRK])
225  HAVE_WCSSTR=1;        AC_SUBST([HAVE_WCSSTR])
226  HAVE_WCSTOK=1;        AC_SUBST([HAVE_WCSTOK])
227  HAVE_WCSWIDTH=1;      AC_SUBST([HAVE_WCSWIDTH])
228  HAVE_WCSFTIME=1;      AC_SUBST([HAVE_WCSFTIME])
229  HAVE_DECL_WCTOB=1;    AC_SUBST([HAVE_DECL_WCTOB])
230  HAVE_DECL_WCWIDTH=1;  AC_SUBST([HAVE_DECL_WCWIDTH])
231  REPLACE_MBSTATE_T=0;  AC_SUBST([REPLACE_MBSTATE_T])
232  REPLACE_BTOWC=0;      AC_SUBST([REPLACE_BTOWC])
233  REPLACE_WCTOB=0;      AC_SUBST([REPLACE_WCTOB])
234  REPLACE_MBSINIT=0;    AC_SUBST([REPLACE_MBSINIT])
235  REPLACE_MBRTOWC=0;    AC_SUBST([REPLACE_MBRTOWC])
236  REPLACE_MBRLEN=0;     AC_SUBST([REPLACE_MBRLEN])
237  REPLACE_MBSRTOWCS=0;  AC_SUBST([REPLACE_MBSRTOWCS])
238  REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS])
239  REPLACE_WCRTOMB=0;    AC_SUBST([REPLACE_WCRTOMB])
240  REPLACE_WCSRTOMBS=0;  AC_SUBST([REPLACE_WCSRTOMBS])
241  REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS])
242  REPLACE_WCWIDTH=0;    AC_SUBST([REPLACE_WCWIDTH])
243  REPLACE_WCSWIDTH=0;   AC_SUBST([REPLACE_WCSWIDTH])
244  REPLACE_WCSFTIME=0;   AC_SUBST([REPLACE_WCSFTIME])
245  REPLACE_WCSTOK=0;     AC_SUBST([REPLACE_WCSTOK])
246])
247