1dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues. 2 3dnl Copyright (C) 2007-2022 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 55 11 12AC_DEFUN_ONCE([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 #include <wchar.h> 44 ]], 45 [btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb 46 wcsrtombs wcsnrtombs wcwidth 47 wmemchr wmemcmp wmemcpy wmemmove wmempcpy wmemset 48 wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp 49 wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr 50 wcscspn wcsspn wcspbrk wcsstr wcstok wcswidth wcsftime 51 ]) 52 53 AC_REQUIRE([AC_C_RESTRICT]) 54 55 AC_CHECK_DECLS([wcsdup], [], [], [[ 56 #include <wchar.h> 57 ]]) 58 if test $ac_cv_have_decl_wcsdup = no; then 59 HAVE_DECL_WCSDUP=0 60 fi 61]) 62 63dnl Check whether <wchar.h> is usable at all. 64AC_DEFUN([gl_WCHAR_H_INLINE_OK], 65[ 66 dnl Test whether <wchar.h> suffers due to the transition from '__inline' to 67 dnl 'gnu_inline'. See <https://sourceware.org/bugzilla/show_bug.cgi?id=4022> 68 dnl and <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>. In summary, 69 dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and 70 dnl the option -std=c99 or -std=gnu99, leads to a broken <wchar.h>. 71 AC_REQUIRE([AC_CANONICAL_HOST]) 72 AC_CACHE_CHECK([whether <wchar.h> uses 'inline' correctly], 73 [gl_cv_header_wchar_h_correct_inline], 74 [gl_cv_header_wchar_h_correct_inline=yes 75 case "$host_os" in 76 *-gnu* | gnu*) 77 AC_LANG_CONFTEST([ 78 AC_LANG_SOURCE([[ 79 #define wcstod renamed_wcstod 80 #include <wchar.h> 81 extern int zero (void); 82 int main () { return zero(); } 83 ]])]) 84 dnl Do not rename the object file from conftest.$ac_objext to 85 dnl conftest1.$ac_objext, as this will cause the link to fail on 86 dnl z/OS when using the XPLINK object format (due to duplicate 87 dnl CSECT names). Instead, temporarily redefine $ac_compile so 88 dnl that the object file has the latter name from the start. 89 save_ac_compile="$ac_compile" 90 ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/` 91 if echo '#include "conftest.c"' >conftest1.c \ 92 && AC_TRY_EVAL([ac_compile]); then 93 AC_LANG_CONFTEST([ 94 AC_LANG_SOURCE([[ 95 #define wcstod renamed_wcstod 96 #include <wchar.h> 97 int zero (void) { return 0; } 98 ]])]) 99 dnl See note above about renaming object files. 100 ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/` 101 if echo '#include "conftest.c"' >conftest2.c \ 102 && AC_TRY_EVAL([ac_compile]); then 103 if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then 104 : 105 else 106 gl_cv_header_wchar_h_correct_inline=no 107 fi 108 fi 109 fi 110 ac_compile="$save_ac_compile" 111 rm -f conftest[12].c conftest[12].$ac_objext conftest$ac_exeext 112 ;; 113 esac 114 ]) 115 if test $gl_cv_header_wchar_h_correct_inline = no; then 116 AC_MSG_ERROR([<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS). 117This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in 118C99 mode. You have four options: 119 - Add the flag -fgnu89-inline to CC and reconfigure, or 120 - Fix your include files, using parts of 121 <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or 122 - Use a gcc version older than 4.3, or 123 - Don't use the flags -std=c99 or -std=gnu99. 124Configuration aborted.]) 125 fi 126]) 127 128# gl_WCHAR_MODULE_INDICATOR([modulename]) 129# sets the shell variable that indicates the presence of the given module 130# to a C preprocessor expression that will evaluate to 1. 131# This macro invocation must not occur in macros that are AC_REQUIREd. 132AC_DEFUN([gl_WCHAR_MODULE_INDICATOR], 133[ 134 dnl Ensure to expand the default settings once only. 135 gl_WCHAR_H_REQUIRE_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# Initializes the default values for AC_SUBSTed shell variables. 142# This macro must not be AC_REQUIREd. It must only be invoked, and only 143# outside of macros or in macros that are not AC_REQUIREd. 144AC_DEFUN([gl_WCHAR_H_REQUIRE_DEFAULTS], 145[ 146 m4_defun(GL_MODULE_INDICATOR_PREFIX[_WCHAR_H_MODULE_INDICATOR_DEFAULTS], [ 147 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_BTOWC]) 148 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCTOB]) 149 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSINIT]) 150 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBRTOWC]) 151 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBRLEN]) 152 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSRTOWCS]) 153 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSNRTOWCS]) 154 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCRTOMB]) 155 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSRTOMBS]) 156 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNRTOMBS]) 157 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCWIDTH]) 158 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMCHR]) 159 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMCMP]) 160 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMCPY]) 161 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMMOVE]) 162 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMPCPY]) 163 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMSET]) 164 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSLEN]) 165 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNLEN]) 166 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCPY]) 167 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCPCPY]) 168 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCPY]) 169 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCPNCPY]) 170 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCAT]) 171 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCAT]) 172 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCMP]) 173 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCMP]) 174 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCASECMP]) 175 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCASECMP]) 176 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCOLL]) 177 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSXFRM]) 178 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSDUP]) 179 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCHR]) 180 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSRCHR]) 181 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCSPN]) 182 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSSPN]) 183 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSPBRK]) 184 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSSTR]) 185 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSTOK]) 186 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSWIDTH]) 187 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSFTIME]) 188 dnl Support Microsoft deprecated alias function names by default. 189 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_WCSDUP], [1]) 190 ]) 191 m4_require(GL_MODULE_INDICATOR_PREFIX[_WCHAR_H_MODULE_INDICATOR_DEFAULTS]) 192 dnl Make sure the shell variable for GNULIB_FREE_POSIX is initialized. 193 gl_STDLIB_H_REQUIRE_DEFAULTS 194 AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) 195]) 196 197AC_DEFUN([gl_WCHAR_H_DEFAULTS], 198[ 199 dnl Assume proper GNU behavior unless another module says otherwise. 200 HAVE_BTOWC=1; AC_SUBST([HAVE_BTOWC]) 201 HAVE_MBSINIT=1; AC_SUBST([HAVE_MBSINIT]) 202 HAVE_MBRTOWC=1; AC_SUBST([HAVE_MBRTOWC]) 203 HAVE_MBRLEN=1; AC_SUBST([HAVE_MBRLEN]) 204 HAVE_MBSRTOWCS=1; AC_SUBST([HAVE_MBSRTOWCS]) 205 HAVE_MBSNRTOWCS=1; AC_SUBST([HAVE_MBSNRTOWCS]) 206 HAVE_WCRTOMB=1; AC_SUBST([HAVE_WCRTOMB]) 207 HAVE_WCSRTOMBS=1; AC_SUBST([HAVE_WCSRTOMBS]) 208 HAVE_WCSNRTOMBS=1; AC_SUBST([HAVE_WCSNRTOMBS]) 209 HAVE_WMEMCHR=1; AC_SUBST([HAVE_WMEMCHR]) 210 HAVE_WMEMCMP=1; AC_SUBST([HAVE_WMEMCMP]) 211 HAVE_WMEMCPY=1; AC_SUBST([HAVE_WMEMCPY]) 212 HAVE_WMEMMOVE=1; AC_SUBST([HAVE_WMEMMOVE]) 213 HAVE_WMEMPCPY=1; AC_SUBST([HAVE_WMEMPCPY]) 214 HAVE_WMEMSET=1; AC_SUBST([HAVE_WMEMSET]) 215 HAVE_WCSLEN=1; AC_SUBST([HAVE_WCSLEN]) 216 HAVE_WCSNLEN=1; AC_SUBST([HAVE_WCSNLEN]) 217 HAVE_WCSCPY=1; AC_SUBST([HAVE_WCSCPY]) 218 HAVE_WCPCPY=1; AC_SUBST([HAVE_WCPCPY]) 219 HAVE_WCSNCPY=1; AC_SUBST([HAVE_WCSNCPY]) 220 HAVE_WCPNCPY=1; AC_SUBST([HAVE_WCPNCPY]) 221 HAVE_WCSCAT=1; AC_SUBST([HAVE_WCSCAT]) 222 HAVE_WCSNCAT=1; AC_SUBST([HAVE_WCSNCAT]) 223 HAVE_WCSCMP=1; AC_SUBST([HAVE_WCSCMP]) 224 HAVE_WCSNCMP=1; AC_SUBST([HAVE_WCSNCMP]) 225 HAVE_WCSCASECMP=1; AC_SUBST([HAVE_WCSCASECMP]) 226 HAVE_WCSNCASECMP=1; AC_SUBST([HAVE_WCSNCASECMP]) 227 HAVE_WCSCOLL=1; AC_SUBST([HAVE_WCSCOLL]) 228 HAVE_WCSXFRM=1; AC_SUBST([HAVE_WCSXFRM]) 229 HAVE_WCSDUP=1; AC_SUBST([HAVE_WCSDUP]) 230 HAVE_WCSCHR=1; AC_SUBST([HAVE_WCSCHR]) 231 HAVE_WCSRCHR=1; AC_SUBST([HAVE_WCSRCHR]) 232 HAVE_WCSCSPN=1; AC_SUBST([HAVE_WCSCSPN]) 233 HAVE_WCSSPN=1; AC_SUBST([HAVE_WCSSPN]) 234 HAVE_WCSPBRK=1; AC_SUBST([HAVE_WCSPBRK]) 235 HAVE_WCSSTR=1; AC_SUBST([HAVE_WCSSTR]) 236 HAVE_WCSTOK=1; AC_SUBST([HAVE_WCSTOK]) 237 HAVE_WCSWIDTH=1; AC_SUBST([HAVE_WCSWIDTH]) 238 HAVE_WCSFTIME=1; AC_SUBST([HAVE_WCSFTIME]) 239 HAVE_DECL_WCTOB=1; AC_SUBST([HAVE_DECL_WCTOB]) 240 HAVE_DECL_WCSDUP=1; AC_SUBST([HAVE_DECL_WCSDUP]) 241 HAVE_DECL_WCWIDTH=1; AC_SUBST([HAVE_DECL_WCWIDTH]) 242 REPLACE_MBSTATE_T=0; AC_SUBST([REPLACE_MBSTATE_T]) 243 REPLACE_BTOWC=0; AC_SUBST([REPLACE_BTOWC]) 244 REPLACE_WCTOB=0; AC_SUBST([REPLACE_WCTOB]) 245 REPLACE_MBSINIT=0; AC_SUBST([REPLACE_MBSINIT]) 246 REPLACE_MBRTOWC=0; AC_SUBST([REPLACE_MBRTOWC]) 247 REPLACE_MBRLEN=0; AC_SUBST([REPLACE_MBRLEN]) 248 REPLACE_MBSRTOWCS=0; AC_SUBST([REPLACE_MBSRTOWCS]) 249 REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS]) 250 REPLACE_WCRTOMB=0; AC_SUBST([REPLACE_WCRTOMB]) 251 REPLACE_WCSRTOMBS=0; AC_SUBST([REPLACE_WCSRTOMBS]) 252 REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS]) 253 REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH]) 254 REPLACE_WCSWIDTH=0; AC_SUBST([REPLACE_WCSWIDTH]) 255 REPLACE_WCSFTIME=0; AC_SUBST([REPLACE_WCSFTIME]) 256 REPLACE_WCSTOK=0; AC_SUBST([REPLACE_WCSTOK]) 257]) 258