1 dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues. 2 3 dnl Copyright (C) 2007-2012 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 39 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 dnl Check for declarations of anything we want to poison if the 39 dnl corresponding gnulib module is not in use. 40 gl_WARN_ON_USE_PREPARE([[ 41 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before 42 <wchar.h>. 43 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be 44 included before <wchar.h>. */ 45 #if !(defined __GLIBC__ && !defined __UCLIBC__) 46 # include <stddef.h> 47 # include <stdio.h> 48 # include <time.h> 49 #endif 50 #include <wchar.h> 51 ]], 52 [btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb 53 wcsrtombs wcsnrtombs wcwidth wmemchr wmemcmp wmemcpy wmemmove wmemset 54 wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp 55 wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr 56 wcscspn wcsspn wcspbrk wcsstr wcstok wcswidth 57 ]) 58 ]) 59 60 dnl Check whether <wchar.h> is usable at all. 61 AC_DEFUN([gl_WCHAR_H_INLINE_OK], 62 [ 63 dnl Test whether <wchar.h> suffers due to the transition from '__inline' to 64 dnl 'gnu_inline'. See <http://sourceware.org/bugzilla/show_bug.cgi?id=4022> 65 dnl and <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>. In summary, 66 dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and 67 dnl the option -std=c99 or -std=gnu99, leads to a broken <wchar.h>. 68 AC_CACHE_CHECK([whether <wchar.h> uses 'inline' correctly], 69 [gl_cv_header_wchar_h_correct_inline], 70 [gl_cv_header_wchar_h_correct_inline=yes 71 AC_LANG_CONFTEST([ 72 AC_LANG_SOURCE([[#define wcstod renamed_wcstod 73 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before 74 <wchar.h>. 75 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be 76 included before <wchar.h>. */ 77 #include <stddef.h> 78 #include <stdio.h> 79 #include <time.h> 80 #include <wchar.h> 81 extern int zero (void); 82 int main () { return zero(); } 83 ]])]) 84 if AC_TRY_EVAL([ac_compile]); then 85 mv conftest.$ac_objext conftest1.$ac_objext 86 AC_LANG_CONFTEST([ 87 AC_LANG_SOURCE([[#define wcstod renamed_wcstod 88 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before 89 <wchar.h>. 90 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be 91 included before <wchar.h>. */ 92 #include <stddef.h> 93 #include <stdio.h> 94 #include <time.h> 95 #include <wchar.h> 96 int zero (void) { return 0; } 97 ]])]) 98 if AC_TRY_EVAL([ac_compile]); then 99 mv conftest.$ac_objext conftest2.$ac_objext 100 if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then 101 : 102 else 103 gl_cv_header_wchar_h_correct_inline=no 104 fi 105 fi 106 fi 107 rm -f conftest1.$ac_objext conftest2.$ac_objext conftest$ac_exeext 108 ]) 109 if test $gl_cv_header_wchar_h_correct_inline = no; then 110 AC_MSG_ERROR([<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS). 111 This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in 112 C99 mode. You have four options: 113 - Add the flag -fgnu89-inline to CC and reconfigure, or 114 - Fix your include files, using parts of 115 <http://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or 116 - Use a gcc version older than 4.3, or 117 - Don't use the flags -std=c99 or -std=gnu99. 118 Configuration aborted.]) 119 fi 120 ]) 121 122 AC_DEFUN([gl_WCHAR_MODULE_INDICATOR], 123 [ 124 dnl Use AC_REQUIRE here, so that the default settings are expanded once only. 125 AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) 126 gl_MODULE_INDICATOR_SET_VARIABLE([$1]) 127 dnl Define it also as a C macro, for the benefit of the unit tests. 128 gl_MODULE_INDICATOR_FOR_TESTS([$1]) 129 ]) 130 131 AC_DEFUN([gl_WCHAR_H_DEFAULTS], 132 [ 133 GNULIB_BTOWC=0; AC_SUBST([GNULIB_BTOWC]) 134 GNULIB_WCTOB=0; AC_SUBST([GNULIB_WCTOB]) 135 GNULIB_MBSINIT=0; AC_SUBST([GNULIB_MBSINIT]) 136 GNULIB_MBRTOWC=0; AC_SUBST([GNULIB_MBRTOWC]) 137 GNULIB_MBRLEN=0; AC_SUBST([GNULIB_MBRLEN]) 138 GNULIB_MBSRTOWCS=0; AC_SUBST([GNULIB_MBSRTOWCS]) 139 GNULIB_MBSNRTOWCS=0; AC_SUBST([GNULIB_MBSNRTOWCS]) 140 GNULIB_WCRTOMB=0; AC_SUBST([GNULIB_WCRTOMB]) 141 GNULIB_WCSRTOMBS=0; AC_SUBST([GNULIB_WCSRTOMBS]) 142 GNULIB_WCSNRTOMBS=0; AC_SUBST([GNULIB_WCSNRTOMBS]) 143 GNULIB_WCWIDTH=0; AC_SUBST([GNULIB_WCWIDTH]) 144 GNULIB_WMEMCHR=0; AC_SUBST([GNULIB_WMEMCHR]) 145 GNULIB_WMEMCMP=0; AC_SUBST([GNULIB_WMEMCMP]) 146 GNULIB_WMEMCPY=0; AC_SUBST([GNULIB_WMEMCPY]) 147 GNULIB_WMEMMOVE=0; AC_SUBST([GNULIB_WMEMMOVE]) 148 GNULIB_WMEMSET=0; AC_SUBST([GNULIB_WMEMSET]) 149 GNULIB_WCSLEN=0; AC_SUBST([GNULIB_WCSLEN]) 150 GNULIB_WCSNLEN=0; AC_SUBST([GNULIB_WCSNLEN]) 151 GNULIB_WCSCPY=0; AC_SUBST([GNULIB_WCSCPY]) 152 GNULIB_WCPCPY=0; AC_SUBST([GNULIB_WCPCPY]) 153 GNULIB_WCSNCPY=0; AC_SUBST([GNULIB_WCSNCPY]) 154 GNULIB_WCPNCPY=0; AC_SUBST([GNULIB_WCPNCPY]) 155 GNULIB_WCSCAT=0; AC_SUBST([GNULIB_WCSCAT]) 156 GNULIB_WCSNCAT=0; AC_SUBST([GNULIB_WCSNCAT]) 157 GNULIB_WCSCMP=0; AC_SUBST([GNULIB_WCSCMP]) 158 GNULIB_WCSNCMP=0; AC_SUBST([GNULIB_WCSNCMP]) 159 GNULIB_WCSCASECMP=0; AC_SUBST([GNULIB_WCSCASECMP]) 160 GNULIB_WCSNCASECMP=0; AC_SUBST([GNULIB_WCSNCASECMP]) 161 GNULIB_WCSCOLL=0; AC_SUBST([GNULIB_WCSCOLL]) 162 GNULIB_WCSXFRM=0; AC_SUBST([GNULIB_WCSXFRM]) 163 GNULIB_WCSDUP=0; AC_SUBST([GNULIB_WCSDUP]) 164 GNULIB_WCSCHR=0; AC_SUBST([GNULIB_WCSCHR]) 165 GNULIB_WCSRCHR=0; AC_SUBST([GNULIB_WCSRCHR]) 166 GNULIB_WCSCSPN=0; AC_SUBST([GNULIB_WCSCSPN]) 167 GNULIB_WCSSPN=0; AC_SUBST([GNULIB_WCSSPN]) 168 GNULIB_WCSPBRK=0; AC_SUBST([GNULIB_WCSPBRK]) 169 GNULIB_WCSSTR=0; AC_SUBST([GNULIB_WCSSTR]) 170 GNULIB_WCSTOK=0; AC_SUBST([GNULIB_WCSTOK]) 171 GNULIB_WCSWIDTH=0; AC_SUBST([GNULIB_WCSWIDTH]) 172 dnl Assume proper GNU behavior unless another module says otherwise. 173 HAVE_BTOWC=1; AC_SUBST([HAVE_BTOWC]) 174 HAVE_MBSINIT=1; AC_SUBST([HAVE_MBSINIT]) 175 HAVE_MBRTOWC=1; AC_SUBST([HAVE_MBRTOWC]) 176 HAVE_MBRLEN=1; AC_SUBST([HAVE_MBRLEN]) 177 HAVE_MBSRTOWCS=1; AC_SUBST([HAVE_MBSRTOWCS]) 178 HAVE_MBSNRTOWCS=1; AC_SUBST([HAVE_MBSNRTOWCS]) 179 HAVE_WCRTOMB=1; AC_SUBST([HAVE_WCRTOMB]) 180 HAVE_WCSRTOMBS=1; AC_SUBST([HAVE_WCSRTOMBS]) 181 HAVE_WCSNRTOMBS=1; AC_SUBST([HAVE_WCSNRTOMBS]) 182 HAVE_WMEMCHR=1; AC_SUBST([HAVE_WMEMCHR]) 183 HAVE_WMEMCMP=1; AC_SUBST([HAVE_WMEMCMP]) 184 HAVE_WMEMCPY=1; AC_SUBST([HAVE_WMEMCPY]) 185 HAVE_WMEMMOVE=1; AC_SUBST([HAVE_WMEMMOVE]) 186 HAVE_WMEMSET=1; AC_SUBST([HAVE_WMEMSET]) 187 HAVE_WCSLEN=1; AC_SUBST([HAVE_WCSLEN]) 188 HAVE_WCSNLEN=1; AC_SUBST([HAVE_WCSNLEN]) 189 HAVE_WCSCPY=1; AC_SUBST([HAVE_WCSCPY]) 190 HAVE_WCPCPY=1; AC_SUBST([HAVE_WCPCPY]) 191 HAVE_WCSNCPY=1; AC_SUBST([HAVE_WCSNCPY]) 192 HAVE_WCPNCPY=1; AC_SUBST([HAVE_WCPNCPY]) 193 HAVE_WCSCAT=1; AC_SUBST([HAVE_WCSCAT]) 194 HAVE_WCSNCAT=1; AC_SUBST([HAVE_WCSNCAT]) 195 HAVE_WCSCMP=1; AC_SUBST([HAVE_WCSCMP]) 196 HAVE_WCSNCMP=1; AC_SUBST([HAVE_WCSNCMP]) 197 HAVE_WCSCASECMP=1; AC_SUBST([HAVE_WCSCASECMP]) 198 HAVE_WCSNCASECMP=1; AC_SUBST([HAVE_WCSNCASECMP]) 199 HAVE_WCSCOLL=1; AC_SUBST([HAVE_WCSCOLL]) 200 HAVE_WCSXFRM=1; AC_SUBST([HAVE_WCSXFRM]) 201 HAVE_WCSDUP=1; AC_SUBST([HAVE_WCSDUP]) 202 HAVE_WCSCHR=1; AC_SUBST([HAVE_WCSCHR]) 203 HAVE_WCSRCHR=1; AC_SUBST([HAVE_WCSRCHR]) 204 HAVE_WCSCSPN=1; AC_SUBST([HAVE_WCSCSPN]) 205 HAVE_WCSSPN=1; AC_SUBST([HAVE_WCSSPN]) 206 HAVE_WCSPBRK=1; AC_SUBST([HAVE_WCSPBRK]) 207 HAVE_WCSSTR=1; AC_SUBST([HAVE_WCSSTR]) 208 HAVE_WCSTOK=1; AC_SUBST([HAVE_WCSTOK]) 209 HAVE_WCSWIDTH=1; AC_SUBST([HAVE_WCSWIDTH]) 210 HAVE_DECL_WCTOB=1; AC_SUBST([HAVE_DECL_WCTOB]) 211 HAVE_DECL_WCWIDTH=1; AC_SUBST([HAVE_DECL_WCWIDTH]) 212 REPLACE_MBSTATE_T=0; AC_SUBST([REPLACE_MBSTATE_T]) 213 REPLACE_BTOWC=0; AC_SUBST([REPLACE_BTOWC]) 214 REPLACE_WCTOB=0; AC_SUBST([REPLACE_WCTOB]) 215 REPLACE_MBSINIT=0; AC_SUBST([REPLACE_MBSINIT]) 216 REPLACE_MBRTOWC=0; AC_SUBST([REPLACE_MBRTOWC]) 217 REPLACE_MBRLEN=0; AC_SUBST([REPLACE_MBRLEN]) 218 REPLACE_MBSRTOWCS=0; AC_SUBST([REPLACE_MBSRTOWCS]) 219 REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS]) 220 REPLACE_WCRTOMB=0; AC_SUBST([REPLACE_WCRTOMB]) 221 REPLACE_WCSRTOMBS=0; AC_SUBST([REPLACE_WCSRTOMBS]) 222 REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS]) 223 REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH]) 224 REPLACE_WCSWIDTH=0; AC_SUBST([REPLACE_WCSWIDTH]) 225 ]) 226