Blame gl/m4/mbrtowc.m4

Packit a4aae4
# mbrtowc.m4 serial 29  -*- coding: utf-8 -*-
Packit a4aae4
dnl Copyright (C) 2001-2002, 2004-2005, 2008-2017 Free Software Foundation,
Packit a4aae4
dnl Inc.
Packit a4aae4
dnl This file is free software; the Free Software Foundation
Packit a4aae4
dnl gives unlimited permission to copy and/or distribute it,
Packit a4aae4
dnl with or without modifications, as long as this notice is preserved.
Packit a4aae4
Packit a4aae4
AC_DEFUN([gl_FUNC_MBRTOWC],
Packit a4aae4
[
Packit a4aae4
  AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
Packit a4aae4
Packit a4aae4
  AC_REQUIRE([AC_TYPE_MBSTATE_T])
Packit a4aae4
  gl_MBSTATE_T_BROKEN
Packit a4aae4
Packit a4aae4
  AC_CHECK_FUNCS_ONCE([mbrtowc])
Packit a4aae4
  if test $ac_cv_func_mbrtowc = no; then
Packit a4aae4
    HAVE_MBRTOWC=0
Packit a4aae4
    AC_CHECK_DECLS([mbrtowc],,, [[
Packit a4aae4
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
Packit a4aae4
   <wchar.h>.
Packit a4aae4
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
Packit a4aae4
   included before <wchar.h>.  */
Packit a4aae4
#include <stddef.h>
Packit a4aae4
#include <stdio.h>
Packit a4aae4
#include <time.h>
Packit a4aae4
#include <wchar.h>
Packit a4aae4
]])
Packit a4aae4
    if test $ac_cv_have_decl_mbrtowc = yes; then
Packit a4aae4
      dnl On Minix 3.1.8, the system's <wchar.h> declares mbrtowc() although
Packit a4aae4
      dnl it does not have the function. Avoid a collision with gnulib's
Packit a4aae4
      dnl replacement.
Packit a4aae4
      REPLACE_MBRTOWC=1
Packit a4aae4
    fi
Packit a4aae4
  else
Packit a4aae4
    if test $REPLACE_MBSTATE_T = 1; then
Packit a4aae4
      REPLACE_MBRTOWC=1
Packit a4aae4
    else
Packit a4aae4
      gl_MBRTOWC_NULL_ARG1
Packit a4aae4
      gl_MBRTOWC_NULL_ARG2
Packit a4aae4
      gl_MBRTOWC_RETVAL
Packit a4aae4
      gl_MBRTOWC_NUL_RETVAL
Packit a4aae4
      gl_MBRTOWC_EMPTY_INPUT
Packit a4aae4
      gl_MBRTOWC_C_LOCALE
Packit a4aae4
      case "$gl_cv_func_mbrtowc_null_arg1" in
Packit a4aae4
        *yes) ;;
Packit a4aae4
        *) AC_DEFINE([MBRTOWC_NULL_ARG1_BUG], [1],
Packit a4aae4
             [Define if the mbrtowc function has the NULL pwc argument bug.])
Packit a4aae4
           REPLACE_MBRTOWC=1
Packit a4aae4
           ;;
Packit a4aae4
      esac
Packit a4aae4
      case "$gl_cv_func_mbrtowc_null_arg2" in
Packit a4aae4
        *yes) ;;
Packit a4aae4
        *) AC_DEFINE([MBRTOWC_NULL_ARG2_BUG], [1],
Packit a4aae4
             [Define if the mbrtowc function has the NULL string argument bug.])
Packit a4aae4
           REPLACE_MBRTOWC=1
Packit a4aae4
           ;;
Packit a4aae4
      esac
Packit a4aae4
      case "$gl_cv_func_mbrtowc_retval" in
Packit a4aae4
        *yes) ;;
Packit a4aae4
        *) AC_DEFINE([MBRTOWC_RETVAL_BUG], [1],
Packit a4aae4
             [Define if the mbrtowc function returns a wrong return value.])
Packit a4aae4
           REPLACE_MBRTOWC=1
Packit a4aae4
           ;;
Packit a4aae4
      esac
Packit a4aae4
      case "$gl_cv_func_mbrtowc_nul_retval" in
Packit a4aae4
        *yes) ;;
Packit a4aae4
        *) AC_DEFINE([MBRTOWC_NUL_RETVAL_BUG], [1],
Packit a4aae4
             [Define if the mbrtowc function does not return 0 for a NUL character.])
Packit a4aae4
           REPLACE_MBRTOWC=1
Packit a4aae4
           ;;
Packit a4aae4
      esac
Packit a4aae4
      case "$gl_cv_func_mbrtowc_empty_input" in
