Blame m4/mbrtowc.m4

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