Blame m4/mbrtowc.m4

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