Blame m4/mbrtowc.m4

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