Packit a4aae4
        *yes) ;;
Packit a4aae4
        *) AC_DEFINE([MBRTOWC_EMPTY_INPUT_BUG], [1],
Packit a4aae4
             [Define if the mbrtowc function does not return (size_t) -2
Packit a4aae4
              for empty input.])
Packit a4aae4
           REPLACE_MBRTOWC=1
Packit a4aae4
           ;;
Packit a4aae4
      esac
Packit a4aae4
      case $gl_cv_C_locale_sans_EILSEQ in
Packit a4aae4
        *yes) ;;
Packit a4aae4
        *) AC_DEFINE([C_LOCALE_MAYBE_EILSEQ], [1],
Packit a4aae4
             [Define to 1 if the C locale may have encoding errors.])
Packit a4aae4
           REPLACE_MBRTOWC=1
Packit a4aae4
           ;;
Packit a4aae4
      esac
Packit a4aae4
    fi
Packit a4aae4
  fi
Packit a4aae4
])
Packit a4aae4
Packit a4aae4
dnl Test whether mbsinit() and mbrtowc() need to be overridden in a way that
Packit a4aae4
dnl redefines the semantics of the given mbstate_t type.
Packit a4aae4
dnl Result is REPLACE_MBSTATE_T.
Packit a4aae4
dnl When this is set to 1, we replace both mbsinit() and mbrtowc(), in order to
Packit a4aae4
dnl avoid inconsistencies.
Packit a4aae4
Packit a4aae4
AC_DEFUN([gl_MBSTATE_T_BROKEN],
Packit a4aae4
[
Packit a4aae4
  AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
Packit a4aae4
Packit a4aae4
  AC_REQUIRE([AC_TYPE_MBSTATE_T])
Packit a4aae4
  AC_CHECK_FUNCS_ONCE([mbsinit])
Packit a4aae4
  AC_CHECK_FUNCS_ONCE([mbrtowc])
Packit a4aae4
  if test $ac_cv_func_mbsinit = yes && test $ac_cv_func_mbrtowc = yes; then
Packit a4aae4
    gl_MBRTOWC_INCOMPLETE_STATE
Packit a4aae4
    gl_MBRTOWC_SANITYCHECK
Packit a4aae4
    REPLACE_MBSTATE_T=0
Packit a4aae4
    case "$gl_cv_func_mbrtowc_incomplete_state" in
Packit a4aae4
      *yes) ;;
Packit a4aae4
      *) REPLACE_MBSTATE_T=1 ;;
Packit a4aae4
    esac
Packit a4aae4
    case "$gl_cv_func_mbrtowc_sanitycheck" in
Packit a4aae4
      *yes) ;;
Packit a4aae4
      *) REPLACE_MBSTATE_T=1 ;;
Packit a4aae4
    esac
Packit a4aae4
  else
Packit a4aae4
    REPLACE_MBSTATE_T=1
Packit a4aae4
  fi
