Home | History | Annotate | Download | only in m4
      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