1# wctype_h.m4 serial 25
2
3dnl A placeholder for ISO C99 <wctype.h>, for platforms that lack it.
4
5dnl Copyright (C) 2006-2020 Free Software Foundation, Inc.
6dnl This file is free software; the Free Software Foundation
7dnl gives unlimited permission to copy and/or distribute it,
8dnl with or without modifications, as long as this notice is preserved.
9
10dnl Written by Paul Eggert.
11
12AC_DEFUN([gl_WCTYPE_H],
13[
14  AC_REQUIRE([gl_WCTYPE_H_DEFAULTS])
15  AC_REQUIRE([AC_PROG_CC])
16  AC_REQUIRE([AC_CANONICAL_HOST])
17  AC_CHECK_FUNCS_ONCE([iswcntrl])
18  if test $ac_cv_func_iswcntrl = yes; then
19    HAVE_ISWCNTRL=1
20  else
21    HAVE_ISWCNTRL=0
22  fi
23  AC_SUBST([HAVE_ISWCNTRL])
24
25  AC_REQUIRE([gt_TYPE_WINT_T])
26  if test $gt_cv_c_wint_t = yes; then
27    HAVE_WINT_T=1
28  else
29    HAVE_WINT_T=0
30  fi
31  AC_SUBST([HAVE_WINT_T])
32
33  AC_REQUIRE([gl_TYPE_WINT_T_PREREQ])
34
35  gl_CHECK_NEXT_HEADERS([wctype.h])
36  if test $ac_cv_header_wctype_h = yes; then
37    if test $ac_cv_func_iswcntrl = yes; then
38      dnl Linux libc5 has an iswprint function that returns 0 for all arguments.
39      dnl The other functions are likely broken in the same way.
40      AC_CACHE_CHECK([whether iswcntrl works], [gl_cv_func_iswcntrl_works],
41        [
42          AC_RUN_IFELSE(
43            [AC_LANG_SOURCE([[
44               /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
45                  included before <wchar.h>.
46                  BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
47                  must be included before <wchar.h>.  */
48               #include <stddef.h>
49               #include <stdio.h>
50               #include <time.h>
51               #include <wchar.h>
52               #include <wctype.h>
53               int main () { return iswprint ('x') == 0; }
54            ]])],
55            [gl_cv_func_iswcntrl_works=yes], [gl_cv_func_iswcntrl_works=no],
56            [dnl Guess no on Linux libc5, yes otherwise.
57             AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdlib.h>
58                          #if __GNU_LIBRARY__ == 1
59                          Linux libc5 i18n is broken.
60                          #endif]], [[]])],
61              [gl_cv_func_iswcntrl_works="guessing yes"],
62              [gl_cv_func_iswcntrl_works="guessing no"])
63            ])
64        ])
65    fi
66    HAVE_WCTYPE_H=1
67  else
68    HAVE_WCTYPE_H=0
69  fi
70  AC_SUBST([HAVE_WCTYPE_H])
71
72  if test $GNULIB_OVERRIDES_WINT_T = 1; then
73    REPLACE_ISWCNTRL=1
74  else
75    case "$gl_cv_func_iswcntrl_works" in
76      *yes) REPLACE_ISWCNTRL=0 ;;
77      *)    REPLACE_ISWCNTRL=1 ;;
78    esac
79  fi
80  AC_SUBST([REPLACE_ISWCNTRL])
81
82  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
83    dnl Redefine all of iswcntrl, ..., iswxdigit in <wctype.h>.
84    :
85  fi
86
87  if test $REPLACE_ISWCNTRL = 1; then
88    REPLACE_TOWLOWER=1
89  else
90    AC_CHECK_FUNCS([towlower])
91    if test $ac_cv_func_towlower = yes; then
92      REPLACE_TOWLOWER=0
93    else
94      AC_CHECK_DECLS([towlower],,,
95        [[/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
96             included before <wchar.h>.
97             BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
98             must be included before <wchar.h>.  */
99          #include <stddef.h>
100          #include <stdio.h>
101          #include <time.h>
102          #include <wchar.h>
103          #if HAVE_WCTYPE_H
104          # include <wctype.h>
105          #endif
106        ]])
107      if test $ac_cv_have_decl_towlower = yes; then
108        dnl On Minix 3.1.8, the system's <wctype.h> declares towlower() and
109        dnl towupper() although it does not have the functions. Avoid a
110        dnl collision with gnulib's replacement.
111        REPLACE_TOWLOWER=1
112      else
113        REPLACE_TOWLOWER=0
114      fi
115    fi
116  fi
117  AC_SUBST([REPLACE_TOWLOWER])
118
119  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then
120    dnl Redefine towlower, towupper in <wctype.h>.
121    :
122  fi
123
124  dnl We assume that the wctype() and iswctype() functions exist if and only
125  dnl if the type wctype_t is defined in <wchar.h> or in <wctype.h> if that
126  dnl exists.
127  dnl HP-UX 11.00 declares all these in <wchar.h> and lacks <wctype.h>.
128  AC_CACHE_CHECK([for wctype_t], [gl_cv_type_wctype_t],
129    [AC_COMPILE_IFELSE(
130       [AC_LANG_PROGRAM(
131          [[/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
132               included before <wchar.h>.
133               BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
134               must be included before <wchar.h>.  */
135            #include <stddef.h>
136            #include <stdio.h>
137            #include <time.h>
138            #include <wchar.h>
139            #if HAVE_WCTYPE_H
140            # include <wctype.h>
141            #endif
142            wctype_t a;
143          ]],
144          [[]])],
145       [gl_cv_type_wctype_t=yes],
146       [gl_cv_type_wctype_t=no])
147    ])
148  if test $gl_cv_type_wctype_t = no; then
149    HAVE_WCTYPE_T=0
150  fi
151
152  dnl We assume that the wctrans() and towctrans() functions exist if and only
153  dnl if the type wctrans_t is defined in <wctype.h>.
154  AC_CACHE_CHECK([for wctrans_t], [gl_cv_type_wctrans_t],
155    [AC_COMPILE_IFELSE(
156       [AC_LANG_PROGRAM(
157          [[/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
158               included before <wchar.h>.
159               BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
160               must be included before <wchar.h>.  */
161            #include <stddef.h>
162            #include <stdio.h>
163            #include <time.h>
164            #include <wchar.h>
165            #include <wctype.h>
166            wctrans_t a;
167          ]],
168          [[]])],
169       [gl_cv_type_wctrans_t=yes],
170       [gl_cv_type_wctrans_t=no])
171    ])
172  if test $gl_cv_type_wctrans_t = no; then
173    HAVE_WCTRANS_T=0
174  fi
175
176  dnl Check for declarations of anything we want to poison if the
177  dnl corresponding gnulib module is not in use.
178  gl_WARN_ON_USE_PREPARE([[
179/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
180   <wchar.h>.
181   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
182   included before <wchar.h>.  */
183#if !(defined __GLIBC__ && !defined __UCLIBC__)
184# include <stddef.h>
185# include <stdio.h>
186# include <time.h>
187# include <wchar.h>
188#endif
189#include <wctype.h>
190    ]],
191    [wctype iswctype wctrans towctrans
192    ])
193])
194
195AC_DEFUN([gl_WCTYPE_MODULE_INDICATOR],
196[
197  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
198  AC_REQUIRE([gl_WCTYPE_H_DEFAULTS])
199  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
200  dnl Define it also as a C macro, for the benefit of the unit tests.
201  gl_MODULE_INDICATOR_FOR_TESTS([$1])
202])
203
204AC_DEFUN([gl_WCTYPE_H_DEFAULTS],
205[
206  GNULIB_ISWBLANK=0;    AC_SUBST([GNULIB_ISWBLANK])
207  GNULIB_ISWDIGIT=0;    AC_SUBST([GNULIB_ISWDIGIT])
208  GNULIB_ISWXDIGIT=0;   AC_SUBST([GNULIB_ISWXDIGIT])
209  GNULIB_WCTYPE=0;      AC_SUBST([GNULIB_WCTYPE])
210  GNULIB_ISWCTYPE=0;    AC_SUBST([GNULIB_ISWCTYPE])
211  GNULIB_WCTRANS=0;     AC_SUBST([GNULIB_WCTRANS])
212  GNULIB_TOWCTRANS=0;   AC_SUBST([GNULIB_TOWCTRANS])
213  dnl Assume proper GNU behavior unless another module says otherwise.
214  HAVE_ISWBLANK=1;      AC_SUBST([HAVE_ISWBLANK])
215  HAVE_WCTYPE_T=1;      AC_SUBST([HAVE_WCTYPE_T])
216  HAVE_WCTRANS_T=1;     AC_SUBST([HAVE_WCTRANS_T])
217  REPLACE_ISWBLANK=0;   AC_SUBST([REPLACE_ISWBLANK])
218  REPLACE_ISWDIGIT=0;   AC_SUBST([REPLACE_ISWDIGIT])
219  REPLACE_ISWXDIGIT=0;  AC_SUBST([REPLACE_ISWXDIGIT])
220])
221