1 # mbrlen.m4 serial 2 2 dnl Copyright (C) 2008 Free Software Foundation, Inc. 3 dnl This file is free software; the Free Software Foundation 4 dnl gives unlimited permission to copy and/or distribute it, 5 dnl with or without modifications, as long as this notice is preserved. 6 7 AC_DEFUN([gl_FUNC_MBRLEN], 8 [ 9 AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) 10 11 AC_REQUIRE([AC_TYPE_MBSTATE_T]) 12 AC_REQUIRE([gl_FUNC_MBRTOWC]) 13 AC_CHECK_FUNCS_ONCE([mbrlen]) 14 if test $ac_cv_func_mbrlen = no; then 15 HAVE_MBRLEN=0 16 else 17 dnl Most bugs affecting the system's mbrtowc function also affect the 18 dnl mbrlen function. So override mbrlen whenever mbrtowc is overridden. 19 dnl We could also run the individual tests below; the results would be 20 dnl the same. 21 if test $REPLACE_MBRTOWC = 1; then 22 REPLACE_MBRLEN=1 23 fi 24 fi 25 if test $HAVE_MBRLEN = 0 || test $REPLACE_MBRLEN = 1; then 26 gl_REPLACE_WCHAR_H 27 AC_LIBOBJ([mbrlen]) 28 gl_PREREQ_MBRLEN 29 fi 30 ]) 31 32 dnl Test whether mbrlen puts the state into non-initial state when parsing an 33 dnl incomplete multibyte character. 34 dnl Result is gl_cv_func_mbrlen_incomplete_state. 35 36 AC_DEFUN([gl_MBRLEN_INCOMPLETE_STATE], 37 [ 38 AC_REQUIRE([AC_PROG_CC]) 39 AC_REQUIRE([gt_LOCALE_JA]) 40 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 41 AC_CACHE_CHECK([whether mbrlen handles incomplete characters], 42 [gl_cv_func_mbrlen_incomplete_state], 43 [ 44 dnl Initial guess, used when cross-compiling or when no suitable locale 45 dnl is present. 46 changequote(,)dnl 47 case "$host_os" in 48 # Guess no on AIX and OSF/1. 49 osf*) gl_cv_func_mbrlen_incomplete_state="guessing no" ;; 50 # Guess yes otherwise. 51 *) gl_cv_func_mbrlen_incomplete_state="guessing yes" ;; 52 esac 53 changequote([,])dnl 54 if test $LOCALE_JA != none; then 55 AC_TRY_RUN([ 56 #include <locale.h> 57 #include <string.h> 58 #include <wchar.h> 59 int main () 60 { 61 if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) 62 { 63 const char input[] = "B\217\253\344\217\251\316er"; /* "Ber" */ 64 mbstate_t state; 65 66 memset (&state, '\0', sizeof (mbstate_t)); 67 if (mbrlen (input + 1, 1, &state) == (size_t)(-2)) 68 if (mbsinit (&state)) 69 return 1; 70 } 71 return 0; 72 }], 73 [gl_cv_func_mbrlen_incomplete_state=yes], 74 [gl_cv_func_mbrlen_incomplete_state=no], 75 []) 76 fi 77 ]) 78 ]) 79 80 dnl Test whether mbrlen, when parsing the end of a multibyte character, 81 dnl correctly returns the number of bytes that were needed to complete the 82 dnl character (not the total number of bytes of the multibyte character). 83 dnl Result is gl_cv_func_mbrlen_retval. 84 85 AC_DEFUN([gl_MBRLEN_RETVAL], 86 [ 87 AC_REQUIRE([AC_PROG_CC]) 88 AC_REQUIRE([gt_LOCALE_FR_UTF8]) 89 AC_REQUIRE([gt_LOCALE_JA]) 90 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 91 AC_CACHE_CHECK([whether mbrlen has a correct return value], 92 [gl_cv_func_mbrlen_retval], 93 [ 94 dnl Initial guess, used when cross-compiling or when no suitable locale 95 dnl is present. 96 changequote(,)dnl 97 case "$host_os" in 98 # Guess no on HP-UX and Solaris. 99 hpux* | solaris*) gl_cv_func_mbrlen_retval="guessing no" ;; 100 # Guess yes otherwise. 101 *) gl_cv_func_mbrlen_retval="guessing yes" ;; 102 esac 103 changequote([,])dnl 104 if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none; then 105 AC_TRY_RUN([ 106 #include <locale.h> 107 #include <string.h> 108 #include <wchar.h> 109 int main () 110 { 111 /* This fails on Solaris. */ 112 if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) 113 { 114 char input[] = "B\303\274\303\237er"; /* "Ber" */ 115 mbstate_t state; 116 117 memset (&state, '\0', sizeof (mbstate_t)); 118 if (mbrlen (input + 1, 1, &state) == (size_t)(-2)) 119 { 120 input[1] = '\0'; 121 if (mbrlen (input + 2, 5, &state) != 1) 122 return 1; 123 } 124 } 125 /* This fails on HP-UX 11.11. */ 126 if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) 127 { 128 char input[] = "B\217\253\344\217\251\316er"; /* "Ber" */ 129 mbstate_t state; 130 131 memset (&state, '\0', sizeof (mbstate_t)); 132 if (mbrlen (input + 1, 1, &state) == (size_t)(-2)) 133 { 134 input[1] = '\0'; 135 if (mbrlen (input + 2, 5, &state) != 2) 136 return 1; 137 } 138 } 139 return 0; 140 }], 141 [gl_cv_func_mbrlen_retval=yes], 142 [gl_cv_func_mbrlen_retval=no], 143 []) 144 fi 145 ]) 146 ]) 147 148 dnl Test whether mbrlen, when parsing a NUL character, correctly returns 0. 149 dnl Result is gl_cv_func_mbrlen_nul_retval. 150 151 AC_DEFUN([gl_MBRLEN_NUL_RETVAL], 152 [ 153 AC_REQUIRE([AC_PROG_CC]) 154 AC_REQUIRE([gt_LOCALE_ZH_CN]) 155 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 156 AC_CACHE_CHECK([whether mbrlen returns 0 when parsing a NUL character], 157 [gl_cv_func_mbrlen_nul_retval], 158 [ 159 dnl Initial guess, used when cross-compiling or when no suitable locale 160 dnl is present. 161 changequote(,)dnl 162 case "$host_os" in 163 # Guess no on Solaris 9. 164 solaris2.9) gl_cv_func_mbrlen_nul_retval="guessing no" ;; 165 # Guess yes otherwise. 166 *) gl_cv_func_mbrlen_nul_retval="guessing yes" ;; 167 esac 168 changequote([,])dnl 169 if test $LOCALE_ZH_CN != none; then 170 AC_TRY_RUN([ 171 #include <locale.h> 172 #include <string.h> 173 #include <wchar.h> 174 int main () 175 { 176 /* This crashes on Solaris 9 inside __mbrtowc_dense_gb18030. */ 177 if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) 178 { 179 mbstate_t state; 180 181 memset (&state, '\0', sizeof (mbstate_t)); 182 if (mbrlen ("", 1, &state) != 0) 183 return 1; 184 } 185 return 0; 186 }], 187 [gl_cv_func_mbrlen_nul_retval=yes], 188 [gl_cv_func_mbrlen_nul_retval=no], 189 []) 190 fi 191 ]) 192 ]) 193 194 # Prerequisites of lib/mbrlen.c. 195 AC_DEFUN([gl_PREREQ_MBRLEN], [ 196 : 197 ]) 198