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