Packit a4aae4
])
Packit a4aae4
Packit a4aae4
dnl Test whether mbrtowc puts the state into non-initial state when parsing an
Packit a4aae4
dnl incomplete multibyte character.
Packit a4aae4
dnl Result is gl_cv_func_mbrtowc_incomplete_state.
Packit a4aae4
Packit a4aae4
AC_DEFUN([gl_MBRTOWC_INCOMPLETE_STATE],
Packit a4aae4
[
Packit a4aae4
  AC_REQUIRE([AC_PROG_CC])
Packit a4aae4
  AC_REQUIRE([gt_LOCALE_JA])
Packit a4aae4
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit a4aae4
  AC_CACHE_CHECK([whether mbrtowc handles incomplete characters],
Packit a4aae4
    [gl_cv_func_mbrtowc_incomplete_state],
Packit a4aae4
    [
Packit a4aae4
      dnl Initial guess, used when cross-compiling or when no suitable locale
Packit a4aae4
      dnl is present.
Packit a4aae4
changequote(,)dnl
Packit a4aae4
      case "$host_os" in
Packit a4aae4
                     # Guess no on AIX and OSF/1.
Packit a4aae4
        aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;;
Packit a4aae4
                     # Guess yes otherwise.
Packit a4aae4
        *)           gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;;
Packit a4aae4
      esac
Packit a4aae4
changequote([,])dnl
Packit a4aae4
      if test $LOCALE_JA != none; then
Packit a4aae4
        AC_RUN_IFELSE(
Packit a4aae4
          [AC_LANG_SOURCE([[
Packit a4aae4
#include <locale.h>
Packit a4aae4
#include <string.h>
Packit a4aae4
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
Packit a4aae4
   <wchar.h>.
Packit a4aae4
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
Packit a4aae4
   included before <wchar.h>.  */
Packit a4aae4
#include <stddef.h>
Packit a4aae4
#include <stdio.h>
Packit a4aae4
#include <time.h>
Packit a4aae4
#include <wchar.h>
Packit a4aae4
int main ()
Packit a4aae4
{
Packit a4aae4
  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
Packit a4aae4
    {
Packit a4aae4
      const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
Packit a4aae4
      mbstate_t state;
Packit a4aae4
      wchar_t wc;
Packit a4aae4
Packit a4aae4
      memset (&state, '\0', sizeof (mbstate_t));
Packit a4aae4
      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
Packit a4aae4
        if (mbsinit (&state))
Packit a4aae4
          return 2;
Packit a4aae4
    }
Packit a4aae4
  return 0;
Packit a4aae4
}]])],
Packit a4aae4
          [gl_cv_func_mbrtowc_incomplete_state=yes],
Packit a4aae4
          [gl_cv_func_mbrtowc_incomplete_state=no],
Packit a4aae4
          [:])
Packit a4aae4
      fi
Packit a4aae4
    ])
Packit a4aae4
])
Packit a4aae4
Packit a4aae4
dnl Test whether mbrtowc works not worse than mbtowc.
Packit a4aae4
dnl Result is gl_cv_func_mbrtowc_sanitycheck.
Packit a4aae4
Packit a4aae4
AC_DEFUN([gl_MBRTOWC_SANITYCHECK],
Packit a4aae4
[
Packit a4aae4
  AC_REQUIRE([AC_PROG_CC])
Packit a4aae4
  AC_REQUIRE([gt_LOCALE_ZH_CN])
Packit a4aae4
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit a4aae4
  AC_CACHE_CHECK([whether mbrtowc works as well as mbtowc],
Packit a4aae4
    [gl_cv_func_mbrtowc_sanitycheck],
Packit a4aae4
    [
Packit a4aae4
      dnl Initial guess, used when cross-compiling or when no suitable locale
Packit a4aae4
      dnl is present.
Packit a4aae4
changequote(,)dnl
Packit a4aae4
      case "$host_os" in
Packit a4aae4
                    # Guess no on Solaris 8.
Packit a4aae4
        solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;;
Packit a4aae4
                    # Guess yes otherwise.
Packit a4aae4
        *)          gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;;
Packit a4aae4
      esac
Packit a4aae4
changequote([,])dnl
Packit a4aae4
      if test $LOCALE_ZH_CN != none; then
Packit a4aae4
        AC_RUN_IFELSE(
Packit a4aae4
          [AC_LANG_SOURCE([[
Packit a4aae4
#include <locale.h>
Packit a4aae4
#include <stdlib.h>
Packit a4aae4
#include <string.h>
Packit a4aae4
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
Packit a4aae4
   <wchar.h>.
Packit a4aae4
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
Packit a4aae4
   included before <wchar.h>.  */
Packit a4aae4
#include <stddef.h>
Packit a4aae4
#include <stdio.h>
Packit a4aae4
#include <time.h>
Packit a4aae4
#include <wchar.h>
Packit a4aae4
int main ()
Packit a4aae4
{
Packit a4aae4
  /* This fails on Solaris 8:
Packit a4aae4
     mbrtowc returns 2, and sets wc to 0x00F0.
Packit a4aae4
     mbtowc returns 4 (correct) and sets wc to 0x5EDC.  */
Packit a4aae4
  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
Packit a4aae4
    {
Packit a4aae4
      char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
Packit a4aae4
      mbstate_t state;
Packit a4aae4
      wchar_t wc;
Packit a4aae4
Packit a4aae4
      memset (&state, '\0', sizeof (mbstate_t));
Packit a4aae4
      if (mbrtowc (&wc, input + 3, 6, &state) != 4
Packit a4aae4
          && mbtowc (&wc, input + 3, 6) == 4)
Packit a4aae4
        return 2;
Packit a4aae4
    }
Packit a4aae4
  return 0;
Packit a4aae4
}]])],
Packit a4aae4
          [gl_cv_func_mbrtowc_sanitycheck=yes],
Packit a4aae4
          [gl_cv_func_mbrtowc_sanitycheck=no],
Packit a4aae4
          [:])
Packit a4aae4
      fi
Packit a4aae4
    ])
Packit a4aae4
])
Packit a4aae4
Packit a4aae4
dnl Test whether mbrtowc supports a NULL pwc argument correctly.
Packit a4aae4
dnl Result is gl_cv_func_mbrtowc_null_arg1.
Packit a4aae4
Packit a4aae4
AC_DEFUN([gl_MBRTOWC_NULL_ARG1],
Packit a4aae4
[
Packit a4aae4
  AC_REQUIRE([AC_PROG_CC])
Packit a4aae4
  AC_REQUIRE([gt_LOCALE_FR_UTF8])
Packit a4aae4
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit a4aae4
  AC_CACHE_CHECK([whether mbrtowc handles a NULL pwc argument],
Packit a4aae4
    [gl_cv_func_mbrtowc_null_arg1],
Packit a4aae4
    [
Packit a4aae4
      dnl Initial guess, used when cross-compiling or when no suitable locale
Packit a4aae4
      dnl is present.
Packit a4aae4
changequote(,)dnl
Packit a4aae4
      case "$host_os" in
Packit a4aae4
                  # Guess no on Solaris.
Packit a4aae4
        solaris*) gl_cv_func_mbrtowc_null_arg1="guessing no" ;;
Packit a4aae4
                  # Guess yes otherwise.
Packit a4aae4
        *)        gl_cv_func_mbrtowc_null_arg1="guessing yes" ;;
Packit a4aae4
      esac
Packit a4aae4
changequote([,])dnl
Packit a4aae4
      if test $LOCALE_FR_UTF8 != none; then
Packit a4aae4
        AC_RUN_IFELSE(
Packit a4aae4
          [AC_LANG_SOURCE([[
Packit a4aae4
#include <locale.h>
Packit a4aae4
#include <stdlib.h>
Packit a4aae4
#include <string.h>
Packit a4aae4
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
Packit a4aae4
   <wchar.h>.
Packit a4aae4
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
Packit a4aae4
   included before <wchar.h>.  */
Packit a4aae4
#include <stddef.h>
Packit a4aae4
#include <stdio.h>
Packit a4aae4
#include <time.h>
Packit a4aae4
#include <wchar.h>
Packit a4aae4
int main ()
Packit a4aae4
{
Packit a4aae4
  int result = 0;
Packit a4aae4
Packit a4aae4
  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
Packit a4aae4
    {
Packit a4aae4
      char input[] = "\303\237er";
Packit a4aae4
      mbstate_t state;
Packit a4aae4
      wchar_t wc;
Packit a4aae4
      size_t ret;
Packit a4aae4
Packit a4aae4
      memset (&state, '\0', sizeof (mbstate_t));
Packit a4aae4
      wc = (wchar_t) 0xBADFACE;
Packit a4aae4
      ret = mbrtowc (&wc, input, 5, &state);
Packit a4aae4
      if (ret != 2)
Packit a4aae4
        result |= 1;
Packit a4aae4
      if (!mbsinit (&state))
Packit a4aae4
        result |= 2;
Packit a4aae4
Packit a4aae4
      memset (&state, '\0', sizeof (mbstate_t));
Packit a4aae4
      ret = mbrtowc (NULL, input, 5, &state);
Packit a4aae4
      if (ret != 2) /* Solaris 7 fails here: ret is -1.  */
Packit a4aae4
        result |= 4;
Packit a4aae4
      if (!mbsinit (&state))
Packit a4aae4
        result |= 8;
Packit a4aae4
    }
Packit a4aae4
  return result;
Packit a4aae4
}]])],
Packit a4aae4
          [gl_cv_func_mbrtowc_null_arg1=yes],
Packit a4aae4
          [gl_cv_func_mbrtowc_null_arg1=no],
Packit a4aae4
          [:])
Packit a4aae4
      fi
Packit a4aae4
    ])
