Blame m4/mbrtowc.m4

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