Packit a4aae4
])
Packit a4aae4
Packit a4aae4
dnl Test whether mbrtowc supports a NULL string argument correctly.
Packit a4aae4
dnl Result is gl_cv_func_mbrtowc_null_arg2.
Packit a4aae4
Packit a4aae4
AC_DEFUN([gl_MBRTOWC_NULL_ARG2],
Packit a4aae4
[
Packit a4aae4
  AC_REQUIRE([AC_PROG_CC])
Packit a4aae4
  AC_REQUIRE([gt_LOCALE_FR_UTF8])
Packit a4aae4
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit a4aae4
  AC_CACHE_CHECK([whether mbrtowc handles a NULL string argument],
Packit a4aae4
    [gl_cv_func_mbrtowc_null_arg2],
Packit a4aae4
    [
Packit a4aae4
      dnl Initial guess, used when cross-compiling or when no suitable locale
Packit a4aae4
      dnl is present.
Packit a4aae4
changequote(,)dnl
Packit a4aae4
      case "$host_os" in
Packit a4aae4
              # Guess no on OSF/1.
Packit a4aae4
        osf*) gl_cv_func_mbrtowc_null_arg2="guessing no" ;;
Packit a4aae4
              # Guess yes otherwise.
Packit a4aae4
        *)    gl_cv_func_mbrtowc_null_arg2="guessing yes" ;;
Packit a4aae4
      esac
Packit a4aae4
changequote([,])dnl
Packit a4aae4
      if test $LOCALE_FR_UTF8 != none; then
Packit a4aae4
        AC_RUN_IFELSE(
Packit a4aae4
          [AC_LANG_SOURCE([[
Packit a4aae4
#include <locale.h>
Packit a4aae4
#include <string.h>
Packit a4aae4
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
Packit a4aae4
   <wchar.h>.
Packit a4aae4
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
Packit a4aae4
   included before <wchar.h>.  */
Packit a4aae4
#include <stddef.h>
Packit a4aae4
#include <stdio.h>
Packit a4aae4
#include <time.h>
Packit a4aae4
#include <wchar.h>
Packit a4aae4
int main ()
Packit a4aae4
{
Packit a4aae4
  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
Packit a4aae4
    {
Packit a4aae4
      mbstate_t state;
Packit a4aae4
      wchar_t wc;
Packit a4aae4
      int ret;
Packit a4aae4
Packit a4aae4
      memset (&state, '\0', sizeof (mbstate_t));
Packit a4aae4
      wc = (wchar_t) 0xBADFACE;
Packit a4aae4
      mbrtowc (&wc, NULL, 5, &state);
Packit a4aae4
      /* Check that wc was not modified.  */
Packit a4aae4
      if (wc != (wchar_t) 0xBADFACE)
Packit a4aae4
        return 2;
Packit a4aae4
    }
Packit a4aae4
  return 0;
Packit a4aae4
}]])],
Packit a4aae4
          [gl_cv_func_mbrtowc_null_arg2=yes],
Packit a4aae4
          [gl_cv_func_mbrtowc_null_arg2=no],
Packit a4aae4
          [:])
Packit a4aae4
      fi
Packit a4aae4
    ])
Packit a4aae4
])
Packit a4aae4
Packit a4aae4
dnl Test whether mbrtowc, when parsing the end of a multibyte character,
Packit a4aae4
dnl correctly returns the number of bytes that were needed to complete the
Packit a4aae4
dnl character (not the total number of bytes of the multibyte character).
Packit a4aae4
dnl Result is gl_cv_func_mbrtowc_retval.
Packit a4aae4
Packit a4aae4
AC_DEFUN([gl_MBRTOWC_RETVAL],
Packit a4aae4
[
Packit a4aae4
  AC_REQUIRE([AC_PROG_CC])
Packit a4aae4
  AC_REQUIRE([gt_LOCALE_FR_UTF8])
Packit a4aae4
  AC_REQUIRE([gt_LOCALE_JA])
Packit a4aae4
  AC_REQUIRE([AC_CANONICAL_HOST])
Packit a4aae4
  AC_CACHE_CHECK([whether mbrtowc has a correct return value],
Packit a4aae4
    [gl_cv_func_mbrtowc_retval],
Packit a4aae4
    [
Packit a4aae4
      dnl Initial guess, used when cross-compiling or when no suitable locale
Packit a4aae4
      dnl is present.
Packit a4aae4
changequote(,)dnl
Packit a4aae4
      case "$host_os" in
Packit a4aae4
                                   # Guess no on HP-UX, Solaris, native Windows.
Packit a4aae4
        hpux* | solaris* | mingw*) gl_cv_func_mbrtowc_retval="guessing no" ;;
Packit a4aae4
                                   # Guess yes otherwise.
Packit a4aae4
        *)                         gl_cv_func_mbrtowc_retval="guessing yes" ;;
Packit a4aae4
      esac
Packit a4aae4
changequote([,])dnl
Packit a4aae4
      if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none \
Packit a4aae4
         || { case "$host_os" in mingw*) true;; *) false;; esac; }; then
Packit a4aae4
        AC_RUN_IFELSE(
Packit a4aae4
          [AC_LANG_SOURCE([[
Packit a4aae4
#include <locale.h>
Packit a4aae4
#include <string.h>
Packit a4aae4
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
Packit a4aae4
   <wchar.h>.
Packit a4aae4
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
Packit a4aae4
   included before <wchar.h>.  */
Packit a4aae4
#include <stddef.h>
Packit a4aae4
#include <stdio.h>
Packit a4aae4
#include <time.h>
Packit a4aae4
#include <wchar.h>
Packit a4aae4
int main ()
Packit a4aae4
{
Packit a4aae4
  int result = 0;
Packit a4aae4
  int found_some_locale = 0;
Packit a4aae4
  /* This fails on Solaris.  */
Packit a4aae4
  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
Packit a4aae4
    {
Packit a4aae4
      char input[] = "B\303\274\303\237er"; /* "Büßer" */
Packit a4aae4
      mbstate_t state;
Packit a4aae4
      wchar_t wc;
Packit a4aae4
Packit a4aae4
      memset (&state, '\0', sizeof (mbstate_t));
Packit a4aae4
      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
Packit a4aae4
        {
Packit a4aae4
          input[1] = '\0';
Packit a4aae4
          if (mbrtowc (&wc, input + 2, 5, &state) != 1)
Packit a4aae4
            result |= 1;
Packit a4aae4
        }
Packit a4aae4
      found_some_locale = 1;
Packit a4aae4
    }
Packit a4aae4
  /* This fails on HP-UX 11.11.  */
Packit a4aae4
  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
Packit a4aae4
    {
Packit a4aae4
      char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
Packit a4aae4
      mbstate_t state;
Packit a4aae4
      wchar_t wc;
Packit a4aae4
Packit a4aae4
      memset (&state, '\0', sizeof (mbstate_t));
Packit a4aae4
      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
Packit a4aae4
        {
Packit a4aae4
          input[1] = '\0';
Packit a4aae4
          if (mbrtowc (&wc, input + 2, 5, &state) != 2)
Packit a4aae4
            result |= 2;
Packit a4aae4
        }
Packit a4aae4
      found_some_locale = 1;
Packit a4aae4
    }
Packit a4aae4
  /* This fails on native Windows.  */
Packit a4aae4
  if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL)
Packit a4aae4
    {
Packit a4aae4
      char input[] = "<\223\372\226\173\214\352>"; /* "<日本語>" */
Packit a4aae4
      mbstate_t state;
Packit a4aae4
      wchar_t wc;
Packit a4aae4
Packit a4aae4
      memset (&state, '\0', sizeof (mbstate_t));
Packit a4aae4
      if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
Packit a4aae4
        {
Packit a4aae4
          input[3] = '\0';
Packit a4aae4
          if (mbrtowc (&wc, input + 4, 4, &state) != 1)
Packit a4aae4
            result |= 4;
Packit a4aae4
        }
Packit a4aae4
      found_some_locale = 1;
Packit a4aae4
    }
Packit a4aae4
  if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL)
Packit a4aae4
    {
Packit a4aae4
      char input[] = "<\244\351\245\273\273\171>"; /* "<日本語>" */
Packit a4aae4
      mbstate_t state;
Packit a4aae4
      wchar_t wc;
Packit a4aae4
Packit a4aae4
      memset (&state, '\0', sizeof (mbstate_t));
Packit a4aae4
      if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
Packit a4aae4
        {
Packit a4aae4
          input[3] = '\0';
Packit a4aae4
          if (mbrtowc (&wc, input + 4, 4, &state) != 1)
Packit a4aae4
            result |= 8;
Packit a4aae4
        }
Packit a4aae4
      found_some_locale = 1;
Packit a4aae4
    }
Packit a4aae4
  if (setlocale (LC_ALL, "Chinese_China.936") != NULL)
Packit a4aae4
    {
Packit a4aae4
      char input[] = "<\310\325\261\276\325\132>"; /* "<日本語>" */
Packit a4aae4
      mbstate_t state;
Packit a4aae4
      wchar_t wc;
Packit a4aae4
Packit a4aae4
      memset (&state, '\0', sizeof (mbstate_t));
Packit a4aae4
      if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
Packit a4aae4
        {
Packit a4aae4
          input[3] = '\0';
Packit a4aae4
          if (mbrtowc (&wc, input + 4, 4, &state) != 1)
Packit a4aae4
            result |= 16;
Packit a4aae4
        }
Packit a4aae4
      found_some_locale = 1;
Packit a4aae4
    }
Packit a4aae4
  return (found_some_locale ? result : 77);
Packit a4aae4
}]])],
Packit a4aae4
          [gl_cv_func_mbrtowc_retval=yes],
Packit a4aae4
          [if test $? != 77; then
Packit a4aae4
             gl_cv_func_mbrtowc_retval=no
Packit a4aae4
           fi
Packit a4aae4
          ],
Packit a4aae4
          [:])
Packit a4aae4
      fi
Packit a4aae4
    ])
Packit a4aae4
])
Packit a4aae4
Packit a4aae4
dnl Test whether mbrtowc, when parsing a NUL character, correctly returns 0.
Packit a4aae4
dnl Result is gl_cv_func_mbrtowc_nul_retval.
Packit a4aae4
Packit a4aae4
AC_DEFUN([gl_MBRTOWC_NUL_RETVAL],
Packit a4aae4
[
Packit a4aae4
  AC_REQUIRE([AC_PROG_CC])
Packit a4aae4
  AC_REQUIRE([gt_LOCALE_ZH_CN])
Packit a4aae4
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit a4aae4
  AC_CACHE_CHECK([whether mbrtowc returns 0 when parsing a NUL character],
Packit a4aae4
    [gl_cv_func_mbrtowc_nul_retval],
Packit a4aae4
    [
Packit a4aae4
      dnl Initial guess, used when cross-compiling or when no suitable locale
Packit a4aae4
      dnl is present.
Packit a4aae4
changequote(,)dnl
Packit a4aae4
      case "$host_os" in
Packit a4aae4
                       # Guess no on Solaris 8 and 9.
Packit a4aae4
        solaris2.[89]) gl_cv_func_mbrtowc_nul_retval="guessing no" ;;
Packit a4aae4
                       # Guess yes otherwise.
Packit a4aae4
        *)             gl_cv_func_mbrtowc_nul_retval="guessing yes" ;;
Packit a4aae4
      esac
Packit a4aae4
changequote([,])dnl
Packit a4aae4
      if test $LOCALE_ZH_CN != none; then
Packit a4aae4
        AC_RUN_IFELSE(
Packit a4aae4
          [AC_LANG_SOURCE([[
Packit a4aae4
#include <locale.h>
Packit a4aae4
#include <string.h>
Packit a4aae4
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
Packit a4aae4
   <wchar.h>.
Packit a4aae4
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
Packit a4aae4
   included before <wchar.h>.  */
Packit a4aae4
#include <stddef.h>
Packit a4aae4
#include <stdio.h>
Packit a4aae4
#include <time.h>
Packit a4aae4
#include <wchar.h>
Packit a4aae4
int main ()
Packit a4aae4
{
Packit a4aae4
  /* This fails on Solaris 8 and 9.  */
Packit a4aae4
  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
Packit a4aae4
    {
Packit a4aae4
      mbstate_t state;
Packit a4aae4
      wchar_t wc;
Packit a4aae4
Packit a4aae4
      memset (&state, '\0', sizeof (mbstate_t));
Packit a4aae4
      if (mbrtowc (&wc, "", 1, &state) != 0)
Packit a4aae4
        return 2;
Packit a4aae4
    }
Packit a4aae4
  return 0;
Packit a4aae4
}]])],
Packit a4aae4
          [gl_cv_func_mbrtowc_nul_retval=yes],
Packit a4aae4
          [gl_cv_func_mbrtowc_nul_retval=no],
Packit a4aae4
          [:])
Packit a4aae4
      fi
Packit a4aae4
    ])
Packit a4aae4
])
Packit a4aae4
Packit a4aae4
dnl Test whether mbrtowc returns the correct value on empty input.
Packit a4aae4
Packit a4aae4
AC_DEFUN([gl_MBRTOWC_EMPTY_INPUT],
Packit a4aae4
[
Packit a4aae4
  AC_REQUIRE([AC_PROG_CC])
Packit a4aae4
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit a4aae4
  AC_CACHE_CHECK([whether mbrtowc works on empty input],
Packit a4aae4
    [gl_cv_func_mbrtowc_empty_input],
Packit a4aae4
    [
Packit a4aae4
      dnl Initial guess, used when cross-compiling or when no suitable locale
Packit a4aae4
      dnl is present.
Packit a4aae4
changequote(,)dnl
Packit a4aae4
      case "$host_os" in
Packit a4aae4
                    # Guess no on AIX and glibc systems.
Packit a4aae4
        aix* | *-gnu*)
Packit a4aae4
                    gl_cv_func_mbrtowc_empty_input="guessing no" ;;
Packit a4aae4
                    # Guess yes on native Windows.
Packit a4aae4
        mingw*)     gl_cv_func_mbrtowc_empty_input="guessing yes" ;;
Packit a4aae4
        *)          gl_cv_func_mbrtowc_empty_input="guessing yes" ;;
Packit a4aae4
      esac
Packit a4aae4
changequote([,])dnl
Packit a4aae4
      AC_RUN_IFELSE(
Packit a4aae4
        [AC_LANG_SOURCE([[
Packit a4aae4
           #include <wchar.h>
Packit a4aae4
           static wchar_t wc;
Packit a4aae4
           static mbstate_t mbs;
Packit a4aae4
           int
Packit a4aae4
           main (void)
Packit a4aae4
           {
Packit a4aae4
             return mbrtowc (&wc, "", 0, &mbs) != (size_t) -2;
Packit a4aae4
           }]])],
Packit a4aae4
        [gl_cv_func_mbrtowc_empty_input=yes],
Packit a4aae4
        [gl_cv_func_mbrtowc_empty_input=no],
Packit a4aae4
        [:])
Packit a4aae4
    ])
Packit a4aae4
])
Packit a4aae4
Packit a4aae4
dnl Test whether mbrtowc reports encoding errors in the C locale.
Packit a4aae4
dnl Although POSIX was never intended to allow this, the GNU C Library
Packit a4aae4
dnl and other implementations do it.  See:
Packit a4aae4
dnl https://sourceware.org/bugzilla/show_bug.cgi?id=19932
Packit a4aae4
Packit a4aae4
AC_DEFUN([gl_MBRTOWC_C_LOCALE],
Packit a4aae4
[
Packit a4aae4
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit a4aae4
  AC_CACHE_CHECK([whether the C locale is free of encoding errors],
Packit a4aae4
    [gl_cv_C_locale_sans_EILSEQ],
Packit a4aae4
    [
Packit a4aae4
     dnl Initial guess, used when cross-compiling or when no suitable locale
Packit a4aae4
     dnl is present.
Packit a4aae4
     gl_cv_C_locale_sans_EILSEQ="guessing no"
Packit a4aae4
Packit a4aae4
     AC_RUN_IFELSE(
Packit a4aae4
       [AC_LANG_PROGRAM(
Packit a4aae4
          [[#include <limits.h>
Packit a4aae4
            #include <locale.h>
Packit a4aae4
            #include <wchar.h>
Packit a4aae4
          ]], [[
Packit a4aae4
            int i;
Packit a4aae4
            char *locale = setlocale (LC_ALL, "C");
Packit a4aae4
            if (! locale)
Packit a4aae4
              return 2;
Packit a4aae4
            for (i = CHAR_MIN; i <= CHAR_MAX; i++)
Packit a4aae4
              {
Packit a4aae4
                char c = i;
Packit a4aae4
                wchar_t wc;
Packit a4aae4
                mbstate_t mbs = { 0, };
Packit a4aae4
                size_t ss = mbrtowc (&wc, &c, 1, &mbs);
Packit a4aae4
                if (1 < ss)
Packit a4aae4
                  return 3;
Packit a4aae4
              }
Packit a4aae4
            return 0;
Packit a4aae4
          ]])],
Packit a4aae4
      [gl_cv_C_locale_sans_EILSEQ=yes],
Packit a4aae4
      [gl_cv_C_locale_sans_EILSEQ=no],
Packit a4aae4
      [case "$host_os" in
Packit a4aae4
                 # Guess yes on native Windows.
Packit a4aae4
         mingw*) gl_cv_C_locale_sans_EILSEQ="guessing yes" ;;
Packit a4aae4
       esac
Packit a4aae4
      ])
Packit a4aae4
    ])
Packit a4aae4
])
Packit a4aae4
Packit a4aae4
# Prerequisites of lib/mbrtowc.c.
Packit a4aae4
AC_DEFUN([gl_PREREQ_MBRTOWC], [
Packit a4aae4
  :
Packit a4aae4
])
Packit a4aae4
Packit a4aae4
Packit a4aae4
dnl From Paul Eggert
Packit a4aae4
Packit a4aae4
dnl This is an override of an autoconf macro.
Packit a4aae4
Packit a4aae4
AC_DEFUN([AC_FUNC_MBRTOWC],
Packit a4aae4
[
Packit a4aae4
  dnl Same as AC_FUNC_MBRTOWC in autoconf-2.60.
Packit a4aae4
  AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared],
Packit a4aae4
    [gl_cv_func_mbrtowc],
Packit a4aae4
    [AC_LINK_IFELSE(
Packit a4aae4
       [AC_LANG_PROGRAM(
Packit a4aae4
            [[/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
Packit a4aae4
                 included before <wchar.h>.
Packit a4aae4
                 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
Packit a4aae4
                 must be included before <wchar.h>.  */
Packit a4aae4
              #include <stddef.h>
Packit a4aae4
              #include <stdio.h>
Packit a4aae4
              #include <time.h>
Packit a4aae4
              #include <wchar.h>]],
Packit a4aae4
            [[wchar_t wc;
Packit a4aae4
              char const s[] = "";
Packit a4aae4
              size_t n = 1;
Packit a4aae4
              mbstate_t state;
Packit a4aae4
              return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));]])],
Packit a4aae4
       [gl_cv_func_mbrtowc=yes],
Packit a4aae4
       [gl_cv_func_mbrtowc=no])])
Packit a4aae4
  if test $gl_cv_func_mbrtowc = yes; then
Packit a4aae4
    AC_DEFINE([HAVE_MBRTOWC], [1],
Packit a4aae4
      [Define to 1 if mbrtowc and mbstate_t are properly declared.])
Packit a4aae4
  fi
Packit a4aae4
])