#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for GNU Bison 3.5.
#
# Report bugs to <bug-bison@gnu.org>.
#
#
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
#
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
## -------------------- ##
## M4sh Initialization. ##
## -------------------- ##

# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in #(
  *posix*) :
    set -o posix ;; #(
  *) :
     ;;
esac
fi


as_nl='
'
export as_nl
# Printing a long string crashes Solaris 7 /usr/bin/printf.
as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
# Prefer a ksh shell builtin over an external printf program on Solaris,
# but without wasting forks for bash or zsh.
if test -z "$BASH_VERSION$ZSH_VERSION" \
    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='print -r --'
  as_echo_n='print -rn --'
elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='printf %s\n'
  as_echo_n='printf %s'
else
  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
    as_echo_n='/usr/ucb/echo -n'
  else
    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
    as_echo_n_body='eval
      arg=$1;
      case $arg in #(
      *"$as_nl"*)
	expr "X$arg" : "X\\(.*\\)$as_nl";
	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
      esac;
      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
    '
    export as_echo_n_body
    as_echo_n='sh -c $as_echo_n_body as_echo'
  fi
  export as_echo_body
  as_echo='sh -c $as_echo_body as_echo'
fi

# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  PATH_SEPARATOR=:
  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
      PATH_SEPARATOR=';'
  }
fi


# IFS
# We need space, tab and new line, in precisely that order.  Quoting is
# there to prevent editors from complaining about space-tab.
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
# splitting by setting IFS to empty value.)
IFS=" ""	$as_nl"

# Find who we are.  Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
  *[\\/]* ) as_myself=$0 ;;
  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
  done
IFS=$as_save_IFS

     ;;
esac
# We did not find ourselves, most probably we were run as `sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
  as_myself=$0
fi
if test ! -f "$as_myself"; then
  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
  exit 1
fi

# Unset variables that we do not need and which cause bugs (e.g. in
# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
# suppresses any "Segmentation fault" message there.  '((' could
# trigger a bug in pdksh 5.2.14.
for as_var in BASH_ENV ENV MAIL MAILPATH
do eval test x\${$as_var+set} = xset \
  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done
PS1='$ '
PS2='> '
PS4='+ '

# NLS nuisances.
LC_ALL=C
export LC_ALL
LANGUAGE=C
export LANGUAGE

# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

# Use a proper internal environment variable to ensure we don't fall
  # into an infinite loop, continuously re-executing ourselves.
  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
    _as_can_reexec=no; export _as_can_reexec;
    # We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables.
# Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null
ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
case $- in # ((((
  *v*x* | *x*v* ) as_opts=-vx ;;
  *v* ) as_opts=-v ;;
  *x* ) as_opts=-x ;;
  * ) as_opts= ;;
esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
as_fn_exit 255
  fi
  # We don't want this to propagate to other subprocesses.
          { _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '\${1+\"\$@\"}'='\"\$@\"'
  setopt NO_GLOB_SUBST
else
  case \`(set -o) 2>/dev/null\` in #(
  *posix*) :
    set -o posix ;; #(
  *) :
     ;;
esac
fi
"
  as_required="as_fn_return () { (exit \$1); }
as_fn_success () { as_fn_return 0; }
as_fn_failure () { as_fn_return 1; }
as_fn_ret_success () { return 0; }
as_fn_ret_failure () { return 1; }

exitcode=0
as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :

else
  exitcode=1; echo positional parameters were not saved.
fi
test x\$exitcode = x0 || exit 1
test -x / || exit 1"
  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
test \$(( 1 + 1 )) = 2 || exit 1"
  if (eval "$as_required") 2>/dev/null; then :
  as_have_required=yes
else
  as_have_required=no
fi
  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :

else
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
  as_found=:
  case $as_dir in #(
	 /*)
	   for as_base in sh bash ksh sh5; do
	     # Try only shells that exist, to save several forks.
	     as_shell=$as_dir/$as_base
	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
  CONFIG_SHELL=$as_shell as_have_required=yes
		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
  break 2
fi
fi
	   done;;
       esac
  as_found=false
done
$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
  CONFIG_SHELL=$SHELL as_have_required=yes
fi; }
IFS=$as_save_IFS


      if test "x$CONFIG_SHELL" != x; then :
  export CONFIG_SHELL
             # We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables.
# Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null
ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
case $- in # ((((
  *v*x* | *x*v* ) as_opts=-vx ;;
  *v* ) as_opts=-v ;;
  *x* ) as_opts=-x ;;
  * ) as_opts= ;;
esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi

    if test x$as_have_required = xno; then :
  $as_echo "$0: This script requires a shell more modern than all"
  $as_echo "$0: the shells that I found on your system."
  if test x${ZSH_VERSION+set} = xset ; then
    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
  else
    $as_echo "$0: Please tell bug-autoconf@gnu.org and bug-bison@gnu.org
$0: about your system, including any error possibly output
$0: before this message. Then install a modern shell, or
$0: manually run the script under such a shell if you do
$0: have one."
  fi
  exit 1
fi
fi
fi
SHELL=${CONFIG_SHELL-/bin/sh}
export SHELL
# Unset more variables known to interfere with behavior of common tools.
CLICOLOR_FORCE= GREP_OPTIONS=
unset CLICOLOR_FORCE GREP_OPTIONS

## --------------------- ##
## M4sh Shell Functions. ##
## --------------------- ##
# as_fn_unset VAR
# ---------------
# Portably unset VAR.
as_fn_unset ()
{
  { eval $1=; unset $1;}
}
as_unset=as_fn_unset

# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
as_fn_set_status ()
{
  return $1
} # as_fn_set_status

# as_fn_exit STATUS
# -----------------
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
as_fn_exit ()
{
  set +e
  as_fn_set_status $1
  exit $1
} # as_fn_exit

# as_fn_mkdir_p
# -------------
# Create "$as_dir" as a directory, including parents if necessary.
as_fn_mkdir_p ()
{

  case $as_dir in #(
  -*) as_dir=./$as_dir;;
  esac
  test -d "$as_dir" || eval $as_mkdir_p || {
    as_dirs=
    while :; do
      case $as_dir in #(
      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
      *) as_qdir=$as_dir;;
      esac
      as_dirs="'$as_qdir' $as_dirs"
      as_dir=`$as_dirname -- "$as_dir" ||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$as_dir" : 'X\(//\)[^/]' \| \
	 X"$as_dir" : 'X\(//\)$' \| \
	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_dir" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
      test -d "$as_dir" && break
    done
    test -z "$as_dirs" || eval "mkdir $as_dirs"
  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"


} # as_fn_mkdir_p

# as_fn_executable_p FILE
# -----------------------
# Test if FILE is an executable regular file.
as_fn_executable_p ()
{
  test -f "$1" && test -x "$1"
} # as_fn_executable_p
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
  eval 'as_fn_append ()
  {
    eval $1+=\$2
  }'
else
  as_fn_append ()
  {
    eval $1=\$$1\$2
  }
fi # as_fn_append

# as_fn_arith ARG...
# ------------------
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
  eval 'as_fn_arith ()
  {
    as_val=$(( $* ))
  }'
else
  as_fn_arith ()
  {
    as_val=`expr "$@" || test $? -eq 1`
  }
fi # as_fn_arith


# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
# script with STATUS, using 1 if that was 0.
as_fn_error ()
{
  as_status=$1; test $as_status -eq 0 && as_status=1
  if test "$4"; then
    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
  fi
  $as_echo "$as_me: error: $2" >&2
  as_fn_exit $as_status
} # as_fn_error

if expr a : '\(a\)' >/dev/null 2>&1 &&
   test "X`expr 00001 : '.*\(...\)'`" = X001; then
  as_expr=expr
else
  as_expr=false
fi

if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
  as_basename=basename
else
  as_basename=false
fi

if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
  as_dirname=dirname
else
  as_dirname=false
fi

as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
	 X"$0" : 'X\(//\)$' \| \
	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X/"$0" |
    sed '/^.*\/\([^/][^/]*\)\/*$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`

# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits


  as_lineno_1=$LINENO as_lineno_1a=$LINENO
  as_lineno_2=$LINENO as_lineno_2a=$LINENO
  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
  sed -n '
    p
    /[$]LINENO/=
  ' <$as_myself |
    sed '
      s/[$]LINENO.*/&-/
      t lineno
      b
      :lineno
      N
      :loop
      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
      t loop
      s/-\n.*//
    ' >$as_me.lineno &&
  chmod +x "$as_me.lineno" ||
    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }

  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
  # already done that, so ensure we don't try to do so again and fall
  # in an infinite loop.  This has already happened in practice.
  _as_can_reexec=no; export _as_can_reexec
  # Don't try to exec as it changes $[0], causing all sort of problems
  # (the dirname of $[0] is not the place where we might find the
  # original and so on.  Autoconf is especially sensitive to this).
  . "./$as_me.lineno"
  # Exit status is that of the last command.
  exit
}

ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
  case `echo 'xy\c'` in
  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
  xy)  ECHO_C='\c';;
  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
       ECHO_T='	';;
  esac;;
*)
  ECHO_N='-n';;
esac

rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
  rm -f conf$$.dir/conf$$.file
else
  rm -f conf$$.dir
  mkdir conf$$.dir 2>/dev/null
fi
if (echo >conf$$.file) 2>/dev/null; then
  if ln -s conf$$.file conf$$ 2>/dev/null; then
    as_ln_s='ln -s'
    # ... but there are two gotchas:
    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
    # In both cases, we have to default to `cp -pR'.
    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
      as_ln_s='cp -pR'
  elif ln conf$$.file conf$$ 2>/dev/null; then
    as_ln_s=ln
  else
    as_ln_s='cp -pR'
  fi
else
  as_ln_s='cp -pR'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null

if mkdir -p . 2>/dev/null; then
  as_mkdir_p='mkdir -p "$as_dir"'
else
  test -d ./-p && rmdir ./-p
  as_mkdir_p=false
fi

as_test_x='test -x'
as_executable_p=as_fn_executable_p

# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"

# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"


test -n "$DJDIR" || exec 7<&0 </dev/null
exec 6>&1

# Name of the host.
# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
# so uname gets run too.
ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`

#
# Initializations.
#
ac_default_prefix=/usr/local
ac_clean_files=
ac_config_libobj_dir=.
LIBOBJS=
cross_compiling=no
subdirs=
MFLAGS=
MAKEFLAGS=

# Identity of this package.
PACKAGE_NAME='GNU Bison'
PACKAGE_TARNAME='bison'
PACKAGE_VERSION='3.5'
PACKAGE_STRING='GNU Bison 3.5'
PACKAGE_BUGREPORT='bug-bison@gnu.org'
PACKAGE_URL='http://www.gnu.org/software/bison/'

# Factoring default headers for most tests.
ac_includes_default="\
#include <stdio.h>
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif
#ifdef STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#else
# ifdef HAVE_STDLIB_H
#  include <stdlib.h>
# endif
#endif
#ifdef HAVE_STRING_H
# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
#  include <memory.h>
# endif
# include <string.h>
#endif
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif"

gl_use_threads_default=
gl_use_winpthreads_default=
ac_header_list=
ac_func_list=
gl_getopt_required=POSIX
gt_needs=
ac_config_libobj_dir=lib
ac_subst_vars='gltests_LTLIBOBJS
gltests_LIBOBJS
gl_LTLIBOBJS
gl_LIBOBJS
CONFIG_INCLUDE
am__EXEEXT_FALSE
am__EXEEXT_TRUE
LTLIBOBJS
LIBOBJS
GCC
AUTOM4TE
CROSS_COMPILING_FALSE
CROSS_COMPILING_TRUE
VALGRIND_OPTS_SUPPRESSION
VALGRIND
aclocaldir
BISON_LOCALEDIR
POSUB
INTLLIBS
LTLIBICONV
LIBICONV
INTL_MACOSX_LIBS
XGETTEXT_EXTRA_OPTIONS
MSGMERGE
XGETTEXT_015
XGETTEXT
GMSGFMT_015
MSGFMT_015
GMSGFMT
MSGFMT
GETTEXT_MACRO_VERSION
USE_NLS
LIBBISON_LTLIBDEPS
LIBBISON_LIBDEPS
gltests_WITNESS
gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_FALSE
gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_TRUE
gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_FALSE
gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_TRUE
gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_FALSE
gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_TRUE
gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_FALSE
gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_TRUE
gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_FALSE
gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_TRUE
gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_FALSE
gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_TRUE
gl_GNULIB_ENABLED_sys_stat_FALSE
gl_GNULIB_ENABLED_sys_stat_TRUE
gl_GNULIB_ENABLED_strnlen_FALSE
gl_GNULIB_ENABLED_strnlen_TRUE
gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_FALSE
gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_TRUE
gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_FALSE
gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_TRUE
gl_GNULIB_ENABLED_strchrnul_FALSE
gl_GNULIB_ENABLED_strchrnul_TRUE
gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_FALSE
gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_TRUE
gl_GNULIB_ENABLED_stat_FALSE
gl_GNULIB_ENABLED_stat_TRUE
gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_FALSE
gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_TRUE
gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_FALSE
gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_TRUE
gl_GNULIB_ENABLED_rmdir_FALSE
gl_GNULIB_ENABLED_rmdir_TRUE
gl_GNULIB_ENABLED_rawmemchr_FALSE
gl_GNULIB_ENABLED_rawmemchr_TRUE
gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_FALSE
gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_TRUE
gl_GNULIB_ENABLED_malloca_FALSE
gl_GNULIB_ENABLED_malloca_TRUE
gl_GNULIB_ENABLED_lstat_FALSE
gl_GNULIB_ENABLED_lstat_TRUE
gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_FALSE
gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_TRUE
gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_FALSE
gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_TRUE
gl_GNULIB_ENABLED_ldexp_FALSE
gl_GNULIB_ENABLED_ldexp_TRUE
gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_FALSE
gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_TRUE
gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_FALSE
gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_TRUE
gl_GNULIB_ENABLED_getdtablesize_FALSE
gl_GNULIB_ENABLED_getdtablesize_TRUE
gl_GNULIB_ENABLED_fstat_FALSE
gl_GNULIB_ENABLED_fstat_TRUE
gl_GNULIB_ENABLED_fseterr_FALSE
gl_GNULIB_ENABLED_fseterr_TRUE
gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_FALSE
gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_TRUE
gl_GNULIB_ENABLED_chdir_FALSE
gl_GNULIB_ENABLED_chdir_TRUE
WINDOWS_64_BIT_ST_SIZE
WINDOWS_STAT_TIMESPEC
NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H
NEXT_SYS_STAT_H
REPLACE_UTIMENSAT
REPLACE_STAT
REPLACE_MKNOD
REPLACE_MKFIFO
REPLACE_MKDIR
REPLACE_LSTAT
REPLACE_FUTIMENS
REPLACE_FSTATAT
REPLACE_FSTAT
HAVE_UTIMENSAT
HAVE_MKNODAT
HAVE_MKNOD
HAVE_MKFIFOAT
HAVE_MKFIFO
HAVE_MKDIRAT
HAVE_LSTAT
HAVE_LCHMOD
HAVE_FUTIMENS
HAVE_FSTATAT
HAVE_FCHMODAT
GNULIB_OVERRIDES_STRUCT_STAT
GNULIB_UTIMENSAT
GNULIB_STAT
GNULIB_MKNODAT
GNULIB_MKNOD
GNULIB_MKFIFOAT
GNULIB_MKFIFO
GNULIB_MKDIRAT
GNULIB_LSTAT
GNULIB_LCHMOD
GNULIB_FUTIMENS
GNULIB_FSTATAT
GNULIB_FSTAT
GNULIB_FCHMODAT
NEXT_AS_FIRST_DIRECTIVE_WCHAR_H
NEXT_WCHAR_H
LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE
LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE
LIBUNISTRING_UNIWIDTH_H
LIBUNISTRING_UNITYPES_H
HAVE_UNISTD_H
NEXT_AS_FIRST_DIRECTIVE_UNISTD_H
NEXT_UNISTD_H
UNISTD_H_DEFINES_STRUCT_TIMESPEC
PTHREAD_H_DEFINES_STRUCT_TIMESPEC
SYS_TIME_H_DEFINES_STRUCT_TIMESPEC
TIME_H_DEFINES_STRUCT_TIMESPEC
NEXT_AS_FIRST_DIRECTIVE_TIME_H
NEXT_TIME_H
NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H
NEXT_SYS_WAIT_H
GNULIB_WAITPID
WINDOWS_STAT_INODES
WINDOWS_64_BIT_OFF_T
NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H
NEXT_SYS_TYPES_H
HAVE_SYS_TIMES_H
NEXT_AS_FIRST_DIRECTIVE_SYS_TIMES_H
NEXT_SYS_TIMES_H
HAVE_TIMES
HAVE_STRUCT_TMS
GNULIB_TIMES
HAVE_SYS_RESOURCE_H
NEXT_AS_FIRST_DIRECTIVE_SYS_RESOURCE_H
NEXT_SYS_RESOURCE_H
NEXT_AS_FIRST_DIRECTIVE_STRING_H
NEXT_STRING_H
NEXT_AS_FIRST_DIRECTIVE_STDLIB_H
NEXT_STDLIB_H
NEXT_AS_FIRST_DIRECTIVE_STDIO_H
NEXT_STDIO_H
NEXT_AS_FIRST_DIRECTIVE_STDDEF_H
NEXT_STDDEF_H
GL_GENERATE_STDDEF_H_FALSE
GL_GENERATE_STDDEF_H_TRUE
STDDEF_H
HAVE_WCHAR_T
HAVE_MAX_ALIGN_T
REPLACE_NULL
HAVE__BOOL
GL_GENERATE_STDBOOL_H_FALSE
GL_GENERATE_STDBOOL_H_TRUE
STDBOOL_H
HAVE_SPAWN_H
NEXT_AS_FIRST_DIRECTIVE_SPAWN_H
NEXT_SPAWN_H
NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H
NEXT_SIGNAL_H
HAVE_STRUCT_SCHED_PARAM
HAVE_SCHED_H
NEXT_AS_FIRST_DIRECTIVE_SCHED_H
NEXT_SCHED_H
REPLACE_SCHED_YIELD
HAVE_SCHED_YIELD
GNULIB_SCHED_YIELD
RELOCATABLE_STRIP
RELOCATABLE_BUILD_DIR
RELOCATABLE_SRC_DIR
RELOCATABLE_CONFIG_H_DIR
RELOCATABLE_LIBRARY_PATH
RELOCATABLE_VIA_WRAPPER_FALSE
RELOCATABLE_VIA_WRAPPER_TRUE
RELOCATABLE_VIA_LD_FALSE
RELOCATABLE_VIA_LD_TRUE
INSTALL_PROGRAM_ENV
RELOCATABLE_LDFLAGS
RELOCATABLE
REPLACE_RAISE
REPLACE_PTHREAD_SIGMASK
HAVE_SIGHANDLER_T
HAVE_TYPE_VOLATILE_SIG_ATOMIC_T
HAVE_STRUCT_SIGACTION_SA_SIGACTION
HAVE_SIGACTION
HAVE_SIGINFO_T
HAVE_SIGSET_T
HAVE_RAISE
HAVE_PTHREAD_SIGMASK
HAVE_POSIX_SIGNALBLOCKING
GNULIB_SIGACTION
GNULIB_SIGPROCMASK
GNULIB_SIGNAL_H_SIGPIPE
GNULIB_RAISE
GNULIB_PTHREAD_SIGMASK
ASM_SYMBOL_PREFIX
LIB_POSIX_SPAWN
REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN
REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR
REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2
REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE
REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR
REPLACE_POSIX_SPAWN
HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR
HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR
HAVE_POSIX_SPAWN_FILE_ACTIONS_T
HAVE_POSIX_SPAWNATTR_T
HAVE_POSIX_SPAWN
GNULIB_POSIX_SPAWNATTR_DESTROY
GNULIB_POSIX_SPAWNATTR_SETSIGMASK
GNULIB_POSIX_SPAWNATTR_GETSIGMASK
GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT
GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT
GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY
GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY
GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM
GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM
GNULIB_POSIX_SPAWNATTR_SETPGROUP
GNULIB_POSIX_SPAWNATTR_GETPGROUP
GNULIB_POSIX_SPAWNATTR_SETFLAGS
GNULIB_POSIX_SPAWNATTR_GETFLAGS
GNULIB_POSIX_SPAWNATTR_INIT
GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY
GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN
GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR
GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2
GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE
GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR
GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT
GNULIB_POSIX_SPAWNP
GNULIB_POSIX_SPAWN
UNDEFINE_STRTOK_R
REPLACE_STRSIGNAL
REPLACE_STRERROR_R
REPLACE_STRERROR
REPLACE_STRTOK_R
REPLACE_STRCASESTR
REPLACE_STRSTR
REPLACE_STRNLEN
REPLACE_STRNDUP
REPLACE_STRNCAT
REPLACE_STRDUP
REPLACE_STRCHRNUL
REPLACE_STPNCPY
REPLACE_MEMMEM
REPLACE_MEMCHR
HAVE_STRVERSCMP
HAVE_DECL_STRSIGNAL
HAVE_DECL_STRERROR_R
HAVE_DECL_STRTOK_R
HAVE_STRCASESTR
HAVE_STRSEP
HAVE_STRPBRK
HAVE_DECL_STRNLEN
HAVE_DECL_STRNDUP
HAVE_DECL_STRDUP
HAVE_STRCHRNUL
HAVE_STPNCPY
HAVE_STPCPY
HAVE_RAWMEMCHR
HAVE_DECL_MEMRCHR
HAVE_MEMPCPY
HAVE_DECL_MEMMEM
HAVE_MEMCHR
HAVE_FFSLL
HAVE_FFSL
HAVE_EXPLICIT_BZERO
HAVE_MBSLEN
GNULIB_STRVERSCMP
GNULIB_STRSIGNAL
GNULIB_STRERROR_R
GNULIB_STRERROR
GNULIB_MBSTOK_R
GNULIB_MBSSEP
GNULIB_MBSSPN
GNULIB_MBSPBRK
GNULIB_MBSCSPN
GNULIB_MBSCASESTR
GNULIB_MBSPCASECMP
GNULIB_MBSNCASECMP
GNULIB_MBSCASECMP
GNULIB_MBSSTR
GNULIB_MBSRCHR
GNULIB_MBSCHR
GNULIB_MBSNLEN
GNULIB_MBSLEN
GNULIB_STRTOK_R
GNULIB_STRCASESTR
GNULIB_STRSTR
GNULIB_STRSEP
GNULIB_STRPBRK
GNULIB_STRNLEN
GNULIB_STRNDUP
GNULIB_STRNCAT
GNULIB_STRDUP
GNULIB_STRCHRNUL
GNULIB_STPNCPY
GNULIB_STPCPY
GNULIB_RAWMEMCHR
GNULIB_MEMRCHR
GNULIB_MEMPCPY
GNULIB_MEMMEM
GNULIB_MEMCHR
GNULIB_FFSLL
GNULIB_FFSL
GNULIB_EXPLICIT_BZERO
LOCALE_ZH_CN
LOCALE_FR_UTF8
LOCALE_JA
REPLACE_WCSTOK
REPLACE_WCSFTIME
REPLACE_WCSWIDTH
REPLACE_WCWIDTH
REPLACE_WCSNRTOMBS
REPLACE_WCSRTOMBS
REPLACE_WCRTOMB
REPLACE_MBSNRTOWCS
REPLACE_MBSRTOWCS
REPLACE_MBRLEN
REPLACE_MBRTOWC
REPLACE_MBSINIT
REPLACE_WCTOB
REPLACE_BTOWC
REPLACE_MBSTATE_T
HAVE_DECL_WCWIDTH
HAVE_DECL_WCTOB
HAVE_WCSFTIME
HAVE_WCSWIDTH
HAVE_WCSTOK
HAVE_WCSSTR
HAVE_WCSPBRK
HAVE_WCSSPN
HAVE_WCSCSPN
HAVE_WCSRCHR
HAVE_WCSCHR
HAVE_WCSDUP
HAVE_WCSXFRM
HAVE_WCSCOLL
HAVE_WCSNCASECMP
HAVE_WCSCASECMP
HAVE_WCSNCMP
HAVE_WCSCMP
HAVE_WCSNCAT
HAVE_WCSCAT
HAVE_WCPNCPY
HAVE_WCSNCPY
HAVE_WCPCPY
HAVE_WCSCPY
HAVE_WCSNLEN
HAVE_WCSLEN
HAVE_WMEMSET
HAVE_WMEMMOVE
HAVE_WMEMCPY
HAVE_WMEMCMP
HAVE_WMEMCHR
HAVE_WCSNRTOMBS
HAVE_WCSRTOMBS
HAVE_WCRTOMB
HAVE_MBSNRTOWCS
HAVE_MBSRTOWCS
HAVE_MBRLEN
HAVE_MBRTOWC
HAVE_MBSINIT
HAVE_BTOWC
GNULIB_WCSFTIME
GNULIB_WCSWIDTH
GNULIB_WCSTOK
GNULIB_WCSSTR
GNULIB_WCSPBRK
GNULIB_WCSSPN
GNULIB_WCSCSPN
GNULIB_WCSRCHR
GNULIB_WCSCHR
GNULIB_WCSDUP
GNULIB_WCSXFRM
GNULIB_WCSCOLL
GNULIB_WCSNCASECMP
GNULIB_WCSCASECMP
GNULIB_WCSNCMP
GNULIB_WCSCMP
GNULIB_WCSNCAT
GNULIB_WCSCAT
GNULIB_WCPNCPY
GNULIB_WCSNCPY
GNULIB_WCPCPY
GNULIB_WCSCPY
GNULIB_WCSNLEN
GNULIB_WCSLEN
GNULIB_WMEMSET
GNULIB_WMEMMOVE
GNULIB_WMEMCPY
GNULIB_WMEMCMP
GNULIB_WMEMCHR
GNULIB_WCWIDTH
GNULIB_WCSNRTOMBS
GNULIB_WCSRTOMBS
GNULIB_WCRTOMB
GNULIB_MBSNRTOWCS
GNULIB_MBSRTOWCS
GNULIB_MBRLEN
GNULIB_MBRTOWC
GNULIB_MBSINIT
GNULIB_WCTOB
GNULIB_BTOWC
NEXT_AS_FIRST_DIRECTIVE_MATH_H
NEXT_MATH_H
SED
LTLIBMULTITHREAD
LIBMULTITHREAD
LTLIBTHREAD
LIBTHREAD
LIBPMULTITHREAD
LIBPTHREAD
LOCALCHARSET_TESTS_ENVIRONMENT
GL_GENERATE_TEXTSTYLE_H_FALSE
GL_GENERATE_TEXTSTYLE_H_TRUE
TEXTSTYLE_H
LIBTEXTSTYLE_PREFIX
LTLIBTEXTSTYLE
LIBTEXTSTYLE
HAVE_LIBTEXTSTYLE
LDEXPL_LIBM
LDEXP_LIBM
REPLACE_TOWLOWER
REPLACE_ISWCNTRL
HAVE_WCTYPE_H
NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H
NEXT_WCTYPE_H
HAVE_CRTDEFS_H
HAVE_WINT_T
HAVE_ISWCNTRL
REPLACE_ISWBLANK
HAVE_WCTRANS_T
HAVE_WCTYPE_T
HAVE_ISWBLANK
GNULIB_TOWCTRANS
GNULIB_WCTRANS
GNULIB_ISWCTYPE
GNULIB_WCTYPE
GNULIB_ISWBLANK
ISNAN_LIBM
ISNANL_LIBM
ISNAND_LIBM
ISNANF_LIBM
NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H
NEXT_INTTYPES_H
UINT64_MAX_EQ_ULONG_MAX
UINT32_MAX_LT_UINTMAX_MAX
PRIPTR_PREFIX
PRI_MACROS_BROKEN
INT64_MAX_EQ_LONG_MAX
INT32_MAX_LT_INTMAX_MAX
REPLACE_STRTOUMAX
REPLACE_STRTOIMAX
HAVE_IMAXDIV_T
HAVE_DECL_STRTOUMAX
HAVE_DECL_STRTOIMAX
HAVE_DECL_IMAXDIV
HAVE_DECL_IMAXABS
GNULIB_STRTOUMAX
GNULIB_STRTOIMAX
GNULIB_IMAXDIV
GNULIB_IMAXABS
GL_GENERATE_STDINT_H_FALSE
GL_GENERATE_STDINT_H_TRUE
STDINT_H
HAVE_SYS_INTTYPES_H
HAVE_SYS_BITYPES_H
HAVE_C99_STDINT_H
WINT_T_SUFFIX
WCHAR_T_SUFFIX
SIG_ATOMIC_T_SUFFIX
SIZE_T_SUFFIX
PTRDIFF_T_SUFFIX
HAVE_SIGNED_WINT_T
HAVE_SIGNED_WCHAR_T
HAVE_SIGNED_SIG_ATOMIC_T
BITSIZEOF_WINT_T
BITSIZEOF_WCHAR_T
BITSIZEOF_SIG_ATOMIC_T
BITSIZEOF_SIZE_T
BITSIZEOF_PTRDIFF_T
HAVE_STDINT_H
NEXT_AS_FIRST_DIRECTIVE_STDINT_H
NEXT_STDINT_H
HAVE_SYS_TYPES_H
HAVE_INTTYPES_H
HAVE_WCHAR_H
HAVE_UNSIGNED_LONG_LONG_INT
HAVE_LONG_LONG_INT
GL_GENERATE_LIMITS_H_FALSE
GL_GENERATE_LIMITS_H_TRUE
LIMITS_H
NEXT_AS_FIRST_DIRECTIVE_LIMITS_H
NEXT_LIMITS_H
REPLACE_LOCALTIME
REPLACE_GMTIME
REPLACE_TZSET
REPLACE_TIMEGM
REPLACE_STRFTIME
REPLACE_NANOSLEEP
REPLACE_MKTIME
REPLACE_LOCALTIME_R
REPLACE_CTIME
HAVE_TIMEZONE_T
HAVE_TZSET
HAVE_TIMEGM
HAVE_STRPTIME
HAVE_NANOSLEEP
HAVE_DECL_LOCALTIME_R
GNULIB_TZSET
GNULIB_TIME_RZ
GNULIB_TIME_R
GNULIB_TIMEGM
GNULIB_STRPTIME
GNULIB_STRFTIME
GNULIB_NANOSLEEP
GNULIB_LOCALTIME
GNULIB_MKTIME
GNULIB_CTIME
NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H
NEXT_SYS_TIME_H
REPLACE_STRUCT_TIMEVAL
REPLACE_GETTIMEOFDAY
HAVE_SYS_TIME_H
HAVE_STRUCT_TIMEVAL
HAVE_GETTIMEOFDAY
GNULIB_GETTIMEOFDAY
LTLIBINTL
LIBINTL
HAVE_GETRUSAGE
GNULIB_GETRUSAGE
GNULIB_GL_UNISTD_H_GETOPT
GETOPT_CDEFS_H
GETOPT_H
HAVE_SYS_CDEFS_H
HAVE_GETOPT_H
NEXT_AS_FIRST_DIRECTIVE_GETOPT_H
NEXT_GETOPT_H
LIB_GETHRXTIME
REPLACE_TRUNCL
REPLACE_TRUNCF
REPLACE_TRUNC
REPLACE_TANHF
REPLACE_TANF
REPLACE_SQRTL
REPLACE_SQRTF
REPLACE_SINHF
REPLACE_SINF
REPLACE_SIGNBIT_USING_GCC
REPLACE_SIGNBIT
REPLACE_ROUNDL
REPLACE_ROUNDF
REPLACE_ROUND
REPLACE_RINTL
REPLACE_REMAINDERL
REPLACE_REMAINDERF
REPLACE_REMAINDER
REPLACE_NAN
REPLACE_MODFL
REPLACE_MODFF
REPLACE_MODF
REPLACE_LOGBL
REPLACE_LOGBF
REPLACE_LOGB
REPLACE_LOG2L
REPLACE_LOG2F
REPLACE_LOG2
REPLACE_LOG1PL
REPLACE_LOG1PF
REPLACE_LOG1P
REPLACE_LOG10L
REPLACE_LOG10F
REPLACE_LOG10
REPLACE_LOGL
REPLACE_LOGF
REPLACE_LOG
REPLACE_LDEXPL
REPLACE_ISNAN
REPLACE_ISINF
REPLACE_ISFINITE
REPLACE_ILOGBL
REPLACE_ILOGBF
REPLACE_ILOGB
REPLACE_HYPOTL
REPLACE_HYPOTF
REPLACE_HYPOT
REPLACE_HUGE_VAL
REPLACE_FREXPL
REPLACE_FREXP
REPLACE_FREXPF
REPLACE_FMODL
REPLACE_FMODF
REPLACE_FMOD
REPLACE_FMAL
REPLACE_FMAF
REPLACE_FMA
REPLACE_FLOORL
REPLACE_FLOORF
REPLACE_FLOOR
REPLACE_FABSL
REPLACE_EXP2L
REPLACE_EXP2
REPLACE_EXPM1L
REPLACE_EXPM1F
REPLACE_EXPM1
REPLACE_EXPL
REPLACE_EXPF
REPLACE_COSHF
REPLACE_COSF
REPLACE_CEILL
REPLACE_CEILF
REPLACE_CEIL
REPLACE_CBRTL
REPLACE_CBRTF
REPLACE_ATAN2F
REPLACE_ATANF
REPLACE_ASINF
REPLACE_ACOSF
HAVE_DECL_TRUNCL
HAVE_DECL_TRUNCF
HAVE_DECL_TRUNC
HAVE_DECL_TANL
HAVE_DECL_SQRTL
HAVE_DECL_SINL
HAVE_DECL_ROUNDL
HAVE_DECL_ROUNDF
HAVE_DECL_ROUND
HAVE_DECL_RINTF
HAVE_DECL_REMAINDERL
HAVE_DECL_REMAINDER
HAVE_DECL_LOGB
HAVE_DECL_LOG2L
HAVE_DECL_LOG2F
HAVE_DECL_LOG2
HAVE_DECL_LOG10L
HAVE_DECL_LOGL
HAVE_DECL_LDEXPL
HAVE_DECL_FREXPL
HAVE_DECL_FLOORL
HAVE_DECL_FLOORF
HAVE_DECL_EXPM1L
HAVE_DECL_EXP2L
HAVE_DECL_EXP2F
HAVE_DECL_EXP2
HAVE_DECL_EXPL
HAVE_DECL_COSL
HAVE_DECL_COPYSIGNF
HAVE_DECL_CEILL
HAVE_DECL_CEILF
HAVE_DECL_CBRTL
HAVE_DECL_CBRTF
HAVE_DECL_ATANL
HAVE_DECL_ASINL
HAVE_DECL_ACOSL
HAVE_TANHF
HAVE_TANL
HAVE_TANF
HAVE_SQRTL
HAVE_SQRTF
HAVE_SINHF
HAVE_SINL
HAVE_SINF
HAVE_RINTL
HAVE_RINT
HAVE_REMAINDERF
HAVE_REMAINDER
HAVE_POWF
HAVE_MODFL
HAVE_MODFF
HAVE_LOGBL
HAVE_LOGBF
HAVE_LOG1PL
HAVE_LOG1PF
HAVE_LOG1P
HAVE_LOG10L
HAVE_LOG10F
HAVE_LOGL
HAVE_LOGF
HAVE_LDEXPF
HAVE_ISNANL
HAVE_ISNAND
HAVE_ISNANF
HAVE_ILOGBL
HAVE_ILOGBF
HAVE_ILOGB
HAVE_HYPOTL
HAVE_HYPOTF
HAVE_FREXPF
HAVE_FMODL
HAVE_FMODF
HAVE_FMAL
HAVE_FMAF
HAVE_FMA
HAVE_FABSL
HAVE_FABSF
HAVE_EXPM1F
HAVE_EXPM1
HAVE_EXPL
HAVE_EXPF
HAVE_COSHF
HAVE_COSL
HAVE_COSF
HAVE_COPYSIGNL
HAVE_COPYSIGN
HAVE_CBRTL
HAVE_CBRTF
HAVE_CBRT
HAVE_ATAN2F
HAVE_ATANL
HAVE_ATANF
HAVE_ASINL
HAVE_ASINF
HAVE_ACOSL
HAVE_ACOSF
GNULIB_TRUNCL
GNULIB_TRUNCF
GNULIB_TRUNC
GNULIB_TANHF
GNULIB_TANL
GNULIB_TANF
GNULIB_SQRTL
GNULIB_SQRTF
GNULIB_SINHF
GNULIB_SINL
GNULIB_SINF
GNULIB_SIGNBIT
GNULIB_ROUNDL
GNULIB_ROUNDF
GNULIB_ROUND
GNULIB_RINTL
GNULIB_RINTF
GNULIB_RINT
GNULIB_REMAINDERL
GNULIB_REMAINDERF
GNULIB_REMAINDER
GNULIB_POWF
GNULIB_MODFL
GNULIB_MODFF
GNULIB_MODF
GNULIB_LOGBL
GNULIB_LOGBF
GNULIB_LOGB
GNULIB_LOG2L
GNULIB_LOG2F
GNULIB_LOG2
GNULIB_LOG1PL
GNULIB_LOG1PF
GNULIB_LOG1P
GNULIB_LOG10L
GNULIB_LOG10F
GNULIB_LOG10
GNULIB_LOGL
GNULIB_LOGF
GNULIB_LOG
GNULIB_LDEXPL
GNULIB_LDEXPF
GNULIB_ISNANL
GNULIB_ISNAND
GNULIB_ISNANF
GNULIB_ISNAN
GNULIB_ISINF
GNULIB_ISFINITE
GNULIB_ILOGBL
GNULIB_ILOGBF
GNULIB_ILOGB
GNULIB_HYPOTL
GNULIB_HYPOTF
GNULIB_HYPOT
GNULIB_FREXPL
GNULIB_FREXP
GNULIB_FREXPF
GNULIB_FMODL
GNULIB_FMODF
GNULIB_FMOD
GNULIB_FMAL
GNULIB_FMAF
GNULIB_FMA
GNULIB_FLOORL
GNULIB_FLOORF
GNULIB_FLOOR
GNULIB_FABSL
GNULIB_FABSF
GNULIB_EXPM1L
GNULIB_EXPM1F
GNULIB_EXPM1
GNULIB_EXP2L
GNULIB_EXP2F
GNULIB_EXP2
GNULIB_EXPL
GNULIB_EXPF
GNULIB_COSHF
GNULIB_COSL
GNULIB_COSF
GNULIB_COPYSIGNL
GNULIB_COPYSIGNF
GNULIB_COPYSIGN
GNULIB_CEILL
GNULIB_CEILF
GNULIB_CEIL
GNULIB_CBRTL
GNULIB_CBRTF
GNULIB_CBRT
GNULIB_ATAN2F
GNULIB_ATANL
GNULIB_ATANF
GNULIB_ASINL
GNULIB_ASINF
GNULIB_ACOSL
GNULIB_ACOSF
HAVE_FEATURES_H
GNULIB_OVERRIDES_WINT_T
APPLE_UNIVERSAL_BUILD
HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
REPLACE_VSPRINTF
REPLACE_VSNPRINTF
REPLACE_VPRINTF
REPLACE_VFPRINTF
REPLACE_VDPRINTF
REPLACE_VASPRINTF
REPLACE_TMPFILE
REPLACE_STDIO_WRITE_FUNCS
REPLACE_STDIO_READ_FUNCS
REPLACE_SPRINTF
REPLACE_SNPRINTF
REPLACE_RENAMEAT
REPLACE_RENAME
REPLACE_REMOVE
REPLACE_PRINTF
REPLACE_POPEN
REPLACE_PERROR
REPLACE_OBSTACK_PRINTF
REPLACE_GETLINE
REPLACE_GETDELIM
REPLACE_FTELLO
REPLACE_FTELL
REPLACE_FSEEKO
REPLACE_FSEEK
REPLACE_FREOPEN
REPLACE_FPURGE
REPLACE_FPRINTF
REPLACE_FOPEN
REPLACE_FFLUSH
REPLACE_FDOPEN
REPLACE_FCLOSE
REPLACE_DPRINTF
HAVE_VDPRINTF
HAVE_VASPRINTF
HAVE_RENAMEAT
HAVE_POPEN
HAVE_PCLOSE
HAVE_FTELLO
HAVE_FSEEKO
HAVE_DPRINTF
HAVE_DECL_VSNPRINTF
HAVE_DECL_SNPRINTF
HAVE_DECL_OBSTACK_PRINTF
HAVE_DECL_GETLINE
HAVE_DECL_GETDELIM
HAVE_DECL_FTELLO
HAVE_DECL_FSEEKO
HAVE_DECL_FPURGE
GNULIB_VSPRINTF_POSIX
GNULIB_VSNPRINTF
GNULIB_VPRINTF_POSIX
GNULIB_VPRINTF
GNULIB_VFPRINTF_POSIX
GNULIB_VFPRINTF
GNULIB_VDPRINTF
GNULIB_VSCANF
GNULIB_VFSCANF
GNULIB_VASPRINTF
GNULIB_TMPFILE
GNULIB_STDIO_H_SIGPIPE
GNULIB_STDIO_H_NONBLOCKING
GNULIB_SPRINTF_POSIX
GNULIB_SNPRINTF
GNULIB_SCANF
GNULIB_RENAMEAT
GNULIB_RENAME
GNULIB_REMOVE
GNULIB_PUTS
GNULIB_PUTCHAR
GNULIB_PUTC
GNULIB_PRINTF_POSIX
GNULIB_PRINTF
GNULIB_POPEN
GNULIB_PERROR
GNULIB_PCLOSE
GNULIB_OBSTACK_PRINTF_POSIX
GNULIB_OBSTACK_PRINTF
GNULIB_GETLINE
GNULIB_GETDELIM
GNULIB_GETCHAR
GNULIB_GETC
GNULIB_FWRITE
GNULIB_FTELLO
GNULIB_FTELL
GNULIB_FSEEKO
GNULIB_FSEEK
GNULIB_FSCANF
GNULIB_FREOPEN
GNULIB_FREAD
GNULIB_FPUTS
GNULIB_FPUTC
GNULIB_FPURGE
GNULIB_FPRINTF_POSIX
GNULIB_FPRINTF
GNULIB_FOPEN
GNULIB_FGETS
GNULIB_FGETC
GNULIB_FFLUSH
GNULIB_FDOPEN
GNULIB_FCLOSE
GNULIB_DPRINTF
REPLACE_ITOLD
GL_GENERATE_FLOAT_H_FALSE
GL_GENERATE_FLOAT_H_TRUE
FLOAT_H
NEXT_AS_FIRST_DIRECTIVE_FLOAT_H
NEXT_FLOAT_H
NEXT_AS_FIRST_DIRECTIVE_FCNTL_H
NEXT_FCNTL_H
REPLACE_OPENAT
REPLACE_OPEN
REPLACE_FCNTL
REPLACE_CREAT
HAVE_OPENAT
HAVE_FCNTL
GNULIB_OPENAT
GNULIB_OPEN
GNULIB_NONBLOCKING
GNULIB_FCNTL
GNULIB_CREAT
EOVERFLOW_VALUE
EOVERFLOW_HIDDEN
ENOLINK_VALUE
ENOLINK_HIDDEN
EMULTIHOP_VALUE
EMULTIHOP_HIDDEN
GL_GENERATE_ERRNO_H_FALSE
GL_GENERATE_ERRNO_H_TRUE
ERRNO_H
NEXT_AS_FIRST_DIRECTIVE_ERRNO_H
NEXT_ERRNO_H
PRAGMA_COLUMNS
PRAGMA_SYSTEM_HEADER
INCLUDE_NEXT_AS_FIRST_DIRECTIVE
INCLUDE_NEXT
pkglibexecdir
runstatedir
lispdir
HAVE_WINSOCK2_H
HAVE_MSVC_INVALID_PARAMETER_HANDLER
UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS
UNISTD_H_HAVE_WINSOCK2_H
REPLACE_WRITE
REPLACE_USLEEP
REPLACE_UNLINKAT
REPLACE_UNLINK
REPLACE_TTYNAME_R
REPLACE_TRUNCATE
REPLACE_SYMLINKAT
REPLACE_SYMLINK
REPLACE_SLEEP
REPLACE_RMDIR
REPLACE_READLINKAT
REPLACE_READLINK
REPLACE_READ
REPLACE_PWRITE
REPLACE_PREAD
REPLACE_LSEEK
REPLACE_LINKAT
REPLACE_LINK
REPLACE_LCHOWN
REPLACE_ISATTY
REPLACE_GETPASS
REPLACE_GETPAGESIZE
REPLACE_GETGROUPS
REPLACE_GETLOGIN_R
REPLACE_GETDTABLESIZE
REPLACE_GETDOMAINNAME
REPLACE_GETCWD
REPLACE_FTRUNCATE
REPLACE_FCHOWNAT
REPLACE_FACCESSAT
REPLACE_DUP2
REPLACE_DUP
REPLACE_CLOSE
REPLACE_CHOWN
REPLACE_ACCESS
HAVE_SYS_PARAM_H
HAVE_OS_H
HAVE_DECL_TTYNAME_R
HAVE_DECL_TRUNCATE
HAVE_DECL_SETHOSTNAME
HAVE_DECL_GETUSERSHELL
HAVE_DECL_GETPAGESIZE
HAVE_DECL_GETLOGIN_R
HAVE_DECL_GETLOGIN
HAVE_DECL_GETDOMAINNAME
HAVE_DECL_FDATASYNC
HAVE_DECL_FCHDIR
HAVE_DECL_ENVIRON
HAVE_USLEEP
HAVE_UNLINKAT
HAVE_SYMLINKAT
HAVE_SYMLINK
HAVE_SLEEP
HAVE_SETHOSTNAME
HAVE_READLINKAT
HAVE_READLINK
HAVE_PWRITE
HAVE_PREAD
HAVE_PIPE2
HAVE_PIPE
HAVE_LINKAT
HAVE_LINK
HAVE_LCHOWN
HAVE_GROUP_MEMBER
HAVE_GETPASS
HAVE_GETPAGESIZE
HAVE_GETLOGIN
HAVE_GETHOSTNAME
HAVE_GETGROUPS
HAVE_GETDTABLESIZE
HAVE_FTRUNCATE
HAVE_FSYNC
HAVE_FDATASYNC
HAVE_FCHOWNAT
HAVE_FCHDIR
HAVE_FACCESSAT
HAVE_EUIDACCESS
HAVE_DUP3
HAVE_DUP2
HAVE_COPY_FILE_RANGE
HAVE_CHOWN
GNULIB_WRITE
GNULIB_USLEEP
GNULIB_UNLINKAT
GNULIB_UNLINK
GNULIB_UNISTD_H_SIGPIPE
GNULIB_UNISTD_H_NONBLOCKING
GNULIB_TTYNAME_R
GNULIB_TRUNCATE
GNULIB_SYMLINKAT
GNULIB_SYMLINK
GNULIB_SLEEP
GNULIB_SETHOSTNAME
GNULIB_RMDIR
GNULIB_READLINKAT
GNULIB_READLINK
GNULIB_READ
GNULIB_PWRITE
GNULIB_PREAD
GNULIB_PIPE2
GNULIB_PIPE
GNULIB_LSEEK
GNULIB_LINKAT
GNULIB_LINK
GNULIB_LCHOWN
GNULIB_ISATTY
GNULIB_GROUP_MEMBER
GNULIB_GETUSERSHELL
GNULIB_GETPASS
GNULIB_GETPAGESIZE
GNULIB_GETLOGIN_R
GNULIB_GETLOGIN
GNULIB_GETHOSTNAME
GNULIB_GETGROUPS
GNULIB_GETDTABLESIZE
GNULIB_GETDOMAINNAME
GNULIB_GETCWD
GNULIB_FTRUNCATE
GNULIB_FSYNC
GNULIB_FDATASYNC
GNULIB_FCHOWNAT
GNULIB_FCHDIR
GNULIB_FACCESSAT
GNULIB_EUIDACCESS
GNULIB_ENVIRON
GNULIB_DUP3
GNULIB_DUP2
GNULIB_DUP
GNULIB_COPY_FILE_RANGE
GNULIB_CLOSE
GNULIB_CHOWN
GNULIB_CHDIR
GNULIB_ACCESS
LIB_CLOCK_GETTIME
REPLACE_WCTOMB
REPLACE_UNSETENV
REPLACE_STRTOLD
REPLACE_STRTOD
REPLACE_SETSTATE
REPLACE_SETENV
REPLACE_REALPATH
REPLACE_REALLOC
REPLACE_RANDOM_R
REPLACE_RANDOM
REPLACE_QSORT_R
REPLACE_PUTENV
REPLACE_PTSNAME_R
REPLACE_PTSNAME
REPLACE_MKSTEMP
REPLACE_MBTOWC
REPLACE_MALLOC
REPLACE_INITSTATE
REPLACE_CANONICALIZE_FILE_NAME
REPLACE_CALLOC
HAVE_DECL_UNSETENV
HAVE_UNLOCKPT
HAVE_SYS_LOADAVG_H
HAVE_STRUCT_RANDOM_DATA
HAVE_STRTOULL
HAVE_STRTOLL
HAVE_STRTOLD
HAVE_STRTOD
HAVE_DECL_SETSTATE
HAVE_SETSTATE
HAVE_DECL_SETENV
HAVE_SETENV
HAVE_SECURE_GETENV
HAVE_RPMATCH
HAVE_REALPATH
HAVE_REALLOCARRAY
HAVE_RANDOM_R
HAVE_RANDOM_H
HAVE_RANDOM
HAVE_QSORT_R
HAVE_PTSNAME_R
HAVE_PTSNAME
HAVE_POSIX_OPENPT
HAVE_MKSTEMPS
HAVE_MKSTEMP
HAVE_MKOSTEMPS
HAVE_MKOSTEMP
HAVE_MKDTEMP
HAVE_MBTOWC
HAVE_DECL_INITSTATE
HAVE_INITSTATE
HAVE_GRANTPT
HAVE_GETSUBOPT
HAVE_DECL_GETLOADAVG
HAVE_CANONICALIZE_FILE_NAME
HAVE_ATOLL
HAVE__EXIT
GNULIB_WCTOMB
GNULIB_UNSETENV
GNULIB_UNLOCKPT
GNULIB_SYSTEM_POSIX
GNULIB_STRTOULL
GNULIB_STRTOLL
GNULIB_STRTOLD
GNULIB_STRTOD
GNULIB_SETENV
GNULIB_SECURE_GETENV
GNULIB_RPMATCH
GNULIB_REALPATH
GNULIB_REALLOC_POSIX
GNULIB_REALLOCARRAY
GNULIB_RANDOM_R
GNULIB_RANDOM
GNULIB_QSORT_R
GNULIB_PUTENV
GNULIB_PTSNAME_R
GNULIB_PTSNAME
GNULIB_POSIX_OPENPT
GNULIB_MKSTEMPS
GNULIB_MKSTEMP
GNULIB_MKOSTEMPS
GNULIB_MKOSTEMP
GNULIB_MKDTEMP
GNULIB_MBTOWC
GNULIB_MALLOC_POSIX
GNULIB_GRANTPT
GNULIB_GETSUBOPT
GNULIB_GETLOADAVG
GNULIB_CANONICALIZE_FILE_NAME
GNULIB_CALLOC_POSIX
GNULIB_ATOLL
GNULIB__EXIT
HAVE_ALLOCA_H
GL_GENERATE_ALLOCA_H_FALSE
GL_GENERATE_ALLOCA_H_TRUE
ALLOCA_H
ALLOCA
GL_COND_LIBTOOL_FALSE
GL_COND_LIBTOOL_TRUE
XSLTPROC
HELP2MAN
PERL
M4_DEBUGFILE
M4_GNU
M4
YFLAGS
YACC
FLEX_CXX_WORKS_FALSE
FLEX_CXX_WORKS_TRUE
FLEX_WORKS_FALSE
FLEX_WORKS_TRUE
LEX_IS_FLEX
LEXLIB
LEX_OUTPUT_ROOT
LEX
DOT
ENABLE_YACC_FALSE
ENABLE_YACC_TRUE
ENABLE_JAVA_FALSE
ENABLE_JAVA_TRUE
HAVE_JVIEW
HAVE_JRE
HAVE_JAVA
HAVE_GIJ
HAVE_JAVA_ENVVAR
CONF_JAVA
HAVE_JVIEW_IN_PATH
HAVE_JRE_IN_PATH
HAVE_JAVA_IN_PATH
HAVE_GIJ_IN_PATH
HAVE_JIKES
HAVE_JAVAC
HAVE_GCJ_C
HAVE_JAVAC_ENVVAR
CLASSPATH_SEPARATOR
CLASSPATH
CONF_JAVAC
HAVE_JIKES_IN_PATH
HAVE_JAVAC_IN_PATH
HAVE_GCJ_IN_PATH
ENABLE_D_FALSE
ENABLE_D_TRUE
DCFLAGS
DC
CXX_COMPILER_POSIXLY_CORRECT
ENABLE_CXX_FALSE
ENABLE_CXX_TRUE
BISON_CXX_WORKS
C_COMPILER_POSIXLY_CORRECT
BISON_C_WORKS
WNO_DEPRECATED_CXXFLAGS
FLEX_SCANNER_CXXFLAGS
WARN_CXXFLAGS_TEST
WERROR_CXXFLAGS
WARN_CXXFLAGS
WARN_CFLAGS_TEST
WERROR_CFLAGS
WARN_CFLAGS
ENABLE_GCC_WARNINGS_FALSE
ENABLE_GCC_WARNINGS_TRUE
ENABLE_CXX14_FALSE
ENABLE_CXX14_TRUE
ENABLE_CXX11_FALSE
ENABLE_CXX11_TRUE
CXX2A_CXXFLAGS
CXX17_CXXFLAGS
CXX14_CXXFLAGS
CXX11_CXXFLAGS
CXX03_CXXFLAGS
CXX98_CXXFLAGS
NO_EXCEPTIONS_CXXFLAGS
host_os
host_vendor
host_cpu
host
build_os
build_vendor
build_cpu
build
RANLIB
ARFLAGS
AR
EGREP
GREP
CPP
am__fastdepCXX_FALSE
am__fastdepCXX_TRUE
CXXDEPMODE
ac_ct_CXX
CXXFLAGS
CXX
am__fastdepCC_FALSE
am__fastdepCC_TRUE
CCDEPMODE
am__nodep
AMDEPBACKSLASH
AMDEP_FALSE
AMDEP_TRUE
am__include
DEPDIR
OBJEXT
EXEEXT
ac_ct_CC
CPPFLAGS
LDFLAGS
CFLAGS
CC
AM_BACKSLASH
AM_DEFAULT_VERBOSITY
AM_DEFAULT_V
AM_V
am__untar
am__tar
AMTAR
am__leading_dot
SET_MAKE
AWK
mkdir_p
MKDIR_P
INSTALL_STRIP_PROGRAM
STRIP
install_sh
MAKEINFO
AUTOHEADER
AUTOMAKE
AUTOCONF
ACLOCAL
VERSION
PACKAGE
CYGPATH_W
am__isrc
INSTALL_DATA
INSTALL_SCRIPT
INSTALL_PROGRAM
PACKAGE_COPYRIGHT_YEAR
target_alias
host_alias
build_alias
LIBS
ECHO_T
ECHO_N
ECHO_C
DEFS
mandir
localedir
libdir
psdir
pdfdir
dvidir
htmldir
infodir
docdir
oldincludedir
includedir
localstatedir
sharedstatedir
sysconfdir
datadir
datarootdir
libexecdir
sbindir
bindir
program_transform_name
prefix
exec_prefix
PACKAGE_URL
PACKAGE_BUGREPORT
PACKAGE_STRING
PACKAGE_VERSION
PACKAGE_TARNAME
PACKAGE_NAME
PATH_SEPARATOR
SHELL
am__quote'
ac_subst_files='relocatable_sh'
ac_user_opts='
enable_option_checking
enable_silent_rules
enable_dependency_tracking
enable_largefile
enable_threads
enable_gcc_warnings
enable_yacc
enable_cross_guesses
enable_assert
with_gnu_ld
enable_rpath
with_libtextstyle_prefix
enable_relocatable
enable_nls
with_libiconv_prefix
with_libintl_prefix
'
      ac_precious_vars='build_alias
host_alias
target_alias
CC
CFLAGS
LDFLAGS
LIBS
CPPFLAGS
CXX
CXXFLAGS
CCC
CPP
YACC
YFLAGS
M4'


# Initialize some variables set by options.
ac_init_help=
ac_init_version=false
ac_unrecognized_opts=
ac_unrecognized_sep=
# The variables have the same names as the options, with
# dashes changed to underlines.
cache_file=/dev/null
exec_prefix=NONE
no_create=
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
verbose=
x_includes=NONE
x_libraries=NONE

# Installation directory options.
# These are left unexpanded so users can "make install exec_prefix=/foo"
# and all the variables that are supposed to be based on exec_prefix
# by default will actually change.
# Use braces instead of parens because sh, perl, etc. also accept them.
# (The list follows the same order as the GNU Coding Standards.)
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datarootdir='${prefix}/share'
datadir='${datarootdir}'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
includedir='${prefix}/include'
oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
infodir='${datarootdir}/info'
htmldir='${docdir}'
dvidir='${docdir}'
pdfdir='${docdir}'
psdir='${docdir}'
libdir='${exec_prefix}/lib'
localedir='${datarootdir}/locale'
mandir='${datarootdir}/man'

ac_prev=
ac_dashdash=
for ac_option
do
  # If the previous option needs an argument, assign it.
  if test -n "$ac_prev"; then
    eval $ac_prev=\$ac_option
    ac_prev=
    continue
  fi

  case $ac_option in
  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
  *=)   ac_optarg= ;;
  *)    ac_optarg=yes ;;
  esac

  # Accept the important Cygnus configure options, so we can diagnose typos.

  case $ac_dashdash$ac_option in
  --)
    ac_dashdash=yes ;;

  -bindir | --bindir | --bindi | --bind | --bin | --bi)
    ac_prev=bindir ;;
  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
    bindir=$ac_optarg ;;

  -build | --build | --buil | --bui | --bu)
    ac_prev=build_alias ;;
  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
    build_alias=$ac_optarg ;;

  -cache-file | --cache-file | --cache-fil | --cache-fi \
  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
    ac_prev=cache_file ;;
  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
    cache_file=$ac_optarg ;;

  --config-cache | -C)
    cache_file=config.cache ;;

  -datadir | --datadir | --datadi | --datad)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=*)
    datadir=$ac_optarg ;;

  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
  | --dataroo | --dataro | --datar)
    ac_prev=datarootdir ;;
  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
    datarootdir=$ac_optarg ;;

  -disable-* | --disable-*)
    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid feature name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"enable_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval enable_$ac_useropt=no ;;

  -docdir | --docdir | --docdi | --doc | --do)
    ac_prev=docdir ;;
  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
    docdir=$ac_optarg ;;

  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
    ac_prev=dvidir ;;
  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
    dvidir=$ac_optarg ;;

  -enable-* | --enable-*)
    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid feature name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"enable_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval enable_$ac_useropt=\$ac_optarg ;;

  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
  | --exec | --exe | --ex)
    ac_prev=exec_prefix ;;
  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
  | --exec=* | --exe=* | --ex=*)
    exec_prefix=$ac_optarg ;;

  -gas | --gas | --ga | --g)
    # Obsolete; use --with-gas.
    with_gas=yes ;;

  -help | --help | --hel | --he | -h)
    ac_init_help=long ;;
  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
    ac_init_help=recursive ;;
  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
    ac_init_help=short ;;

  -host | --host | --hos | --ho)
    ac_prev=host_alias ;;
  -host=* | --host=* | --hos=* | --ho=*)
    host_alias=$ac_optarg ;;

  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
    ac_prev=htmldir ;;
  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
  | --ht=*)
    htmldir=$ac_optarg ;;

  -includedir | --includedir | --includedi | --included | --include \
  | --includ | --inclu | --incl | --inc)
    ac_prev=includedir ;;
  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
  | --includ=* | --inclu=* | --incl=* | --inc=*)
    includedir=$ac_optarg ;;

  -infodir | --infodir | --infodi | --infod | --info | --inf)
    ac_prev=infodir ;;
  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
    infodir=$ac_optarg ;;

  -libdir | --libdir | --libdi | --libd)
    ac_prev=libdir ;;
  -libdir=* | --libdir=* | --libdi=* | --libd=*)
    libdir=$ac_optarg ;;

  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
  | --libexe | --libex | --libe)
    ac_prev=libexecdir ;;
  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
  | --libexe=* | --libex=* | --libe=*)
    libexecdir=$ac_optarg ;;

  -localedir | --localedir | --localedi | --localed | --locale)
    ac_prev=localedir ;;
  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
    localedir=$ac_optarg ;;

  -localstatedir | --localstatedir | --localstatedi | --localstated \
  | --localstate | --localstat | --localsta | --localst | --locals)
    ac_prev=localstatedir ;;
  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
    localstatedir=$ac_optarg ;;

  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
    ac_prev=mandir ;;
  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
    mandir=$ac_optarg ;;

  -nfp | --nfp | --nf)
    # Obsolete; use --without-fp.
    with_fp=no ;;

  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c | -n)
    no_create=yes ;;

  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
    no_recursion=yes ;;

  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
  | --oldin | --oldi | --old | --ol | --o)
    ac_prev=oldincludedir ;;
  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
    oldincludedir=$ac_optarg ;;

  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
    ac_prev=prefix ;;
  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
    prefix=$ac_optarg ;;

  -program-prefix | --program-prefix | --program-prefi | --program-pref \
  | --program-pre | --program-pr | --program-p)
    ac_prev=program_prefix ;;
  -program-prefix=* | --program-prefix=* | --program-prefi=* \
  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
    program_prefix=$ac_optarg ;;

  -program-suffix | --program-suffix | --program-suffi | --program-suff \
  | --program-suf | --program-su | --program-s)
    ac_prev=program_suffix ;;
  -program-suffix=* | --program-suffix=* | --program-suffi=* \
  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
    program_suffix=$ac_optarg ;;

  -program-transform-name | --program-transform-name \
  | --program-transform-nam | --program-transform-na \
  | --program-transform-n | --program-transform- \
  | --program-transform | --program-transfor \
  | --program-transfo | --program-transf \
  | --program-trans | --program-tran \
  | --progr-tra | --program-tr | --program-t)
    ac_prev=program_transform_name ;;
  -program-transform-name=* | --program-transform-name=* \
  | --program-transform-nam=* | --program-transform-na=* \
  | --program-transform-n=* | --program-transform-=* \
  | --program-transform=* | --program-transfor=* \
  | --program-transfo=* | --program-transf=* \
  | --program-trans=* | --program-tran=* \
  | --progr-tra=* | --program-tr=* | --program-t=*)
    program_transform_name=$ac_optarg ;;

  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
    ac_prev=pdfdir ;;
  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
    pdfdir=$ac_optarg ;;

  -psdir | --psdir | --psdi | --psd | --ps)
    ac_prev=psdir ;;
  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
    psdir=$ac_optarg ;;

  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil)
    silent=yes ;;

  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
    ac_prev=sbindir ;;
  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
  | --sbi=* | --sb=*)
    sbindir=$ac_optarg ;;

  -sharedstatedir | --sharedstatedir | --sharedstatedi \
  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
  | --sharedst | --shareds | --shared | --share | --shar \
  | --sha | --sh)
    ac_prev=sharedstatedir ;;
  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
  | --sha=* | --sh=*)
    sharedstatedir=$ac_optarg ;;

  -site | --site | --sit)
    ac_prev=site ;;
  -site=* | --site=* | --sit=*)
    site=$ac_optarg ;;

  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
    ac_prev=srcdir ;;
  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
    srcdir=$ac_optarg ;;

  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
  | --syscon | --sysco | --sysc | --sys | --sy)
    ac_prev=sysconfdir ;;
  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
    sysconfdir=$ac_optarg ;;

  -target | --target | --targe | --targ | --tar | --ta | --t)
    ac_prev=target_alias ;;
  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
    target_alias=$ac_optarg ;;

  -v | -verbose | --verbose | --verbos | --verbo | --verb)
    verbose=yes ;;

  -version | --version | --versio | --versi | --vers | -V)
    ac_init_version=: ;;

  -with-* | --with-*)
    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid package name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"with_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval with_$ac_useropt=\$ac_optarg ;;

  -without-* | --without-*)
    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid package name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"with_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval with_$ac_useropt=no ;;

  --x)
    # Obsolete; use --with-x.
    with_x=yes ;;

  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
  | --x-incl | --x-inc | --x-in | --x-i)
    ac_prev=x_includes ;;
  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
    x_includes=$ac_optarg ;;

  -x-libraries | --x-libraries | --x-librarie | --x-librari \
  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
    ac_prev=x_libraries ;;
  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
    x_libraries=$ac_optarg ;;

  -*) as_fn_error $? "unrecognized option: \`$ac_option'
Try \`$0 --help' for more information"
    ;;

  *=*)
    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
    # Reject names that are not valid shell variable names.
    case $ac_envvar in #(
      '' | [0-9]* | *[!_$as_cr_alnum]* )
      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
    esac
    eval $ac_envvar=\$ac_optarg
    export $ac_envvar ;;

  *)
    # FIXME: should be removed in autoconf 3.0.
    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
    ;;

  esac
done

if test -n "$ac_prev"; then
  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
  as_fn_error $? "missing argument to $ac_option"
fi

if test -n "$ac_unrecognized_opts"; then
  case $enable_option_checking in
    no) ;;
    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
  esac
fi

# Check all directory arguments for consistency.
for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
		datadir sysconfdir sharedstatedir localstatedir includedir \
		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
		libdir localedir mandir
do
  eval ac_val=\$$ac_var
  # Remove trailing slashes.
  case $ac_val in
    */ )
      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
      eval $ac_var=\$ac_val;;
  esac
  # Be sure to have absolute directory names.
  case $ac_val in
    [\\/$]* | ?:[\\/]* )  continue;;
    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
  esac
  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
done

# There might be people who depend on the old broken behavior: `$host'
# used to hold the argument of --host etc.
# FIXME: To remove some day.
build=$build_alias
host=$host_alias
target=$target_alias

# FIXME: To remove some day.
if test "x$host_alias" != x; then
  if test "x$build_alias" = x; then
    cross_compiling=maybe
  elif test "x$build_alias" != "x$host_alias"; then
    cross_compiling=yes
  fi
fi

ac_tool_prefix=
test -n "$host_alias" && ac_tool_prefix=$host_alias-

test "$silent" = yes && exec 6>/dev/null


ac_pwd=`pwd` && test -n "$ac_pwd" &&
ac_ls_di=`ls -di .` &&
ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
  as_fn_error $? "working directory cannot be determined"
test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
  as_fn_error $? "pwd does not report name of working directory"


# Find the source files, if location was not specified.
if test -z "$srcdir"; then
  ac_srcdir_defaulted=yes
  # Try the directory containing this script, then the parent directory.
  ac_confdir=`$as_dirname -- "$as_myself" ||
$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$as_myself" : 'X\(//\)[^/]' \| \
	 X"$as_myself" : 'X\(//\)$' \| \
	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_myself" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
  srcdir=$ac_confdir
  if test ! -r "$srcdir/$ac_unique_file"; then
    srcdir=..
  fi
else
  ac_srcdir_defaulted=no
fi
if test ! -r "$srcdir/$ac_unique_file"; then
  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
fi
ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
ac_abs_confdir=`(
	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
	pwd)`
# When building in place, set srcdir=.
if test "$ac_abs_confdir" = "$ac_pwd"; then
  srcdir=.
fi
# Remove unnecessary trailing slashes from srcdir.
# Double slashes in file names in object file debugging info
# mess up M-x gdb in Emacs.
case $srcdir in
*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
esac
for ac_var in $ac_precious_vars; do
  eval ac_env_${ac_var}_set=\${${ac_var}+set}
  eval ac_env_${ac_var}_value=\$${ac_var}
  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
  eval ac_cv_env_${ac_var}_value=\$${ac_var}
done

#
# Report the --help message.
#
if test "$ac_init_help" = "long"; then
  # Omit some internal or obsolete options to make the list less imposing.
  # This message is too long to be a string in the A/UX 3.1 sh.
  cat <<_ACEOF
\`configure' configures GNU Bison 3.5 to adapt to many kinds of systems.

Usage: $0 [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
  -V, --version           display version information and exit
  -q, --quiet, --silent   do not print \`checking ...' messages
      --cache-file=FILE   cache test results in FILE [disabled]
  -C, --config-cache      alias for \`--cache-file=config.cache'
  -n, --no-create         do not create output files
      --srcdir=DIR        find the sources in DIR [configure dir or \`..']

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$ac_default_prefix]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]

By default, \`make install' will install all the files in
\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
an installation prefix other than \`$ac_default_prefix' using \`--prefix',
for instance \`--prefix=\$HOME'.

For better control, use the options below.

Fine tuning of the installation directories:
  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --libexecdir=DIR        program executables [EPREFIX/libexec]
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
  --libdir=DIR            object code libraries [EPREFIX/lib]
  --includedir=DIR        C header files [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
  --docdir=DIR            documentation root [DATAROOTDIR/doc/bison]
  --htmldir=DIR           html documentation [DOCDIR]
  --dvidir=DIR            dvi documentation [DOCDIR]
  --pdfdir=DIR            pdf documentation [DOCDIR]
  --psdir=DIR             ps documentation [DOCDIR]
_ACEOF

  cat <<\_ACEOF

Program names:
  --program-prefix=PREFIX            prepend PREFIX to installed program names
  --program-suffix=SUFFIX            append SUFFIX to installed program names
  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
_ACEOF
fi

if test -n "$ac_init_help"; then
  case $ac_init_help in
     short | recursive ) echo "Configuration of GNU Bison 3.5:";;
   esac
  cat <<\_ACEOF

Optional Features:
  --disable-option-checking  ignore unrecognized --enable/--with options
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --enable-silent-rules   less verbose build output (undo: "make V=1")
  --disable-silent-rules  verbose build output (undo: "make V=0")
  --enable-dependency-tracking
                          do not reject slow dependency extractors
  --disable-dependency-tracking
                          speeds up one-time build
  --disable-largefile     omit support for large files
  --enable-threads={isoc|posix|isoc+posix|windows}
                          specify multithreading API
  --disable-threads       build without multithread safety
  --enable-gcc-warnings   turn on lots of GCC warnings (not recommended).
                           Also, issue synclines from the examples/ to
                           the corresponding source in the Texinfo doc.
  --disable-yacc          do not build a yacc command or an -ly library
  --enable-cross-guesses={conservative|risky}
                          specify policy for cross-compilation guesses
  --disable-assert        turn off assertions
  --disable-rpath         do not hardcode runtime library paths
  --enable-relocatable    install a package that can be moved in the file
                          system
  --disable-nls           do not use Native Language Support

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
  --with-libtextstyle-prefix[=DIR]  search for libtextstyle in DIR/include and DIR/lib
  --without-libtextstyle-prefix     don't search for libtextstyle in includedir and libdir
  --with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
  --without-libiconv-prefix     don't search for libiconv in includedir and libdir
  --with-libintl-prefix[=DIR]  search for libintl in DIR/include and DIR/lib
  --without-libintl-prefix     don't search for libintl in includedir and libdir

Some influential environment variables:
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  LIBS        libraries to pass to the linker, e.g. -l<library>
  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
              you have headers in a nonstandard directory <include dir>
  CXX         C++ compiler command
  CXXFLAGS    C++ compiler flags
  CPP         C preprocessor
  YACC        The `Yet Another Compiler Compiler' implementation to use.
              Defaults to the first program found out of: `bison -y', `byacc',
              `yacc'.
  YFLAGS      The list of arguments that will be passed by default to $YACC.
              This script will default YFLAGS to the empty string to avoid a
              default value of `-d' given by some make applications.
  M4          Location of GNU M4 1.4.6 or later. Defaults to the first program
              of 'm4', 'gm4', or 'gnum4' on PATH that meets Autoconf needs.

Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.

Report bugs to <bug-bison@gnu.org>.
GNU Bison home page: <http://www.gnu.org/software/bison/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
_ACEOF
ac_status=$?
fi

if test "$ac_init_help" = "recursive"; then
  # If there are subdirs, report their specific --help.
  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
    test -d "$ac_dir" ||
      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
      continue
    ac_builddir=.

case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
  # A ".." for each directory in $ac_dir_suffix.
  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
  case $ac_top_builddir_sub in
  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
  esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix

case $srcdir in
  .)  # We are building in place.
    ac_srcdir=.
    ac_top_srcdir=$ac_top_builddir_sub
    ac_abs_top_srcdir=$ac_pwd ;;
  [\\/]* | ?:[\\/]* )  # Absolute name.
    ac_srcdir=$srcdir$ac_dir_suffix;
    ac_top_srcdir=$srcdir
    ac_abs_top_srcdir=$srcdir ;;
  *) # Relative name.
    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
    ac_top_srcdir=$ac_top_build_prefix$srcdir
    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix

    cd "$ac_dir" || { ac_status=$?; continue; }
    # Check for guested configure.
    if test -f "$ac_srcdir/configure.gnu"; then
      echo &&
      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
    elif test -f "$ac_srcdir/configure"; then
      echo &&
      $SHELL "$ac_srcdir/configure" --help=recursive
    else
      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
    fi || ac_status=$?
    cd "$ac_pwd" || { ac_status=$?; break; }
  done
fi

test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
  cat <<\_ACEOF
GNU Bison configure 3.5
generated by GNU Autoconf 2.69

Copyright (C) 2012 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
  exit
fi

## ------------------------ ##
## Autoconf initialization. ##
## ------------------------ ##

# ac_fn_c_try_compile LINENO
# --------------------------
# Try to compile conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_compile ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext
  if { { ac_try="$ac_compile"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compile") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_c_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest.$ac_objext; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_compile

# ac_fn_cxx_try_compile LINENO
# ----------------------------
# Try to compile conftest.$ac_ext, and return whether this succeeded.
ac_fn_cxx_try_compile ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext
  if { { ac_try="$ac_compile"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compile") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_cxx_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest.$ac_objext; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_cxx_try_compile

# ac_fn_c_try_cpp LINENO
# ----------------------
# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_cpp ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if { { ac_try="$ac_cpp conftest.$ac_ext"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } > conftest.i && {
	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
	 test ! -s conftest.err
       }; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

    ac_retval=1
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_cpp

# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists, giving a warning if it cannot be compiled using
# the include files in INCLUDES and setting the cache variable VAR
# accordingly.
ac_fn_c_check_header_mongrel ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if eval \${$3+:} false; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
else
  # Is the header compilable?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
$as_echo_n "checking $2 usability... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
#include <$2>
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_header_compiler=yes
else
  ac_header_compiler=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
$as_echo "$ac_header_compiler" >&6; }

# Is the header present?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
$as_echo_n "checking $2 presence... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$2>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  ac_header_preproc=yes
else
  ac_header_preproc=no
fi
rm -f conftest.err conftest.i conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
$as_echo "$ac_header_preproc" >&6; }

# So?  What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
  yes:no: )
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
    ;;
  no:yes:* )
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
( $as_echo "## -------------------------------- ##
## Report this to bug-bison@gnu.org ##
## -------------------------------- ##"
     ) | sed "s/^/$as_me: WARNING:     /" >&2
    ;;
esac
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  eval "$3=\$ac_header_compiler"
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_header_mongrel

# ac_fn_c_try_run LINENO
# ----------------------
# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
# that executables *can* be run.
ac_fn_c_try_run ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
  { { case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_try") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; }; then :
  ac_retval=0
else
  $as_echo "$as_me: program exited with status $ac_status" >&5
       $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

       ac_retval=$ac_status
fi
  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_run

# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists and can be compiled using the include files in
# INCLUDES, setting the cache variable VAR accordingly.
ac_fn_c_check_header_compile ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
#include <$2>
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  eval "$3=yes"
else
  eval "$3=no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_header_compile

# ac_fn_cxx_try_link LINENO
# -------------------------
# Try to link conftest.$ac_ext, and return whether this succeeded.
ac_fn_cxx_try_link ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext conftest$ac_exeext
  if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_cxx_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest$ac_exeext && {
	 test "$cross_compiling" = yes ||
	 test -x conftest$ac_exeext
       }; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1
fi
  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
  # interfere with the next link command; also delete a directory that is
  # left behind by Apple's compiler.  We do this before executing the actions.
  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_cxx_try_link

# ac_fn_c_try_link LINENO
# -----------------------
# Try to link conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_link ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext conftest$ac_exeext
  if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_c_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest$ac_exeext && {
	 test "$cross_compiling" = yes ||
	 test -x conftest$ac_exeext
       }; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1
fi
  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
  # interfere with the next link command; also delete a directory that is
  # left behind by Apple's compiler.  We do this before executing the actions.
  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_link

# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
# -------------------------------------------
# Tests whether TYPE exists after having included INCLUDES, setting cache
# variable VAR accordingly.
ac_fn_c_check_type ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  eval "$3=no"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
if (sizeof ($2))
	 return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
if (sizeof (($2)))
	    return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

else
  eval "$3=yes"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_type

# ac_fn_c_check_func LINENO FUNC VAR
# ----------------------------------
# Tests whether FUNC exists, setting the cache variable VAR accordingly
ac_fn_c_check_func ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
#define $2 innocuous_$2

/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $2 (); below.
    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
    <limits.h> exists even on freestanding compilers.  */

#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif

#undef $2

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char $2 ();
/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined __stub_$2 || defined __stub___$2
choke me
#endif

int
main ()
{
return $2 ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  eval "$3=yes"
else
  eval "$3=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_func

# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
# --------------------------------------------
# Tries to find the compile-time value of EXPR in a program that includes
# INCLUDES, setting VAR accordingly. Returns whether the value could be
# computed
ac_fn_c_compute_int ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if test "$cross_compiling" = yes; then
    # Depending upon the size, compute the lo and hi bounds.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) >= 0)];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_lo=0 ac_mid=0
  while :; do
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_hi=$ac_mid; break
else
  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
			if test $ac_lo -le $ac_mid; then
			  ac_lo= ac_hi=
			  break
			fi
			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  done
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) < 0)];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_hi=-1 ac_mid=-1
  while :; do
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) >= $ac_mid)];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_lo=$ac_mid; break
else
  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
			if test $ac_mid -le $ac_hi; then
			  ac_lo= ac_hi=
			  break
			fi
			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  done
else
  ac_lo= ac_hi=
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
# Binary search between lo and hi bounds.
while test "x$ac_lo" != "x$ac_hi"; do
  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_hi=$ac_mid
else
  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
done
case $ac_lo in #((
?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
'') ac_retval=1 ;;
esac
  else
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
static long int longval () { return $2; }
static unsigned long int ulongval () { return $2; }
#include <stdio.h>
#include <stdlib.h>
int
main ()
{

  FILE *f = fopen ("conftest.val", "w");
  if (! f)
    return 1;
  if (($2) < 0)
    {
      long int i = longval ();
      if (i != ($2))
	return 1;
      fprintf (f, "%ld", i);
    }
  else
    {
      unsigned long int i = ulongval ();
      if (i != ($2))
	return 1;
      fprintf (f, "%lu", i);
    }
  /* Do not output a trailing newline, as this causes \r\n confusion
     on some platforms.  */
  return ferror (f) || fclose (f) != 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
else
  ac_retval=1
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
rm -f conftest.val

  fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_compute_int

# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
# ---------------------------------------------
# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
# accordingly.
ac_fn_c_check_decl ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  as_decl_name=`echo $2|sed 's/ *(.*//'`
  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
#ifndef $as_decl_name
#ifdef __cplusplus
  (void) $as_decl_use;
#else
  (void) $as_decl_name;
#endif
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  eval "$3=yes"
else
  eval "$3=no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_decl

# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
# ----------------------------------------------------
# Tries to find if the field MEMBER exists in type AGGR, after including
# INCLUDES, setting cache variable VAR accordingly.
ac_fn_c_check_member ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
$as_echo_n "checking for $2.$3... " >&6; }
if eval \${$4+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$5
int
main ()
{
static $2 ac_aggr;
if (ac_aggr.$3)
return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  eval "$4=yes"
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$5
int
main ()
{
static $2 ac_aggr;
if (sizeof ac_aggr.$3)
return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  eval "$4=yes"
else
  eval "$4=no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$4
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_member
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by GNU Bison $as_me 3.5, which was
generated by GNU Autoconf 2.69.  Invocation command line was

  $ $0 $@

_ACEOF
exec 5>>config.log
{
cat <<_ASUNAME
## --------- ##
## Platform. ##
## --------- ##

hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
uname -m = `(uname -m) 2>/dev/null || echo unknown`
uname -r = `(uname -r) 2>/dev/null || echo unknown`
uname -s = `(uname -s) 2>/dev/null || echo unknown`
uname -v = `(uname -v) 2>/dev/null || echo unknown`

/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`

/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`

_ASUNAME

as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    $as_echo "PATH: $as_dir"
  done
IFS=$as_save_IFS

} >&5

cat >&5 <<_ACEOF


## ----------- ##
## Core tests. ##
## ----------- ##

_ACEOF


# Keep a trace of the command line.
# Strip out --no-create and --no-recursion so they do not pile up.
# Strip out --silent because we don't want to record it for future runs.
# Also quote any args containing shell meta-characters.
# Make two passes to allow for proper duplicate-argument suppression.
ac_configure_args=
ac_configure_args0=
ac_configure_args1=
ac_must_keep_next=false
for ac_pass in 1 2
do
  for ac_arg
  do
    case $ac_arg in
    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
    | -silent | --silent | --silen | --sile | --sil)
      continue ;;
    *\'*)
      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
    esac
    case $ac_pass in
    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
    2)
      as_fn_append ac_configure_args1 " '$ac_arg'"
      if test $ac_must_keep_next = true; then
	ac_must_keep_next=false # Got value, back to normal.
      else
	case $ac_arg in
	  *=* | --config-cache | -C | -disable-* | --disable-* \
	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
	  | -with-* | --with-* | -without-* | --without-* | --x)
	    case "$ac_configure_args0 " in
	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
	    esac
	    ;;
	  -* ) ac_must_keep_next=true ;;
	esac
      fi
      as_fn_append ac_configure_args " '$ac_arg'"
      ;;
    esac
  done
done
{ ac_configure_args0=; unset ac_configure_args0;}
{ ac_configure_args1=; unset ac_configure_args1;}

# When interrupted or exit'd, cleanup temporary files, and complete
# config.log.  We remove comments because anyway the quotes in there
# would cause problems or look ugly.
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
  # Save into config.log some information that might help in debugging.
  {
    echo

    $as_echo "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
    echo
    # The following way of writing the cache mishandles newlines in values,
(
  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
    eval ac_val=\$$ac_var
    case $ac_val in #(
    *${as_nl}*)
      case $ac_var in #(
      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
      esac
      case $ac_var in #(
      _ | IFS | as_nl) ;; #(
      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
      *) { eval $ac_var=; unset $ac_var;} ;;
      esac ;;
    esac
  done
  (set) 2>&1 |
    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
    *${as_nl}ac_space=\ *)
      sed -n \
	"s/'\''/'\''\\\\'\'''\''/g;
	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
      ;; #(
    *)
      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
      ;;
    esac |
    sort
)
    echo

    $as_echo "## ----------------- ##
## Output variables. ##
## ----------------- ##"
    echo
    for ac_var in $ac_subst_vars
    do
      eval ac_val=\$$ac_var
      case $ac_val in
      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
      esac
      $as_echo "$ac_var='\''$ac_val'\''"
    done | sort
    echo

    if test -n "$ac_subst_files"; then
      $as_echo "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
      echo
      for ac_var in $ac_subst_files
      do
	eval ac_val=\$$ac_var
	case $ac_val in
	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
	esac
	$as_echo "$ac_var='\''$ac_val'\''"
      done | sort
      echo
    fi

    if test -s confdefs.h; then
      $as_echo "## ----------- ##
## confdefs.h. ##
## ----------- ##"
      echo
      cat confdefs.h
      echo
    fi
    test "$ac_signal" != 0 &&
      $as_echo "$as_me: caught signal $ac_signal"
    $as_echo "$as_me: exit $exit_status"
  } >&5
  rm -f core *.core core.conftest.* &&
    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
    exit $exit_status
' 0
for ac_signal in 1 2 13 15; do
  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
done
ac_signal=0

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h

$as_echo "/* confdefs.h */" > confdefs.h

# Predefined preprocessor variables.

cat >>confdefs.h <<_ACEOF
#define PACKAGE_NAME "$PACKAGE_NAME"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_VERSION "$PACKAGE_VERSION"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_STRING "$PACKAGE_STRING"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_URL "$PACKAGE_URL"
_ACEOF


# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
ac_site_file1=NONE
ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
  # We do not want a PATH search for config.site.
  case $CONFIG_SITE in #((
    -*)  ac_site_file1=./$CONFIG_SITE;;
    */*) ac_site_file1=$CONFIG_SITE;;
    *)   ac_site_file1=./$CONFIG_SITE;;
  esac
elif test "x$prefix" != xNONE; then
  ac_site_file1=$prefix/share/config.site
  ac_site_file2=$prefix/etc/config.site
else
  ac_site_file1=$ac_default_prefix/share/config.site
  ac_site_file2=$ac_default_prefix/etc/config.site
fi
for ac_site_file in "$ac_site_file1" "$ac_site_file2"
do
  test "x$ac_site_file" = xNONE && continue
  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
$as_echo "$as_me: loading site script $ac_site_file" >&6;}
    sed 's/^/| /' "$ac_site_file" >&5
    . "$ac_site_file" \
      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
See \`config.log' for more details" "$LINENO" 5; }
  fi
done

if test -r "$cache_file"; then
  # Some versions of bash will fail to source /dev/null (special files
  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
$as_echo "$as_me: loading cache $cache_file" >&6;}
    case $cache_file in
      [\\/]* | ?:[\\/]* ) . "$cache_file";;
      *)                      . "./$cache_file";;
    esac
  fi
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
$as_echo "$as_me: creating cache $cache_file" >&6;}
  >$cache_file
fi

as_fn_append ac_header_list " locale.h"
as_fn_append ac_func_list " canonicalize_file_name"
as_fn_append ac_func_list " getcwd"
as_fn_append ac_func_list " readlink"
as_fn_append ac_func_list " realpath"
as_fn_append ac_header_list " sys/param.h"
as_fn_append ac_func_list " readlinkat"
as_fn_append ac_func_list " _set_invalid_parameter_handler"
as_fn_append ac_header_list " sys/socket.h"
as_fn_append ac_header_list " unistd.h"
as_fn_append ac_func_list " fcntl"
as_fn_append ac_func_list " symlink"
as_fn_append ac_header_list " stdio_ext.h"
as_fn_append ac_func_list " vasnprintf"
as_fn_append ac_header_list " features.h"
as_fn_append ac_func_list " snprintf"
as_fn_append ac_func_list " fsync"
as_fn_append ac_func_list " microuptime"
as_fn_append ac_func_list " nanouptime"
gl_getopt_required=GNU
as_fn_append ac_header_list " getopt.h"
as_fn_append ac_header_list " sys/cdefs.h"
as_fn_append ac_func_list " getprogname"
as_fn_append ac_func_list " getexecname"
as_fn_append ac_func_list " getrusage"
as_fn_append ac_func_list " gettimeofday"
as_fn_append ac_header_list " sys/time.h"
as_fn_append ac_header_list " limits.h"
as_fn_append ac_header_list " wchar.h"
as_fn_append ac_header_list " stdint.h"
as_fn_append ac_header_list " inttypes.h"
as_fn_append ac_func_list " iswcntrl"
as_fn_append ac_header_list " crtdefs.h"
as_fn_append ac_header_list " wctype.h"
as_fn_append ac_func_list " iswblank"
as_fn_append ac_func_list " tcdrain"
as_fn_append ac_header_list " threads.h"
as_fn_append ac_header_list " math.h"
as_fn_append ac_func_list " mbsinit"
as_fn_append ac_func_list " mbrtowc"
as_fn_append ac_func_list " isascii"
as_fn_append ac_header_list " sys/mman.h"
as_fn_append ac_func_list " mprotect"
as_fn_append ac_func_list " obstack_printf"
as_fn_append ac_func_list " lstat"
as_fn_append ac_func_list " strerror_r"
as_fn_append ac_func_list " __xpg_strerror_r"
as_fn_append ac_func_list " pipe2"
gl_printf_safe=yes
as_fn_append ac_func_list " setenv"
as_fn_append ac_func_list " link"
as_fn_append ac_func_list " sigaction"
as_fn_append ac_func_list " sigaltstack"
as_fn_append ac_func_list " siginterrupt"
as_fn_append ac_header_list " spawn.h"
as_fn_append ac_func_list " strdup"
as_fn_append ac_func_list " strndup"
as_fn_append ac_header_list " sys/resource.h"
as_fn_append ac_header_list " sys/times.h"
as_fn_append ac_header_list " sys/wait.h"
as_fn_append ac_func_list " pipe"
as_fn_append ac_func_list " wcwidth"
as_fn_append ac_func_list " __fseterr"
as_fn_append ac_header_list " sys/stat.h"
as_fn_append ac_func_list " getdtablesize"
as_fn_append ac_func_list " catgets"
as_fn_append ac_func_list " setlocale"
gt_needs="$gt_needs need-ngettext"
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
for ac_var in $ac_precious_vars; do
  eval ac_old_set=\$ac_cv_env_${ac_var}_set
  eval ac_new_set=\$ac_env_${ac_var}_set
  eval ac_old_val=\$ac_cv_env_${ac_var}_value
  eval ac_new_val=\$ac_env_${ac_var}_value
  case $ac_old_set,$ac_new_set in
    set,)
      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
      ac_cache_corrupted=: ;;
    ,set)
      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
      ac_cache_corrupted=: ;;
    ,);;
    *)
      if test "x$ac_old_val" != "x$ac_new_val"; then
	# differences in whitespace do not lead to failure.
	ac_old_val_w=`echo x $ac_old_val`
	ac_new_val_w=`echo x $ac_new_val`
	if test "$ac_old_val_w" != "$ac_new_val_w"; then
	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
	  ac_cache_corrupted=:
	else
	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
	  eval $ac_var=\$ac_old_val
	fi
	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
      fi;;
  esac
  # Pass precious variables to config.status.
  if test "$ac_new_set" = set; then
    case $ac_new_val in
    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
    *) ac_arg=$ac_var=$ac_new_val ;;
    esac
    case " $ac_configure_args " in
      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
    esac
  fi
done
if $ac_cache_corrupted; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
## -------------------- ##

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


PACKAGE_COPYRIGHT_YEAR=2019


cat >>confdefs.h <<_ACEOF
#define PACKAGE_COPYRIGHT_YEAR $PACKAGE_COPYRIGHT_YEAR
_ACEOF


ac_aux_dir=
for ac_dir in build-aux "$srcdir"/build-aux; do
  if test -f "$ac_dir/install-sh"; then
    ac_aux_dir=$ac_dir
    ac_install_sh="$ac_aux_dir/install-sh -c"
    break
  elif test -f "$ac_dir/install.sh"; then
    ac_aux_dir=$ac_dir
    ac_install_sh="$ac_aux_dir/install.sh -c"
    break
  elif test -f "$ac_dir/shtool"; then
    ac_aux_dir=$ac_dir
    ac_install_sh="$ac_aux_dir/shtool install -c"
    break
  fi
done
if test -z "$ac_aux_dir"; then
  as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5
fi

# These three variables are undocumented and unsupported,
# and are intended to be withdrawn in a future Autoconf release.
# They can cause serious problems if a builder's source tree is in a directory
# whose full name contains unusual characters.
ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.




# We use Automake 1.14's %D% and %C%.
#
# When we move to Automake 1.16, simplify examples/c/reccalc/local.mk.
# Our CI runs on Xenial, which has only Automake 1.15.
#
# We want gnits strictness only when rolling a stable release.  For
# release candidates, we use version strings like 2.4.3_rc1, but gnits
# doesn't like that, so we let the underscore disable gnits.  Between
# releases, we want to be able run make dist without being required to
# add a bogus NEWS entry.  In that case, the version string
# automatically contains a dash, which we also let disable gnits.
am__api_version='1.16'

# Find a good install program.  We prefer a C program (faster),
# so one script is as good as another.  But avoid the broken or
# incompatible versions:
# SysV /etc/install, /usr/sbin/install
# SunOS /usr/etc/install
# IRIX /sbin/install
# AIX /bin/install
# AmigaOS /C/install, which installs bootblocks on floppy discs
# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
# AFS /usr/afsws/bin/install, which mishandles nonexistent args
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# OS/2's system install, which has a completely different semantic
# ./install, which can be erroneously created by make from ./install.sh.
# Reject install programs that cannot install multiple files.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
$as_echo_n "checking for a BSD-compatible install... " >&6; }
if test -z "$INSTALL"; then
if ${ac_cv_path_install+:} false; then :
  $as_echo_n "(cached) " >&6
else
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    # Account for people who put trailing slashes in PATH elements.
case $as_dir/ in #((
  ./ | .// | /[cC]/* | \
  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
  /usr/ucb/* ) ;;
  *)
    # OSF1 and SCO ODT 3.0 have their own names for install.
    # Don't use installbsd from OSF since it installs stuff as root
    # by default.
    for ac_prog in ginstall scoinst install; do
      for ac_exec_ext in '' $ac_executable_extensions; do
	if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
	  if test $ac_prog = install &&
	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
	    # AIX install.  It has an incompatible calling convention.
	    :
	  elif test $ac_prog = install &&
	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
	    # program-specific install script used by HP pwplus--don't use.
	    :
	  else
	    rm -rf conftest.one conftest.two conftest.dir
	    echo one > conftest.one
	    echo two > conftest.two
	    mkdir conftest.dir
	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
	      test -s conftest.one && test -s conftest.two &&
	      test -s conftest.dir/conftest.one &&
	      test -s conftest.dir/conftest.two
	    then
	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
	      break 3
	    fi
	  fi
	fi
      done
    done
    ;;
esac

  done
IFS=$as_save_IFS

rm -rf conftest.one conftest.two conftest.dir

fi
  if test "${ac_cv_path_install+set}" = set; then
    INSTALL=$ac_cv_path_install
  else
    # As a last resort, use the slow shell script.  Don't cache a
    # value for INSTALL within a source directory, because that will
    # break other packages using the cache if that directory is
    # removed, or if the value is a relative name.
    INSTALL=$ac_install_sh
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
$as_echo "$INSTALL" >&6; }

# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
# It thinks the first close brace ends the variable substitution.
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'

test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'

test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
$as_echo_n "checking whether build environment is sane... " >&6; }
# Reject unsafe characters in $srcdir or the absolute working directory
# name.  Accept space and tab only in the latter.
am_lf='
'
case `pwd` in
  *[\\\"\#\$\&\'\`$am_lf]*)
    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
esac
case $srcdir in
  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
esac

# Do 'set' in a subshell so we don't clobber the current shell's
# arguments.  Must try -L first in case configure is actually a
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
if (
   am_has_slept=no
   for am_try in 1 2; do
     echo "timestamp, slept: $am_has_slept" > conftest.file
     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
     if test "$*" = "X"; then
	# -L didn't work.
	set X `ls -t "$srcdir/configure" conftest.file`
     fi
     if test "$*" != "X $srcdir/configure conftest.file" \
	&& test "$*" != "X conftest.file $srcdir/configure"; then

	# If neither matched, then we have a broken ls.  This can happen
	# if, for instance, CONFIG_SHELL is bash and it inherits a
	# broken ls alias from the environment.  This has actually
	# happened.  Such a system could not be considered "sane".
	as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
  alias in your environment" "$LINENO" 5
     fi
     if test "$2" = conftest.file || test $am_try -eq 2; then
       break
     fi
     # Just in case.
     sleep 1
     am_has_slept=yes
   done
   test "$2" = conftest.file
   )
then
   # Ok.
   :
else
   as_fn_error $? "newly created file is older than distributed files!
Check your system clock" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
# If we didn't sleep, we still need to ensure time stamps of config.status and
# generated files are strictly newer.
am_sleep_pid=
if grep 'slept: no' conftest.file >/dev/null 2>&1; then
  ( sleep 1 ) &
  am_sleep_pid=$!
fi

rm -f conftest.file

test "$program_prefix" != NONE &&
  program_transform_name="s&^&$program_prefix&;$program_transform_name"
# Use a double $ so make ignores it.
test "$program_suffix" != NONE &&
  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
# Double any \ or $.
# By default was `s,x,x', remove it if useless.
ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`

# Expand $ac_aux_dir to an absolute path.
am_aux_dir=`cd "$ac_aux_dir" && pwd`

if test x"${MISSING+set}" != xset; then
  case $am_aux_dir in
  *\ * | *\	*)
    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
  *)
    MISSING="\${SHELL} $am_aux_dir/missing" ;;
  esac
fi
# Use eval to expand $SHELL
if eval "$MISSING --is-lightweight"; then
  am_missing_run="$MISSING "
else
  am_missing_run=
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
fi

if test x"${install_sh+set}" != xset; then
  case $am_aux_dir in
  *\ * | *\	*)
    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
  *)
    install_sh="\${SHELL} $am_aux_dir/install-sh"
  esac
fi

# Installed binaries are usually stripped using 'strip' when the user
# run "make install-strip".  However 'strip' might not be the right
# tool to use in cross-compilation environments, therefore Automake
# will honor the 'STRIP' environment variable to overrule this program.
if test "$cross_compiling" != no; then
  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
set dummy ${ac_tool_prefix}strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_STRIP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$STRIP"; then
  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
STRIP=$ac_cv_prog_STRIP
if test -n "$STRIP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
$as_echo "$STRIP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_STRIP"; then
  ac_ct_STRIP=$STRIP
  # Extract the first word of "strip", so it can be a program name with args.
set dummy strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_STRIP"; then
  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_STRIP="strip"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
if test -n "$ac_ct_STRIP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
$as_echo "$ac_ct_STRIP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_STRIP" = x; then
    STRIP=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    STRIP=$ac_ct_STRIP
  fi
else
  STRIP="$ac_cv_prog_STRIP"
fi

fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
if test -z "$MKDIR_P"; then
  if ${ac_cv_path_mkdir+:} false; then :
  $as_echo_n "(cached) " >&6
else
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in mkdir gmkdir; do
	 for ac_exec_ext in '' $ac_executable_extensions; do
	   as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
	     'mkdir (GNU coreutils) '* | \
	     'mkdir (coreutils) '* | \
	     'mkdir (fileutils) '4.1*)
	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
	       break 3;;
	   esac
	 done
       done
  done
IFS=$as_save_IFS

fi

  test -d ./--version && rmdir ./--version
  if test "${ac_cv_path_mkdir+set}" = set; then
    MKDIR_P="$ac_cv_path_mkdir -p"
  else
    # As a last resort, use the slow shell script.  Don't cache a
    # value for MKDIR_P within a source directory, because that will
    # break other packages using the cache if that directory is
    # removed, or if the value is a relative name.
    MKDIR_P="$ac_install_sh -d"
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
$as_echo "$MKDIR_P" >&6; }

for ac_prog in gawk mawk nawk awk
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_AWK+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$AWK"; then
  ac_cv_prog_AWK="$AWK" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_AWK="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
AWK=$ac_cv_prog_AWK
if test -n "$AWK"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
$as_echo "$AWK" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$AWK" && break
done

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
set x ${MAKE-make}
ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat >conftest.make <<\_ACEOF
SHELL = /bin/sh
all:
	@echo '@@@%%%=$(MAKE)=@@@%%%'
_ACEOF
# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
case `${MAKE-make} -f conftest.make 2>/dev/null` in
  *@@@%%%=?*=@@@%%%*)
    eval ac_cv_prog_make_${ac_make}_set=yes;;
  *)
    eval ac_cv_prog_make_${ac_make}_set=no;;
esac
rm -f conftest.make
fi
if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
  SET_MAKE=
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
  SET_MAKE="MAKE=${MAKE-make}"
fi

rm -rf .tst 2>/dev/null
mkdir .tst 2>/dev/null
if test -d .tst; then
  am__leading_dot=.
else
  am__leading_dot=_
fi
rmdir .tst 2>/dev/null

# Check whether --enable-silent-rules was given.
if test "${enable_silent_rules+set}" = set; then :
  enableval=$enable_silent_rules;
fi

case $enable_silent_rules in # (((
  yes) AM_DEFAULT_VERBOSITY=0;;
   no) AM_DEFAULT_VERBOSITY=1;;
    *) AM_DEFAULT_VERBOSITY=1;;
esac
am_make=${MAKE-make}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
if ${am_cv_make_support_nested_variables+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if $as_echo 'TRUE=$(BAR$(V))
BAR0=false
BAR1=true
V=1
am__doit:
	@$(TRUE)
.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
  am_cv_make_support_nested_variables=yes
else
  am_cv_make_support_nested_variables=no
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
$as_echo "$am_cv_make_support_nested_variables" >&6; }
if test $am_cv_make_support_nested_variables = yes; then
    AM_V='$(V)'
  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
else
  AM_V=$AM_DEFAULT_VERBOSITY
  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
fi
AM_BACKSLASH='\'

if test "`cd $srcdir && pwd`" != "`pwd`"; then
  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
  # is not polluted with repeated "-I."
  am__isrc=' -I$(srcdir)'
  # test to see if srcdir already configured
  if test -f $srcdir/config.status; then
    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
  fi
fi

# test whether we have cygpath
if test -z "$CYGPATH_W"; then
  if (cygpath --version) >/dev/null 2>/dev/null; then
    CYGPATH_W='cygpath -w'
  else
    CYGPATH_W=echo
  fi
fi


# Define the identity of the package.
 PACKAGE='bison'
 VERSION='3.5'


cat >>confdefs.h <<_ACEOF
#define PACKAGE "$PACKAGE"
_ACEOF


cat >>confdefs.h <<_ACEOF
#define VERSION "$VERSION"
_ACEOF

# Some tools Automake needs.

ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}


AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}


AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}


AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}


MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}

# For better backward compatibility.  To be removed once Automake 1.9.x
# dies out for good.  For more background, see:
# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
mkdir_p='$(MKDIR_P)'

# We need awk for the "check" target (and possibly the TAP driver).  The
# system "awk" is bad on some platforms.
# Always define AMTAR for backward compatibility.  Yes, it's still used
# in the wild :-(  We should find a proper way to deprecate it ...
AMTAR='$${TAR-tar}'


# We'll loop over all known methods to create a tar archive until one works.
_am_tools='gnutar  pax cpio none'

am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'






# POSIX will say in a future version that running "rm -f" with no argument
# is OK; and we want to be able to make that assumption in our Makefile
# recipes.  So use an aggressive probe to check that the usage we want is
# actually supported "in the wild" to an acceptable degree.
# See automake bug#10828.
# To make any issue more visible, cause the running configure to be aborted
# by default if the 'rm' program in use doesn't match our expectations; the
# user can still override this though.
if rm -f && rm -fr && rm -rf; then : OK; else
  cat >&2 <<'END'
Oops!

Your 'rm' program seems unable to run without file operands specified
on the command line, even when the '-f' option is present.  This is contrary
to the behaviour of most rm programs out there, and not conforming with
the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>

Please tell bug-automake@gnu.org about your system, including the value
of your $PATH and any error possibly output before this message.  This
can help us improve future automake versions.

END
  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
    echo 'Configuration will proceed anyway, since you have set the' >&2
    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
    echo >&2
  else
    cat >&2 <<'END'
Aborting the configuration process, to ensure you take notice of the issue.

You can download and install GNU coreutils to get an 'rm' implementation
that behaves properly: <https://www.gnu.org/software/coreutils/>.

If you want to complete the configuration process using your problematic
'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
to "yes", and re-run configure.

END
    as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
  fi
fi

# Check whether --enable-silent-rules was given.
if test "${enable_silent_rules+set}" = set; then :
  enableval=$enable_silent_rules;
fi

case $enable_silent_rules in # (((
  yes) AM_DEFAULT_VERBOSITY=0;;
   no) AM_DEFAULT_VERBOSITY=1;;
    *) AM_DEFAULT_VERBOSITY=0;;
esac
am_make=${MAKE-make}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
if ${am_cv_make_support_nested_variables+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if $as_echo 'TRUE=$(BAR$(V))
BAR0=false
BAR1=true
V=1
am__doit:
	@$(TRUE)
.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
  am_cv_make_support_nested_variables=yes
else
  am_cv_make_support_nested_variables=no
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
$as_echo "$am_cv_make_support_nested_variables" >&6; }
if test $am_cv_make_support_nested_variables = yes; then
    AM_V='$(V)'
  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
else
  AM_V=$AM_DEFAULT_VERBOSITY
  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
fi
AM_BACKSLASH='\'

ac_config_headers="$ac_config_headers lib/config.h:lib/config.in.h"


# Checks for the compiler.
DEPDIR="${am__leading_dot}deps"

ac_config_commands="$ac_config_commands depfiles"

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
cat > confinc.mk << 'END'
am__doit:
	@echo this is the am__doit target >confinc.out
.PHONY: am__doit
END
am__include="#"
am__quote=
# BSD make does it like this.
echo '.include "confinc.mk" # ignored' > confmf.BSD
# Other make implementations (GNU, Solaris 10, AIX) do it like this.
echo 'include confinc.mk # ignored' > confmf.GNU
_am_result=no
for s in GNU BSD; do
  { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
   (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
  case $?:`cat confinc.out 2>/dev/null` in #(
  '0:this is the am__doit target') :
    case $s in #(
  BSD) :
    am__include='.include' am__quote='"' ;; #(
  *) :
    am__include='include' am__quote='' ;;
esac ;; #(
  *) :
     ;;
esac
  if test "$am__include" != "#"; then
    _am_result="yes ($s style)"
    break
  fi
done
rm -f confinc.* confmf.*
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
$as_echo "${_am_result}" >&6; }

# Check whether --enable-dependency-tracking was given.
if test "${enable_dependency_tracking+set}" = set; then :
  enableval=$enable_dependency_tracking;
fi

if test "x$enable_dependency_tracking" != xno; then
  am_depcomp="$ac_aux_dir/depcomp"
  AMDEPBACKSLASH='\'
  am__nodep='_no'
fi
 if test "x$enable_dependency_tracking" != xno; then
  AMDEP_TRUE=
  AMDEP_FALSE='#'
else
  AMDEP_TRUE='#'
  AMDEP_FALSE=
fi


ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_CC="${ac_tool_prefix}gcc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_CC"; then
  ac_ct_CC=$CC
  # Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CC"; then
  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_CC="gcc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
$as_echo "$ac_ct_CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_CC" = x; then
    CC=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CC=$ac_ct_CC
  fi
else
  CC="$ac_cv_prog_CC"
fi

if test -z "$CC"; then
          if test -n "$ac_tool_prefix"; then
    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_CC="${ac_tool_prefix}cc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  fi
fi
if test -z "$CC"; then
  # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  ac_prog_rejected=no
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
       ac_prog_rejected=yes
       continue
     fi
    ac_cv_prog_CC="cc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

if test $ac_prog_rejected = yes; then
  # We found a bogon in the path, so make sure we never use it.
  set dummy $ac_cv_prog_CC
  shift
  if test $# != 0; then
    # We chose a different compiler from the bogus one.
    # However, it has the same basename, so the bogon will be chosen
    # first if we set CC to just the basename; use the full file name.
    shift
    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
  fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$CC"; then
  if test -n "$ac_tool_prefix"; then
  for ac_prog in cl.exe
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


    test -n "$CC" && break
  done
fi
if test -z "$CC"; then
  ac_ct_CC=$CC
  for ac_prog in cl.exe
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CC"; then
  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_CC="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
$as_echo "$ac_ct_CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$ac_ct_CC" && break
done

  if test "x$ac_ct_CC" = x; then
    CC=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CC=$ac_ct_CC
  fi
fi

fi
if test -z "$CC"; then
  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
set dummy ${ac_tool_prefix}clang; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_CC="${ac_tool_prefix}clang"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_CC"; then
  ac_ct_CC=$CC
  # Extract the first word of "clang", so it can be a program name with args.
set dummy clang; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CC"; then
  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_CC="clang"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
$as_echo "$ac_ct_CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_CC" = x; then
    CC=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CC=$ac_ct_CC
  fi
else
  CC="$ac_cv_prog_CC"
fi

fi


test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
See \`config.log' for more details" "$LINENO" 5; }

# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion -version; do
  { { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    sed '10a\
... rest of stderr output deleted ...
         10q' conftest.err >conftest.er1
    cat conftest.er1 >&5
  fi
  rm -f conftest.er1 conftest.err
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
done

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
$as_echo_n "checking whether the C compiler works... " >&6; }
ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`

# The possible output files:
ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"

ac_rmfiles=
for ac_file in $ac_files
do
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
  esac
done
rm -f $ac_rmfiles

if { { ac_try="$ac_link_default"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link_default") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then :
  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
# in a Makefile.  We should not override ac_cv_exeext if it was cached,
# so that the user can short-circuit this test for compilers unknown to
# Autoconf.
for ac_file in $ac_files ''
do
  test -f "$ac_file" || continue
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
	;;
    [ab].out )
	# We found the default executable, but exeext='' is most
	# certainly right.
	break;;
    *.* )
	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
	then :; else
	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
	fi
	# We set ac_cv_exeext here because the later test for it is not
	# safe: cross compilers may not add the suffix if given an `-o'
	# argument, so we may need to know it at that point already.
	# Even if this section looks crufty: it has the advantage of
	# actually working.
	break;;
    * )
	break;;
  esac
done
test "$ac_cv_exeext" = no && ac_cv_exeext=

else
  ac_file=''
fi
if test -z "$ac_file"; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
See \`config.log' for more details" "$LINENO" 5; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
$as_echo_n "checking for C compiler default output file name... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
$as_echo "$ac_file" >&6; }
ac_exeext=$ac_cv_exeext

rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
$as_echo_n "checking for suffix of executables... " >&6; }
if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then :
  # If both `conftest.exe' and `conftest' are `present' (well, observable)
# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
# work properly (i.e., refer to `conftest.exe'), while it won't with
# `rm'.
for ac_file in conftest.exe conftest conftest.*; do
  test -f "$ac_file" || continue
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
	  break;;
    * ) break;;
  esac
done
else
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest conftest$ac_cv_exeext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
$as_echo "$ac_cv_exeext" >&6; }

rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
ac_exeext=$EXEEXT
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdio.h>
int
main ()
{
FILE *f = fopen ("conftest.out", "w");
 return ferror (f) || fclose (f) != 0;

  ;
  return 0;
}
_ACEOF
ac_clean_files="$ac_clean_files conftest.out"
# Check that the compiler produces executables we can run.  If not, either
# the compiler is broken, or we cross compile.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
$as_echo_n "checking whether we are cross compiling... " >&6; }
if test "$cross_compiling" != yes; then
  { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
  if { ac_try='./conftest$ac_cv_exeext'
  { { case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_try") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; }; then
    cross_compiling=no
  else
    if test "$cross_compiling" = maybe; then
	cross_compiling=yes
    else
	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
See \`config.log' for more details" "$LINENO" 5; }
    fi
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
$as_echo "$cross_compiling" >&6; }

rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
$as_echo_n "checking for suffix of object files... " >&6; }
if ${ac_cv_objext+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
rm -f conftest.o conftest.obj
if { { ac_try="$ac_compile"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compile") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then :
  for ac_file in conftest.o conftest.obj conftest.*; do
  test -f "$ac_file" || continue;
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
       break;;
  esac
done
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
$as_echo "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
if ${ac_cv_c_compiler_gnu+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
#ifndef __GNUC__
       choke me
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_compiler_gnu=yes
else
  ac_compiler_gnu=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
$as_echo "$ac_cv_c_compiler_gnu" >&6; }
if test $ac_compiler_gnu = yes; then
  GCC=yes
else
  GCC=
fi
ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
$as_echo_n "checking whether $CC accepts -g... " >&6; }
if ${ac_cv_prog_cc_g+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_save_c_werror_flag=$ac_c_werror_flag
   ac_c_werror_flag=yes
   ac_cv_prog_cc_g=no
   CFLAGS="-g"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_g=yes
else
  CFLAGS=""
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

else
  ac_c_werror_flag=$ac_save_c_werror_flag
	 CFLAGS="-g"
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_g=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   ac_c_werror_flag=$ac_save_c_werror_flag
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
$as_echo "$ac_cv_prog_cc_g" >&6; }
if test "$ac_test_CFLAGS" = set; then
  CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
  if test "$GCC" = yes; then
    CFLAGS="-g -O2"
  else
    CFLAGS="-g"
  fi
else
  if test "$GCC" = yes; then
    CFLAGS="-O2"
  else
    CFLAGS=
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
$as_echo_n "checking for $CC option to enable C11 features... " >&6; }
if ${ac_cv_prog_cc_c11+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_prog_cc_c11=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
#include <wchar.h>
#include <stdio.h>

// Check varargs macros.  These examples are taken from C99 6.10.3.5.
#define debug(...) fprintf (stderr, __VA_ARGS__)
#define showlist(...) puts (#__VA_ARGS__)
#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
static void
test_varargs_macros (void)
{
  int x = 1234;
  int y = 5678;
  debug ("Flag");
  debug ("X = %d\n", x);
  showlist (The first, second, and third items.);
  report (x>y, "x is %d but y is %d", x, y);
}

// Check long long types.
#define BIG64 18446744073709551615ull
#define BIG32 4294967295ul
#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
#if !BIG_OK
  your preprocessor is broken;
#endif
#if BIG_OK
#else
  your preprocessor is broken;
#endif
static long long int bignum = -9223372036854775807LL;
static unsigned long long int ubignum = BIG64;

struct incomplete_array
{
  int datasize;
  double data[];
};

struct named_init {
  int number;
  const wchar_t *name;
  double average;
};

typedef const char *ccp;

static inline int
test_restrict (ccp restrict text)
{
  // See if C++-style comments work.
  // Iterate through items via the restricted pointer.
  // Also check for declarations in for loops.
  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
    continue;
  return 0;
}

// Check varargs and va_copy.
static bool
test_varargs (const char *format, ...)
{
  va_list args;
  va_start (args, format);
  va_list args_copy;
  va_copy (args_copy, args);

  const char *str = "";
  int number = 0;
  float fnumber = 0;

  while (*format)
    {
      switch (*format++)
	{
	case 's': // string
	  str = va_arg (args_copy, const char *);
	  break;
	case 'd': // int
	  number = va_arg (args_copy, int);
	  break;
	case 'f': // float
	  fnumber = va_arg (args_copy, double);
	  break;
	default:
	  break;
	}
    }
  va_end (args_copy);
  va_end (args);

  return *str && number && fnumber;
}
// Check _Alignas.
char _Alignas (double) aligned_as_double;
char _Alignas (0) no_special_alignment;
extern char aligned_as_int;
char _Alignas (0) _Alignas (int) aligned_as_int;

// Check _Alignof.
enum
{
  int_alignment = _Alignof (int),
  int_array_alignment = _Alignof (int[100]),
  char_alignment = _Alignof (char)
};
_Static_assert (0 < -_Alignof (int), "_Alignof is signed");

// Check _Noreturn.
int _Noreturn does_not_return (void) { for (;;) continue; }

// Check _Static_assert.
struct test_static_assert
{
  int x;
  _Static_assert (sizeof (int) <= sizeof (long int),
                  "_Static_assert does not work in struct");
  long int y;
};

// Check UTF-8 literals.
#define u8 syntax error!
char const utf8_literal[] = u8"happens to be ASCII" "another string";

// Check duplicate typedefs.
typedef long *long_ptr;
typedef long int *long_ptr;
typedef long_ptr long_ptr;

// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
struct anonymous
{
  union {
    struct { int i; int j; };
    struct { int k; long int l; } w;
  };
  int m;
} v1;

int
main ()
{

  // Check bool.
  _Bool success = false;

  // Check restrict.
  if (test_restrict ("String literal") == 0)
    success = true;
  char *restrict newvar = "Another string";

  // Check varargs.
  success &= test_varargs ("s, d' f .", "string", 65, 34.234);
  test_varargs_macros ();

  // Check flexible array members.
  struct incomplete_array *ia =
    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
  ia->datasize = 10;
  for (int i = 0; i < ia->datasize; ++i)
    ia->data[i] = i * 1.234;

  // Check named initializers.
  struct named_init ni = {
    .number = 34,
    .name = L"Test wide string",
    .average = 543.34343,
  };

  ni.number = 58;

  int dynamic_array[ni.number];
  dynamic_array[ni.number - 1] = 543;

  // work around unused variable warnings
  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
	  || dynamic_array[ni.number - 1] != 543);

  v1.i = 2;
  v1.w.k = 5;
  _Static_assert ((offsetof (struct anonymous, i)
		   == offsetof (struct anonymous, w.k)),
		  "Anonymous union alignment botch");

  ;
  return 0;
}
_ACEOF
for ac_arg in '' -std=gnu11
do
  CC="$ac_save_CC $ac_arg"
  if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_c11=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext
  test "x$ac_cv_prog_cc_c11" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC

fi
# AC_CACHE_VAL
ac_prog_cc_stdc_options=
case "x$ac_cv_prog_cc_c11" in
  x)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; } ;;
  xno)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
$as_echo "unsupported" >&6; } ;;
  *)
    ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c11"
    CC=$CC$ac_prog_cc_stdc_options
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
$as_echo "$ac_cv_prog_cc_c11" >&6; } ;;
esac
if test "x$ac_cv_prog_cc_c11" != xno; then :
  ac_prog_cc_stdc=c11
		 ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
$as_echo_n "checking for $CC option to enable C99 features... " >&6; }
if ${ac_cv_prog_cc_c99+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_prog_cc_c99=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
#include <wchar.h>
#include <stdio.h>

// Check varargs macros.  These examples are taken from C99 6.10.3.5.
#define debug(...) fprintf (stderr, __VA_ARGS__)
#define showlist(...) puts (#__VA_ARGS__)
#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
static void
test_varargs_macros (void)
{
  int x = 1234;
  int y = 5678;
  debug ("Flag");
  debug ("X = %d\n", x);
  showlist (The first, second, and third items.);
  report (x>y, "x is %d but y is %d", x, y);
}

// Check long long types.
#define BIG64 18446744073709551615ull
#define BIG32 4294967295ul
#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
#if !BIG_OK
  your preprocessor is broken;
#endif
#if BIG_OK
#else
  your preprocessor is broken;
#endif
static long long int bignum = -9223372036854775807LL;
static unsigned long long int ubignum = BIG64;

struct incomplete_array
{
  int datasize;
  double data[];
};

struct named_init {
  int number;
  const wchar_t *name;
  double average;
};

typedef const char *ccp;

static inline int
test_restrict (ccp restrict text)
{
  // See if C++-style comments work.
  // Iterate through items via the restricted pointer.
  // Also check for declarations in for loops.
  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
    continue;
  return 0;
}

// Check varargs and va_copy.
static bool
test_varargs (const char *format, ...)
{
  va_list args;
  va_start (args, format);
  va_list args_copy;
  va_copy (args_copy, args);

  const char *str = "";
  int number = 0;
  float fnumber = 0;

  while (*format)
    {
      switch (*format++)
	{
	case 's': // string
	  str = va_arg (args_copy, const char *);
	  break;
	case 'd': // int
	  number = va_arg (args_copy, int);
	  break;
	case 'f': // float
	  fnumber = va_arg (args_copy, double);
	  break;
	default:
	  break;
	}
    }
  va_end (args_copy);
  va_end (args);

  return *str && number && fnumber;
}
int
main ()
{

  // Check bool.
  _Bool success = false;

  // Check restrict.
  if (test_restrict ("String literal") == 0)
    success = true;
  char *restrict newvar = "Another string";

  // Check varargs.
  success &= test_varargs ("s, d' f .", "string", 65, 34.234);
  test_varargs_macros ();

  // Check flexible array members.
  struct incomplete_array *ia =
    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
  ia->datasize = 10;
  for (int i = 0; i < ia->datasize; ++i)
    ia->data[i] = i * 1.234;

  // Check named initializers.
  struct named_init ni = {
    .number = 34,
    .name = L"Test wide string",
    .average = 543.34343,
  };

  ni.number = 58;

  int dynamic_array[ni.number];
  dynamic_array[ni.number - 1] = 543;

  // work around unused variable warnings
  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
	  || dynamic_array[ni.number - 1] != 543);

  ;
  return 0;
}
_ACEOF
for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc1x -qlanglvl=extc99
do
  CC="$ac_save_CC $ac_arg"
  if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_c99=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext
  test "x$ac_cv_prog_cc_c99" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC

fi
# AC_CACHE_VAL
ac_prog_cc_stdc_options=
case "x$ac_cv_prog_cc_c99" in
  x)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; } ;;
  xno)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
$as_echo "unsupported" >&6; } ;;
  *)
    ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c99"
    CC=$CC$ac_prog_cc_stdc_options
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
esac
if test "x$ac_cv_prog_cc_c99" != xno; then :
  ac_prog_cc_stdc=c99
		    ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
$as_echo_n "checking for $CC option to enable C89 features... " >&6; }
if ${ac_cv_prog_cc_c89+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_prog_cc_c89=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdarg.h>
#include <stdio.h>
struct stat;
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
static char *e (p, i)
     char **p;
     int i;
{
  return p[i];
}
static char *f (char * (*g) (char **, int), char **p, ...)
{
  char *s;
  va_list v;
  va_start (v,p);
  s = g (p, va_arg (v,int));
  va_end (v);
  return s;
}

/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
   function prototypes and stuff, but not '\xHH' hex character constants.
   These don't provoke an error unfortunately, instead are silently treated
   as 'x'.  The following induces an error, until -std is added to get
   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
   array size at least.  It's necessary to write '\x00'==0 to get something
   that's true only with -std.  */
int osf4_cc_array ['\x00' == 0 ? 1 : -1];

/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
   inside strings and character constants.  */
#define FOO(x) 'x'
int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];

int test (int i, double x);
struct s1 {int (*f) (int a);};
struct s2 {int (*f) (double a);};
int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
int argc;
char **argv;
int
main ()
{
return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
  ;
  return 0;
}
_ACEOF
for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
  CC="$ac_save_CC $ac_arg"
  if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_c89=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext
  test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC

fi
# AC_CACHE_VAL
ac_prog_cc_stdc_options=
case "x$ac_cv_prog_cc_c89" in
  x)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; } ;;
  xno)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
$as_echo "unsupported" >&6; } ;;
  *)
    ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c89"
    CC=$CC$ac_prog_cc_stdc_options
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
esac
if test "x$ac_cv_prog_cc_c89" != xno; then :
  ac_prog_cc_stdc=c89
		       ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
else
  ac_prog_cc_stdc=no
		       ac_cv_prog_cc_stdc=no
fi

fi

fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

depcc="$CC"   am_compiler_list=

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
$as_echo_n "checking dependency style of $depcc... " >&6; }
if ${am_cv_CC_dependencies_compiler_type+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
  # We make a subdir and do the tests there.  Otherwise we can end up
  # making bogus files that we don't know about and never remove.  For
  # instance it was reported that on HP-UX the gcc test will end up
  # making a dummy file named 'D' -- because '-MD' means "put the output
  # in D".
  rm -rf conftest.dir
  mkdir conftest.dir
  # Copy depcomp to subdir because otherwise we won't find it if we're
  # using a relative directory.
  cp "$am_depcomp" conftest.dir
  cd conftest.dir
  # We will build objects and dependencies in a subdirectory because
  # it helps to detect inapplicable dependency modes.  For instance
  # both Tru64's cc and ICC support -MD to output dependencies as a
  # side effect of compilation, but ICC will put the dependencies in
  # the current directory while Tru64 will put them in the object
  # directory.
  mkdir sub

  am_cv_CC_dependencies_compiler_type=none
  if test "$am_compiler_list" = ""; then
     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
  fi
  am__universal=false
  case " $depcc " in #(
     *\ -arch\ *\ -arch\ *) am__universal=true ;;
     esac

  for depmode in $am_compiler_list; do
    # Setup a source with many dependencies, because some compilers
    # like to wrap large dependency lists on column 80 (with \), and
    # we should not choose a depcomp mode which is confused by this.
    #
    # We need to recreate these files for each test, as the compiler may
    # overwrite some of them when testing with obscure command lines.
    # This happens at least with the AIX C compiler.
    : > sub/conftest.c
    for i in 1 2 3 4 5 6; do
      echo '#include "conftst'$i'.h"' >> sub/conftest.c
      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
      # Solaris 10 /bin/sh.
      echo '/* dummy */' > sub/conftst$i.h
    done
    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf

    # We check with '-c' and '-o' for the sake of the "dashmstdout"
    # mode.  It turns out that the SunPro C++ compiler does not properly
    # handle '-M -o', and we need to detect this.  Also, some Intel
    # versions had trouble with output in subdirs.
    am__obj=sub/conftest.${OBJEXT-o}
    am__minus_obj="-o $am__obj"
    case $depmode in
    gcc)
      # This depmode causes a compiler race in universal mode.
      test "$am__universal" = false || continue
      ;;
    nosideeffect)
      # After this tag, mechanisms are not by side-effect, so they'll
      # only be used when explicitly requested.
      if test "x$enable_dependency_tracking" = xyes; then
	continue
      else
	break
      fi
      ;;
    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
      # This compiler won't grok '-c -o', but also, the minuso test has
      # not run yet.  These depmodes are late enough in the game, and
      # so weak that their functioning should not be impacted.
      am__obj=conftest.${OBJEXT-o}
      am__minus_obj=
      ;;
    none) break ;;
    esac
    if depmode=$depmode \
       source=sub/conftest.c object=$am__obj \
       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
         >/dev/null 2>conftest.err &&
       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
      # icc doesn't choke on unknown options, it will just issue warnings
      # or remarks (even with -Werror).  So we grep stderr for any message
      # that says an option was ignored or not supported.
      # When given -MP, icc 7.0 and 7.1 complain thusly:
      #   icc: Command line warning: ignoring option '-M'; no argument required
      # The diagnosis changed in icc 8.0:
      #   icc: Command line remark: option '-MP' not supported
      if (grep 'ignoring option' conftest.err ||
          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
        am_cv_CC_dependencies_compiler_type=$depmode
        break
      fi
    fi
  done

  cd ..
  rm -rf conftest.dir
else
  am_cv_CC_dependencies_compiler_type=none
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type

 if
  test "x$enable_dependency_tracking" != xno \
  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
  am__fastdepCC_TRUE=
  am__fastdepCC_FALSE='#'
else
  am__fastdepCC_TRUE='#'
  am__fastdepCC_FALSE=
fi



ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
if test -z "$CXX"; then
  if test -n "$CCC"; then
    CXX=$CCC
  else
    if test -n "$ac_tool_prefix"; then
  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CXX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CXX"; then
  ac_cv_prog_CXX="$CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CXX=$ac_cv_prog_CXX
if test -n "$CXX"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
$as_echo "$CXX" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


    test -n "$CXX" && break
  done
fi
if test -z "$CXX"; then
  ac_ct_CXX=$CXX
  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CXX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CXX"; then
  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_CXX="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
if test -n "$ac_ct_CXX"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
$as_echo "$ac_ct_CXX" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$ac_ct_CXX" && break
done

  if test "x$ac_ct_CXX" = x; then
    CXX="g++"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CXX=$ac_ct_CXX
  fi
fi

  fi
fi
# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion; do
  { { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    sed '10a\
... rest of stderr output deleted ...
         10q' conftest.err >conftest.er1
    cat conftest.er1 >&5
  fi
  rm -f conftest.er1 conftest.err
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
done

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
if ${ac_cv_cxx_compiler_gnu+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
#ifndef __GNUC__
       choke me
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_compiler_gnu=yes
else
  ac_compiler_gnu=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_cxx_compiler_gnu=$ac_compiler_gnu

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
if test $ac_compiler_gnu = yes; then
  GXX=yes
else
  GXX=
fi
ac_test_CXXFLAGS=${CXXFLAGS+set}
ac_save_CXXFLAGS=$CXXFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
$as_echo_n "checking whether $CXX accepts -g... " >&6; }
if ${ac_cv_prog_cxx_g+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
   ac_cxx_werror_flag=yes
   ac_cv_prog_cxx_g=no
   CXXFLAGS="-g"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_cv_prog_cxx_g=yes
else
  CXXFLAGS=""
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

else
  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
	 CXXFLAGS="-g"
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_cv_prog_cxx_g=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
$as_echo "$ac_cv_prog_cxx_g" >&6; }
if test "$ac_test_CXXFLAGS" = set; then
  CXXFLAGS=$ac_save_CXXFLAGS
elif test $ac_cv_prog_cxx_g = yes; then
  if test "$GXX" = yes; then
    CXXFLAGS="-g -O2"
  else
    CXXFLAGS="-g"
  fi
else
  if test "$GXX" = yes; then
    CXXFLAGS="-O2"
  else
    CXXFLAGS=
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
$as_echo_n "checking for $CXX option to enable C++11 features... " >&6; }
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
if ${ac_cv_prog_cxx_cxx11+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_prog_cxx_cxx11=no
ac_save_CXX=$CXX
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <deque>
#include <functional>
#include <memory>
#include <tuple>
#include <array>
#include <regex>
#include <iostream>

namespace cxx11test
{
  typedef std::shared_ptr<std::string> sptr;
  typedef std::weak_ptr<std::string> wptr;

  typedef std::tuple<std::string,int,double> tp;
  typedef std::array<int, 20> int_array;

  constexpr int get_val() { return 20; }

  struct testinit
  {
    int i;
    double d;
  };

  class delegate  {
  public:
    delegate(int n) : n(n) {}
    delegate(): delegate(2354) {}

    virtual int getval() { return this->n; };
  protected:
    int n;
  };

  class overridden : public delegate {
  public:
    overridden(int n): delegate(n) {}
    virtual int getval() override final { return this->n * 2; }
  };

  class nocopy {
  public:
    nocopy(int i): i(i) {}
    nocopy() = default;
    nocopy(const nocopy&) = delete;
    nocopy & operator=(const nocopy&) = delete;
  private:
    int i;
  };
}


#include <algorithm>
#include <cstdlib>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <set>
#include <sstream>
#include <stdexcept>
#include <string>
#include <utility>
#include <vector>

namespace test {
  typedef std::vector<std::string> string_vec;
  typedef std::pair<int,bool> map_value;
  typedef std::map<std::string,map_value> map_type;
  typedef std::set<int> set_type;

  template<typename T>
  class printer {
  public:
    printer(std::ostringstream& os): os(os) {}
    void operator() (T elem) { os << elem << std::endl; }
  private:
    std::ostringstream& os;
  };
}

int
main ()
{

{
  // Test auto and decltype
  std::deque<int> d;
  d.push_front(43);
  d.push_front(484);
  d.push_front(3);
  d.push_front(844);
  int total = 0;
  for (auto i = d.begin(); i != d.end(); ++i) { total += *i; }

  auto a1 = 6538;
  auto a2 = 48573953.4;
  auto a3 = "String literal";

  decltype(a2) a4 = 34895.034;
}
{
  // Test constexpr
  short sa[cxx11test::get_val()] = { 0 };
}
{
  // Test initializer lists
  cxx11test::testinit il = { 4323, 435234.23544 };
}
{
  // Test range-based for and lambda
  cxx11test::int_array array = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
  for (int &x : array) { x += 23; }
  std::for_each(array.begin(), array.end(), [](int v1){ std::cout << v1; });
}
{
  using cxx11test::sptr;
  using cxx11test::wptr;

  sptr sp(new std::string("ASCII string"));
  wptr wp(sp);
  sptr sp2(wp);
}
{
  cxx11test::tp tuple("test", 54, 45.53434);
  double d = std::get<2>(tuple);
  std::string s;
  int i;
  std::tie(s,i,d) = tuple;
}
{
  static std::regex filename_regex("^_?([a-z0-9_.]+-)+[a-z0-9]+$");
  std::string testmatch("Test if this string matches");
  bool match = std::regex_search(testmatch, filename_regex);
}
{
  cxx11test::int_array array = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
  cxx11test::int_array::size_type size = array.size();
}
{
  // Test constructor delegation
  cxx11test::delegate d1;
  cxx11test::delegate d2();
  cxx11test::delegate d3(45);
}
{
  // Test override and final
  cxx11test::overridden o1(55464);
}
{
  // Test nullptr
  char *c = nullptr;
}
{
  // Test template brackets
  std::vector<std::pair<int,char*>> v1;
}
{
  // Unicode literals
  char const *utf8 = u8"UTF-8 string \u2500";
  char16_t const *utf16 = u"UTF-8 string \u2500";
  char32_t const *utf32 = U"UTF-32 string \u2500";
}



try {
  // Basic string.
  std::string teststr("ASCII text");
  teststr += " string";

  // Simple vector.
  test::string_vec testvec;
  testvec.push_back(teststr);
  testvec.push_back("foo");
  testvec.push_back("bar");
  if (testvec.size() != 3) {
    throw std::runtime_error("vector size is not 1");
  }

  // Dump vector into stringstream and obtain string.
  std::ostringstream os;
  for (test::string_vec::const_iterator i = testvec.begin();
       i != testvec.end(); ++i) {
    if (i + 1 != testvec.end()) {
      os << teststr << '\n';
    }
  }
  // Check algorithms work.
  std::for_each(testvec.begin(), testvec.end(), test::printer<std::string>(os));
  std::string os_out = os.str();

  // Test pair and map.
  test::map_type testmap;
  testmap.insert(std::make_pair(std::string("key"),
                                std::make_pair(53,false)));

  // Test set.
  int values[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
  test::set_type testset(values, values + sizeof(values)/sizeof(values[0]));
  std::list<int> testlist(testset.begin(), testset.end());
  std::copy(testset.begin(), testset.end(), std::back_inserter(testlist));
} catch (const std::exception& e) {
  std::cerr << "Caught exception: " << e.what() << std::endl;

  // Test fstream
  std::ofstream of("test.txt");
  of << "Test ASCII text\n" << std::flush;
  of << "N= " << std::hex << std::setw(8) << std::left << 534 << std::endl;
  of.close();
}
std::exit(0);

  ;
  return 0;
}
_ACEOF
for ac_arg in '' -std=gnu++11 -std=c++11 -std=gnu++0x -std=c++0x -qlanglvl=extended0x -AA
do
  CXX="$ac_save_CXX $ac_arg"
  if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_cv_prog_cxx_cxx11=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext
  test "x$ac_cv_prog_cxx_cxx11" != "xno" && break
done
rm -f conftest.$ac_ext
CXX=$ac_save_CXX

fi
# AC_CACHE_VAL
ac_prog_cxx_stdcxx_options=
case "x$ac_cv_prog_cxx_cxx11" in
  x)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; } ;;
  xno)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
$as_echo "unsupported" >&6; } ;;
  *)
    ac_prog_cxx_stdcxx_options=" $ac_cv_prog_cxx_cxx11"
    CXX=$CXX$ac_prog_cxx_stdcxx_options
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5
$as_echo "$ac_cv_prog_cxx_cxx11" >&6; } ;;
esac
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
if test "x$ac_cv_prog_cxx_cxx11" != xno; then :
  ac_prog_cxx_stdcxx=cxx11
		    ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
		    ac_cv_prog_cxx_cxx98=$ac_cv_prog_cxx_cxx11
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
$as_echo_n "checking for $CXX option to enable C++98 features... " >&6; }
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
if ${ac_cv_prog_cxx_cxx98+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_prog_cxx_cxx98=no
ac_save_CXX=$CXX
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <algorithm>
#include <cstdlib>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <set>
#include <sstream>
#include <stdexcept>
#include <string>
#include <utility>
#include <vector>

namespace test {
  typedef std::vector<std::string> string_vec;
  typedef std::pair<int,bool> map_value;
  typedef std::map<std::string,map_value> map_type;
  typedef std::set<int> set_type;

  template<typename T>
  class printer {
  public:
    printer(std::ostringstream& os): os(os) {}
    void operator() (T elem) { os << elem << std::endl; }
  private:
    std::ostringstream& os;
  };
}

int
main ()
{


try {
  // Basic string.
  std::string teststr("ASCII text");
  teststr += " string";

  // Simple vector.
  test::string_vec testvec;
  testvec.push_back(teststr);
  testvec.push_back("foo");
  testvec.push_back("bar");
  if (testvec.size() != 3) {
    throw std::runtime_error("vector size is not 1");
  }

  // Dump vector into stringstream and obtain string.
  std::ostringstream os;
  for (test::string_vec::const_iterator i = testvec.begin();
       i != testvec.end(); ++i) {
    if (i + 1 != testvec.end()) {
      os << teststr << '\n';
    }
  }
  // Check algorithms work.
  std::for_each(testvec.begin(), testvec.end(), test::printer<std::string>(os));
  std::string os_out = os.str();

  // Test pair and map.
  test::map_type testmap;
  testmap.insert(std::make_pair(std::string("key"),
                                std::make_pair(53,false)));

  // Test set.
  int values[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
  test::set_type testset(values, values + sizeof(values)/sizeof(values[0]));
  std::list<int> testlist(testset.begin(), testset.end());
  std::copy(testset.begin(), testset.end(), std::back_inserter(testlist));
} catch (const std::exception& e) {
  std::cerr << "Caught exception: " << e.what() << std::endl;

  // Test fstream
  std::ofstream of("test.txt");
  of << "Test ASCII text\n" << std::flush;
  of << "N= " << std::hex << std::setw(8) << std::left << 534 << std::endl;
  of.close();
}
std::exit(0);

  ;
  return 0;
}
_ACEOF
for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA
do
  CXX="$ac_save_CXX $ac_arg"
  if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_cv_prog_cxx_cxx98=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext
  test "x$ac_cv_prog_cxx_cxx98" != "xno" && break
done
rm -f conftest.$ac_ext
CXX=$ac_save_CXX

fi
# AC_CACHE_VAL
ac_prog_cxx_stdcxx_options=
case "x$ac_cv_prog_cxx_cxx98" in
  x)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; } ;;
  xno)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
$as_echo "unsupported" >&6; } ;;
  *)
    ac_prog_cxx_stdcxx_options=" $ac_cv_prog_cxx_cxx98"
    CXX=$CXX$ac_prog_cxx_stdcxx_options
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5
$as_echo "$ac_cv_prog_cxx_cxx98" >&6; } ;;
esac
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
if test "x$ac_cv_prog_cxx_cxx98" != xno; then :
  ac_prog_cxx_stdcxx=cxx98
		        ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98
else
  ac_prog_cxx_stdcxx=no
		        ac_cv_prog_cxx_stdcxx=no
fi

fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

depcc="$CXX"  am_compiler_list=

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
$as_echo_n "checking dependency style of $depcc... " >&6; }
if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
  # We make a subdir and do the tests there.  Otherwise we can end up
  # making bogus files that we don't know about and never remove.  For
  # instance it was reported that on HP-UX the gcc test will end up
  # making a dummy file named 'D' -- because '-MD' means "put the output
  # in D".
  rm -rf conftest.dir
  mkdir conftest.dir
  # Copy depcomp to subdir because otherwise we won't find it if we're
  # using a relative directory.
  cp "$am_depcomp" conftest.dir
  cd conftest.dir
  # We will build objects and dependencies in a subdirectory because
  # it helps to detect inapplicable dependency modes.  For instance
  # both Tru64's cc and ICC support -MD to output dependencies as a
  # side effect of compilation, but ICC will put the dependencies in
  # the current directory while Tru64 will put them in the object
  # directory.
  mkdir sub

  am_cv_CXX_dependencies_compiler_type=none
  if test "$am_compiler_list" = ""; then
     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
  fi
  am__universal=false
  case " $depcc " in #(
     *\ -arch\ *\ -arch\ *) am__universal=true ;;
     esac

  for depmode in $am_compiler_list; do
    # Setup a source with many dependencies, because some compilers
    # like to wrap large dependency lists on column 80 (with \), and
    # we should not choose a depcomp mode which is confused by this.
    #
    # We need to recreate these files for each test, as the compiler may
    # overwrite some of them when testing with obscure command lines.
    # This happens at least with the AIX C compiler.
    : > sub/conftest.c
    for i in 1 2 3 4 5 6; do
      echo '#include "conftst'$i'.h"' >> sub/conftest.c
      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
      # Solaris 10 /bin/sh.
      echo '/* dummy */' > sub/conftst$i.h
    done
    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf

    # We check with '-c' and '-o' for the sake of the "dashmstdout"
    # mode.  It turns out that the SunPro C++ compiler does not properly
    # handle '-M -o', and we need to detect this.  Also, some Intel
    # versions had trouble with output in subdirs.
    am__obj=sub/conftest.${OBJEXT-o}
    am__minus_obj="-o $am__obj"
    case $depmode in
    gcc)
      # This depmode causes a compiler race in universal mode.
      test "$am__universal" = false || continue
      ;;
    nosideeffect)
      # After this tag, mechanisms are not by side-effect, so they'll
      # only be used when explicitly requested.
      if test "x$enable_dependency_tracking" = xyes; then
	continue
      else
	break
      fi
      ;;
    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
      # This compiler won't grok '-c -o', but also, the minuso test has
      # not run yet.  These depmodes are late enough in the game, and
      # so weak that their functioning should not be impacted.
      am__obj=conftest.${OBJEXT-o}
      am__minus_obj=
      ;;
    none) break ;;
    esac
    if depmode=$depmode \
       source=sub/conftest.c object=$am__obj \
       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
         >/dev/null 2>conftest.err &&
       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
      # icc doesn't choke on unknown options, it will just issue warnings
      # or remarks (even with -Werror).  So we grep stderr for any message
      # that says an option was ignored or not supported.
      # When given -MP, icc 7.0 and 7.1 complain thusly:
      #   icc: Command line warning: ignoring option '-M'; no argument required
      # The diagnosis changed in icc 8.0:
      #   icc: Command line remark: option '-MP' not supported
      if (grep 'ignoring option' conftest.err ||
          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
        am_cv_CXX_dependencies_compiler_type=$depmode
        break
      fi
    fi
  done

  cd ..
  rm -rf conftest.dir
else
  am_cv_CXX_dependencies_compiler_type=none
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type

 if
  test "x$enable_dependency_tracking" != xno \
  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
  am__fastdepCXX_TRUE=
  am__fastdepCXX_FALSE='#'
else
  am__fastdepCXX_TRUE='#'
  am__fastdepCXX_FALSE=
fi



# Gnulib (early checks).

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
$as_echo_n "checking how to run the C preprocessor... " >&6; }
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
  CPP=
fi
if test -z "$CPP"; then
  if ${ac_cv_prog_CPP+:} false; then :
  $as_echo_n "(cached) " >&6
else
      # Double quotes because CPP needs to be expanded
    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
    do
      ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
  # <limits.h> exists even on freestanding compilers.
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp. "Syntax error" is here to catch this case.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
		     Syntax error
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :

else
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.i conftest.$ac_ext

  # OK, works on sane cases.  Now check whether nonexistent headers
  # can be detected and how.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  # Broken: success on invalid input.
continue
else
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.i conftest.$ac_ext

done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
  break
fi

    done
    ac_cv_prog_CPP=$CPP

fi
  CPP=$ac_cv_prog_CPP
else
  ac_cv_prog_CPP=$CPP
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
$as_echo "$CPP" >&6; }
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
  # <limits.h> exists even on freestanding compilers.
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp. "Syntax error" is here to catch this case.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
		     Syntax error
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :

else
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.i conftest.$ac_ext

  # OK, works on sane cases.  Now check whether nonexistent headers
  # can be detected and how.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  # Broken: success on invalid input.
continue
else
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.i conftest.$ac_ext

done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :

else
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
See \`config.log' for more details" "$LINENO" 5; }
fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
if ${ac_cv_path_GREP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$GREP"; then
  ac_path_GREP_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in grep ggrep; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
      as_fn_executable_p "$ac_path_GREP" || continue
# Check for GNU ac_path_GREP and select it if it is found.
  # Check for GNU $ac_path_GREP
case `"$ac_path_GREP" --version 2>&1` in
*GNU*)
  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
*)
  ac_count=0
  $as_echo_n 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    $as_echo 'GREP' >> "conftest.nl"
    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_GREP_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_GREP="$ac_path_GREP"
      ac_path_GREP_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_GREP_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_GREP"; then
    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
  fi
else
  ac_cv_path_GREP=$GREP
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
$as_echo "$ac_cv_path_GREP" >&6; }
 GREP="$ac_cv_path_GREP"


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
$as_echo_n "checking for egrep... " >&6; }
if ${ac_cv_path_EGREP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
   then ac_cv_path_EGREP="$GREP -E"
   else
     if test -z "$EGREP"; then
  ac_path_EGREP_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in egrep; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
      as_fn_executable_p "$ac_path_EGREP" || continue
# Check for GNU ac_path_EGREP and select it if it is found.
  # Check for GNU $ac_path_EGREP
case `"$ac_path_EGREP" --version 2>&1` in
*GNU*)
  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
*)
  ac_count=0
  $as_echo_n 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    $as_echo 'EGREP' >> "conftest.nl"
    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_EGREP="$ac_path_EGREP"
      ac_path_EGREP_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_EGREP_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_EGREP"; then
    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
  fi
else
  ac_cv_path_EGREP=$EGREP
fi

   fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
$as_echo "$ac_cv_path_EGREP" >&6; }
 EGREP="$ac_cv_path_EGREP"


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
if ${ac_cv_header_stdc+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <float.h>

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_header_stdc=yes
else
  ac_cv_header_stdc=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

if test $ac_cv_header_stdc = yes; then
  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <string.h>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "memchr" >/dev/null 2>&1; then :

else
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "free" >/dev/null 2>&1; then :

else
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
  if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ctype.h>
#include <stdlib.h>
#if ((' ' & 0x0FF) == 0x020)
# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#else
# define ISLOWER(c) \
		   (('a' <= (c) && (c) <= 'i') \
		     || ('j' <= (c) && (c) <= 'r') \
		     || ('s' <= (c) && (c) <= 'z'))
# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
#endif

#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int
main ()
{
  int i;
  for (i = 0; i < 256; i++)
    if (XOR (islower (i), ISLOWER (i))
	|| toupper (i) != TOUPPER (i))
      return 2;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :

else
  ac_cv_header_stdc=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
$as_echo "$ac_cv_header_stdc" >&6; }
if test $ac_cv_header_stdc = yes; then

$as_echo "#define STDC_HEADERS 1" >>confdefs.h

fi

# On IRIX 5.3, sys/types and inttypes.h are conflicting.
for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
		  inttypes.h stdint.h unistd.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

fi

done



  ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default"
if test "x$ac_cv_header_minix_config_h" = xyes; then :
  MINIX=yes
else
  MINIX=
fi


  if test "$MINIX" = yes; then

$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h


$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h


$as_echo "#define _MINIX 1" >>confdefs.h


$as_echo "#define _NETBSD_SOURCE 1" >>confdefs.h

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; }
if ${ac_cv_safe_to_define___extensions__+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#         define __EXTENSIONS__ 1
          $ac_includes_default
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_safe_to_define___extensions__=yes
else
  ac_cv_safe_to_define___extensions__=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
$as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
  test $ac_cv_safe_to_define___extensions__ = yes &&
    $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h

  $as_echo "#define _ALL_SOURCE 1" >>confdefs.h

  $as_echo "#define _DARWIN_C_SOURCE 1" >>confdefs.h

  $as_echo "#define _GNU_SOURCE 1" >>confdefs.h

  $as_echo "#define _NETBSD_SOURCE 1" >>confdefs.h

  $as_echo "#define _OPENBSD_SOURCE 1" >>confdefs.h

  $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h

  $as_echo "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h

  $as_echo "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h

  $as_echo "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h

  $as_echo "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h

  $as_echo "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h

  $as_echo "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h

  $as_echo "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h

  $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5
$as_echo_n "checking whether _XOPEN_SOURCE should be defined... " >&6; }
if ${ac_cv_should_define__xopen_source+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_should_define__xopen_source=no
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

          #include <wchar.h>
          mbstate_t x;
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

             #define _XOPEN_SOURCE 500
             #include <wchar.h>
             mbstate_t x;
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_should_define__xopen_source=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5
$as_echo "$ac_cv_should_define__xopen_source" >&6; }
  test $ac_cv_should_define__xopen_source = yes &&
    $as_echo "#define _XOPEN_SOURCE 500" >>confdefs.h

  $as_echo "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h











  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Minix Amsterdam compiler" >&5
$as_echo_n "checking for Minix Amsterdam compiler... " >&6; }
if ${gl_cv_c_amsterdam_compiler+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef __ACK__
Amsterdam
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Amsterdam" >/dev/null 2>&1; then :
  gl_cv_c_amsterdam_compiler=yes
else
  gl_cv_c_amsterdam_compiler=no
fi
rm -f conftest*


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_amsterdam_compiler" >&5
$as_echo "$gl_cv_c_amsterdam_compiler" >&6; }

      if test $gl_cv_c_amsterdam_compiler = yes; then
    if test -z "$AR"; then
      AR='cc -c.a'
    fi
    if test -z "$ARFLAGS"; then
      ARFLAGS='-o'
    fi
  else
                                                :
  fi

        if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
set dummy ${ac_tool_prefix}ar; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_AR+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_AR="${ac_tool_prefix}ar"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
AR=$ac_cv_prog_AR
if test -n "$AR"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
$as_echo "$AR" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_AR"; then
  ac_ct_AR=$AR
  # Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_AR+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_AR"; then
  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_AR="ar"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_AR=$ac_cv_prog_ac_ct_AR
if test -n "$ac_ct_AR"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
$as_echo "$ac_ct_AR" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_AR" = x; then
    AR="ar"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    AR=$ac_ct_AR
  fi
else
  AR="$ac_cv_prog_AR"
fi

  if test -z "$ARFLAGS"; then
    ARFLAGS='cr'
  fi



  if test -z "$RANLIB"; then
    if test $gl_cv_c_amsterdam_compiler = yes; then
      RANLIB=':'
    else
            if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_RANLIB+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
RANLIB=$ac_cv_prog_RANLIB
if test -n "$RANLIB"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
$as_echo "$RANLIB" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_RANLIB"; then
  ac_ct_RANLIB=$RANLIB
  # Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_RANLIB"; then
  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_RANLIB="ranlib"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
if test -n "$ac_ct_RANLIB"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
$as_echo "$ac_ct_RANLIB" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_RANLIB" = x; then
    RANLIB=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    RANLIB=$ac_ct_RANLIB
  fi
else
  RANLIB="$ac_cv_prog_RANLIB"
fi

    fi
  fi



# Make sure we can run config.sub.
$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
$as_echo_n "checking build system type... " >&6; }
if ${ac_cv_build+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
test "x$ac_build_alias" = x &&
  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
$as_echo "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
esac
build=$ac_cv_build
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_build
shift
build_cpu=$1
build_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
build_os=$*
IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
$as_echo_n "checking host system type... " >&6; }
if ${ac_cv_host+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "x$host_alias" = x; then
  ac_cv_host=$ac_cv_build
else
  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
$as_echo "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
esac
host=$ac_cv_host
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_host
shift
host_cpu=$1
host_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
host_os=$*
IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac





  # IEEE behaviour is the default on all CPUs except Alpha and SH
  # (according to the test results of Bruno Haible's ieeefp/fenv_default.m4
  # and the GCC 4.1.2 manual).
  case "$host_cpu" in
    alpha*)
      # On Alpha systems, a compiler option provides the behaviour.
      # See the ieee(3) manual page, also available at
      # <https://backdrift.org/man/tru64/man3/ieee.3.html>
      if test -n "$GCC"; then
        # GCC has the option -mieee.
        # For full IEEE compliance (rarely needed), use option -mieee-with-inexact.
        CPPFLAGS="$CPPFLAGS -mieee"
      else
        # Compaq (ex-DEC) C has the option -ieee, equivalent to -ieee_with_no_inexact.
        # For full IEEE compliance (rarely needed), use option -ieee_with_inexact.
        CPPFLAGS="$CPPFLAGS -ieee"
      fi
      ;;
    sh*)
      if test -n "$GCC"; then
        # GCC has the option -mieee.
        CPPFLAGS="$CPPFLAGS -mieee"
      fi
      ;;
  esac

# Check whether --enable-largefile was given.
if test "${enable_largefile+set}" = set; then :
  enableval=$enable_largefile;
fi

if test "$enable_largefile" != no; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
if ${ac_cv_sys_largefile_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_sys_largefile_CC=no
     if test "$GCC" != yes; then
       ac_save_CC=$CC
       while :; do
         # IRIX 6.2 and later do not support large files by default,
         # so use the C compiler's -n32 option if that helps.
         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
 /* Check that off_t can represent 2**63 - 1 correctly.
    We can't simply define LARGE_OFF_T to be 9223372036854775807,
    since some C++ compilers masquerading as C compilers
    incorrectly reject 9223372036854775807.  */
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
                       && LARGE_OFF_T % 2147483647 == 1)
                      ? 1 : -1];
int
main ()
{

  ;
  return 0;
}
_ACEOF
         if ac_fn_c_try_compile "$LINENO"; then :
  break
fi
rm -f core conftest.err conftest.$ac_objext
         CC="$CC -n32"
         if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_sys_largefile_CC=' -n32'; break
fi
rm -f core conftest.err conftest.$ac_objext
         break
       done
       CC=$ac_save_CC
       rm -f conftest.$ac_ext
    fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
$as_echo "$ac_cv_sys_largefile_CC" >&6; }
  if test "$ac_cv_sys_largefile_CC" != no; then
    CC=$CC$ac_cv_sys_largefile_CC
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
if ${ac_cv_sys_file_offset_bits+:} false; then :
  $as_echo_n "(cached) " >&6
else
  while :; do
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
 /* Check that off_t can represent 2**63 - 1 correctly.
    We can't simply define LARGE_OFF_T to be 9223372036854775807,
    since some C++ compilers masquerading as C compilers
    incorrectly reject 9223372036854775807.  */
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
                       && LARGE_OFF_T % 2147483647 == 1)
                      ? 1 : -1];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_sys_file_offset_bits=no; break
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#define _FILE_OFFSET_BITS 64
#include <sys/types.h>
 /* Check that off_t can represent 2**63 - 1 correctly.
    We can't simply define LARGE_OFF_T to be 9223372036854775807,
    since some C++ compilers masquerading as C compilers
    incorrectly reject 9223372036854775807.  */
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
                       && LARGE_OFF_T % 2147483647 == 1)
                      ? 1 : -1];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_sys_file_offset_bits=64; break
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  ac_cv_sys_file_offset_bits=unknown
  break
done
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
case $ac_cv_sys_file_offset_bits in #(
  no | unknown) ;;
  *)
cat >>confdefs.h <<_ACEOF
#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
_ACEOF
;;
esac
rm -rf conftest*
  if test $ac_cv_sys_file_offset_bits = unknown; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
if ${ac_cv_sys_large_files+:} false; then :
  $as_echo_n "(cached) " >&6
else
  while :; do
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
 /* Check that off_t can represent 2**63 - 1 correctly.
    We can't simply define LARGE_OFF_T to be 9223372036854775807,
    since some C++ compilers masquerading as C compilers
    incorrectly reject 9223372036854775807.  */
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
                       && LARGE_OFF_T % 2147483647 == 1)
                      ? 1 : -1];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_sys_large_files=no; break
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#define _LARGE_FILES 1
#include <sys/types.h>
 /* Check that off_t can represent 2**63 - 1 correctly.
    We can't simply define LARGE_OFF_T to be 9223372036854775807,
    since some C++ compilers masquerading as C compilers
    incorrectly reject 9223372036854775807.  */
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
                       && LARGE_OFF_T % 2147483647 == 1)
                      ? 1 : -1];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_sys_large_files=1; break
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  ac_cv_sys_large_files=unknown
  break
done
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
$as_echo "$ac_cv_sys_large_files" >&6; }
case $ac_cv_sys_large_files in #(
  no | unknown) ;;
  *)
cat >>confdefs.h <<_ACEOF
#define _LARGE_FILES $ac_cv_sys_large_files
_ACEOF
;;
esac
rm -rf conftest*
  fi


$as_echo "#define _DARWIN_USE_64_BIT_INODE 1" >>confdefs.h

fi







  # Check whether --enable-threads was given.
if test "${enable_threads+set}" = set; then :
  enableval=$enable_threads; gl_use_threads=$enableval
else
  if test -n "$gl_use_threads_default"; then
       gl_use_threads="$gl_use_threads_default"
     else
       case "$host_os" in
                                    osf*) gl_use_threads=no ;;
                                    cygwin*)
               case `uname -r` in
                 1.[0-5].*) gl_use_threads=no ;;
                 *)         gl_use_threads=yes ;;
               esac
               ;;
                  mingw*)
               case "$gl_use_winpthreads_default" in
                 yes) gl_use_threads=posix ;;
                 no)  gl_use_threads=windows ;;
                 *)   gl_use_threads=yes ;;
               esac
               ;;
         *)    gl_use_threads=yes ;;
       esac
     fi

fi

  if test "$gl_use_threads" = yes \
     || test "$gl_use_threads" = isoc \
     || test "$gl_use_threads" = posix \
     || test "$gl_use_threads" = isoc+posix; then
    # For using <threads.h> or <pthread.h>:


  if test -z "$gl_anythreadlib_early_done"; then
    case "$host_os" in
      osf*)
        # On OSF/1, the compiler needs the flag -D_REENTRANT so that it
        # groks <pthread.h>. cc also understands the flag -pthread, but
        # we don't use it because 1. gcc-2.95 doesn't understand -pthread,
        # 2. putting a flag into CPPFLAGS that has an effect on the linker
        # causes the AC_LINK_IFELSE test below to succeed unexpectedly,
        # leading to wrong values of LIBTHREAD and LTLIBTHREAD.
        CPPFLAGS="$CPPFLAGS -D_REENTRANT"
        ;;
    esac
    # Some systems optimize for single-threaded programs by default, and
    # need special flags to disable these optimizations. For example, the
    # definition of 'errno' in <errno.h>.
    case "$host_os" in
      aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
      solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
    esac
    gl_anythreadlib_early_done=done
  fi

  fi



  # Pre-early section.




  # Code from module absolute-header:
  # Code from module alignof:
  # Code from module alloca-opt:
  # Code from module allocator:
  # Code from module announce-gen:
  # Code from module areadlink:
  # Code from module argmatch:
  # Code from module array-list:
  # Code from module assert:
  # Code from module assure:
  # Code from module binary-io:
  # Code from module bitrotate:
  # Code from module bitset:
  # Code from module bitsetv:
  # Code from module c-ctype:
  # Code from module c-strcase:
  # Code from module c-strcaseeq:
  # Code from module c99:
  # Code from module calloc-posix:
  # Code from module canonicalize-lgpl:
  # Code from module careadlinkat:
  # Code from module chdir:
  # Code from module clock-time:
  # Code from module cloexec:
  # Code from module close:
  # Code from module close-stream:
  # Code from module closeout:
  # Code from module concat-filename:
  # Code from module config-h:
  # Code from module configmake:
  # Code from module diffseq:
  # Code from module dirname:
  # Code from module dirname-lgpl:
  # Code from module do-release-commit-and-tag:
  # Code from module dosname:
  # Code from module double-slash-root:
  # Code from module dup2:
  # Code from module environ:
  # Code from module errno:
  # Code from module error:
  # Code from module exitfail:
  # Code from module extensions:
  # Code from module extern-inline:
  # Code from module fatal-signal:
  # Code from module fcntl:
  # Code from module fcntl-h:
  # Code from module fd-hook:
  # Code from module fd-safer-flag:
  # Code from module fdl:
  # Code from module filename:
  # Code from module float:
  # Code from module fopen:
  # Code from module fopen-safer:
  # Code from module fpending:
  # Code from module fpieee:

  # Code from module fprintf-posix:
  # Code from module fpucw:
  # Code from module frexp-nolibm:
  # Code from module frexpl-nolibm:
  # Code from module fseterr:
  # Code from module fstat:
  # Code from module fstrcmp:
  # Code from module fsync:
  # Code from module gendocs:
  # Code from module getdtablesize:
  # Code from module gethrxtime:
  # Code from module getopt-gnu:
  # Code from module getopt-posix:
  # Code from module getprogname:
  # Code from module getrusage:
  # Code from module gettext-h:
  # Code from module gettime:
  # Code from module gettimeofday:
  # Code from module git-version-gen:
  # Code from module gitlog-to-changelog:
  # Code from module gnu-web-doc-update:
  # Code from module gnumakefile:
  # Code from module gnupload:
  # Code from module gpl-3.0:
  # Code from module hard-locale:
  # Code from module hash:
  # Code from module havelib:
  # Code from module include_next:
  # Code from module intprops:
  # Code from module inttypes:
  # Code from module inttypes-incomplete:
  # Code from module isnan:
  # Code from module isnand:
  # Code from module isnand-nolibm:
  # Code from module isnanf:
  # Code from module isnanf-nolibm:
  # Code from module isnanl:
  # Code from module isnanl-nolibm:
  # Code from module iswblank:
  # Code from module javacomp-script:
  # Code from module javaexec-script:
  # Code from module largefile:

  # Code from module ldexp:
  # Code from module ldexpl:
  # Code from module libc-config:
  # Code from module libtextstyle:
  # Code from module libtextstyle-optional:
  # Code from module limits-h:
  # Code from module list:
  # Code from module localcharset:
  # Code from module localtime-buffer:
  # Code from module lock:
  # Code from module lstat:
  # Code from module maintainer-makefile:
  # Code from module malloc-gnu:
  # Code from module malloc-posix:
  # Code from module malloca:
  # Code from module math:
  # Code from module mbchar:
  # Code from module mbfile:
  # Code from module mbrtowc:
  # Code from module mbsinit:
  # Code from module mbswidth:
  # Code from module memchr:
  # Code from module minmax:
  # Code from module msvc-inval:
  # Code from module msvc-nothrow:
  # Code from module multiarch:
  # Code from module nocrash:
  # Code from module non-recursive-gnulib-prefix-hack:
  # Code from module obstack:
  # Code from module obstack-printf:
  # Code from module open:
  # Code from module pathmax:
  # Code from module perror:
  # Code from module pipe2:
  # Code from module pipe2-safer:
  # Code from module posix_spawn-internal:
  # Code from module posix_spawn_file_actions_addclose:
  # Code from module posix_spawn_file_actions_adddup2:
  # Code from module posix_spawn_file_actions_addopen:
  # Code from module posix_spawn_file_actions_destroy:
  # Code from module posix_spawn_file_actions_init:
  # Code from module posix_spawnattr_destroy:
  # Code from module posix_spawnattr_init:
  # Code from module posix_spawnattr_setflags:
  # Code from module posix_spawnattr_setsigmask:
  # Code from module posix_spawnp:
  # Code from module printf-frexp:
  # Code from module printf-frexpl:
  # Code from module printf-posix:
  # Code from module printf-safe:
  # Code from module progname:
  # Code from module quote:
  # Code from module quotearg:
  # Code from module quotearg-simple:
  # Code from module raise:
  # Code from module rawmemchr:
  # Code from module readlink:
  # Code from module readme-release:
  # Code from module realloc-posix:
  # Code from module relocatable-prog:
  # Code from module relocatable-prog-wrapper:
  # Code from module relocatable-script:
  # Code from module rename:
  # Code from module rmdir:
  # Code from module same-inode:
  # Code from module sched:
  # Code from module sh-filename:
  # Code from module sigaction:
  # Code from module signal-h:
  # Code from module signbit:
  # Code from module sigprocmask:
  # Code from module size_max:
  # Code from module snippet/_Noreturn:
  # Code from module snippet/arg-nonnull:
  # Code from module snippet/c++defs:
  # Code from module snippet/warn-on-use:
  # Code from module snprintf:
  # Code from module snprintf-posix:
  # Code from module spawn:
  # Code from module spawn-pipe:
  # Code from module sprintf-posix:
  # Code from module ssize_t:
  # Code from module stat:
  # Code from module stat-time:
  # Code from module std-gnu11:
  # Code from module stdbool:
  # Code from module stddef:
  # Code from module stdint:
  # Code from module stdio:
  # Code from module stdlib:
  # Code from module stpcpy:
  # Code from module strchrnul:
  # Code from module strdup-posix:
  # Code from module streq:
  # Code from module strerror:
  # Code from module strerror-override:
  # Code from module strerror_r-posix:
  # Code from module string:
  # Code from module strndup:
  # Code from module strnlen:
  # Code from module strverscmp:
  # Code from module sys_resource:
  # Code from module sys_stat:
  # Code from module sys_time:
  # Code from module sys_times:
  # Code from module sys_types:
  # Code from module sys_wait:
  # Code from module threadlib:



  # Code from module time:
  # Code from module timespec:
  # Code from module timevar:
  # Code from module tls:
  # Code from module unistd:
  # Code from module unistd-safer:
  # Code from module unitypes:
  # Code from module uniwidth/base:
  # Code from module uniwidth/width:
  # Code from module unlink:
  # Code from module unlocked-io:
  # Code from module unsetenv:
  # Code from module update-copyright:
  # Code from module useless-if-before-free:
  # Code from module vasnprintf:
  # Code from module vasprintf:
  # Code from module vasprintf-posix:
  # Code from module vc-list-files:
  # Code from module verify:
  # Code from module vfprintf-posix:
  # Code from module vsnprintf:
  # Code from module vsnprintf-posix:
  # Code from module vsprintf-posix:
  # Code from module wait-process:
  # Code from module waitpid:
  # Code from module warnings:
  # Code from module wchar:
  # Code from module wctype-h:
  # Code from module wcwidth:
  # Code from module windows-mutex:
  # Code from module windows-once:
  # Code from module windows-recmutex:
  # Code from module windows-rwlock:
  # Code from module windows-tls:
  # Code from module winsz-ioctl:
  # Code from module winsz-termios:
  # Code from module xalloc:
  # Code from module xalloc-die:
  # Code from module xalloc-oversized:
  # Code from module xconcat-filename:
  # Code from module xhash:
  # Code from module xlist:
  # Code from module xmemdup0:
  # Code from module xreadlink:
  # Code from module xsize:
  # Code from module xstrndup:


# Gnulib uses '#pragma GCC diagnostic push' to silence some
# warnings, but older gcc doesn't support this.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pragma GCC diagnostic push works" >&5
$as_echo_n "checking whether pragma GCC diagnostic push works... " >&6; }
if ${lv_cv_gcc_pragma_push_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

  save_CFLAGS=$CFLAGS
  CFLAGS='-Wunknown-pragmas -Werror'
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

    #pragma GCC diagnostic push
    #pragma GCC diagnostic pop

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  lv_cv_gcc_pragma_push_works=yes
else
  lv_cv_gcc_pragma_push_works=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CFLAGS=$save_CFLAGS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lv_cv_gcc_pragma_push_works" >&5
$as_echo "$lv_cv_gcc_pragma_push_works" >&6; }

ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu



  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Werror -Wunknown-warning-option" >&5
$as_echo_n "checking whether C++ compiler handles -Werror -Wunknown-warning-option... " >&6; }
if ${gl_cv_warn_cxx__Werror__Wunknown_warning_option+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CXXFLAGS"
  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Werror -Wunknown-warning-option"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  gl_cv_warn_cxx__Werror__Wunknown_warning_option=yes
else
  gl_cv_warn_cxx__Werror__Wunknown_warning_option=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS="$gl_save_compiler_FLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Werror__Wunknown_warning_option" >&5
$as_echo "$gl_cv_warn_cxx__Werror__Wunknown_warning_option" >&6; }
if test "x$gl_cv_warn_cxx__Werror__Wunknown_warning_option" = xyes; then :
  gl_unknown_warnings_are_errors='-Wunknown-warning-option -Werror'
else
  gl_unknown_warnings_are_errors=
fi

  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu




{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -fno-exceptions" >&5
$as_echo_n "checking whether C++ compiler handles -fno-exceptions... " >&6; }
if ${gl_cv_warn_cxx__fno_exceptions+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CXXFLAGS"
  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -fno-exceptions"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  gl_cv_warn_cxx__fno_exceptions=yes
else
  gl_cv_warn_cxx__fno_exceptions=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS="$gl_save_compiler_FLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__fno_exceptions" >&5
$as_echo "$gl_cv_warn_cxx__fno_exceptions" >&6; }
if test "x$gl_cv_warn_cxx__fno_exceptions" = xyes; then :
  as_fn_append NO_EXCEPTIONS_CXXFLAGS " -fno-exceptions"
fi



ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

for f in '-std=c++98' '-std=c++98 -stdlib=libc++'
do
  as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$f" | $as_tr_sh`
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
$as_echo_n "checking whether C++ compiler accepts $f... " >&6; }
if eval \${$as_CACHEVAR+:} false; then :
  $as_echo_n "(cached) " >&6
else

  ax_check_save_flags=$CXXFLAGS
  CXXFLAGS="$CXXFLAGS  $f"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <vector>

typedef std::vector<int> ints;


int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  eval "$as_CACHEVAR=yes"
else
  eval "$as_CACHEVAR=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
  CXX98_CXXFLAGS=$f
 break
fi

done
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu



ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

for f in '-std=c++03' '-std=c++03 -stdlib=libc++'
do
  as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$f" | $as_tr_sh`
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
$as_echo_n "checking whether C++ compiler accepts $f... " >&6; }
if eval \${$as_CACHEVAR+:} false; then :
  $as_echo_n "(cached) " >&6
else

  ax_check_save_flags=$CXXFLAGS
  CXXFLAGS="$CXXFLAGS  $f"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <vector>

typedef std::vector<int> ints;



int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  eval "$as_CACHEVAR=yes"
else
  eval "$as_CACHEVAR=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
  CXX03_CXXFLAGS=$f
 break
fi

done
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu



ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

for f in '-std=c++11' '-std=c++11 -stdlib=libc++'
do
  as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$f" | $as_tr_sh`
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
$as_echo_n "checking whether C++ compiler accepts $f... " >&6; }
if eval \${$as_CACHEVAR+:} false; then :
  $as_echo_n "(cached) " >&6
else

  ax_check_save_flags=$CXXFLAGS
  CXXFLAGS="$CXXFLAGS  $f"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <vector>

typedef std::vector<int> ints;


#include <algorithm>
#include <memory>
#include <set>
#include <sstream>
#include <string>

  // C++11
  template <typename T>
  struct check
  {
    static_assert(sizeof(int) <= sizeof(T), "not big enough");
  };

  using right_angle_brackets = check<check<bool>>;

  auto f = std::make_shared<std::string>("shared_ptr");

  int a;
  decltype(a) b;

  typedef check<int> check_type;
  check_type c;
  check_type&& cr = static_cast<check_type&&>(c);

  auto d = a;

  // Some versions of libstdc++ do not support std::set::emplace.
  void foo()
  {
    std::set<int> is;
    is.emplace(42);
  }

  // Clang++ 3.5, for a while, was unable to process properly
  // the for-loop because its variable, r, is a typedef...
  // It failed as follows:
  //
  // error: unexpected ':' in nested name specifier; did you mean '::'?
  //    for (auto r: std::set<int>{1, 2})
  //               ^
  //               ::
  using r = std::set<int>;
  void bar()
  {
    for (int r: std::set<int>{1, 2})
      continue;
  }

  // GCC 4.8.2 on Solaris 11.3 does not support to_string.
  auto e = std::to_string(42);


int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  eval "$as_CACHEVAR=yes"
else
  eval "$as_CACHEVAR=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
  CXX11_CXXFLAGS=$f
 break
fi

done
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu



ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

for f in '-std=c++14' '-std=c++14 -stdlib=libc++'
do
  as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$f" | $as_tr_sh`
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
$as_echo_n "checking whether C++ compiler accepts $f... " >&6; }
if eval \${$as_CACHEVAR+:} false; then :
  $as_echo_n "(cached) " >&6
else

  ax_check_save_flags=$CXXFLAGS
  CXXFLAGS="$CXXFLAGS  $f"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <vector>

typedef std::vector<int> ints;


#include <algorithm>
#include <memory>
#include <set>
#include <sstream>
#include <string>

  // C++11
  template <typename T>
  struct check
  {
    static_assert(sizeof(int) <= sizeof(T), "not big enough");
  };

  using right_angle_brackets = check<check<bool>>;

  auto f = std::make_shared<std::string>("shared_ptr");

  int a;
  decltype(a) b;

  typedef check<int> check_type;
  check_type c;
  check_type&& cr = static_cast<check_type&&>(c);

  auto d = a;

  // Some versions of libstdc++ do not support std::set::emplace.
  void foo()
  {
    std::set<int> is;
    is.emplace(42);
  }

  // Clang++ 3.5, for a while, was unable to process properly
  // the for-loop because its variable, r, is a typedef...
  // It failed as follows:
  //
  // error: unexpected ':' in nested name specifier; did you mean '::'?
  //    for (auto r: std::set<int>{1, 2})
  //               ^
  //               ::
  using r = std::set<int>;
  void bar()
  {
    for (int r: std::set<int>{1, 2})
      continue;
  }

  // GCC 4.8.2 on Solaris 11.3 does not support to_string.
  auto e = std::to_string(42);

  // C++14
  void mismatch()
  {
    using ints = std::vector<int>;
    auto v1 = ints{1, 2, 3};
    auto v2 = ints{1, 2};
    std::mismatch(std::begin(v1), std::end(v1),
                  std::begin(v2), std::end(v2));
  }


int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  eval "$as_CACHEVAR=yes"
else
  eval "$as_CACHEVAR=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
  CXX14_CXXFLAGS=$f
 break
fi

done
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu



ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

for f in '-std=c++17' '-std=c++17 -stdlib=libc++'
do
  as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$f" | $as_tr_sh`
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
$as_echo_n "checking whether C++ compiler accepts $f... " >&6; }
if eval \${$as_CACHEVAR+:} false; then :
  $as_echo_n "(cached) " >&6
else

  ax_check_save_flags=$CXXFLAGS
  CXXFLAGS="$CXXFLAGS  $f"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <vector>

typedef std::vector<int> ints;


#include <algorithm>
#include <memory>
#include <set>
#include <sstream>
#include <string>

  // C++11
  template <typename T>
  struct check
  {
    static_assert(sizeof(int) <= sizeof(T), "not big enough");
  };

  using right_angle_brackets = check<check<bool>>;

  auto f = std::make_shared<std::string>("shared_ptr");

  int a;
  decltype(a) b;

  typedef check<int> check_type;
  check_type c;
  check_type&& cr = static_cast<check_type&&>(c);

  auto d = a;

  // Some versions of libstdc++ do not support std::set::emplace.
  void foo()
  {
    std::set<int> is;
    is.emplace(42);
  }

  // Clang++ 3.5, for a while, was unable to process properly
  // the for-loop because its variable, r, is a typedef...
  // It failed as follows:
  //
  // error: unexpected ':' in nested name specifier; did you mean '::'?
  //    for (auto r: std::set<int>{1, 2})
  //               ^
  //               ::
  using r = std::set<int>;
  void bar()
  {
    for (int r: std::set<int>{1, 2})
      continue;
  }

  // GCC 4.8.2 on Solaris 11.3 does not support to_string.
  auto e = std::to_string(42);

  // C++14
  void mismatch()
  {
    using ints = std::vector<int>;
    auto v1 = ints{1, 2, 3};
    auto v2 = ints{1, 2};
    std::mismatch(std::begin(v1), std::end(v1),
                  std::begin(v2), std::end(v2));
  }

  // C++17
  namespace ns1::ns2::ns3 {}

#include <optional>
  auto opt_string = std::optional<std::string>{};
  auto out = std::ostringstream{};


int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  eval "$as_CACHEVAR=yes"
else
  eval "$as_CACHEVAR=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
  CXX17_CXXFLAGS=$f
 break
fi

done
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu



ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

for f in '-std=c++2a' '-std=c++2a -stdlib=libc++'
do
  as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$f" | $as_tr_sh`
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $f" >&5
$as_echo_n "checking whether C++ compiler accepts $f... " >&6; }
if eval \${$as_CACHEVAR+:} false; then :
  $as_echo_n "(cached) " >&6
else

  ax_check_save_flags=$CXXFLAGS
  CXXFLAGS="$CXXFLAGS  $f"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <vector>

typedef std::vector<int> ints;


#include <algorithm>
#include <memory>
#include <set>
#include <sstream>
#include <string>

  // C++11
  template <typename T>
  struct check
  {
    static_assert(sizeof(int) <= sizeof(T), "not big enough");
  };

  using right_angle_brackets = check<check<bool>>;

  auto f = std::make_shared<std::string>("shared_ptr");

  int a;
  decltype(a) b;

  typedef check<int> check_type;
  check_type c;
  check_type&& cr = static_cast<check_type&&>(c);

  auto d = a;

  // Some versions of libstdc++ do not support std::set::emplace.
  void foo()
  {
    std::set<int> is;
    is.emplace(42);
  }

  // Clang++ 3.5, for a while, was unable to process properly
  // the for-loop because its variable, r, is a typedef...
  // It failed as follows:
  //
  // error: unexpected ':' in nested name specifier; did you mean '::'?
  //    for (auto r: std::set<int>{1, 2})
  //               ^
  //               ::
  using r = std::set<int>;
  void bar()
  {
    for (int r: std::set<int>{1, 2})
      continue;
  }

  // GCC 4.8.2 on Solaris 11.3 does not support to_string.
  auto e = std::to_string(42);

  // C++14
  void mismatch()
  {
    using ints = std::vector<int>;
    auto v1 = ints{1, 2, 3};
    auto v2 = ints{1, 2};
    std::mismatch(std::begin(v1), std::end(v1),
                  std::begin(v2), std::end(v2));
  }

  // C++17
  namespace ns1::ns2::ns3 {}

#include <optional>
  auto opt_string = std::optional<std::string>{};
  auto out = std::ostringstream{};

  // C++2A


int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  eval "$as_CACHEVAR=yes"
else
  eval "$as_CACHEVAR=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS=$ax_check_save_flags
fi
eval ac_res=\$$as_CACHEVAR
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
  CXX2A_CXXFLAGS=$f
 break
fi

done
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu


 if test x"$CXX11_CXXFLAGS" != x; then
  ENABLE_CXX11_TRUE=
  ENABLE_CXX11_FALSE='#'
else
  ENABLE_CXX11_TRUE='#'
  ENABLE_CXX11_FALSE=
fi

 if test x"$CXX14_CXXFLAGS" != x; then
  ENABLE_CXX14_TRUE=
  ENABLE_CXX14_FALSE='#'
else
  ENABLE_CXX14_TRUE='#'
  ENABLE_CXX14_FALSE=
fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


# Check whether --enable-gcc-warnings was given.
if test "${enable_gcc_warnings+set}" = set; then :
  enableval=$enable_gcc_warnings; case $enable_gcc_warnings in
   yes|no) ;;
   *)  as_fn_error $? "invalid value for --gcc-warnings: $enable_gcc_warnings" "$LINENO" 5;;
 esac
else
  enable_gcc_warnings=no
fi

 if test "$enable_gcc_warnings" = yes; then
  ENABLE_GCC_WARNINGS_TRUE=
  ENABLE_GCC_WARNINGS_FALSE='#'
else
  ENABLE_GCC_WARNINGS_TRUE='#'
  ENABLE_GCC_WARNINGS_FALSE=
fi

if test "$enable_gcc_warnings" = yes; then
  # -Wno-tautological-constant-out-of-range-compare for Clang 3.3 and
  # 3.4 on GNU/Linux that choke on intprops.h's INT_MULTIPLY_WRAPV,
  # etc.
  warn_common='-Wall -Wextra -Wcast-align
    -fparse-all-comments -Wdocumentation
    -Wformat -Wimplicit-fallthrough -Wnull-dereference
    -Wno-sign-compare -Wno-tautological-constant-out-of-range-compare
    -Wpointer-arith -Wshadow
    -Wwrite-strings'
  warn_c='-Wbad-function-cast -Wstrict-prototypes'
  warn_cxx='-Wextra-semi -Wnoexcept -Wold-style-cast -Wundefined-func-template
    -Wweak-vtables'
  # Warnings for the test suite only.
  #
  # -fno-color-diagnostics: Clang's use of colors in the error
  # messages is confusing the tests looking at the compiler's output
  # (e.g., synclines.at).
  #
  # -Wno-keyword-macro: We use the "#define private public" dirty
  # trick in the test suite to check some private implementation
  # details for lalr1.cc.
  warn_tests='-Wundef -pedantic -Wconversion
    -Wdeprecated -Wsign-compare -Wsign-conversion
    -Wtautological-constant-out-of-range-compare
    -fno-color-diagnostics
    -Wno-keyword-macro'


  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

  # Clang supports many of GCC's -W options, but only issues warnings
  # on the ones it does not recognize.  In that case, gl_WARN_ADD
  # thinks the option is supported, and unknown options are then added
  # to CFLAGS.  But then, when -Werror is added in the test suite for
  # instance, the warning about the unknown option turns into an
  # error.
  #
  # This should be addressed by gnulib's gl_WARN_ADD, but in the
  # meanwhile, turn warnings about unknown options into errors in
  # CFLAGS, and restore CFLAGS after the tests.
  save_CFLAGS=$CFLAGS

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror -Wunknown-warning-option" >&5
$as_echo_n "checking whether C compiler handles -Werror -Wunknown-warning-option... " >&6; }
if ${gl_cv_warn_c__Werror__Wunknown_warning_option+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CFLAGS"
  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Werror -Wunknown-warning-option"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_warn_c__Werror__Wunknown_warning_option=yes
else
  gl_cv_warn_c__Werror__Wunknown_warning_option=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CFLAGS="$gl_save_compiler_FLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Werror__Wunknown_warning_option" >&5
$as_echo "$gl_cv_warn_c__Werror__Wunknown_warning_option" >&6; }
if test "x$gl_cv_warn_c__Werror__Wunknown_warning_option" = xyes; then :
  gl_unknown_warnings_are_errors='-Wunknown-warning-option -Werror'
else
  gl_unknown_warnings_are_errors=
fi

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu




{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror=unknown-warning-option" >&5
$as_echo_n "checking whether C compiler handles -Werror=unknown-warning-option... " >&6; }
if ${gl_cv_warn_c__Werror_unknown_warning_option+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CFLAGS"
  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Werror=unknown-warning-option"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_warn_c__Werror_unknown_warning_option=yes
else
  gl_cv_warn_c__Werror_unknown_warning_option=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CFLAGS="$gl_save_compiler_FLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Werror_unknown_warning_option" >&5
$as_echo "$gl_cv_warn_c__Werror_unknown_warning_option" >&6; }
if test "x$gl_cv_warn_c__Werror_unknown_warning_option" = xyes; then :
  as_fn_append CFLAGS " -Werror=unknown-warning-option"
fi


  # Accept this warning only if it is not too touchy (e.g., clang 3.3
  # and 3.4).


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Wunreachable-code" >&5
$as_echo_n "checking whether C compiler handles -Wunreachable-code... " >&6; }
if ${gl_cv_warn_c__Wunreachable_code+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CFLAGS"
  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Wunreachable-code"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
if (sizeof (long) < sizeof (int)) return 1;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_warn_c__Wunreachable_code=yes
else
  gl_cv_warn_c__Wunreachable_code=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CFLAGS="$gl_save_compiler_FLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Wunreachable_code" >&5
$as_echo "$gl_cv_warn_c__Wunreachable_code" >&6; }
if test "x$gl_cv_warn_c__Wunreachable_code" = xyes; then :
  as_fn_append WARN_CFLAGS " -Wunreachable-code"
fi


  for i in $warn_common $warn_c;
  do


as_gl_Warn=`$as_echo "gl_cv_warn_c_$i" | $as_tr_sh`
gl_positive="$i"
case $gl_positive in
  -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles $i" >&5
$as_echo_n "checking whether C compiler handles $i... " >&6; }
if eval \${$as_gl_Warn+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CFLAGS"
  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors $gl_positive"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  eval "$as_gl_Warn=yes"
else
  eval "$as_gl_Warn=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CFLAGS="$gl_save_compiler_FLAGS"

fi
eval ac_res=\$$as_gl_Warn
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
if eval test \"x\$"$as_gl_Warn"\" = x"yes"; then :
  as_fn_append WARN_CFLAGS " $i"
fi


  done


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror" >&5
$as_echo_n "checking whether C compiler handles -Werror... " >&6; }
if ${gl_cv_warn_c__Werror+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CFLAGS"
  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Werror"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_warn_c__Werror=yes
else
  gl_cv_warn_c__Werror=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CFLAGS="$gl_save_compiler_FLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Werror" >&5
$as_echo "$gl_cv_warn_c__Werror" >&6; }
if test "x$gl_cv_warn_c__Werror" = xyes; then :
  as_fn_append WERROR_CFLAGS " -Werror"
fi



  # Warnings for the test suite, and maybe for bison if GCC is modern
  # enough.
  test $lv_cv_gcc_pragma_push_works = yes &&
    as_fn_append WARN_CFLAGS " $WARN_CFLAGS_TEST"

  # Warnings for the test suite only.
  for i in $warn_tests -Wincompatible-pointer-types;
  do


as_gl_Warn=`$as_echo "gl_cv_warn_c_$i" | $as_tr_sh`
gl_positive="$i"
case $gl_positive in
  -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles $i" >&5
$as_echo_n "checking whether C compiler handles $i... " >&6; }
if eval \${$as_gl_Warn+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CFLAGS"
  as_fn_append CFLAGS " $gl_unknown_warnings_are_errors $gl_positive"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  eval "$as_gl_Warn=yes"
else
  eval "$as_gl_Warn=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CFLAGS="$gl_save_compiler_FLAGS"

fi
eval ac_res=\$$as_gl_Warn
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
if eval test \"x\$"$as_gl_Warn"\" = x"yes"; then :
  as_fn_append WARN_CFLAGS_TEST " $i"
fi


  done
  CFLAGS=$save_CFLAGS
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  save_CXXFLAGS=$CXXFLAGS


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Werror=unknown-warning-option" >&5
$as_echo_n "checking whether C++ compiler handles -Werror=unknown-warning-option... " >&6; }
if ${gl_cv_warn_cxx__Werror_unknown_warning_option+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CXXFLAGS"
  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Werror=unknown-warning-option"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  gl_cv_warn_cxx__Werror_unknown_warning_option=yes
else
  gl_cv_warn_cxx__Werror_unknown_warning_option=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS="$gl_save_compiler_FLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Werror_unknown_warning_option" >&5
$as_echo "$gl_cv_warn_cxx__Werror_unknown_warning_option" >&6; }
if test "x$gl_cv_warn_cxx__Werror_unknown_warning_option" = xyes; then :
  as_fn_append CXXFLAGS " -Werror=unknown-warning-option"
fi


  for i in $warn_common $warn_cxx;
  do


as_gl_Warn=`$as_echo "gl_cv_warn_cxx_$i" | $as_tr_sh`
gl_positive="$i"
case $gl_positive in
  -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles $i" >&5
$as_echo_n "checking whether C++ compiler handles $i... " >&6; }
if eval \${$as_gl_Warn+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CXXFLAGS"
  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors $gl_positive"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  eval "$as_gl_Warn=yes"
else
  eval "$as_gl_Warn=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS="$gl_save_compiler_FLAGS"

fi
eval ac_res=\$$as_gl_Warn
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
if eval test \"x\$"$as_gl_Warn"\" = x"yes"; then :
  as_fn_append WARN_CXXFLAGS " $i"
fi


  done
  # Accept this warning only if it is not too touchy (e.g., clang 3.3
  # and 3.4).


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Wunreachable-code" >&5
$as_echo_n "checking whether C++ compiler handles -Wunreachable-code... " >&6; }
if ${gl_cv_warn_cxx__Wunreachable_code+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CXXFLAGS"
  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Wunreachable-code"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
if (sizeof (long) < sizeof (int)) return 1;
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  gl_cv_warn_cxx__Wunreachable_code=yes
else
  gl_cv_warn_cxx__Wunreachable_code=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS="$gl_save_compiler_FLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Wunreachable_code" >&5
$as_echo "$gl_cv_warn_cxx__Wunreachable_code" >&6; }
if test "x$gl_cv_warn_cxx__Wunreachable_code" = xyes; then :
  as_fn_append WARN_CXXFLAGS " -Wunreachable-code"
fi




{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Wzero-as-null-pointer-constant" >&5
$as_echo_n "checking whether C++ compiler handles -Wzero-as-null-pointer-constant... " >&6; }
if ${gl_cv_warn_cxx__Wzero_as_null_pointer_constant+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CXXFLAGS"
  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Wzero-as-null-pointer-constant"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
nullptr
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  gl_cv_warn_cxx__Wzero_as_null_pointer_constant=yes
else
  gl_cv_warn_cxx__Wzero_as_null_pointer_constant=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS="$gl_save_compiler_FLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Wzero_as_null_pointer_constant" >&5
$as_echo "$gl_cv_warn_cxx__Wzero_as_null_pointer_constant" >&6; }
if test "x$gl_cv_warn_cxx__Wzero_as_null_pointer_constant" = xyes; then :
  as_fn_append WARN_CXXFLAGS " -Wzero-as-null-pointer-constant"
fi


  # Before GCC6, the pragmas don't work well enough to neutralize
  # this warning.


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Wuseless-cast" >&5
$as_echo_n "checking whether C++ compiler handles -Wuseless-cast... " >&6; }
if ${gl_cv_warn_cxx__Wuseless_cast+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CXXFLAGS"
  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Wuseless-cast"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

              #if defined __GNUC__ && ! defined __ICC && ! defined __clang__ && __GNUC__ < 6
              syntax error
              #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  gl_cv_warn_cxx__Wuseless_cast=yes
else
  gl_cv_warn_cxx__Wuseless_cast=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS="$gl_save_compiler_FLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Wuseless_cast" >&5
$as_echo "$gl_cv_warn_cxx__Wuseless_cast" >&6; }
if test "x$gl_cv_warn_cxx__Wuseless_cast" = xyes; then :
  as_fn_append WARN_CXXFLAGS " -Wuseless-cast"
fi




{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Werror" >&5
$as_echo_n "checking whether C++ compiler handles -Werror... " >&6; }
if ${gl_cv_warn_cxx__Werror+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CXXFLAGS"
  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Werror"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  gl_cv_warn_cxx__Werror=yes
else
  gl_cv_warn_cxx__Werror=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS="$gl_save_compiler_FLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Werror" >&5
$as_echo "$gl_cv_warn_cxx__Werror" >&6; }
if test "x$gl_cv_warn_cxx__Werror" = xyes; then :
  as_fn_append WERROR_CXXFLAGS " -Werror"
fi


  # Warnings for the test suite only.
  for i in $warn_tests;
  do


as_gl_Warn=`$as_echo "gl_cv_warn_cxx_$i" | $as_tr_sh`
gl_positive="$i"
case $gl_positive in
  -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles $i" >&5
$as_echo_n "checking whether C++ compiler handles $i... " >&6; }
if eval \${$as_gl_Warn+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CXXFLAGS"
  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors $gl_positive"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  eval "$as_gl_Warn=yes"
else
  eval "$as_gl_Warn=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS="$gl_save_compiler_FLAGS"

fi
eval ac_res=\$$as_gl_Warn
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
if eval test \"x\$"$as_gl_Warn"\" = x"yes"; then :
  as_fn_append WARN_CXXFLAGS_TEST " $i"
fi


  done
  # Too many compilers complain about Flex generated code.


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Wno-error" >&5
$as_echo_n "checking whether C++ compiler handles -Wno-error... " >&6; }
if ${gl_cv_warn_cxx__Wno_error+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CXXFLAGS"
  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Werror"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  gl_cv_warn_cxx__Wno_error=yes
else
  gl_cv_warn_cxx__Wno_error=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS="$gl_save_compiler_FLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Wno_error" >&5
$as_echo "$gl_cv_warn_cxx__Wno_error" >&6; }
if test "x$gl_cv_warn_cxx__Wno_error" = xyes; then :
  as_fn_append FLEX_SCANNER_CXXFLAGS " -Wno-error"
fi


  # Clang++ deprecates compiling C.


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler handles -Wno-deprecated" >&5
$as_echo_n "checking whether C++ compiler handles -Wno-deprecated... " >&6; }
if ${gl_cv_warn_cxx__Wno_deprecated+:} false; then :
  $as_echo_n "(cached) " >&6
else

  gl_save_compiler_FLAGS="$CXXFLAGS"
  as_fn_append CXXFLAGS " $gl_unknown_warnings_are_errors -Wdeprecated"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  gl_cv_warn_cxx__Wno_deprecated=yes
else
  gl_cv_warn_cxx__Wno_deprecated=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CXXFLAGS="$gl_save_compiler_FLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_cxx__Wno_deprecated" >&5
$as_echo "$gl_cv_warn_cxx__Wno_deprecated" >&6; }
if test "x$gl_cv_warn_cxx__Wno_deprecated" = xyes; then :
  as_fn_append WNO_DEPRECATED_CXXFLAGS " -Wno-deprecated"
fi


  CXXFLAGS=$save_CXXFLAGS
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi



  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>
         int test_array[CHAR_BIT];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

else
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compile a simple C program
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   BISON_C_WORKS=:


ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports POSIXLY_CORRECT=1" >&5
$as_echo_n "checking whether $CC supports POSIXLY_CORRECT=1... " >&6; }
if ${bison_cv_c_supports_posixly_correct+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }'
case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" </dev/null` in
  xx) gl_had_POSIXLY_CORRECT=exported ;;
  x)  gl_had_POSIXLY_CORRECT=yes      ;;
  *)  gl_had_POSIXLY_CORRECT=         ;;
esac
POSIXLY_CORRECT=1
export POSIXLY_CORRECT
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  bison_cv_c_supports_posixly_correct=yes
else
  bison_cv_c_supports_posixly_correct=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
case $gl_had_POSIXLY_CORRECT in
  exported) ;;
  yes) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}; POSIXLY_CORRECT=1 ;;
  *) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;} ;;
esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bison_cv_c_supports_posixly_correct" >&5
$as_echo "$bison_cv_c_supports_posixly_correct" >&6; }
case $bison_cv_c_supports_posixly_correct in
  yes) C_COMPILER_POSIXLY_CORRECT=true
 ;;
  no)  C_COMPILER_POSIXLY_CORRECT=false
;;
esac

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX builds executables that work" >&5
$as_echo_n "checking whether $CXX builds executables that work... " >&6; }
if ${bison_cv_cxx_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    bison_cv_cxx_works=no
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <cstdlib>
          #include <iostream>
          #include <map>
          #include <string>
          using namespace std;
int
main ()
{
std::cerr << "";
          cout << "";
          typedef std::pair<unsigned, int> uipair;
          std::map<unsigned, int> m;
          std::map<unsigned, int>::iterator i;
          m.insert (uipair (4, -4));
          for (i = m.begin (); i != m.end (); ++i)
            if (i->first != 4)
              return 1;
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  if { ac_try='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_objext $LIBS >&5'
  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; }; then :
  if test "$cross_compiling" = yes; then :
  bison_cv_cxx_works=cross
else
  if { ac_try='./conftest$ac_exeext'
  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; }; then :
  bison_cv_cxx_works=yes
fi
fi
fi
       rm -f conftest$ac_exeext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bison_cv_cxx_works" >&5
$as_echo "$bison_cv_cxx_works" >&6; }

 case $bison_cv_cxx_works in
   yes)        BISON_CXX_WORKS=':';;
   no | cross) BISON_CXX_WORKS='false';;
 esac


  if test $bison_cv_cxx_works = yes; then
  ENABLE_CXX_TRUE=
  ENABLE_CXX_FALSE='#'
else
  ENABLE_CXX_TRUE='#'
  ENABLE_CXX_FALSE=
fi


ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports POSIXLY_CORRECT=1" >&5
$as_echo_n "checking whether $CXX supports POSIXLY_CORRECT=1... " >&6; }
if ${bison_cv_cxx_supports_posixly_correct+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }'
case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" </dev/null` in
  xx) gl_had_POSIXLY_CORRECT=exported ;;
  x)  gl_had_POSIXLY_CORRECT=yes      ;;
  *)  gl_had_POSIXLY_CORRECT=         ;;
esac
POSIXLY_CORRECT=1
export POSIXLY_CORRECT
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  bison_cv_cxx_supports_posixly_correct=yes
else
  bison_cv_cxx_supports_posixly_correct=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
case $gl_had_POSIXLY_CORRECT in
  exported) ;;
  yes) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}; POSIXLY_CORRECT=1 ;;
  *) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;} ;;
esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bison_cv_cxx_supports_posixly_correct" >&5
$as_echo "$bison_cv_cxx_supports_posixly_correct" >&6; }
case $bison_cv_cxx_supports_posixly_correct in
  yes) CXX_COMPILER_POSIXLY_CORRECT=true
 ;;
  no)  CXX_COMPILER_POSIXLY_CORRECT=false
;;
esac

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



# D.
for ac_prog in dmd
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_DC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$DC"; then
  ac_cv_prog_DC="$DC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_DC="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
DC=$ac_cv_prog_DC
if test -n "$DC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DC" >&5
$as_echo "$DC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$DC" && break
done

for ac_prog in -g
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_DCFLAGS+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$DCFLAGS"; then
  ac_cv_prog_DCFLAGS="$DCFLAGS" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_DCFLAGS="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
DCFLAGS=$ac_cv_prog_DCFLAGS
if test -n "$DCFLAGS"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DCFLAGS" >&5
$as_echo "$DCFLAGS" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$DCFLAGS" && break
done

 if test x"$DC" != x; then
  ENABLE_D_TRUE=
  ENABLE_D_FALSE='#'
else
  ENABLE_D_TRUE='#'
  ENABLE_D_FALSE=
fi


# Java.


  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#if defined _WIN32 || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
  yes
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  CLASSPATH_SEPARATOR=';'
else
  CLASSPATH_SEPARATOR=':'
fi
rm -f conftest*

  source_version=1.7
  test -n "$source_version" || {
    as_fn_error $? "missing source-version argument to gt_JAVACOMP" "$LINENO" 5
  }
  target_version=1.7
  case "$source_version" in
    1.3) goodcode='class conftest {}'
         failcode='class conftestfail { static { assert(true); } }' ;;
    1.4) goodcode='class conftest     { static { assert(true); } }'
         failcode='class conftestfail<T> { T foo() { return null; } }' ;;
    1.5) goodcode='class conftest<T>     { T foo() { return null; } }'
         failcode='class conftestfail { void foo () { switch ("A") {} } }' ;;
    1.7) goodcode='class conftest     { void foo () { switch ("A") {} } }'
         failcode='class conftestfail { void foo () { Runnable r = () -> {}; } }' ;;
    1.8) goodcode='class conftest     { void foo () { Runnable r = () -> {}; } }'
         failcode='interface conftestfail { private void foo () {} }' ;;
    9)   goodcode='interface conftest     { private void foo () {} }'
         failcode='class conftestfail { public void m() { var i = new Integer(0); } }' ;;
    10)  goodcode='class conftest     { public void m() { var i = new Integer(0); } }'
         failcode='class conftestfail { Readable r = (var b) -> 0; }' ;;
    11)  goodcode='class conftest     { Readable r = (var b) -> 0; }'
         failcode='class conftestfail syntax error' ;;
    *) as_fn_error $? "invalid source-version argument to gt_JAVACOMP: $source_version" "$LINENO" 5 ;;
  esac
  case "$target_version" in
    1.1) cfversion=45 ;;
    1.2) cfversion=46 ;;
    1.3) cfversion=47 ;;
    1.4) cfversion=48 ;;
    1.5) cfversion=49 ;;
    1.6) cfversion=50 ;;
    1.7) cfversion=51 ;;
    1.8) cfversion=52 ;;
    9)   cfversion=53 ;;
    10)  cfversion=54 ;;
    11)  cfversion=55 ;;
    *) as_fn_error $? "invalid target-version argument to gt_JAVACOMP: $target_version" "$LINENO" 5 ;;
  esac
  # Function to output the classfile version of a file (8th byte) in decimal.
  if od -A x < /dev/null >/dev/null 2>/dev/null; then
    # Use POSIX od.
    func_classfile_version ()
    {
      od -A n -t d1 -j 7 -N 1 "$1"
    }
  else
    # Use BSD hexdump.
    func_classfile_version ()
    {
      dd if="$1" bs=1 count=1 skip=7 2>/dev/null | hexdump -e '1/1 "%3d "'
      echo
    }
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Java compiler" >&5
$as_echo_n "checking for Java compiler... " >&6; }
                                                                                                                                                                  CONF_JAVAC=
  HAVE_JAVAC_ENVVAR=
  HAVE_GCJ_C=
  HAVE_JAVAC=
  HAVE_JIKES=
  HAVE_JAVACOMP=
  cat > conftestlib.java <<EOF
public class conftestlib {
  public static void main (String[] args) {
  }
}
EOF
  echo "$goodcode" > conftest.java
  echo "$failcode" > conftestfail.java
        if test -n "$JAVAC"; then
        if $JAVAC --version 2>/dev/null | sed -e 1q | grep gcj > /dev/null; then
            if $JAVAC --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^4\.[012]/d' | grep '^[4-9]' >/dev/null; then
                        rm -f conftest.class
        if { echo "$as_me:10295: $JAVAC -d . conftest.java" >&5
             $JAVAC -d . conftest.java >&5 2>&1
           } \
           && test -f conftest.class \
           && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
                    rm -f conftest.class
          rm -f conftestfail.class
          if { echo "$as_me:10302: $JAVAC -fsource=$source_version -d . conftest.java" >&5
               $JAVAC -fsource="$source_version" -d . conftest.java >&5 2>&1
             } \
             && test -f conftest.class \
             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
             && { echo "$as_me:10307: $JAVAC -d . conftestfail.java" >&5
                  $JAVAC -d . conftestfail.java >&5 2>&1
                } \
             && test -f conftestfail.class \
             && ! { echo "$as_me:10311: $JAVAC -fsource=$source_version -d . conftestfail.java" >&5
                    $JAVAC -fsource="$source_version" -d . conftestfail.java >&5 2>&1
                  }; then
            CONF_JAVAC="$JAVAC -fsource=$source_version"
            HAVE_JAVAC_ENVVAR=1
            HAVE_JAVACOMP=1
          else
            CONF_JAVAC="$JAVAC"
            HAVE_JAVAC_ENVVAR=1
            HAVE_JAVACOMP=1
          fi
        else
                    rm -f conftest.class
          rm -f conftestfail.class
          if { echo "$as_me:10325: $JAVAC -fsource=$source_version -ftarget=$target_version -d . conftest.java" >&5
               $JAVAC -fsource="$source_version" -ftarget="$target_version" -d . conftest.java >&5 2>&1
             } \
             && test -f conftest.class \
             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
            CONF_JAVAC="$JAVAC -fsource=$source_version -ftarget=$target_version"
            HAVE_JAVAC_ENVVAR=1
            HAVE_JAVACOMP=1
          fi
        fi
      else
                if test "$target_version" = 1.4 && test "$source_version" = 1.4; then
                    rm -f conftest.class
          if { echo "$as_me:10338: $JAVAC -d . conftest.java" >&5
               $JAVAC -d . conftest.java >&5 2>&1
             } \
             && test -f conftest.class; then
            CONF_JAVAC="$JAVAC"
            HAVE_JAVAC_ENVVAR=1
            HAVE_JAVACOMP=1
          fi
        else
          if test "$target_version" = 1.4 && test "$source_version" = 1.3; then
                                    javac_works=
            rm -f conftest.class
            if { echo "$as_me:10350: $JAVAC -d . conftest.java" >&5
                 $JAVAC -d . conftest.java >&5 2>&1
               } \
               && test -f conftest.class; then
              javac_works=1
            fi
            javac_noassert_works=
            rm -f conftest.class
            if { echo "$as_me:10358: $JAVAC -fno-assert -d . conftest.java" >&5
                 $JAVAC -fno-assert -d . conftest.java >&5 2>&1
               } \
               && test -f conftest.class; then
              javac_noassert_works=1
            fi
            if test -n "$javac_works" && test -n "$javac_noassert_works"; then
              rm -f conftestfail.class
              if { echo "$as_me:10366: $JAVAC -d . conftestfail.java" >&5
                   $JAVAC -d . conftestfail.java >&5 2>&1
                 } \
                 && test -f conftestfail.class \
                 && ! { echo "$as_me:10370: $JAVAC -fno-assert -d . conftestfail.java" >&5
                        $JAVAC -fno-assert -d . conftestfail.java >&5 2>&1
                      }; then
                                javac_works=
              fi
            fi
            if test -n "$javac_works"; then
              CONF_JAVAC="$JAVAC"
              HAVE_JAVAC_ENVVAR=1
              HAVE_JAVACOMP=1
            else
              if test -n "$javac_noassert_works"; then
                CONF_JAVAC="$JAVAC -fno-assert"
                HAVE_JAVAC_ENVVAR=1
                HAVE_JAVACOMP=1
              fi
            fi
          fi
        fi
      fi
    else
                                    if test "$source_version" = 1.5; then
        case "$target_version" in
          1.1 | 1.2 | 1.3 | 1.4 | 1.5) ;;
          *) source_version='1.6' ;;
        esac
      fi
      rm -f conftest.class
      if { echo "$as_me:10398: $JAVAC -d . conftest.java" >&5
           $JAVAC -d . conftest.java >&5 2>&1
         } \
         && test -f conftest.class \
         && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
                rm -f conftest.class
        rm -f conftestfail.class
        if { echo "$as_me:10405: $JAVAC -source $source_version -d . conftest.java" >&5
             $JAVAC -source "$source_version" -d . conftest.java >&5 2>&1
           } \
           && test -f conftest.class \
           && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
           && { echo "$as_me:10410: $JAVAC -d . conftestfail.java" >&5
                $JAVAC -d . conftestfail.java >&5 2>&1
              } \
           && test -f conftestfail.class \
           && ! { echo "$as_me:10414: $JAVAC -source $source_version -d . conftestfail.java" >&5
                  $JAVAC -source "$source_version" -d . conftestfail.java >&5 2>&1
                }; then
          CONF_JAVAC="$JAVAC -source $source_version"
          HAVE_JAVAC_ENVVAR=1
          HAVE_JAVACOMP=1
        else
          CONF_JAVAC="$JAVAC"
          HAVE_JAVAC_ENVVAR=1
          HAVE_JAVACOMP=1
        fi
      else
                        rm -f conftest.class
        if { echo "$as_me:10427: $JAVAC -target $target_version -d . conftest.java" >&5
             $JAVAC -target "$target_version" -d . conftest.java >&5 2>&1
           } \
           && test -f conftest.class \
           && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
                    rm -f conftest.class
          rm -f conftestfail.class
          if { echo "$as_me:10434: $JAVAC -target $target_version -source $source_version -d . conftest.java" >&5
               $JAVAC -target "$target_version" -source "$source_version" -d . conftest.java >&5 2>&1
             } \
             && test -f conftest.class \
             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
             && { echo "$as_me:10439: $JAVAC -target $target_version -d . conftestfail.java" >&5
                  $JAVAC -target "$target_version" -d . conftestfail.java >&5 2>&1
                } \
             && test -f conftestfail.class \
             && ! { echo "$as_me:10443: $JAVAC -target $target_version -source $source_version -d . conftestfail.java" >&5
                    $JAVAC -target "$target_version" -source "$source_version" -d . conftestfail.java >&5 2>&1
                  }; then
            CONF_JAVAC="$JAVAC -target $target_version -source $source_version"
            HAVE_JAVAC_ENVVAR=1
            HAVE_JAVACOMP=1
          else
            CONF_JAVAC="$JAVAC -target $target_version"
            HAVE_JAVAC_ENVVAR=1
            HAVE_JAVACOMP=1
          fi
        else
                                        rm -f conftest.class
          if { echo "$as_me:10456: $JAVAC -target $target_version -source $source_version -d . conftest.java" >&5
               $JAVAC -target "$target_version" -source "$source_version" -d . conftest.java >&5 2>&1
             } \
             && test -f conftest.class \
             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
            CONF_JAVAC="$JAVAC -target $target_version -source $source_version"
            HAVE_JAVAC_ENVVAR=1
            HAVE_JAVACOMP=1
          fi
        fi
      fi
    fi
  fi
  if test -z "$HAVE_JAVACOMP"; then
                # Extract the first word of "gcj", so it can be a program name with args.
set dummy gcj; ac_word=$2
:
if ${ac_cv_prog_HAVE_GCJ_IN_PATH+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$HAVE_GCJ_IN_PATH"; then
  ac_cv_prog_HAVE_GCJ_IN_PATH="$HAVE_GCJ_IN_PATH" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_HAVE_GCJ_IN_PATH="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
HAVE_GCJ_IN_PATH=$ac_cv_prog_HAVE_GCJ_IN_PATH
if test -n "$HAVE_GCJ_IN_PATH"; then
  :
else
  :
fi


    # Extract the first word of "javac", so it can be a program name with args.
set dummy javac; ac_word=$2
:
if ${ac_cv_prog_HAVE_JAVAC_IN_PATH+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$HAVE_JAVAC_IN_PATH"; then
  ac_cv_prog_HAVE_JAVAC_IN_PATH="$HAVE_JAVAC_IN_PATH" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_HAVE_JAVAC_IN_PATH="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
HAVE_JAVAC_IN_PATH=$ac_cv_prog_HAVE_JAVAC_IN_PATH
if test -n "$HAVE_JAVAC_IN_PATH"; then
  :
else
  :
fi


    # Extract the first word of "jikes", so it can be a program name with args.
set dummy jikes; ac_word=$2
:
if ${ac_cv_prog_HAVE_JIKES_IN_PATH+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$HAVE_JIKES_IN_PATH"; then
  ac_cv_prog_HAVE_JIKES_IN_PATH="$HAVE_JIKES_IN_PATH" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_HAVE_JIKES_IN_PATH="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
HAVE_JIKES_IN_PATH=$ac_cv_prog_HAVE_JIKES_IN_PATH
if test -n "$HAVE_JIKES_IN_PATH"; then
  :
else
  :
fi


                if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_GCJ_IN_PATH"; then
            if gcj --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^3\.[01]/d' | grep '^[3-9]' >/dev/null; then
                if { echo "$as_me:10574: gcj -C -d . conftestlib.java" >&5
             gcj -C -d . conftestlib.java >&5 2>&1
           }; then
                    if gcj --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^4\.[012]/d' | grep '^[4-9]' >/dev/null; then
                                    rm -f conftest.class
            if { echo "$as_me:10579: gcj -C -d . conftest.java" >&5
                 gcj -C -d . conftest.java >&5 2>&1
               } \
               && test -f conftest.class \
               && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
                            rm -f conftest.class
              rm -f conftestfail.class
              if { echo "$as_me:10586: gcj -C -fsource=$source_version -d . conftest.java" >&5
                   gcj -C -fsource="$source_version" -d . conftest.java >&5 2>&1
                 } \
                 && test -f conftest.class \
                 && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
                 && { echo "$as_me:10591: gcj -C -d . conftestfail.java" >&5
                      gcj -C -d . conftestfail.java >&5 2>&1
                    } \
                 && test -f conftestfail.class \
                 && ! { echo "$as_me:10595: gcj -C -fsource=$source_version -d . conftestfail.java" >&5
                        gcj -C -fsource="$source_version" -d . conftestfail.java >&5 2>&1
                      }; then
                CONF_JAVAC="gcj -C -fsource=$source_version"
                HAVE_JAVAC_ENVVAR=1
                HAVE_JAVACOMP=1
              else
                CONF_JAVAC="gcj -C"
                HAVE_JAVAC_ENVVAR=1
                HAVE_JAVACOMP=1
              fi
            else
                            rm -f conftest.class
              rm -f conftestfail.class
              if { echo "$as_me:10609: gcj -C -fsource=$source_version -ftarget=$target_version -d . conftest.java" >&5
                   gcj -C -fsource="$source_version" -ftarget="$target_version" -d . conftest.java >&5 2>&1
                 } \
                 && test -f conftest.class \
                 && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
                CONF_JAVAC="gcj -C -fsource=$source_version -ftarget=$target_version"
                HAVE_JAVAC_ENVVAR=1
                HAVE_JAVACOMP=1
              fi
            fi
          else
                                                if test "$target_version" = 1.4 && test "$source_version" = 1.4; then
              rm -f conftest.class
              if { echo "$as_me:10622: gcj -C -d . conftest.java" >&5
                   gcj -C -d . conftest.java >&5 2>&1
                 } \
                 && test -f conftest.class; then
                CONF_JAVAC="gcj -C"
                HAVE_GCJ_C=1
                HAVE_JAVACOMP=1
              fi
            else
              if test "$target_version" = 1.4 && test "$source_version" = 1.3; then
                                                rm -f conftest.class
                if { echo "$as_me:10633: gcj -C -fno-assert -d . conftest.java" >&5
                     gcj -C -fno-assert -d . conftest.java >&5 2>&1
                   } \
                   && test -f conftest.class; then
                  CONF_JAVAC="gcj -C -fno-assert"
                  HAVE_GCJ_C=1
                  HAVE_JAVACOMP=1
                else
                  rm -f conftest.class
                  if { echo "$as_me:10642: gcj -C -d . conftest.java" >&5
                       gcj -C -d . conftest.java >&5 2>&1
                     } \
                     && test -f conftest.class; then
                    CONF_JAVAC="gcj -C"
                    HAVE_GCJ_C=1
                    HAVE_JAVACOMP=1
                  fi
                fi
              fi
            fi
          fi
        fi
      fi
    fi
    if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_JAVAC_IN_PATH"; then
            if { javac -version >/dev/null 2>/dev/null || test $? -le 2; } \
         && ( if javac -help 2>&1 >/dev/null | grep at.dms.kjc.Main >/dev/null && javac -help 2>/dev/null | grep 'released.*2000' >/dev/null ; then exit 1; else exit 0; fi ); then
                                        if test "$source_version" = 1.5; then
          case "$target_version" in
            1.1 | 1.2 | 1.3 | 1.4 | 1.5) ;;
            *) source_version='1.6' ;;
          esac
        fi
                        rm -f conftest.class
        if { echo "$as_me:10667: javac -d . conftest.java" >&5
             javac -d . conftest.java >&5 2>&1
           } \
           && test -f conftest.class \
           && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
                    rm -f conftest.class
          rm -f conftestfail.class
          if { echo "$as_me:10674: javac -source $source_version -d . conftest.java" >&5
               javac -source "$source_version" -d . conftest.java >&5 2>&1
             } \
             && test -f conftest.class \
             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
             && { echo "$as_me:10679: javac -d . conftestfail.java" >&5
                  javac -d . conftestfail.java >&5 2>&1
                } \
             && test -f conftestfail.class \
             && ! { echo "$as_me:10683: javac -source $source_version -d . conftestfail.java" >&5
                    javac -source "$source_version" -d . conftestfail.java >&5 2>&1
                  }; then
            CONF_JAVAC="javac -source $source_version"
            HAVE_JAVAC=1
            HAVE_JAVACOMP=1
          else
            CONF_JAVAC="javac"
            HAVE_JAVAC=1
            HAVE_JAVACOMP=1
          fi
        else
                              rm -f conftest.class
          if { echo "$as_me:10696: javac -target $target_version -d . conftest.java" >&5
               javac -target "$target_version" -d . conftest.java >&5 2>&1
             } \
             && test -f conftest.class \
             && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
                        rm -f conftest.class
            rm -f conftestfail.class
            if { echo "$as_me:10703: javac -target $target_version -source $source_version -d . conftest.java" >&5
                 javac -target "$target_version" -source "$source_version" -d . conftest.java >&5 2>&1
               } \
               && test -f conftest.class \
               && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5 \
               && { echo "$as_me:10708: javac -target $target_version -d . conftestfail.java" >&5
                    javac -target "$target_version" -d . conftestfail.java >&5 2>&1
                  } \
               && test -f conftestfail.class \
               && ! { echo "$as_me:10712: javac -target $target_version -source $source_version -d . conftestfail.java" >&5
                      javac -target "$target_version" -source "$source_version" -d . conftestfail.java >&5 2>&1
                    }; then
              CONF_JAVAC="javac -target $target_version -source $source_version"
              HAVE_JAVAC=1
              HAVE_JAVACOMP=1
            else
              CONF_JAVAC="javac -target $target_version"
              HAVE_JAVAC=1
              HAVE_JAVACOMP=1
            fi
          else
                                                rm -f conftest.class
            if { echo "$as_me:10725: javac -target $target_version -source $source_version -d . conftest.java" >&5
                 javac -target "$target_version" -source "$source_version" -d . conftest.java >&5 2>&1
               } \
               && test -f conftest.class \
               && expr `func_classfile_version conftest.class` '<=' $cfversion >/dev/null 2>&5; then
              CONF_JAVAC="javac -target $target_version -source $source_version"
              HAVE_JAVAC=1
              HAVE_JAVACOMP=1
            fi
          fi
        fi
      fi
    fi
    if test -z "$HAVE_JAVACOMP" && test -n "$HAVE_JIKES_IN_PATH"; then
            if { jikes >/dev/null 2>/dev/null || test $? = 1; } \
         && (
              # See if the existing CLASSPATH is sufficient to make jikes work.
              unset JAVA_HOME
              jikes conftestlib.java >&5 2>&1
              error=$?
              rm -f conftestlib.class
              exit $error
            ); then
                                if test "$source_version" = 1.3; then
          CONF_JAVAC="jikes"
          HAVE_JIKES=1
          HAVE_JAVACOMP=1
        fi
      fi
    fi
  fi
  rm -f conftest*.java conftest*.class
  if test -n "$HAVE_JAVACOMP"; then
    ac_result="$CONF_JAVAC"
  else
    ac_result="no"
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_result" >&5
$as_echo "$ac_result" >&6; }









  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Java virtual machine" >&5
$as_echo_n "checking for Java virtual machine... " >&6; }
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#if defined _WIN32 || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
  yes
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  CLASSPATH_SEPARATOR=';'
else
  CLASSPATH_SEPARATOR=':'
fi
rm -f conftest*

  CONF_JAVA=
  HAVE_JAVA_ENVVAR=
  HAVE_GIJ=
  HAVE_JAVA=
  HAVE_JRE=
  HAVE_JVIEW=
  HAVE_JAVAEXEC=1
  if test -n "$JAVA"; then
    HAVE_JAVA_ENVVAR=1
    CONF_JAVA="$JAVA"
  else
                # Extract the first word of "gij", so it can be a program name with args.
set dummy gij; ac_word=$2
:
if ${ac_cv_prog_HAVE_GIJ_IN_PATH+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$HAVE_GIJ_IN_PATH"; then
  ac_cv_prog_HAVE_GIJ_IN_PATH="$HAVE_GIJ_IN_PATH" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_HAVE_GIJ_IN_PATH="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
HAVE_GIJ_IN_PATH=$ac_cv_prog_HAVE_GIJ_IN_PATH
if test -n "$HAVE_GIJ_IN_PATH"; then
  :
else
  :
fi


    # Extract the first word of "java", so it can be a program name with args.
set dummy java; ac_word=$2
:
if ${ac_cv_prog_HAVE_JAVA_IN_PATH+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$HAVE_JAVA_IN_PATH"; then
  ac_cv_prog_HAVE_JAVA_IN_PATH="$HAVE_JAVA_IN_PATH" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_HAVE_JAVA_IN_PATH="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
HAVE_JAVA_IN_PATH=$ac_cv_prog_HAVE_JAVA_IN_PATH
if test -n "$HAVE_JAVA_IN_PATH"; then
  :
else
  :
fi


    # Extract the first word of "jre", so it can be a program name with args.
set dummy jre; ac_word=$2
:
if ${ac_cv_prog_HAVE_JRE_IN_PATH+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$HAVE_JRE_IN_PATH"; then
  ac_cv_prog_HAVE_JRE_IN_PATH="$HAVE_JRE_IN_PATH" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_HAVE_JRE_IN_PATH="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
HAVE_JRE_IN_PATH=$ac_cv_prog_HAVE_JRE_IN_PATH
if test -n "$HAVE_JRE_IN_PATH"; then
  :
else
  :
fi


    # Extract the first word of "jview", so it can be a program name with args.
set dummy jview; ac_word=$2
:
if ${ac_cv_prog_HAVE_JVIEW_IN_PATH+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$HAVE_JVIEW_IN_PATH"; then
  ac_cv_prog_HAVE_JVIEW_IN_PATH="$HAVE_JVIEW_IN_PATH" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_HAVE_JVIEW_IN_PATH="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
HAVE_JVIEW_IN_PATH=$ac_cv_prog_HAVE_JVIEW_IN_PATH
if test -n "$HAVE_JVIEW_IN_PATH"; then
  :
else
  :
fi



    export CLASSPATH
    if test -n "$HAVE_GIJ_IN_PATH" \
       && gij --version >/dev/null 2>/dev/null \
       ; then
      HAVE_GIJ=1
      CONF_JAVA="gij"
    else
      if test -n "$HAVE_JAVA_IN_PATH" \
         && java -version >/dev/null 2>/dev/null \
         ; then
        HAVE_JAVA=1
        CONF_JAVA="java"
      else
        if test -n "$HAVE_JRE_IN_PATH" \
           && (jre >/dev/null 2>/dev/null || test $? = 1) \
           ; then
          HAVE_JRE=1
          CONF_JAVA="jre"
        else
          if test -n "$HAVE_JVIEW_IN_PATH" \
             && (jview -? >/dev/null 2>/dev/null || test $? = 1) \
             ; then
            HAVE_JVIEW=1
            CONF_JAVA="jview"
          else
            HAVE_JAVAEXEC=
          fi
        fi
      fi
    fi

  fi
  if test -n "$HAVE_JAVAEXEC"; then
    ac_result="$CONF_JAVA"
  else
    ac_result="no"
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_result" >&5
$as_echo "$ac_result" >&6; }









 if test x"$CONF_JAVAC" != x && test x"$CONF_JAVA" != x; then
  ENABLE_JAVA_TRUE=
  ENABLE_JAVA_FALSE='#'
else
  ENABLE_JAVA_TRUE='#'
  ENABLE_JAVA_FALSE=
fi



# Check whether --enable-yacc was given.
if test "${enable_yacc+set}" = set; then :
  enableval=$enable_yacc;
else
  enable_yacc=yes
fi

 if test "$enable_yacc" = yes; then
  ENABLE_YACC_TRUE=
  ENABLE_YACC_FALSE='#'
else
  ENABLE_YACC_TRUE='#'
  ENABLE_YACC_FALSE=
fi

ac_config_files="$ac_config_files src/yacc"


# Checks for programs.

DOT=${DOT-"${am_missing_run}dot"}

for ac_prog in flex lex
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_LEX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$LEX"; then
  ac_cv_prog_LEX="$LEX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_LEX="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
LEX=$ac_cv_prog_LEX
if test -n "$LEX"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5
$as_echo "$LEX" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$LEX" && break
done
test -n "$LEX" || LEX=":"

if test "x$LEX" != "x:"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lex is flex" >&5
$as_echo_n "checking whether lex is flex... " >&6; }
if ${ac_cv_prog_lex_is_flex+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat >conftest.l <<_ACEOF
%option debug nodefault noinput nounput noyywrap never-interactive
%x SC_CONF_TEST
%%
a { BEGIN SC_CONF_TEST; }
_ACEOF
if { { ac_try="$LEX conftest.l"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$LEX conftest.l") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  ac_cv_prog_lex_is_flex=yes
else
  ac_cv_prog_lex_is_flex=no
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_is_flex" >&5
$as_echo "$ac_cv_prog_lex_is_flex" >&6; }

cat >conftest.l <<_ACEOF
%%
a { ECHO; }
b { REJECT; }
c { yymore (); }
d { yyless (1); }
e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument.  */
    yyless ((input () != 0)); }
f { unput (yytext[0]); }
. { BEGIN INITIAL; }
%%
#ifdef YYTEXT_POINTER
extern char *yytext;
#endif
int
main (void)
{
  return ! yylex () + ! yywrap ();
}
_ACEOF
{ { ac_try="$LEX conftest.l"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$LEX conftest.l") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5
$as_echo_n "checking lex output file root... " >&6; }
if ${ac_cv_prog_lex_root+:} false; then :
  $as_echo_n "(cached) " >&6
else

if test -f lex.yy.c; then
  ac_cv_prog_lex_root=lex.yy
elif test -f lexyy.c; then
  ac_cv_prog_lex_root=lexyy
else
  as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5
$as_echo "$ac_cv_prog_lex_root" >&6; }
LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root

if test -z "${LEXLIB+set}"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5
$as_echo_n "checking lex library... " >&6; }
if ${ac_cv_lib_lex+:} false; then :
  $as_echo_n "(cached) " >&6
else

    ac_save_LIBS=$LIBS
    ac_cv_lib_lex='none needed'
    for ac_lib in '' -lfl -ll; do
      LIBS="$ac_lib $ac_save_LIBS"
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
`cat $LEX_OUTPUT_ROOT.c`
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_lex=$ac_lib
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      test "$ac_cv_lib_lex" != 'none needed' && break
    done
    LIBS=$ac_save_LIBS

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5
$as_echo "$ac_cv_lib_lex" >&6; }
  test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex
fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5
$as_echo_n "checking whether yytext is a pointer... " >&6; }
if ${ac_cv_prog_lex_yytext_pointer+:} false; then :
  $as_echo_n "(cached) " >&6
else
  # POSIX says lex can declare yytext either as a pointer or an array; the
# default is implementation-dependent.  Figure out which it is, since
# not all implementations provide the %pointer and %array declarations.
ac_cv_prog_lex_yytext_pointer=no
ac_save_LIBS=$LIBS
LIBS="$LEXLIB $ac_save_LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

  #define YYTEXT_POINTER 1
`cat $LEX_OUTPUT_ROOT.c`
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_prog_lex_yytext_pointer=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_save_LIBS

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5
$as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; }
if test $ac_cv_prog_lex_yytext_pointer = yes; then

$as_echo "#define YYTEXT_POINTER 1" >>confdefs.h

fi
rm -f conftest.l $LEX_OUTPUT_ROOT.c

fi
LEX_IS_FLEX=`test "$ac_cv_prog_lex_is_flex" = yes && echo true || echo false`

if ! "$LEX_IS_FLEX" || test "X$LEX" = X:; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: bypassing lex because flex is required" >&5
$as_echo "$as_me: WARNING: bypassing lex because flex is required" >&2;}
  LEX=:
fi
 if $LEX_IS_FLEX; then
  FLEX_WORKS_TRUE=
  FLEX_WORKS_FALSE='#'
else
  FLEX_WORKS_TRUE='#'
  FLEX_WORKS_FALSE=
fi

 if $LEX_IS_FLEX && test $bison_cv_cxx_works = yes; then
  FLEX_CXX_WORKS_TRUE=
  FLEX_CXX_WORKS_FALSE='#'
else
  FLEX_CXX_WORKS_TRUE='#'
  FLEX_CXX_WORKS_FALSE=
fi

for ac_prog in 'bison -y' byacc
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_YACC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$YACC"; then
  ac_cv_prog_YACC="$YACC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_YACC="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
YACC=$ac_cv_prog_YACC
if test -n "$YACC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5
$as_echo "$YACC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$YACC" && break
done
test -n "$YACC" || YACC="yacc"

if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_RANLIB+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
RANLIB=$ac_cv_prog_RANLIB
if test -n "$RANLIB"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
$as_echo "$RANLIB" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_RANLIB"; then
  ac_ct_RANLIB=$RANLIB
  # Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_RANLIB"; then
  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_RANLIB="ranlib"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
if test -n "$ac_ct_RANLIB"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
$as_echo "$ac_ct_RANLIB" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_RANLIB" = x; then
    RANLIB=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    RANLIB=$ac_ct_RANLIB
  fi
else
  RANLIB="$ac_cv_prog_RANLIB"
fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU M4 that supports accurate traces" >&5
$as_echo_n "checking for GNU M4 that supports accurate traces... " >&6; }
if ${ac_cv_path_M4+:} false; then :
  $as_echo_n "(cached) " >&6
else
  rm -f conftest.m4f
ac_had_posixly_correct=${POSIXLY_CORRECT:+yes}
{ POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}
if test -z "$M4"; then
  ac_path_M4_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in m4 gm4 gnum4; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_M4="$as_dir/$ac_prog$ac_exec_ext"
      as_fn_executable_p "$ac_path_M4" || continue
      # Root out GNU M4 1.4.5, as well as non-GNU m4 that ignore -t, -F.
      # Root out GNU M4 1.4.15 with buggy false negative replacement strstr.
      # Root out Glibc 2.9 - 2.12 and GNU M4 1.4.11 - 1.4.15 with buggy
      # false positive strstr.
      ac_snippet=change'quote(<,>)in''dir(<if''def>,mac,bug)'
      ac_snippet=${ac_snippet}pat'subst(a,\(b\)\|\(a\),\1)d'nl
      ac_snippet=${ac_snippet}${as_nl}if'else(in''dex(..wi.d.,.d.),-1,bug)'
      ac_snippet=${ac_snippet}${as_nl}if'else(in''dex(;:11-:12-:12-:12-:12-:12-:12-:12-:12.:12.:12.:12.:12.:12.:12.:12.:12-,:12-:12-:12-:12-:12-:12-:12-:12-),-1,,strstr-bug2)'
      test -z "`$ac_path_M4 -F conftest.m4f </dev/null 2>&1`" \
      && test -z "`$as_echo $ac_snippet | $ac_path_M4 --trace=mac 2>&1`" \
      && test -f conftest.m4f \
      && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:
      rm -f conftest.m4f
      $ac_path_M4_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_M4"; then
    as_fn_error $? "no acceptable m4 could be found in \$PATH.
GNU M4 1.4.6 or later is required; 1.4.16 or newer is recommended.
GNU M4 1.4.15 uses a buggy replacement strstr on some systems.
Glibc 2.9 - 2.12 and GNU M4 1.4.11 - 1.4.15 have another strstr bug." "$LINENO" 5
  fi
else
  ac_cv_path_M4=$M4
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_M4" >&5
$as_echo "$ac_cv_path_M4" >&6; }
  M4=$ac_cv_path_M4
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $ac_cv_path_M4 accepts --gnu" >&5
$as_echo_n "checking whether $ac_cv_path_M4 accepts --gnu... " >&6; }
if ${ac_cv_prog_gnu_m4_gnu+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case `$M4 --help < /dev/null 2>&1` in
      *--gnu*) ac_cv_prog_gnu_m4_gnu=yes ;;
      *) ac_cv_prog_gnu_m4_gnu=no ;;
    esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gnu_m4_gnu" >&5
$as_echo "$ac_cv_prog_gnu_m4_gnu" >&6; }
  if test "$ac_cv_prog_gnu_m4_gnu" = yes; then
    M4_GNU=--gnu
  else
    M4_GNU=
  fi

  if test x$ac_had_posixly_correct = xyes; then
    POSIXLY_CORRECT=:
    if test $ac_cv_prog_gnu_m4_gnu = no; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: the version of M4 that was found does not support -g" >&5
$as_echo "$as_me: WARNING: the version of M4 that was found does not support -g" >&2;}
      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using it with POSIXLY_CORRECT set may cause problems" >&5
$as_echo "$as_me: WARNING: using it with POSIXLY_CORRECT set may cause problems" >&2;}
    fi
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how m4 supports trace files" >&5
$as_echo_n "checking how m4 supports trace files... " >&6; }
if ${ac_cv_prog_gnu_m4_debugfile+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case `$M4 --help < /dev/null 2>&1` in
      *debugfile*) ac_cv_prog_gnu_m4_debugfile=--debugfile ;;
      *) ac_cv_prog_gnu_m4_debugfile=--error-output ;;
    esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gnu_m4_debugfile" >&5
$as_echo "$ac_cv_prog_gnu_m4_debugfile" >&6; }
  M4_DEBUGFILE=$ac_cv_prog_gnu_m4_debugfile



cat >>confdefs.h <<_ACEOF
#define M4 "$M4"
_ACEOF


cat >>confdefs.h <<_ACEOF
#define M4_GNU_OPTION "$M4_GNU"
_ACEOF

# Extract the first word of "perl", so it can be a program name with args.
set dummy perl; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_PERL+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $PERL in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
PERL=$ac_cv_path_PERL
if test -n "$PERL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
$as_echo "$PERL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi



HELP2MAN=${HELP2MAN-"${am_missing_run}help2man"}

# Extract the first word of "xsltproc", so it can be a program name with args.
set dummy xsltproc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_XSLTPROC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $XSLTPROC in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_XSLTPROC="$XSLTPROC" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_XSLTPROC="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
XSLTPROC=$ac_cv_path_XSLTPROC
if test -n "$XSLTPROC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XSLTPROC" >&5
$as_echo "$XSLTPROC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi




# Checks for header files.



  for ac_header in $ac_header_list
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

fi

done





# Checks for compiler characteristics.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
$as_echo_n "checking for inline... " >&6; }
if ${ac_cv_c_inline+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_c_inline=no
for ac_kw in inline __inline__ __inline; do
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __cplusplus
typedef int foo_t;
static $ac_kw foo_t static_foo () {return 0; }
$ac_kw foo_t foo () {return 0; }
#endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_inline=$ac_kw
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  test "$ac_cv_c_inline" != no && break
done

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
$as_echo "$ac_cv_c_inline" >&6; }

case $ac_cv_c_inline in
  inline | yes) ;;
  *)
    case $ac_cv_c_inline in
      no) ac_val=;;
      *) ac_val=$ac_cv_c_inline;;
    esac
    cat >>confdefs.h <<_ACEOF
#ifndef __cplusplus
#define inline $ac_val
#endif
_ACEOF
    ;;
esac


# Gnulib (later checks).  Putting them here rather than right after
# gl_EARLY avoids some redundant checks.






                        # Check whether --enable-cross-guesses was given.
if test "${enable_cross_guesses+set}" = set; then :
  enableval=$enable_cross_guesses; if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then
       { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-cross-guesses" >&5
$as_echo "$as_me: WARNING: invalid argument supplied to --enable-cross-guesses" >&2;}
       enableval=conservative
     fi
     gl_cross_guesses="$enableval"
else
  gl_cross_guesses=conservative
fi

  if test $gl_cross_guesses = risky; then
    gl_cross_guess_normal="guessing yes"
    gl_cross_guess_inverted="guessing no"
  else
    gl_cross_guess_normal="guessing no"
    gl_cross_guess_inverted="guessing yes"
  fi
          LIBC_FATAL_STDERR_=1
  export LIBC_FATAL_STDERR_

ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
if test "x$ac_cv_type_size_t" = xyes; then :

else

cat >>confdefs.h <<_ACEOF
#define size_t unsigned int
_ACEOF

fi

# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
# for constant arguments.  Useless!
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
$as_echo_n "checking for working alloca.h... " >&6; }
if ${ac_cv_working_alloca_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <alloca.h>
int
main ()
{
char *p = (char *) alloca (2 * sizeof (int));
			  if (p) return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_working_alloca_h=yes
else
  ac_cv_working_alloca_h=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
$as_echo "$ac_cv_working_alloca_h" >&6; }
if test $ac_cv_working_alloca_h = yes; then

$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
$as_echo_n "checking for alloca... " >&6; }
if ${ac_cv_func_alloca_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __GNUC__
# define alloca __builtin_alloca
#else
# ifdef _MSC_VER
#  include <malloc.h>
#  define alloca _alloca
# else
#  ifdef HAVE_ALLOCA_H
#   include <alloca.h>
#  else
#   ifdef _AIX
 #pragma alloca
#   else
#    ifndef alloca /* predefined by HP cc +Olibcalls */
void *alloca (size_t);
#    endif
#   endif
#  endif
# endif
#endif

int
main ()
{
char *p = (char *) alloca (1);
				    if (p) return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_func_alloca_works=yes
else
  ac_cv_func_alloca_works=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
$as_echo "$ac_cv_func_alloca_works" >&6; }

if test $ac_cv_func_alloca_works = yes; then

$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h

else
  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
# that cause trouble.  Some versions do not even contain alloca or
# contain a buggy version.  If you still want to use their alloca,
# use ar to extract alloca.o from them instead of compiling alloca.c.





ALLOCA=\${LIBOBJDIR}alloca.$ac_objext

$as_echo "#define C_ALLOCA 1" >>confdefs.h


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
if ${ac_cv_os_cray+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if defined CRAY && ! defined CRAY2
webecray
#else
wenotbecray
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "webecray" >/dev/null 2>&1; then :
  ac_cv_os_cray=yes
else
  ac_cv_os_cray=no
fi
rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5
$as_echo "$ac_cv_os_cray" >&6; }
if test $ac_cv_os_cray = yes; then
  for ac_func in _getb67 GETB67 getb67; do
    as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :

cat >>confdefs.h <<_ACEOF
#define CRAY_STACKSEG_END $ac_func
_ACEOF

    break
fi

  done
fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
$as_echo_n "checking stack direction for C alloca... " >&6; }
if ${ac_cv_c_stack_direction+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  ac_cv_c_stack_direction=0
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
int
find_stack_direction (int *addr, int depth)
{
  int dir, dummy = 0;
  if (! addr)
    addr = &dummy;
  *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
  dir = depth ? find_stack_direction (addr, depth - 1) : 0;
  return dir + dummy;
}

int
main (int argc, char **argv)
{
  return find_stack_direction (0, argc + !argv + 20) < 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_c_stack_direction=1
else
  ac_cv_c_stack_direction=-1
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
$as_echo "$ac_cv_c_stack_direction" >&6; }
cat >>confdefs.h <<_ACEOF
#define STACK_DIRECTION $ac_cv_c_stack_direction
_ACEOF


fi


  GNULIB__EXIT=0;
  GNULIB_ATOLL=0;
  GNULIB_CALLOC_POSIX=0;
  GNULIB_CANONICALIZE_FILE_NAME=0;
  GNULIB_GETLOADAVG=0;
  GNULIB_GETSUBOPT=0;
  GNULIB_GRANTPT=0;
  GNULIB_MALLOC_POSIX=0;
  GNULIB_MBTOWC=0;
  GNULIB_MKDTEMP=0;
  GNULIB_MKOSTEMP=0;
  GNULIB_MKOSTEMPS=0;
  GNULIB_MKSTEMP=0;
  GNULIB_MKSTEMPS=0;
  GNULIB_POSIX_OPENPT=0;
  GNULIB_PTSNAME=0;
  GNULIB_PTSNAME_R=0;
  GNULIB_PUTENV=0;
  GNULIB_QSORT_R=0;
  GNULIB_RANDOM=0;
  GNULIB_RANDOM_R=0;
  GNULIB_REALLOCARRAY=0;
  GNULIB_REALLOC_POSIX=0;
  GNULIB_REALPATH=0;
  GNULIB_RPMATCH=0;
  GNULIB_SECURE_GETENV=0;
  GNULIB_SETENV=0;
  GNULIB_STRTOD=0;
  GNULIB_STRTOLD=0;
  GNULIB_STRTOLL=0;
  GNULIB_STRTOULL=0;
  GNULIB_SYSTEM_POSIX=0;
  GNULIB_UNLOCKPT=0;
  GNULIB_UNSETENV=0;
  GNULIB_WCTOMB=0;
    HAVE__EXIT=1;
  HAVE_ATOLL=1;
  HAVE_CANONICALIZE_FILE_NAME=1;
  HAVE_DECL_GETLOADAVG=1;
  HAVE_GETSUBOPT=1;
  HAVE_GRANTPT=1;
  HAVE_INITSTATE=1;
  HAVE_DECL_INITSTATE=1;
  HAVE_MBTOWC=1;
  HAVE_MKDTEMP=1;
  HAVE_MKOSTEMP=1;
  HAVE_MKOSTEMPS=1;
  HAVE_MKSTEMP=1;
  HAVE_MKSTEMPS=1;
  HAVE_POSIX_OPENPT=1;
  HAVE_PTSNAME=1;
  HAVE_PTSNAME_R=1;
  HAVE_QSORT_R=1;
  HAVE_RANDOM=1;
  HAVE_RANDOM_H=1;
  HAVE_RANDOM_R=1;
  HAVE_REALLOCARRAY=1;
  HAVE_REALPATH=1;
  HAVE_RPMATCH=1;
  HAVE_SECURE_GETENV=1;
  HAVE_SETENV=1;
  HAVE_DECL_SETENV=1;
  HAVE_SETSTATE=1;
  HAVE_DECL_SETSTATE=1;
  HAVE_STRTOD=1;
  HAVE_STRTOLD=1;
  HAVE_STRTOLL=1;
  HAVE_STRTOULL=1;
  HAVE_STRUCT_RANDOM_DATA=1;
  HAVE_SYS_LOADAVG_H=0;
  HAVE_UNLOCKPT=1;
  HAVE_DECL_UNSETENV=1;
  REPLACE_CALLOC=0;
  REPLACE_CANONICALIZE_FILE_NAME=0;
  REPLACE_INITSTATE=0;
  REPLACE_MALLOC=0;
  REPLACE_MBTOWC=0;
  REPLACE_MKSTEMP=0;
  REPLACE_PTSNAME=0;
  REPLACE_PTSNAME_R=0;
  REPLACE_PUTENV=0;
  REPLACE_QSORT_R=0;
  REPLACE_RANDOM=0;
  REPLACE_RANDOM_R=0;
  REPLACE_REALLOC=0;
  REPLACE_REALPATH=0;
  REPLACE_SETENV=0;
  REPLACE_SETSTATE=0;
  REPLACE_STRTOD=0;
  REPLACE_STRTOLD=0;
  REPLACE_UNSETENV=0;
  REPLACE_WCTOMB=0;


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether malloc, realloc, calloc are POSIX compliant" >&5
$as_echo_n "checking whether malloc, realloc, calloc are POSIX compliant... " >&6; }
if ${gl_cv_func_malloc_posix+:} false; then :
  $as_echo_n "(cached) " >&6
else

                        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
#if defined _WIN32 && ! defined __CYGWIN__
             choke me
             #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_func_malloc_posix=yes
else
  gl_cv_func_malloc_posix=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_malloc_posix" >&5
$as_echo "$gl_cv_func_malloc_posix" >&6; }




  for ac_func in $ac_func_list
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done









  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether // is distinct from /" >&5
$as_echo_n "checking whether // is distinct from /... " >&6; }
if ${gl_cv_double_slash_root+:} false; then :
  $as_echo_n "(cached) " >&6
else
   if test x"$cross_compiling" = xyes ; then
        # When cross-compiling, there is no way to tell whether // is special
        # short of a list of hosts.  However, the only known hosts to date
        # that have a distinct // are Apollo DomainOS (too old to port to),
        # Cygwin, and z/OS.  If anyone knows of another system for which // has
        # special semantics and is distinct from /, please report it to
        # <bug-gnulib@gnu.org>.
        case $host in
          *-cygwin | i370-ibm-openedition)
            gl_cv_double_slash_root=yes ;;
          *)
            # Be optimistic and assume that / and // are the same when we
            # don't know.
            gl_cv_double_slash_root='unknown, assuming no' ;;
        esac
      else
        set x `ls -di / // 2>/dev/null`
        if test "$2" = "$4" && wc //dev/null >/dev/null 2>&1; then
          gl_cv_double_slash_root=no
        else
          gl_cv_double_slash_root=yes
        fi
      fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_double_slash_root" >&5
$as_echo "$gl_cv_double_slash_root" >&6; }
  if test "$gl_cv_double_slash_root" = yes; then

$as_echo "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h

  fi





     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether realpath works" >&5
$as_echo_n "checking whether realpath works... " >&6; }
if ${gl_cv_func_realpath_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

    touch conftest.a
    mkdir conftest.d
    if test "$cross_compiling" = yes; then :
  case "$host_os" in
                       # Guess yes on glibc systems.
        *-gnu* | gnu*) gl_cv_func_realpath_works="guessing yes" ;;
                       # Guess yes on musl systems.
        *-musl*)       gl_cv_func_realpath_works="guessing yes" ;;
                       # Guess no on native Windows.
        mingw*)        gl_cv_func_realpath_works="guessing no" ;;
                       # If we don't know, obey --enable-cross-guesses.
        *)             gl_cv_func_realpath_works="$gl_cross_guess_normal" ;;
      esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */



#include <stdlib.h>
#if defined __MACH__ && defined __APPLE__
/* Avoid a crash on Mac OS X.  */
#include <mach/mach.h>
#include <mach/mach_error.h>
#include <mach/thread_status.h>
#include <mach/exception.h>
#include <mach/task.h>
#include <pthread.h>
/* The exception port on which our thread listens.  */
static mach_port_t our_exception_port;
/* The main function of the thread listening for exceptions of type
   EXC_BAD_ACCESS.  */
static void *
mach_exception_thread (void *arg)
{
  /* Buffer for a message to be received.  */
  struct {
    mach_msg_header_t head;
    mach_msg_body_t msgh_body;
    char data[1024];
  } msg;
  mach_msg_return_t retval;
  /* Wait for a message on the exception port.  */
  retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
                     our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
  if (retval != MACH_MSG_SUCCESS)
    abort ();
  exit (1);
}
static void
nocrash_init (void)
{
  mach_port_t self = mach_task_self ();
  /* Allocate a port on which the thread shall listen for exceptions.  */
  if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
      == KERN_SUCCESS) {
    /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html.  */
    if (mach_port_insert_right (self, our_exception_port, our_exception_port,
                                MACH_MSG_TYPE_MAKE_SEND)
        == KERN_SUCCESS) {
      /* The exceptions we want to catch.  Only EXC_BAD_ACCESS is interesting
         for us.  */
      exception_mask_t mask = EXC_MASK_BAD_ACCESS;
      /* Create the thread listening on the exception port.  */
      pthread_attr_t attr;
      pthread_t thread;
      if (pthread_attr_init (&attr) == 0
          && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
          && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
        pthread_attr_destroy (&attr);
        /* Replace the exception port info for these exceptions with our own.
           Note that we replace the exception port for the entire task, not only
           for a particular thread.  This has the effect that when our exception
           port gets the message, the thread specific exception port has already
           been asked, and we don't need to bother about it.
           See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html.  */
        task_set_exception_ports (self, mask, our_exception_port,
                                  EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
      }
    }
  }
}
#elif defined _WIN32 && ! defined __CYGWIN__
/* Avoid a crash on native Windows.  */
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winerror.h>
static LONG WINAPI
exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
{
  switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
    {
    case EXCEPTION_ACCESS_VIOLATION:
    case EXCEPTION_IN_PAGE_ERROR:
    case EXCEPTION_STACK_OVERFLOW:
    case EXCEPTION_GUARD_PAGE:
    case EXCEPTION_PRIV_INSTRUCTION:
    case EXCEPTION_ILLEGAL_INSTRUCTION:
    case EXCEPTION_DATATYPE_MISALIGNMENT:
    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
      exit (1);
    }
  return EXCEPTION_CONTINUE_SEARCH;
}
static void
nocrash_init (void)
{
  SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
}
#else
/* Avoid a crash on POSIX systems.  */
#include <signal.h>
#include <unistd.h>
/* A POSIX signal handler.  */
static void
exception_handler (int sig)
{
  _exit (1);
}
static void
nocrash_init (void)
{
#ifdef SIGSEGV
  signal (SIGSEGV, exception_handler);
#endif
#ifdef SIGBUS
  signal (SIGBUS, exception_handler);
#endif
}
#endif

        #include <stdlib.h>
        #include <string.h>

int
main ()
{

        int result = 0;
        {
          char *name = realpath ("conftest.a", NULL);
          if (!(name && *name == '/'))
            result |= 1;
          free (name);
        }
        {
          char *name = realpath ("conftest.b/../conftest.a", NULL);
          if (name != NULL)
            result |= 2;
          free (name);
        }
        {
          char *name = realpath ("conftest.a/", NULL);
          if (name != NULL)
            result |= 4;
          free (name);
        }
        {
          char *name1 = realpath (".", NULL);
          char *name2 = realpath ("conftest.d//./..", NULL);
          if (! name1 || ! name2 || strcmp (name1, name2))
            result |= 8;
          free (name1);
          free (name2);
        }
        return result;

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_realpath_works=yes
else
  gl_cv_func_realpath_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

    rm -rf conftest.a conftest.d

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_realpath_works" >&5
$as_echo "$gl_cv_func_realpath_works" >&6; }
  case "$gl_cv_func_realpath_works" in
    *yes)

$as_echo "#define FUNC_REALPATH_WORKS 1" >>confdefs.h

      ;;
  esac













  GNULIB_ACCESS=0;
  GNULIB_CHDIR=0;
  GNULIB_CHOWN=0;
  GNULIB_CLOSE=0;
  GNULIB_COPY_FILE_RANGE=0;
  GNULIB_DUP=0;
  GNULIB_DUP2=0;
  GNULIB_DUP3=0;
  GNULIB_ENVIRON=0;
  GNULIB_EUIDACCESS=0;
  GNULIB_FACCESSAT=0;
  GNULIB_FCHDIR=0;
  GNULIB_FCHOWNAT=0;
  GNULIB_FDATASYNC=0;
  GNULIB_FSYNC=0;
  GNULIB_FTRUNCATE=0;
  GNULIB_GETCWD=0;
  GNULIB_GETDOMAINNAME=0;
  GNULIB_GETDTABLESIZE=0;
  GNULIB_GETGROUPS=0;
  GNULIB_GETHOSTNAME=0;
  GNULIB_GETLOGIN=0;
  GNULIB_GETLOGIN_R=0;
  GNULIB_GETPAGESIZE=0;
  GNULIB_GETPASS=0;
  GNULIB_GETUSERSHELL=0;
  GNULIB_GROUP_MEMBER=0;
  GNULIB_ISATTY=0;
  GNULIB_LCHOWN=0;
  GNULIB_LINK=0;
  GNULIB_LINKAT=0;
  GNULIB_LSEEK=0;
  GNULIB_PIPE=0;
  GNULIB_PIPE2=0;
  GNULIB_PREAD=0;
  GNULIB_PWRITE=0;
  GNULIB_READ=0;
  GNULIB_READLINK=0;
  GNULIB_READLINKAT=0;
  GNULIB_RMDIR=0;
  GNULIB_SETHOSTNAME=0;
  GNULIB_SLEEP=0;
  GNULIB_SYMLINK=0;
  GNULIB_SYMLINKAT=0;
  GNULIB_TRUNCATE=0;
  GNULIB_TTYNAME_R=0;
  GNULIB_UNISTD_H_NONBLOCKING=0;
  GNULIB_UNISTD_H_SIGPIPE=0;
  GNULIB_UNLINK=0;
  GNULIB_UNLINKAT=0;
  GNULIB_USLEEP=0;
  GNULIB_WRITE=0;
    HAVE_CHOWN=1;
  HAVE_COPY_FILE_RANGE=1;
  HAVE_DUP2=1;
  HAVE_DUP3=1;
  HAVE_EUIDACCESS=1;
  HAVE_FACCESSAT=1;
  HAVE_FCHDIR=1;
  HAVE_FCHOWNAT=1;
  HAVE_FDATASYNC=1;
  HAVE_FSYNC=1;
  HAVE_FTRUNCATE=1;
  HAVE_GETDTABLESIZE=1;
  HAVE_GETGROUPS=1;
  HAVE_GETHOSTNAME=1;
  HAVE_GETLOGIN=1;
  HAVE_GETPAGESIZE=1;
  HAVE_GETPASS=1;
  HAVE_GROUP_MEMBER=1;
  HAVE_LCHOWN=1;
  HAVE_LINK=1;
  HAVE_LINKAT=1;
  HAVE_PIPE=1;
  HAVE_PIPE2=1;
  HAVE_PREAD=1;
  HAVE_PWRITE=1;
  HAVE_READLINK=1;
  HAVE_READLINKAT=1;
  HAVE_SETHOSTNAME=1;
  HAVE_SLEEP=1;
  HAVE_SYMLINK=1;
  HAVE_SYMLINKAT=1;
  HAVE_UNLINKAT=1;
  HAVE_USLEEP=1;
  HAVE_DECL_ENVIRON=1;
  HAVE_DECL_FCHDIR=1;
  HAVE_DECL_FDATASYNC=1;
  HAVE_DECL_GETDOMAINNAME=1;
  HAVE_DECL_GETLOGIN=1;
  HAVE_DECL_GETLOGIN_R=1;
  HAVE_DECL_GETPAGESIZE=1;
  HAVE_DECL_GETUSERSHELL=1;
  HAVE_DECL_SETHOSTNAME=1;
  HAVE_DECL_TRUNCATE=1;
  HAVE_DECL_TTYNAME_R=1;
  HAVE_OS_H=0;
  HAVE_SYS_PARAM_H=0;
  REPLACE_ACCESS=0;
  REPLACE_CHOWN=0;
  REPLACE_CLOSE=0;
  REPLACE_DUP=0;
  REPLACE_DUP2=0;
  REPLACE_FACCESSAT=0;
  REPLACE_FCHOWNAT=0;
  REPLACE_FTRUNCATE=0;
  REPLACE_GETCWD=0;
  REPLACE_GETDOMAINNAME=0;
  REPLACE_GETDTABLESIZE=0;
  REPLACE_GETLOGIN_R=0;
  REPLACE_GETGROUPS=0;
  REPLACE_GETPAGESIZE=0;
  REPLACE_GETPASS=0;
  REPLACE_ISATTY=0;
  REPLACE_LCHOWN=0;
  REPLACE_LINK=0;
  REPLACE_LINKAT=0;
  REPLACE_LSEEK=0;
  REPLACE_PREAD=0;
  REPLACE_PWRITE=0;
  REPLACE_READ=0;
  REPLACE_READLINK=0;
  REPLACE_READLINKAT=0;
  REPLACE_RMDIR=0;
  REPLACE_SLEEP=0;
  REPLACE_SYMLINK=0;
  REPLACE_SYMLINKAT=0;
  REPLACE_TRUNCATE=0;
  REPLACE_TTYNAME_R=0;
  REPLACE_UNLINK=0;
  REPLACE_UNLINKAT=0;
  REPLACE_USLEEP=0;
  REPLACE_WRITE=0;
  UNISTD_H_HAVE_WINSOCK2_H=0;
  UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;






  if test $ac_cv_func__set_invalid_parameter_handler = yes; then
    HAVE_MSVC_INVALID_PARAMETER_HANDLER=1

$as_echo "#define HAVE_MSVC_INVALID_PARAMETER_HANDLER 1" >>confdefs.h

  else
    HAVE_MSVC_INVALID_PARAMETER_HANDLER=0
  fi

















  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if environ is properly declared" >&5
$as_echo_n "checking if environ is properly declared... " >&6; }
if ${gt_cv_var_environ_declaration+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if HAVE_UNISTD_H
     #include <unistd.h>
     #endif
     /* mingw, BeOS, Haiku declare environ in <stdlib.h>, not in <unistd.h>.  */
     #include <stdlib.h>

            extern struct { int foo; } environ;
int
main ()
{
environ.foo = 1;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gt_cv_var_environ_declaration=no
else
  gt_cv_var_environ_declaration=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_var_environ_declaration" >&5
$as_echo "$gt_cv_var_environ_declaration" >&6; }
  if test $gt_cv_var_environ_declaration = yes; then

$as_echo "#define HAVE_ENVIRON_DECL 1" >>confdefs.h

  fi


  if test $gt_cv_var_environ_declaration != yes; then
    HAVE_DECL_ENVIRON=0
  fi



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the preprocessor supports include_next" >&5
$as_echo_n "checking whether the preprocessor supports include_next... " >&6; }
if ${gl_cv_have_include_next+:} false; then :
  $as_echo_n "(cached) " >&6
else
  rm -rf conftestd1a conftestd1b conftestd2
     mkdir conftestd1a conftestd1b conftestd2
                                                  cat <<EOF > conftestd1a/conftest.h
#define DEFINED_IN_CONFTESTD1
#include_next <conftest.h>
#ifdef DEFINED_IN_CONFTESTD2
int foo;
#else
#error "include_next doesn't work"
#endif
EOF
     cat <<EOF > conftestd1b/conftest.h
#define DEFINED_IN_CONFTESTD1
#include <stdio.h>
#include_next <conftest.h>
#ifdef DEFINED_IN_CONFTESTD2
int foo;
#else
#error "include_next doesn't work"
#endif
EOF
     cat <<EOF > conftestd2/conftest.h
#ifndef DEFINED_IN_CONFTESTD1
#error "include_next test doesn't work"
#endif
#define DEFINED_IN_CONFTESTD2
EOF
     gl_save_CPPFLAGS="$CPPFLAGS"
     CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2"
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <conftest.h>
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_have_include_next=yes
else
  CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2"
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <conftest.h>
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_have_include_next=buggy
else
  gl_cv_have_include_next=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
     CPPFLAGS="$gl_save_CPPFLAGS"
     rm -rf conftestd1a conftestd1b conftestd2

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_include_next" >&5
$as_echo "$gl_cv_have_include_next" >&6; }
  PRAGMA_SYSTEM_HEADER=
  if test $gl_cv_have_include_next = yes; then
    INCLUDE_NEXT=include_next
    INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
    if test -n "$GCC"; then
      PRAGMA_SYSTEM_HEADER='#pragma GCC system_header'
    fi
  else
    if test $gl_cv_have_include_next = buggy; then
      INCLUDE_NEXT=include
      INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
    else
      INCLUDE_NEXT=include
      INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include
    fi
  fi



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether system header files limit the line length" >&5
$as_echo_n "checking whether system header files limit the line length... " >&6; }
if ${gl_cv_pragma_columns+:} false; then :
  $as_echo_n "(cached) " >&6
else
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef __TANDEM
choke me
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "choke me" >/dev/null 2>&1; then :
  gl_cv_pragma_columns=yes
else
  gl_cv_pragma_columns=no
fi
rm -f conftest*


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_pragma_columns" >&5
$as_echo "$gl_cv_pragma_columns" >&6; }
  if test $gl_cv_pragma_columns = yes; then
    PRAGMA_COLUMNS="#pragma COLUMNS 10000"
  else
    PRAGMA_COLUMNS=
  fi




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for complete errno.h" >&5
$as_echo_n "checking for complete errno.h... " >&6; }
if ${gl_cv_header_errno_h_complete+:} false; then :
  $as_echo_n "(cached) " >&6
else

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <errno.h>
#if !defined ETXTBSY
booboo
#endif
#if !defined ENOMSG
booboo
#endif
#if !defined EIDRM
booboo
#endif
#if !defined ENOLINK
booboo
#endif
#if !defined EPROTO
booboo
#endif
#if !defined EMULTIHOP
booboo
#endif
#if !defined EBADMSG
booboo
#endif
#if !defined EOVERFLOW
booboo
#endif
#if !defined ENOTSUP
booboo
#endif
#if !defined ENETRESET
booboo
#endif
#if !defined ECONNABORTED
booboo
#endif
#if !defined ESTALE
booboo
#endif
#if !defined EDQUOT
booboo
#endif
#if !defined ECANCELED
booboo
#endif
#if !defined EOWNERDEAD
booboo
#endif
#if !defined ENOTRECOVERABLE
booboo
#endif
#if !defined EILSEQ
booboo
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "booboo" >/dev/null 2>&1; then :
  gl_cv_header_errno_h_complete=no
else
  gl_cv_header_errno_h_complete=yes
fi
rm -f conftest*


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_complete" >&5
$as_echo "$gl_cv_header_errno_h_complete" >&6; }
  if test $gl_cv_header_errno_h_complete = yes; then
    ERRNO_H=''
  else








     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_errno_h='<'errno.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <errno.h>" >&5
$as_echo_n "checking absolute name of <errno.h>... " >&6; }
if ${gl_cv_next_errno_h+:} false; then :
  $as_echo_n "(cached) " >&6
else



  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'errno.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_errno_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_errno_h
           gl_cv_next_errno_h='"'$gl_header'"'


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_errno_h" >&5
$as_echo "$gl_cv_next_errno_h" >&6; }
     fi
     NEXT_ERRNO_H=$gl_cv_next_errno_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'errno.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_errno_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_ERRNO_H=$gl_next_as_first_directive




    ERRNO_H='errno.h'
  fi

   if test -n "$ERRNO_H"; then
  GL_GENERATE_ERRNO_H_TRUE=
  GL_GENERATE_ERRNO_H_FALSE='#'
else
  GL_GENERATE_ERRNO_H_TRUE='#'
  GL_GENERATE_ERRNO_H_FALSE=
fi


  if test -n "$ERRNO_H"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EMULTIHOP value" >&5
$as_echo_n "checking for EMULTIHOP value... " >&6; }
if ${gl_cv_header_errno_h_EMULTIHOP+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <errno.h>
#ifdef EMULTIHOP
yes
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  gl_cv_header_errno_h_EMULTIHOP=yes
else
  gl_cv_header_errno_h_EMULTIHOP=no
fi
rm -f conftest*

      if test $gl_cv_header_errno_h_EMULTIHOP = no; then
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define _XOPEN_SOURCE_EXTENDED 1
#include <errno.h>
#ifdef EMULTIHOP
yes
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  gl_cv_header_errno_h_EMULTIHOP=hidden
fi
rm -f conftest*

        if test $gl_cv_header_errno_h_EMULTIHOP = hidden; then
                              if ac_fn_c_compute_int "$LINENO" "EMULTIHOP" "gl_cv_header_errno_h_EMULTIHOP"        "
#define _XOPEN_SOURCE_EXTENDED 1
#include <errno.h>
/* The following two lines are a workaround against an autoconf-2.52 bug.  */
#include <stdio.h>
#include <stdlib.h>
"; then :

fi

        fi
      fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EMULTIHOP" >&5
$as_echo "$gl_cv_header_errno_h_EMULTIHOP" >&6; }
    case $gl_cv_header_errno_h_EMULTIHOP in
      yes | no)
        EMULTIHOP_HIDDEN=0; EMULTIHOP_VALUE=
        ;;
      *)
        EMULTIHOP_HIDDEN=1; EMULTIHOP_VALUE="$gl_cv_header_errno_h_EMULTIHOP"
        ;;
    esac


  fi


  if test -n "$ERRNO_H"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ENOLINK value" >&5
$as_echo_n "checking for ENOLINK value... " >&6; }
if ${gl_cv_header_errno_h_ENOLINK+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <errno.h>
#ifdef ENOLINK
yes
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  gl_cv_header_errno_h_ENOLINK=yes
else
  gl_cv_header_errno_h_ENOLINK=no
fi
rm -f conftest*

      if test $gl_cv_header_errno_h_ENOLINK = no; then
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define _XOPEN_SOURCE_EXTENDED 1
#include <errno.h>
#ifdef ENOLINK
yes
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  gl_cv_header_errno_h_ENOLINK=hidden
fi
rm -f conftest*

        if test $gl_cv_header_errno_h_ENOLINK = hidden; then
                              if ac_fn_c_compute_int "$LINENO" "ENOLINK" "gl_cv_header_errno_h_ENOLINK"        "
#define _XOPEN_SOURCE_EXTENDED 1
#include <errno.h>
/* The following two lines are a workaround against an autoconf-2.52 bug.  */
#include <stdio.h>
#include <stdlib.h>
"; then :

fi

        fi
      fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_ENOLINK" >&5
$as_echo "$gl_cv_header_errno_h_ENOLINK" >&6; }
    case $gl_cv_header_errno_h_ENOLINK in
      yes | no)
        ENOLINK_HIDDEN=0; ENOLINK_VALUE=
        ;;
      *)
        ENOLINK_HIDDEN=1; ENOLINK_VALUE="$gl_cv_header_errno_h_ENOLINK"
        ;;
    esac


  fi


  if test -n "$ERRNO_H"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EOVERFLOW value" >&5
$as_echo_n "checking for EOVERFLOW value... " >&6; }
if ${gl_cv_header_errno_h_EOVERFLOW+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <errno.h>
#ifdef EOVERFLOW
yes
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  gl_cv_header_errno_h_EOVERFLOW=yes
else
  gl_cv_header_errno_h_EOVERFLOW=no
fi
rm -f conftest*

      if test $gl_cv_header_errno_h_EOVERFLOW = no; then
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define _XOPEN_SOURCE_EXTENDED 1
#include <errno.h>
#ifdef EOVERFLOW
yes
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  gl_cv_header_errno_h_EOVERFLOW=hidden
fi
rm -f conftest*

        if test $gl_cv_header_errno_h_EOVERFLOW = hidden; then
                              if ac_fn_c_compute_int "$LINENO" "EOVERFLOW" "gl_cv_header_errno_h_EOVERFLOW"        "
#define _XOPEN_SOURCE_EXTENDED 1
#include <errno.h>
/* The following two lines are a workaround against an autoconf-2.52 bug.  */
#include <stdio.h>
#include <stdlib.h>
"; then :

fi

        fi
      fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EOVERFLOW" >&5
$as_echo "$gl_cv_header_errno_h_EOVERFLOW" >&6; }
    case $gl_cv_header_errno_h_EOVERFLOW in
      yes | no)
        EOVERFLOW_HIDDEN=0; EOVERFLOW_VALUE=
        ;;
      *)
        EOVERFLOW_HIDDEN=1; EOVERFLOW_VALUE="$gl_cv_header_errno_h_EOVERFLOW"
        ;;
    esac


  fi


ac_fn_c_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default"
if test "x$ac_cv_have_decl_strerror_r" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_STRERROR_R $ac_have_decl
_ACEOF

for ac_func in strerror_r
do :
  ac_fn_c_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r"
if test "x$ac_cv_func_strerror_r" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRERROR_R 1
_ACEOF

fi
done

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5
$as_echo_n "checking whether strerror_r returns char *... " >&6; }
if ${ac_cv_func_strerror_r_char_p+:} false; then :
  $as_echo_n "(cached) " >&6
else

    ac_cv_func_strerror_r_char_p=no
    if test $ac_cv_have_decl_strerror_r = yes; then
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
int
main ()
{

	  char buf[100];
	  char x = *strerror_r (0, buf, sizeof buf);
	  char *p = strerror_r (0, buf, sizeof buf);
	  return !p || x;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_func_strerror_r_char_p=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    else
      # strerror_r is not declared.  Choose between
      # systems that have relatively inaccessible declarations for the
      # function.  BeOS and DEC UNIX 4.0 fall in this category, but the
      # former has a strerror_r that returns char*, while the latter
      # has a strerror_r that returns `int'.
      # This test should segfault on the DEC system.
      if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
	extern char *strerror_r ();
int
main ()
{
char buf[100];
	  char x = *strerror_r (0, buf, sizeof buf);
	  return ! isalpha (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_func_strerror_r_char_p=yes
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

    fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_char_p" >&5
$as_echo "$ac_cv_func_strerror_r_char_p" >&6; }
if test $ac_cv_func_strerror_r_char_p = yes; then

$as_echo "#define STRERROR_R_CHAR_P 1" >>confdefs.h

fi


  XGETTEXT_EXTRA_OPTIONS=





  ac_fn_c_check_type "$LINENO" "sig_atomic_t" "ac_cv_type_sig_atomic_t" "#include <signal.h>
"
if test "x$ac_cv_type_sig_atomic_t" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_SIG_ATOMIC_T 1
_ACEOF


else

$as_echo "#define sig_atomic_t int" >>confdefs.h

fi



  GNULIB_CREAT=0;
  GNULIB_FCNTL=0;
  GNULIB_NONBLOCKING=0;
  GNULIB_OPEN=0;
  GNULIB_OPENAT=0;
    HAVE_FCNTL=1;
  HAVE_OPENAT=1;
  REPLACE_CREAT=0;
  REPLACE_FCNTL=0;
  REPLACE_OPEN=0;
  REPLACE_OPENAT=0;










  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fcntl.h" >&5
$as_echo_n "checking for working fcntl.h... " >&6; }
if ${gl_cv_header_working_fcntl_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  case "$host_os" in
                  # Guess 'no' on native Windows.
          mingw*) gl_cv_header_working_fcntl_h='no' ;;
          *)      gl_cv_header_working_fcntl_h=cross-compiling ;;
        esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
           #include <sys/stat.h>
           #if HAVE_UNISTD_H
           # include <unistd.h>
           #else /* on Windows with MSVC */
           # include <io.h>
           # include <stdlib.h>
           # defined sleep(n) _sleep ((n) * 1000)
           #endif
           #include <fcntl.h>
           #ifndef O_NOATIME
            #define O_NOATIME 0
           #endif
           #ifndef O_NOFOLLOW
            #define O_NOFOLLOW 0
           #endif
           static int const constants[] =
            {
              O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND,
              O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
            };

int
main ()
{

            int result = !constants;
            #if HAVE_SYMLINK
            {
              static char const sym[] = "conftest.sym";
              if (symlink ("/dev/null", sym) != 0)
                result |= 2;
              else
                {
                  int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0);
                  if (fd >= 0)
                    {
                      close (fd);
                      result |= 4;
                    }
                }
              if (unlink (sym) != 0 || symlink (".", sym) != 0)
                result |= 2;
              else
                {
                  int fd = open (sym, O_RDONLY | O_NOFOLLOW);
                  if (fd >= 0)
                    {
                      close (fd);
                      result |= 4;
                    }
                }
              unlink (sym);
            }
            #endif
            {
              static char const file[] = "confdefs.h";
              int fd = open (file, O_RDONLY | O_NOATIME);
              if (fd < 0)
                result |= 8;
              else
                {
                  struct stat st0;
                  if (fstat (fd, &st0) != 0)
                    result |= 16;
                  else
                    {
                      char c;
                      sleep (1);
                      if (read (fd, &c, 1) != 1)
                        result |= 24;
                      else
                        {
                          if (close (fd) != 0)
                            result |= 32;
                          else
                            {
                              struct stat st1;
                              if (stat (file, &st1) != 0)
                                result |= 40;
                              else
                                if (st0.st_atime != st1.st_atime)
                                  result |= 64;
                            }
                        }
                    }
                }
            }
            return result;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_header_working_fcntl_h=yes
else
  case $? in #(
        4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
        64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
        68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
         *) gl_cv_header_working_fcntl_h='no';;
        esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_fcntl_h" >&5
$as_echo "$gl_cv_header_working_fcntl_h" >&6; }

  case $gl_cv_header_working_fcntl_h in #(
  *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
  *) ac_val=1;;
  esac

cat >>confdefs.h <<_ACEOF
#define HAVE_WORKING_O_NOATIME $ac_val
_ACEOF


  case $gl_cv_header_working_fcntl_h in #(
  *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
  *) ac_val=1;;
  esac

cat >>confdefs.h <<_ACEOF
#define HAVE_WORKING_O_NOFOLLOW $ac_val
_ACEOF


ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
if test "x$ac_cv_type_pid_t" = xyes; then :

else

cat >>confdefs.h <<_ACEOF
#define pid_t int
_ACEOF

fi

ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
if test "x$ac_cv_type_mode_t" = xyes; then :

else

cat >>confdefs.h <<_ACEOF
#define mode_t int
_ACEOF

fi


  GNULIB_DPRINTF=0;
  GNULIB_FCLOSE=0;
  GNULIB_FDOPEN=0;
  GNULIB_FFLUSH=0;
  GNULIB_FGETC=0;
  GNULIB_FGETS=0;
  GNULIB_FOPEN=0;
  GNULIB_FPRINTF=0;
  GNULIB_FPRINTF_POSIX=0;
  GNULIB_FPURGE=0;
  GNULIB_FPUTC=0;
  GNULIB_FPUTS=0;
  GNULIB_FREAD=0;
  GNULIB_FREOPEN=0;
  GNULIB_FSCANF=0;
  GNULIB_FSEEK=0;
  GNULIB_FSEEKO=0;
  GNULIB_FTELL=0;
  GNULIB_FTELLO=0;
  GNULIB_FWRITE=0;
  GNULIB_GETC=0;
  GNULIB_GETCHAR=0;
  GNULIB_GETDELIM=0;
  GNULIB_GETLINE=0;
  GNULIB_OBSTACK_PRINTF=0;
  GNULIB_OBSTACK_PRINTF_POSIX=0;
  GNULIB_PCLOSE=0;
  GNULIB_PERROR=0;
  GNULIB_POPEN=0;
  GNULIB_PRINTF=0;
  GNULIB_PRINTF_POSIX=0;
  GNULIB_PUTC=0;
  GNULIB_PUTCHAR=0;
  GNULIB_PUTS=0;
  GNULIB_REMOVE=0;
  GNULIB_RENAME=0;
  GNULIB_RENAMEAT=0;
  GNULIB_SCANF=0;
  GNULIB_SNPRINTF=0;
  GNULIB_SPRINTF_POSIX=0;
  GNULIB_STDIO_H_NONBLOCKING=0;
  GNULIB_STDIO_H_SIGPIPE=0;
  GNULIB_TMPFILE=0;
  GNULIB_VASPRINTF=0;
  GNULIB_VFSCANF=0;
  GNULIB_VSCANF=0;
  GNULIB_VDPRINTF=0;
  GNULIB_VFPRINTF=0;
  GNULIB_VFPRINTF_POSIX=0;
  GNULIB_VPRINTF=0;
  GNULIB_VPRINTF_POSIX=0;
  GNULIB_VSNPRINTF=0;
  GNULIB_VSPRINTF_POSIX=0;
    HAVE_DECL_FPURGE=1;
  HAVE_DECL_FSEEKO=1;
  HAVE_DECL_FTELLO=1;
  HAVE_DECL_GETDELIM=1;
  HAVE_DECL_GETLINE=1;
  HAVE_DECL_OBSTACK_PRINTF=1;
  HAVE_DECL_SNPRINTF=1;
  HAVE_DECL_VSNPRINTF=1;
  HAVE_DPRINTF=1;
  HAVE_FSEEKO=1;
  HAVE_FTELLO=1;
  HAVE_PCLOSE=1;
  HAVE_POPEN=1;
  HAVE_RENAMEAT=1;
  HAVE_VASPRINTF=1;
  HAVE_VDPRINTF=1;
  REPLACE_DPRINTF=0;
  REPLACE_FCLOSE=0;
  REPLACE_FDOPEN=0;
  REPLACE_FFLUSH=0;
  REPLACE_FOPEN=0;
  REPLACE_FPRINTF=0;
  REPLACE_FPURGE=0;
  REPLACE_FREOPEN=0;
  REPLACE_FSEEK=0;
  REPLACE_FSEEKO=0;
  REPLACE_FTELL=0;
  REPLACE_FTELLO=0;
  REPLACE_GETDELIM=0;
  REPLACE_GETLINE=0;
  REPLACE_OBSTACK_PRINTF=0;
  REPLACE_PERROR=0;
  REPLACE_POPEN=0;
  REPLACE_PRINTF=0;
  REPLACE_REMOVE=0;
  REPLACE_RENAME=0;
  REPLACE_RENAMEAT=0;
  REPLACE_SNPRINTF=0;
  REPLACE_SPRINTF=0;
  REPLACE_STDIO_READ_FUNCS=0;
  REPLACE_STDIO_WRITE_FUNCS=0;
  REPLACE_TMPFILE=0;
  REPLACE_VASPRINTF=0;
  REPLACE_VDPRINTF=0;
  REPLACE_VFPRINTF=0;
  REPLACE_VPRINTF=0;
  REPLACE_VSNPRINTF=0;
  REPLACE_VSPRINTF=0;




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5
$as_echo_n "checking for stdint.h... " >&6; }
if ${gl_cv_header_stdint_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
            #include <stdint.h>
int
main ()
{
uintmax_t i = (uintmax_t) -1; return !i;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_header_stdint_h=yes
else
  gl_cv_header_stdint_h=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_h" >&5
$as_echo "$gl_cv_header_stdint_h" >&6; }
  if test $gl_cv_header_stdint_h = yes; then

cat >>confdefs.h <<_ACEOF
#define HAVE_STDINT_H_WITH_UINTMAX 1
_ACEOF

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5
$as_echo_n "checking for inttypes.h... " >&6; }
if ${gl_cv_header_inttypes_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <inttypes.h>

int
main ()
{
uintmax_t i = (uintmax_t) -1; return !i;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_header_inttypes_h=yes
else
  gl_cv_header_inttypes_h=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_inttypes_h" >&5
$as_echo "$gl_cv_header_inttypes_h" >&6; }
  if test $gl_cv_header_inttypes_h = yes; then

cat >>confdefs.h <<_ACEOF
#define HAVE_INTTYPES_H_WITH_UINTMAX 1
_ACEOF

  fi





     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports size specifiers as in C99" >&5
$as_echo_n "checking whether printf supports size specifiers as in C99... " >&6; }
if ${gl_cv_func_printf_sizes_c99+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
                                 # Guess yes on glibc systems.
           *-gnu* | gnu*)        gl_cv_func_printf_sizes_c99="guessing yes";;
                                 # Guess yes on musl systems.
           *-musl*)              gl_cv_func_printf_sizes_c99="guessing yes";;
                                 # Guess yes on FreeBSD >= 5.
           freebsd[1-4].*)       gl_cv_func_printf_sizes_c99="guessing no";;
           freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
                                 # Guess yes on Mac OS X >= 10.3.
           darwin[1-6].*)        gl_cv_func_printf_sizes_c99="guessing no";;
           darwin*)              gl_cv_func_printf_sizes_c99="guessing yes";;
                                 # Guess yes on OpenBSD >= 3.9.
           openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
                                 gl_cv_func_printf_sizes_c99="guessing no";;
           openbsd*)             gl_cv_func_printf_sizes_c99="guessing yes";;
                                 # Guess yes on Solaris >= 2.10.
           solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
           solaris*)             gl_cv_func_printf_sizes_c99="guessing no";;
                                 # Guess yes on NetBSD >= 3.
           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
                                 gl_cv_func_printf_sizes_c99="guessing no";;
           netbsd*)              gl_cv_func_printf_sizes_c99="guessing yes";;
                                 # Guess yes on Android.
           linux*-android*)      gl_cv_func_printf_sizes_c99="guessing yes";;
                                 # Guess yes on MSVC, no on mingw.
           mingw*)               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef _MSC_VER
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_func_printf_sizes_c99="guessing yes"
else
  gl_cv_func_printf_sizes_c99="guessing no"
fi
rm -f conftest*

                                 ;;
                                 # If we don't know, obey --enable-cross-guesses.
           *)                    gl_cv_func_printf_sizes_c99="$gl_cross_guess_normal";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#if HAVE_STDINT_H_WITH_UINTMAX
# include <stdint.h>
#endif
#if HAVE_INTTYPES_H_WITH_UINTMAX
# include <inttypes.h>
#endif
static char buf[100];
int main ()
{
  int result = 0;
#if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
  buf[0] = '\0';
  if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
      || strcmp (buf, "12345671 33") != 0)
    result |= 1;
#else
  result |= 1;
#endif
  buf[0] = '\0';
  if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
      || strcmp (buf, "12345672 33") != 0)
    result |= 2;
  buf[0] = '\0';
  if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
      || strcmp (buf, "12345673 33") != 0)
    result |= 4;
  buf[0] = '\0';
  if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
      || strcmp (buf, "1.5 33") != 0)
    result |= 8;
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_printf_sizes_c99=yes
else
  gl_cv_func_printf_sizes_c99=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_sizes_c99" >&5
$as_echo "$gl_cv_func_printf_sizes_c99" >&6; }



     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports 'long double' arguments" >&5
$as_echo_n "checking whether printf supports 'long double' arguments... " >&6; }
if ${gl_cv_func_printf_long_double+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
                            # Guess no on BeOS.
           beos*)           gl_cv_func_printf_long_double="guessing no";;
                            # Guess yes on Android.
           linux*-android*) gl_cv_func_printf_long_double="guessing yes";;
                            # Guess yes on MSVC, no on mingw.
           mingw*)          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef _MSC_VER
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_func_printf_long_double="guessing yes"
else
  gl_cv_func_printf_long_double="guessing no"
fi
rm -f conftest*

                            ;;
           *)               gl_cv_func_printf_long_double="guessing yes";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
static char buf[10000];
int main ()
{
  int result = 0;
  buf[0] = '\0';
  if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0
      || strcmp (buf, "1.750000 33") != 0)
    result |= 1;
  buf[0] = '\0';
  if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0
      || strcmp (buf, "1.750000e+00 33") != 0)
    result |= 2;
  buf[0] = '\0';
  if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0
      || strcmp (buf, "1.75 33") != 0)
    result |= 4;
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_printf_long_double=yes
else
  gl_cv_func_printf_long_double=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_long_double" >&5
$as_echo "$gl_cv_func_printf_long_double" >&6; }



     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports infinite 'double' arguments" >&5
$as_echo_n "checking whether printf supports infinite 'double' arguments... " >&6; }
if ${gl_cv_func_printf_infinite+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
                                 # Guess yes on glibc systems.
           *-gnu* | gnu*)        gl_cv_func_printf_infinite="guessing yes";;
                                 # Guess yes on musl systems.
           *-musl*)              gl_cv_func_printf_infinite="guessing yes";;
                                 # Guess yes on FreeBSD >= 6.
           freebsd[1-5].*)       gl_cv_func_printf_infinite="guessing no";;
           freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";;
                                 # Guess yes on Mac OS X >= 10.3.
           darwin[1-6].*)        gl_cv_func_printf_infinite="guessing no";;
           darwin*)              gl_cv_func_printf_infinite="guessing yes";;
                                 # Guess yes on HP-UX >= 11.
           hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";;
           hpux*)                gl_cv_func_printf_infinite="guessing yes";;
                                 # Guess yes on NetBSD >= 3.
           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
                                 gl_cv_func_printf_infinite="guessing no";;
           netbsd*)              gl_cv_func_printf_infinite="guessing yes";;
                                 # Guess yes on BeOS.
           beos*)                gl_cv_func_printf_infinite="guessing yes";;
                                 # Guess no on Android.
           linux*-android*)      gl_cv_func_printf_infinite="guessing no";;
                                 # Guess yes on MSVC, no on mingw.
           mingw*)               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef _MSC_VER
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_func_printf_infinite="guessing yes"
else
  gl_cv_func_printf_infinite="guessing no"
fi
rm -f conftest*

                                 ;;
                                 # If we don't know, obey --enable-cross-guesses.
           *)                    gl_cv_func_printf_infinite="$gl_cross_guess_normal";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
static int
strisnan (const char *string, size_t start_index, size_t end_index)
{
  if (start_index < end_index)
    {
      if (string[start_index] == '-')
        start_index++;
      if (start_index + 3 <= end_index
          && memcmp (string + start_index, "nan", 3) == 0)
        {
          start_index += 3;
          if (start_index == end_index
              || (string[start_index] == '(' && string[end_index - 1] == ')'))
            return 1;
        }
    }
  return 0;
}
static int
have_minus_zero ()
{
  static double plus_zero = 0.0;
  double minus_zero = - plus_zero;
  return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
}
static char buf[10000];
static double zero = 0.0;
int main ()
{
  int result = 0;
  if (sprintf (buf, "%f", 1.0 / zero) < 0
      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
    result |= 1;
  if (sprintf (buf, "%f", -1.0 / zero) < 0
      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
    result |= 1;
  if (sprintf (buf, "%f", zero / zero) < 0
      || !strisnan (buf, 0, strlen (buf)))
    result |= 2;
  if (sprintf (buf, "%e", 1.0 / zero) < 0
      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
    result |= 4;
  if (sprintf (buf, "%e", -1.0 / zero) < 0
      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
    result |= 4;
  if (sprintf (buf, "%e", zero / zero) < 0
      || !strisnan (buf, 0, strlen (buf)))
    result |= 8;
  if (sprintf (buf, "%g", 1.0 / zero) < 0
      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
    result |= 16;
  if (sprintf (buf, "%g", -1.0 / zero) < 0
      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
    result |= 16;
  if (sprintf (buf, "%g", zero / zero) < 0
      || !strisnan (buf, 0, strlen (buf)))
    result |= 32;
  /* This test fails on HP-UX 10.20.  */
  if (have_minus_zero ())
    if (sprintf (buf, "%g", - zero) < 0
        || strcmp (buf, "-0") != 0)
    result |= 64;
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_printf_infinite=yes
else
  gl_cv_func_printf_infinite=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_infinite" >&5
$as_echo "$gl_cv_func_printf_infinite" >&6; }


   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
if ${ac_cv_c_bigendian+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_c_bigendian=unknown
    # See if we're dealing with a universal compiler.
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __APPLE_CC__
	       not a universal capable compiler
	     #endif
	     typedef int dummy;

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

	# Check for potential -arch flags.  It is not universal unless
	# there are at least two -arch flags with different values.
	ac_arch=
	ac_prev=
	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
	 if test -n "$ac_prev"; then
	   case $ac_word in
	     i?86 | x86_64 | ppc | ppc64)
	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
		 ac_arch=$ac_word
	       else
		 ac_cv_c_bigendian=universal
		 break
	       fi
	       ;;
	   esac
	   ac_prev=
	 elif test "x$ac_word" = "x-arch"; then
	   ac_prev=arch
	 fi
       done
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    if test $ac_cv_c_bigendian = unknown; then
      # See if sys/param.h defines the BYTE_ORDER macro.
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
	     #include <sys/param.h>

int
main ()
{
#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
		     && LITTLE_ENDIAN)
	      bogus endian macros
	     #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  # It does; now see whether it defined to BIG_ENDIAN or not.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
		#include <sys/param.h>

int
main ()
{
#if BYTE_ORDER != BIG_ENDIAN
		 not big endian
		#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_bigendian=yes
else
  ac_cv_c_bigendian=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    fi
    if test $ac_cv_c_bigendian = unknown; then
      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>

int
main ()
{
#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
	      bogus endian macros
	     #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  # It does; now see whether it defined to _BIG_ENDIAN or not.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>

int
main ()
{
#ifndef _BIG_ENDIAN
		 not big endian
		#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_bigendian=yes
else
  ac_cv_c_bigendian=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    fi
    if test $ac_cv_c_bigendian = unknown; then
      # Compile a test program.
      if test "$cross_compiling" = yes; then :
  # Try to guess by grepping values from an object file.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
short int ascii_mm[] =
		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
		short int ascii_ii[] =
		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
		int use_ascii (int i) {
		  return ascii_mm[i] + ascii_ii[i];
		}
		short int ebcdic_ii[] =
		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
		short int ebcdic_mm[] =
		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
		int use_ebcdic (int i) {
		  return ebcdic_mm[i] + ebcdic_ii[i];
		}
		extern int foo;

int
main ()
{
return use_ascii (foo) == use_ebcdic (foo);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
	      ac_cv_c_bigendian=yes
	    fi
	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
	      if test "$ac_cv_c_bigendian" = unknown; then
		ac_cv_c_bigendian=no
	      else
		# finding both strings is unlikely to happen, but who knows?
		ac_cv_c_bigendian=unknown
	      fi
	    fi
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
int
main ()
{

	     /* Are we little or big endian?  From Harbison&Steele.  */
	     union
	     {
	       long int l;
	       char c[sizeof (long int)];
	     } u;
	     u.l = 1;
	     return u.c[sizeof (long int) - 1] == 1;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_c_bigendian=no
else
  ac_cv_c_bigendian=yes
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

    fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
$as_echo "$ac_cv_c_bigendian" >&6; }
 case $ac_cv_c_bigendian in #(
   yes)
     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
;; #(
   no)
      ;; #(
   universal)

$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h

     ;; #(
   *)
     as_fn_error $? "unknown endianness
 presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
 esac



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether long double and double are the same" >&5
$as_echo_n "checking whether long double and double are the same... " >&6; }
if ${gl_cv_long_double_equals_double+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <float.h>
int
main ()
{
typedef int check[sizeof (long double) == sizeof (double)
                              && LDBL_MANT_DIG == DBL_MANT_DIG
                              && LDBL_MAX_EXP == DBL_MAX_EXP
                              && LDBL_MIN_EXP == DBL_MIN_EXP
                              ? 1 : -1];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_long_double_equals_double=yes
else
  gl_cv_long_double_equals_double=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_long_double_equals_double" >&5
$as_echo "$gl_cv_long_double_equals_double" >&6; }
  if test $gl_cv_long_double_equals_double = yes; then

$as_echo "#define HAVE_SAME_LONG_DOUBLE_AS_DOUBLE 1" >>confdefs.h

    HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=1
  else
    HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=0
  fi







         if test -n "$gl_printf_safe"; then

$as_echo "#define CHECK_PRINTF_SAFE 1" >>confdefs.h

  fi
  case "$gl_cv_func_printf_long_double" in
    *yes)
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports infinite 'long double' arguments" >&5
$as_echo_n "checking whether printf supports infinite 'long double' arguments... " >&6; }
if ${gl_cv_func_printf_infinite_long_double+:} false; then :
  $as_echo_n "(cached) " >&6
else

          if test "$cross_compiling" = yes; then :
  case "$host_cpu" in
                                     # Guess no on ia64, x86_64, i386.
               ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";;
               *)
                 case "$host_os" in
                                         # Guess yes on glibc systems.
                   *-gnu* | gnu*)        gl_cv_func_printf_infinite_long_double="guessing yes";;
                                         # Guess yes on musl systems.
                   *-musl*)              gl_cv_func_printf_infinite_long_double="guessing yes";;
                                         # Guess yes on FreeBSD >= 6.
                   freebsd[1-5].*)       gl_cv_func_printf_infinite_long_double="guessing no";;
                   freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
                                         # Guess yes on HP-UX >= 11.
                   hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
                   hpux*)                gl_cv_func_printf_infinite_long_double="guessing yes";;
                                         # Guess no on Android.
                   linux*-android*)      gl_cv_func_printf_infinite_long_double="guessing no";;
                                         # Guess yes on MSVC, no on mingw.
                   mingw*)               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef _MSC_VER
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_func_printf_infinite_long_double="guessing yes"
else
  gl_cv_func_printf_infinite_long_double="guessing no"
fi
rm -f conftest*

                                         ;;
                                         # If we don't know, obey --enable-cross-guesses.
                   *)                    gl_cv_func_printf_infinite_long_double="$gl_cross_guess_normal";;
                 esac
                 ;;
             esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


#include <stdlib.h>
#if defined __MACH__ && defined __APPLE__
/* Avoid a crash on Mac OS X.  */
#include <mach/mach.h>
#include <mach/mach_error.h>
#include <mach/thread_status.h>
#include <mach/exception.h>
#include <mach/task.h>
#include <pthread.h>
/* The exception port on which our thread listens.  */
static mach_port_t our_exception_port;
/* The main function of the thread listening for exceptions of type
   EXC_BAD_ACCESS.  */
static void *
mach_exception_thread (void *arg)
{
  /* Buffer for a message to be received.  */
  struct {
    mach_msg_header_t head;
    mach_msg_body_t msgh_body;
    char data[1024];
  } msg;
  mach_msg_return_t retval;
  /* Wait for a message on the exception port.  */
  retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
                     our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
  if (retval != MACH_MSG_SUCCESS)
    abort ();
  exit (1);
}
static void
nocrash_init (void)
{
  mach_port_t self = mach_task_self ();
  /* Allocate a port on which the thread shall listen for exceptions.  */
  if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
      == KERN_SUCCESS) {
    /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html.  */
    if (mach_port_insert_right (self, our_exception_port, our_exception_port,
                                MACH_MSG_TYPE_MAKE_SEND)
        == KERN_SUCCESS) {
      /* The exceptions we want to catch.  Only EXC_BAD_ACCESS is interesting
         for us.  */
      exception_mask_t mask = EXC_MASK_BAD_ACCESS;
      /* Create the thread listening on the exception port.  */
      pthread_attr_t attr;
      pthread_t thread;
      if (pthread_attr_init (&attr) == 0
          && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
          && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
        pthread_attr_destroy (&attr);
        /* Replace the exception port info for these exceptions with our own.
           Note that we replace the exception port for the entire task, not only
           for a particular thread.  This has the effect that when our exception
           port gets the message, the thread specific exception port has already
           been asked, and we don't need to bother about it.
           See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html.  */
        task_set_exception_ports (self, mask, our_exception_port,
                                  EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
      }
    }
  }
}
#elif defined _WIN32 && ! defined __CYGWIN__
/* Avoid a crash on native Windows.  */
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winerror.h>
static LONG WINAPI
exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
{
  switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
    {
    case EXCEPTION_ACCESS_VIOLATION:
    case EXCEPTION_IN_PAGE_ERROR:
    case EXCEPTION_STACK_OVERFLOW:
    case EXCEPTION_GUARD_PAGE:
    case EXCEPTION_PRIV_INSTRUCTION:
    case EXCEPTION_ILLEGAL_INSTRUCTION:
    case EXCEPTION_DATATYPE_MISALIGNMENT:
    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
      exit (1);
    }
  return EXCEPTION_CONTINUE_SEARCH;
}
static void
nocrash_init (void)
{
  SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
}
#else
/* Avoid a crash on POSIX systems.  */
#include <signal.h>
#include <unistd.h>
/* A POSIX signal handler.  */
static void
exception_handler (int sig)
{
  _exit (1);
}
static void
nocrash_init (void)
{
#ifdef SIGSEGV
  signal (SIGSEGV, exception_handler);
#endif
#ifdef SIGBUS
  signal (SIGBUS, exception_handler);
#endif
}
#endif

#include <float.h>
#include <stdio.h>
#include <string.h>
static int
strisnan (const char *string, size_t start_index, size_t end_index)
{
  if (start_index < end_index)
    {
      if (string[start_index] == '-')
        start_index++;
      if (start_index + 3 <= end_index
          && memcmp (string + start_index, "nan", 3) == 0)
        {
          start_index += 3;
          if (start_index == end_index
              || (string[start_index] == '(' && string[end_index - 1] == ')'))
            return 1;
        }
    }
  return 0;
}
static char buf[10000];
static long double zeroL = 0.0L;
int main ()
{
  int result = 0;
  nocrash_init();
  if (sprintf (buf, "%Lf", 1.0L / zeroL) < 0
      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
    result |= 1;
  if (sprintf (buf, "%Lf", -1.0L / zeroL) < 0
      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
    result |= 1;
  if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
      || !strisnan (buf, 0, strlen (buf)))
    result |= 1;
  if (sprintf (buf, "%Le", 1.0L / zeroL) < 0
      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
    result |= 1;
  if (sprintf (buf, "%Le", -1.0L / zeroL) < 0
      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
    result |= 1;
  if (sprintf (buf, "%Le", zeroL / zeroL) < 0
      || !strisnan (buf, 0, strlen (buf)))
    result |= 1;
  if (sprintf (buf, "%Lg", 1.0L / zeroL) < 0
      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
    result |= 1;
  if (sprintf (buf, "%Lg", -1.0L / zeroL) < 0
      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
    result |= 1;
  if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
      || !strisnan (buf, 0, strlen (buf)))
    result |= 1;
#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
/* Representation of an 80-bit 'long double' as an initializer for a sequence
   of 'unsigned int' words.  */
# ifdef WORDS_BIGENDIAN
#  define LDBL80_WORDS(exponent,manthi,mantlo) \
     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
       ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16),   \
       (unsigned int) (mantlo) << 16                                        \
     }
# else
#  define LDBL80_WORDS(exponent,manthi,mantlo) \
     { mantlo, manthi, exponent }
# endif
  { /* Quiet NaN.  */
    static union { unsigned int word[4]; long double value; } x =
      { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
    if (sprintf (buf, "%Lf", x.value) < 0
        || !strisnan (buf, 0, strlen (buf)))
      result |= 2;
    if (sprintf (buf, "%Le", x.value) < 0
        || !strisnan (buf, 0, strlen (buf)))
      result |= 2;
    if (sprintf (buf, "%Lg", x.value) < 0
        || !strisnan (buf, 0, strlen (buf)))
      result |= 2;
  }
  {
    /* Signalling NaN.  */
    static union { unsigned int word[4]; long double value; } x =
      { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
    if (sprintf (buf, "%Lf", x.value) < 0
        || !strisnan (buf, 0, strlen (buf)))
      result |= 2;
    if (sprintf (buf, "%Le", x.value) < 0
        || !strisnan (buf, 0, strlen (buf)))
      result |= 2;
    if (sprintf (buf, "%Lg", x.value) < 0
        || !strisnan (buf, 0, strlen (buf)))
      result |= 2;
  }
  { /* Pseudo-NaN.  */
    static union { unsigned int word[4]; long double value; } x =
      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
    if (sprintf (buf, "%Lf", x.value) <= 0)
      result |= 4;
    if (sprintf (buf, "%Le", x.value) <= 0)
      result |= 4;
    if (sprintf (buf, "%Lg", x.value) <= 0)
      result |= 4;
  }
  { /* Pseudo-Infinity.  */
    static union { unsigned int word[4]; long double value; } x =
      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
    if (sprintf (buf, "%Lf", x.value) <= 0)
      result |= 8;
    if (sprintf (buf, "%Le", x.value) <= 0)
      result |= 8;
    if (sprintf (buf, "%Lg", x.value) <= 0)
      result |= 8;
  }
  { /* Pseudo-Zero.  */
    static union { unsigned int word[4]; long double value; } x =
      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
    if (sprintf (buf, "%Lf", x.value) <= 0)
      result |= 16;
    if (sprintf (buf, "%Le", x.value) <= 0)
      result |= 16;
    if (sprintf (buf, "%Lg", x.value) <= 0)
      result |= 16;
  }
  { /* Unnormalized number.  */
    static union { unsigned int word[4]; long double value; } x =
      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
    if (sprintf (buf, "%Lf", x.value) <= 0)
      result |= 32;
    if (sprintf (buf, "%Le", x.value) <= 0)
      result |= 32;
    if (sprintf (buf, "%Lg", x.value) <= 0)
      result |= 32;
  }
  { /* Pseudo-Denormal.  */
    static union { unsigned int word[4]; long double value; } x =
      { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
    if (sprintf (buf, "%Lf", x.value) <= 0)
      result |= 64;
    if (sprintf (buf, "%Le", x.value) <= 0)
      result |= 64;
    if (sprintf (buf, "%Lg", x.value) <= 0)
      result |= 64;
  }
#endif
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_printf_infinite_long_double=yes
else
  gl_cv_func_printf_infinite_long_double=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_infinite_long_double" >&5
$as_echo "$gl_cv_func_printf_infinite_long_double" >&6; }
      ;;
    *)
      gl_cv_func_printf_infinite_long_double="irrelevant"
      ;;
  esac



     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'a' and 'A' directives" >&5
$as_echo_n "checking whether printf supports the 'a' and 'A' directives... " >&6; }
if ${gl_cv_func_printf_directive_a+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
                                 # Guess yes on glibc >= 2.5 systems.
           *-gnu* | gnu*)
             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

               #include <features.h>
               #ifdef __GNU_LIBRARY__
                #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__
                 BZ2908
                #endif
               #endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "BZ2908" >/dev/null 2>&1; then :
  gl_cv_func_printf_directive_a="guessing yes"
else
  gl_cv_func_printf_directive_a="guessing no"
fi
rm -f conftest*

             ;;
                                 # Guess yes on musl systems.
           *-musl*)              gl_cv_func_printf_directive_a="guessing yes";;
                                 # Guess no on Android.
           linux*-android*)      gl_cv_func_printf_directive_a="guessing no";;
                                 # Guess no on native Windows.
           mingw*)               gl_cv_func_printf_directive_a="guessing no";;
                                 # If we don't know, obey --enable-cross-guesses.
           *)                    gl_cv_func_printf_directive_a="$gl_cross_guess_normal";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
static char buf[100];
static double zero = 0.0;
int main ()
{
  int result = 0;
  if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0
      || (strcmp (buf, "0x1.922p+1 33") != 0
          && strcmp (buf, "0x3.244p+0 33") != 0
          && strcmp (buf, "0x6.488p-1 33") != 0
          && strcmp (buf, "0xc.91p-2 33") != 0))
    result |= 1;
  if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0
      || (strcmp (buf, "-0X1.922P+1 33") != 0
          && strcmp (buf, "-0X3.244P+0 33") != 0
          && strcmp (buf, "-0X6.488P-1 33") != 0
          && strcmp (buf, "-0XC.91P-2 33") != 0))
    result |= 2;
  /* This catches a FreeBSD 6.1 bug: it doesn't round.  */
  if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
      || (strcmp (buf, "0x1.83p+0 33") != 0
          && strcmp (buf, "0x3.05p-1 33") != 0
          && strcmp (buf, "0x6.0ap-2 33") != 0
          && strcmp (buf, "0xc.14p-3 33") != 0))
    result |= 4;
  /* This catches a Mac OS X 10.12.4 (Darwin 16.5) bug: it doesn't round.  */
  if (sprintf (buf, "%.0a %d", 1.51, 33, 44, 55) < 0
      || (strcmp (buf, "0x2p+0 33") != 0
          && strcmp (buf, "0x3p-1 33") != 0
          && strcmp (buf, "0x6p-2 33") != 0
          && strcmp (buf, "0xcp-3 33") != 0))
    result |= 4;
  /* This catches a FreeBSD 6.1 bug.  See
     <https://lists.gnu.org/r/bug-gnulib/2007-04/msg00107.html> */
  if (sprintf (buf, "%010a %d", 1.0 / zero, 33, 44, 55) < 0
      || buf[0] == '0')
    result |= 8;
  /* This catches a Mac OS X 10.3.9 (Darwin 7.9) bug.  */
  if (sprintf (buf, "%.1a", 1.999) < 0
      || (strcmp (buf, "0x1.0p+1") != 0
          && strcmp (buf, "0x2.0p+0") != 0
          && strcmp (buf, "0x4.0p-1") != 0
          && strcmp (buf, "0x8.0p-2") != 0))
    result |= 16;
  /* This catches the same Mac OS X 10.3.9 (Darwin 7.9) bug and also a
     glibc 2.4 bug <https://sourceware.org/bugzilla/show_bug.cgi?id=2908>.  */
  if (sprintf (buf, "%.1La", 1.999L) < 0
      || (strcmp (buf, "0x1.0p+1") != 0
          && strcmp (buf, "0x2.0p+0") != 0
          && strcmp (buf, "0x4.0p-1") != 0
          && strcmp (buf, "0x8.0p-2") != 0))
    result |= 32;
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_printf_directive_a=yes
else
  gl_cv_func_printf_directive_a=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_a" >&5
$as_echo "$gl_cv_func_printf_directive_a" >&6; }



     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'F' directive" >&5
$as_echo_n "checking whether printf supports the 'F' directive... " >&6; }
if ${gl_cv_func_printf_directive_f+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
                                 # Guess yes on glibc systems.
           *-gnu* | gnu*)        gl_cv_func_printf_directive_f="guessing yes";;
                                 # Guess yes on musl systems.
           *-musl*)              gl_cv_func_printf_directive_f="guessing yes";;
                                 # Guess yes on FreeBSD >= 6.
           freebsd[1-5].*)       gl_cv_func_printf_directive_f="guessing no";;
           freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
                                 # Guess yes on Mac OS X >= 10.3.
           darwin[1-6].*)        gl_cv_func_printf_directive_f="guessing no";;
           darwin*)              gl_cv_func_printf_directive_f="guessing yes";;
                                 # Guess yes on Solaris >= 2.10.
           solaris2.[1-9][0-9]*) gl_cv_func_printf_directive_f="guessing yes";;
           solaris*)             gl_cv_func_printf_directive_f="guessing no";;
                                 # Guess no on Android.
           linux*-android*)      gl_cv_func_printf_directive_f="guessing no";;
                                 # Guess yes on MSVC, no on mingw.
           mingw*)               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef _MSC_VER
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_func_printf_directive_f="guessing yes"
else
  gl_cv_func_printf_directive_f="guessing no"
fi
rm -f conftest*

                                 ;;
                                 # If we don't know, obey --enable-cross-guesses.
           *)                    gl_cv_func_printf_directive_f="$gl_cross_guess_normal";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
static char buf[100];
static double zero = 0.0;
int main ()
{
  int result = 0;
  if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
      || strcmp (buf, "1234567.000000 33") != 0)
    result |= 1;
  if (sprintf (buf, "%F", 1.0 / zero) < 0
      || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
    result |= 2;
  /* This catches a Cygwin 1.5.x bug.  */
  if (sprintf (buf, "%.F", 1234.0) < 0
      || strcmp (buf, "1234") != 0)
    result |= 4;
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_printf_directive_f=yes
else
  gl_cv_func_printf_directive_f=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_f" >&5
$as_echo "$gl_cv_func_printf_directive_f" >&6; }



     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'n' directive" >&5
$as_echo_n "checking whether printf supports the 'n' directive... " >&6; }
if ${gl_cv_func_printf_directive_n+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
                            # Guess no on Android.
           linux*-android*) gl_cv_func_printf_directive_n="guessing no";;
                            # Guess no on native Windows.
           mingw*)          gl_cv_func_printf_directive_n="guessing no";;
           *)               gl_cv_func_printf_directive_n="guessing yes";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _MSC_VER
/* See page about "Parameter Validation" on msdn.microsoft.com.  */
static void cdecl
invalid_parameter_handler (const wchar_t *expression,
                           const wchar_t *function,
                           const wchar_t *file, unsigned int line,
                           uintptr_t dummy)
{
  exit (1);
}
#endif
static char fmtstring[10];
static char buf[100];
int main ()
{
  int count = -1;
#ifdef _MSC_VER
  _set_invalid_parameter_handler (invalid_parameter_handler);
#endif
  /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
     support %n in format strings in read-only memory but not in writable
     memory.  */
  strcpy (fmtstring, "%d %n");
  if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
      || strcmp (buf, "123 ") != 0
      || count != 4)
    return 1;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_printf_directive_n=yes
else
  gl_cv_func_printf_directive_n=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_n" >&5
$as_echo "$gl_cv_func_printf_directive_n" >&6; }



     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the 'ls' directive" >&5
$as_echo_n "checking whether printf supports the 'ls' directive... " >&6; }
if ${gl_cv_func_printf_directive_ls+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
           openbsd*)        gl_cv_func_printf_directive_ls="guessing no";;
           irix*)           gl_cv_func_printf_directive_ls="guessing no";;
           solaris*)        gl_cv_func_printf_directive_ls="guessing no";;
           cygwin*)         gl_cv_func_printf_directive_ls="guessing no";;
           beos* | haiku*)  gl_cv_func_printf_directive_ls="guessing no";;
                            # Guess no on Android.
           linux*-android*) gl_cv_func_printf_directive_ls="guessing no";;
                            # Guess yes on native Windows.
           mingw*)          gl_cv_func_printf_directive_ls="guessing yes";;
           *)               gl_cv_func_printf_directive_ls="guessing yes";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
#include <string.h>
int main ()
{
  int result = 0;
  char buf[100];
  /* Test whether %ls works at all.
     This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on
     Cygwin 1.5.  */
  {
    static const wchar_t wstring[] = { 'a', 'b', 'c', 0 };
    buf[0] = '\0';
    if (sprintf (buf, "%ls", wstring) < 0
        || strcmp (buf, "abc") != 0)
      result |= 1;
  }
  /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an
     assertion failure inside libc), but not on OpenBSD 4.0.  */
  {
    static const wchar_t wstring[] = { 'a', 0 };
    buf[0] = '\0';
    if (sprintf (buf, "%ls", wstring) < 0
        || strcmp (buf, "a") != 0)
      result |= 2;
  }
  /* Test whether precisions in %ls are supported as specified in ISO C 99
     section 7.19.6.1:
       "If a precision is specified, no more than that many bytes are written
        (including shift sequences, if any), and the array shall contain a
        null wide character if, to equal the multibyte character sequence
        length given by the precision, the function would need to access a
        wide character one past the end of the array."
     This test fails on Solaris 10.  */
  {
    static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 };
    buf[0] = '\0';
    if (sprintf (buf, "%.2ls", wstring) < 0
        || strcmp (buf, "ab") != 0)
      result |= 8;
  }
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_printf_directive_ls=yes
else
  gl_cv_func_printf_directive_ls=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_directive_ls" >&5
$as_echo "$gl_cv_func_printf_directive_ls" >&6; }



     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5
$as_echo_n "checking whether printf supports POSIX/XSI format strings with positions... " >&6; }
if ${gl_cv_func_printf_positions+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
           netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
                            gl_cv_func_printf_positions="guessing no";;
           beos*)           gl_cv_func_printf_positions="guessing no";;
                            # Guess yes on Android.
           linux*-android*) gl_cv_func_printf_positions="guessing yes";;
                            # Guess no on native Windows.
           mingw* | pw*)    gl_cv_func_printf_positions="guessing no";;
           *)               gl_cv_func_printf_positions="guessing yes";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
/* The string "%2$d %1$d", with dollar characters protected from the shell's
   dollar expansion (possibly an autoconf bug).  */
static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
static char buf[100];
int main ()
{
  sprintf (buf, format, 33, 55);
  return (strcmp (buf, "55 33") != 0);
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_printf_positions=yes
else
  gl_cv_func_printf_positions=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5
$as_echo "$gl_cv_func_printf_positions" >&6; }



     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the grouping flag" >&5
$as_echo_n "checking whether printf supports the grouping flag... " >&6; }
if ${gl_cv_func_printf_flag_grouping+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
           cygwin*)         gl_cv_func_printf_flag_grouping="guessing no";;
           netbsd*)         gl_cv_func_printf_flag_grouping="guessing no";;
                            # Guess no on Android.
           linux*-android*) gl_cv_func_printf_flag_grouping="guessing no";;
                            # Guess no on native Windows.
           mingw* | pw*)    gl_cv_func_printf_flag_grouping="guessing no";;
           *)               gl_cv_func_printf_flag_grouping="guessing yes";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
static char buf[100];
int main ()
{
  if (sprintf (buf, "%'d %d", 1234567, 99) < 0
      || buf[strlen (buf) - 1] != '9')
    return 1;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_printf_flag_grouping=yes
else
  gl_cv_func_printf_flag_grouping=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_grouping" >&5
$as_echo "$gl_cv_func_printf_flag_grouping" >&6; }



     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the left-adjust flag correctly" >&5
$as_echo_n "checking whether printf supports the left-adjust flag correctly... " >&6; }
if ${gl_cv_func_printf_flag_leftadjust+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
                            # Guess yes on HP-UX 11.
           hpux11*)         gl_cv_func_printf_flag_leftadjust="guessing yes";;
                            # Guess no on HP-UX 10 and older.
           hpux*)           gl_cv_func_printf_flag_leftadjust="guessing no";;
                            # Guess yes on Android.
           linux*-android*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
                            # Guess yes on native Windows.
           mingw*)          gl_cv_func_printf_flag_leftadjust="guessing yes";;
                            # Guess yes otherwise.
           *)               gl_cv_func_printf_flag_leftadjust="guessing yes";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
static char buf[100];
int main ()
{
  /* Check that a '-' flag is not annihilated by a negative width.  */
  if (sprintf (buf, "a%-*sc", -3, "b") < 0
      || strcmp (buf, "ab  c") != 0)
    return 1;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_printf_flag_leftadjust=yes
else
  gl_cv_func_printf_flag_leftadjust=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_leftadjust" >&5
$as_echo "$gl_cv_func_printf_flag_leftadjust" >&6; }



     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports the zero flag correctly" >&5
$as_echo_n "checking whether printf supports the zero flag correctly... " >&6; }
if ${gl_cv_func_printf_flag_zero+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
                            # Guess yes on glibc systems.
           *-gnu* | gnu*)   gl_cv_func_printf_flag_zero="guessing yes";;
                            # Guess yes on musl systems.
           *-musl*)         gl_cv_func_printf_flag_zero="guessing yes";;
                            # Guess yes on BeOS.
           beos*)           gl_cv_func_printf_flag_zero="guessing yes";;
                            # Guess no on Android.
           linux*-android*) gl_cv_func_printf_flag_zero="guessing no";;
                            # Guess no on native Windows.
           mingw*)          gl_cv_func_printf_flag_zero="guessing no";;
                            # If we don't know, obey --enable-cross-guesses.
           *)               gl_cv_func_printf_flag_zero="$gl_cross_guess_normal";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
static char buf[100];
static double zero = 0.0;
int main ()
{
  if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0
      || (strcmp (buf, "       inf") != 0
          && strcmp (buf, "  infinity") != 0))
    return 1;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_printf_flag_zero=yes
else
  gl_cv_func_printf_flag_zero=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_flag_zero" >&5
$as_echo "$gl_cv_func_printf_flag_zero" >&6; }



     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports large precisions" >&5
$as_echo_n "checking whether printf supports large precisions... " >&6; }
if ${gl_cv_func_printf_precision+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
           # Guess no only on Solaris, native Windows, and BeOS systems.
           solaris*)        gl_cv_func_printf_precision="guessing no" ;;
           mingw* | pw*)    gl_cv_func_printf_precision="guessing no" ;;
           beos*)           gl_cv_func_printf_precision="guessing no" ;;
                            # Guess yes on Android.
           linux*-android*) gl_cv_func_printf_precision="guessing yes" ;;
           *)               gl_cv_func_printf_precision="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
static char buf[5000];
int main ()
{
  int result = 0;
#ifdef __BEOS__
  /* On BeOS, this would crash and show a dialog box.  Avoid the crash.  */
  return 1;
#endif
  if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
    result |= 1;
  if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5)
    result |= 2;
  if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5
      || buf[0] != '1')
    result |= 4;
  if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5
      || buf[0] != '1')
    result |= 4;
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_printf_precision=yes
else
  gl_cv_func_printf_precision=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_precision" >&5
$as_echo "$gl_cv_func_printf_precision" >&6; }


    gl_cv_c_multiarch=no
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __APPLE_CC__
         not a universal capable compiler
        #endif
        typedef int dummy;

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

               arch=
     prev=
     for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do
       if test -n "$prev"; then
         case $word in
           i?86 | x86_64 | ppc | ppc64)
             if test -z "$arch" || test "$arch" = "$word"; then
               arch="$word"
             else
               gl_cv_c_multiarch=yes
             fi
             ;;
         esac
         prev=
       else
         if test "x$word" = "x-arch"; then
           prev=arch
         fi
       fi
     done

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  if test $gl_cv_c_multiarch = yes; then
    APPLE_UNIVERSAL_BUILD=1
  else
    APPLE_UNIVERSAL_BUILD=0
  fi





     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf survives out-of-memory conditions" >&5
$as_echo_n "checking whether printf survives out-of-memory conditions... " >&6; }
if ${gl_cv_func_printf_enomem+:} false; then :
  $as_echo_n "(cached) " >&6
else

      gl_cv_func_printf_enomem="guessing no"
      if test "$cross_compiling" = no; then
        if test $APPLE_UNIVERSAL_BUILD = 0; then
          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


#include <stdlib.h>
#if defined __MACH__ && defined __APPLE__
/* Avoid a crash on Mac OS X.  */
#include <mach/mach.h>
#include <mach/mach_error.h>
#include <mach/thread_status.h>
#include <mach/exception.h>
#include <mach/task.h>
#include <pthread.h>
/* The exception port on which our thread listens.  */
static mach_port_t our_exception_port;
/* The main function of the thread listening for exceptions of type
   EXC_BAD_ACCESS.  */
static void *
mach_exception_thread (void *arg)
{
  /* Buffer for a message to be received.  */
  struct {
    mach_msg_header_t head;
    mach_msg_body_t msgh_body;
    char data1024;
  } msg;
  mach_msg_return_t retval;
  /* Wait for a message on the exception port.  */
  retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
                     our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
  if (retval != MACH_MSG_SUCCESS)
    abort ();
  exit (1);
}
static void
nocrash_init (void)
{
  mach_port_t self = mach_task_self ();
  /* Allocate a port on which the thread shall listen for exceptions.  */
  if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
      == KERN_SUCCESS) {
    /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html.  */
    if (mach_port_insert_right (self, our_exception_port, our_exception_port,
                                MACH_MSG_TYPE_MAKE_SEND)
        == KERN_SUCCESS) {
      /* The exceptions we want to catch.  Only EXC_BAD_ACCESS is interesting
         for us.  */
      exception_mask_t mask = EXC_MASK_BAD_ACCESS;
      /* Create the thread listening on the exception port.  */
      pthread_attr_t attr;
      pthread_t thread;
      if (pthread_attr_init (&attr) == 0
          && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
          && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
        pthread_attr_destroy (&attr);
        /* Replace the exception port info for these exceptions with our own.
           Note that we replace the exception port for the entire task, not only
           for a particular thread.  This has the effect that when our exception
           port gets the message, the thread specific exception port has already
           been asked, and we don't need to bother about it.
           See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html.  */
        task_set_exception_ports (self, mask, our_exception_port,
                                  EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
      }
    }
  }
}
#elif defined _WIN32 && ! defined __CYGWIN__
/* Avoid a crash on native Windows.  */
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winerror.h>
static LONG WINAPI
exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
{
  switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
    {
    case EXCEPTION_ACCESS_VIOLATION:
    case EXCEPTION_IN_PAGE_ERROR:
    case EXCEPTION_STACK_OVERFLOW:
    case EXCEPTION_GUARD_PAGE:
    case EXCEPTION_PRIV_INSTRUCTION:
    case EXCEPTION_ILLEGAL_INSTRUCTION:
    case EXCEPTION_DATATYPE_MISALIGNMENT:
    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
      exit (1);
    }
  return EXCEPTION_CONTINUE_SEARCH;
}
static void
nocrash_init (void)
{
  SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
}
#else
/* Avoid a crash on POSIX systems.  */
#include <signal.h>
#include <unistd.h>
/* A POSIX signal handler.  */
static void
exception_handler (int sig)
{
  _exit (1);
}
static void
nocrash_init (void)
{
#ifdef SIGSEGV
  signal (SIGSEGV, exception_handler);
#endif
#ifdef SIGBUS
  signal (SIGBUS, exception_handler);
#endif
}
#endif

#include <stdio.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <errno.h>
int main()
{
  struct rlimit limit;
  int ret;
  nocrash_init ();
  /* Some printf implementations allocate temporary space with malloc.  */
  /* On BSD systems, malloc() is limited by RLIMIT_DATA.  */
#ifdef RLIMIT_DATA
  if (getrlimit (RLIMIT_DATA, &limit) < 0)
    return 77;
  if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
    limit.rlim_max = 5000000;
  limit.rlim_cur = limit.rlim_max;
  if (setrlimit (RLIMIT_DATA, &limit) < 0)
    return 77;
#endif
  /* On Linux systems, malloc() is limited by RLIMIT_AS.  */
#ifdef RLIMIT_AS
  if (getrlimit (RLIMIT_AS, &limit) < 0)
    return 77;
  if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
    limit.rlim_max = 5000000;
  limit.rlim_cur = limit.rlim_max;
  if (setrlimit (RLIMIT_AS, &limit) < 0)
    return 77;
#endif
  /* Some printf implementations allocate temporary space on the stack.  */
#ifdef RLIMIT_STACK
  if (getrlimit (RLIMIT_STACK, &limit) < 0)
    return 77;
  if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
    limit.rlim_max = 5000000;
  limit.rlim_cur = limit.rlim_max;
  if (setrlimit (RLIMIT_STACK, &limit) < 0)
    return 77;
#endif
  ret = printf ("%.5000000f", 1.0);
  return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
}

_ACEOF
          if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && test -s conftest$ac_exeext; then
            (./conftest 2>&5
             result=$?
             $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $result" >&5
             if test $result != 0 && test $result != 77; then result=1; fi
             exit $result
            ) >/dev/null 2>/dev/null
            case $? in
              0) gl_cv_func_printf_enomem="yes" ;;
              77) gl_cv_func_printf_enomem="guessing no" ;;
              *) gl_cv_func_printf_enomem="no" ;;
            esac
          else
            gl_cv_func_printf_enomem="guessing no"
          fi
          rm -fr conftest*
        else
                                        gl_cv_func_printf_enomem="guessing no"
        fi
      fi
      if test "$gl_cv_func_printf_enomem" = "guessing no"; then
        case "$host_os" in
                           # Guess yes on glibc systems.
          *-gnu* | gnu*)   gl_cv_func_printf_enomem="guessing yes";;
                           # Guess yes on Solaris.
          solaris*)        gl_cv_func_printf_enomem="guessing yes";;
                           # Guess yes on AIX.
          aix*)            gl_cv_func_printf_enomem="guessing yes";;
                           # Guess yes on HP-UX/hppa.
          hpux*)           case "$host_cpu" in
                             hppa*) gl_cv_func_printf_enomem="guessing yes";;
                             *)     gl_cv_func_printf_enomem="guessing no";;
                           esac
                           ;;
                           # Guess yes on IRIX.
          irix*)           gl_cv_func_printf_enomem="guessing yes";;
                           # Guess yes on OSF/1.
          osf*)            gl_cv_func_printf_enomem="guessing yes";;
                           # Guess yes on BeOS.
          beos*)           gl_cv_func_printf_enomem="guessing yes";;
                           # Guess yes on Haiku.
          haiku*)          gl_cv_func_printf_enomem="guessing yes";;
                           # Guess no on Android.
          linux*-android*) gl_cv_func_printf_enomem="guessing no";;
                           # If we don't know, obey --enable-cross-guesses.
          *)               gl_cv_func_printf_enomem="$gl_cross_guess_normal";;
        esac
      fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_enomem" >&5
$as_echo "$gl_cv_func_printf_enomem" >&6; }



  case "$gl_cv_func_printf_long_double" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5
$as_echo_n "checking for unsigned long long int... " >&6; }
if ${ac_cv_type_unsigned_long_long_int+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_type_unsigned_long_long_int=yes
     if test "x${ac_cv_prog_cc_c99-no}" = xno; then
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

  /* For now, do not test the preprocessor; as of 2007 there are too many
         implementations with broken preprocessors.  Perhaps this can
         be revisited in 2012.  In the meantime, code should not expect
         #if to work with literals wider than 32 bits.  */
      /* Test literals.  */
      long long int ll = 9223372036854775807ll;
      long long int nll = -9223372036854775807LL;
      unsigned long long int ull = 18446744073709551615ULL;
      /* Test constant expressions.   */
      typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
                     ? 1 : -1)];
      typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
                     ? 1 : -1)];
      int i = 63;
int
main ()
{
/* Test availability of runtime routines for shift and division.  */
      long long int llmax = 9223372036854775807ll;
      unsigned long long int ullmax = 18446744073709551615ull;
      return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
              | (llmax / ll) | (llmax % ll)
              | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
              | (ullmax / ull) | (ullmax % ull));
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_link "$LINENO"; then :

else
  ac_cv_type_unsigned_long_long_int=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
     fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5
$as_echo "$ac_cv_type_unsigned_long_long_int" >&6; }
  if test $ac_cv_type_unsigned_long_long_int = yes; then

$as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h

  fi



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5
$as_echo_n "checking for long long int... " >&6; }
if ${ac_cv_type_long_long_int+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_type_long_long_int=yes
      if test "x${ac_cv_prog_cc_c99-no}" = xno; then
        ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
        if test $ac_cv_type_long_long_int = yes; then
                                        if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>
                 #ifndef LLONG_MAX
                 # define HALF \
                          (1LL << (sizeof (long long int) * CHAR_BIT - 2))
                 # define LLONG_MAX (HALF - 1 + HALF)
                 #endif
int
main ()
{
long long int n = 1;
                 int i;
                 for (i = 0; ; i++)
                   {
                     long long int m = n << i;
                     if (m >> i != n)
                       return 1;
                     if (LLONG_MAX / 2 < m)
                       break;
                   }
                 return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :

else
  ac_cv_type_long_long_int=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

        fi
      fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long_int" >&5
$as_echo "$ac_cv_type_long_long_int" >&6; }
  if test $ac_cv_type_long_long_int = yes; then

$as_echo "#define HAVE_LONG_LONG_INT 1" >>confdefs.h

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5
$as_echo_n "checking for wchar_t... " >&6; }
if ${gt_cv_c_wchar_t+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stddef.h>
            wchar_t foo = (wchar_t)'\0';
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gt_cv_c_wchar_t=yes
else
  gt_cv_c_wchar_t=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5
$as_echo "$gt_cv_c_wchar_t" >&6; }
  if test $gt_cv_c_wchar_t = yes; then

$as_echo "#define HAVE_WCHAR_T 1" >>confdefs.h

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5
$as_echo_n "checking for wint_t... " >&6; }
if ${gt_cv_c_wint_t+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
   before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
            wint_t foo = (wchar_t)'\0';
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gt_cv_c_wint_t=yes
else
  gt_cv_c_wint_t=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5
$as_echo "$gt_cv_c_wint_t" >&6; }
  if test $gt_cv_c_wint_t = yes; then

$as_echo "#define HAVE_WINT_T 1" >>confdefs.h


            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wint_t is too small" >&5
$as_echo_n "checking whether wint_t is too small... " >&6; }
if ${gl_cv_type_wint_t_too_small+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#if !(defined __GLIBC__ && !defined __UCLIBC__)
# include <stddef.h>
# include <stdio.h>
# include <time.h>
#endif
#include <wchar.h>
              int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1];

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_type_wint_t_too_small=no
else
  gl_cv_type_wint_t_too_small=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wint_t_too_small" >&5
$as_echo "$gl_cv_type_wint_t_too_small" >&6; }
    if test $gl_cv_type_wint_t_too_small = yes; then
      GNULIB_OVERRIDES_WINT_T=1
    else
      GNULIB_OVERRIDES_WINT_T=0
    fi
  else
    GNULIB_OVERRIDES_WINT_T=0
  fi






  if test $ac_cv_header_features_h = yes; then
    HAVE_FEATURES_H=1
  else
    HAVE_FEATURES_H=0
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intmax_t" >&5
$as_echo_n "checking for intmax_t... " >&6; }
if ${gt_cv_c_intmax_t+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stddef.h>
#include <stdlib.h>
#if HAVE_STDINT_H_WITH_UINTMAX
#include <stdint.h>
#endif
#if HAVE_INTTYPES_H_WITH_UINTMAX
#include <inttypes.h>
#endif

int
main ()
{
intmax_t x = -1; return !x;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gt_cv_c_intmax_t=yes
else
  gt_cv_c_intmax_t=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_intmax_t" >&5
$as_echo "$gt_cv_c_intmax_t" >&6; }
  if test $gt_cv_c_intmax_t = yes; then

$as_echo "#define HAVE_INTMAX_T 1" >>confdefs.h

  else

    test $ac_cv_type_long_long_int = yes \
      && ac_type='long long' \
      || ac_type='long'

cat >>confdefs.h <<_ACEOF
#define intmax_t $ac_type
_ACEOF

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'double'" >&5
$as_echo_n "checking where to find the exponent in a 'double'... " >&6; }
if ${gl_cv_cc_double_expbit0+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

                                                                      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#if defined arm || defined __arm || defined __arm__
  mixed_endianness
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "mixed_endianness" >/dev/null 2>&1; then :
  gl_cv_cc_double_expbit0="unknown"
else

                                                         :
if ${ac_cv_c_bigendian+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_c_bigendian=unknown
    # See if we're dealing with a universal compiler.
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __APPLE_CC__
	       not a universal capable compiler
	     #endif
	     typedef int dummy;

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

	# Check for potential -arch flags.  It is not universal unless
	# there are at least two -arch flags with different values.
	ac_arch=
	ac_prev=
	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
	 if test -n "$ac_prev"; then
	   case $ac_word in
	     i?86 | x86_64 | ppc | ppc64)
	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
		 ac_arch=$ac_word
	       else
		 ac_cv_c_bigendian=universal
		 break
	       fi
	       ;;
	   esac
	   ac_prev=
	 elif test "x$ac_word" = "x-arch"; then
	   ac_prev=arch
	 fi
       done
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    if test $ac_cv_c_bigendian = unknown; then
      # See if sys/param.h defines the BYTE_ORDER macro.
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
	     #include <sys/param.h>

int
main ()
{
#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
		     && LITTLE_ENDIAN)
	      bogus endian macros
	     #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  # It does; now see whether it defined to BIG_ENDIAN or not.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
		#include <sys/param.h>

int
main ()
{
#if BYTE_ORDER != BIG_ENDIAN
		 not big endian
		#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_bigendian=yes
else
  ac_cv_c_bigendian=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    fi
    if test $ac_cv_c_bigendian = unknown; then
      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>

int
main ()
{
#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
	      bogus endian macros
	     #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  # It does; now see whether it defined to _BIG_ENDIAN or not.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>

int
main ()
{
#ifndef _BIG_ENDIAN
		 not big endian
		#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_bigendian=yes
else
  ac_cv_c_bigendian=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    fi
    if test $ac_cv_c_bigendian = unknown; then
      # Compile a test program.
      if test "$cross_compiling" = yes; then :
  # Try to guess by grepping values from an object file.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
short int ascii_mm[] =
		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
		short int ascii_ii[] =
		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
		int use_ascii (int i) {
		  return ascii_mm[i] + ascii_ii[i];
		}
		short int ebcdic_ii[] =
		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
		short int ebcdic_mm[] =
		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
		int use_ebcdic (int i) {
		  return ebcdic_mm[i] + ebcdic_ii[i];
		}
		extern int foo;

int
main ()
{
return use_ascii (foo) == use_ebcdic (foo);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
	      ac_cv_c_bigendian=yes
	    fi
	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
	      if test "$ac_cv_c_bigendian" = unknown; then
		ac_cv_c_bigendian=no
	      else
		# finding both strings is unlikely to happen, but who knows?
		ac_cv_c_bigendian=unknown
	      fi
	    fi
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
int
main ()
{

	     /* Are we little or big endian?  From Harbison&Steele.  */
	     union
	     {
	       long int l;
	       char c[sizeof (long int)];
	     } u;
	     u.l = 1;
	     return u.c[sizeof (long int) - 1] == 1;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_c_bigendian=no
else
  ac_cv_c_bigendian=yes
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

    fi
fi
:
 case $ac_cv_c_bigendian in #(
   yes)
     gl_cv_cc_double_expbit0="word 0 bit 20";; #(
   no)
     gl_cv_cc_double_expbit0="word 1 bit 20" ;; #(
   universal)

$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h

     ;; #(
   *)
     gl_cv_cc_double_expbit0="unknown" ;;
 esac


fi
rm -f conftest*


else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <float.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#define NWORDS \
  ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { double value; unsigned int word[NWORDS]; } memory_double;
static unsigned int ored_words[NWORDS];
static unsigned int anded_words[NWORDS];
static void add_to_ored_words (double x)
{
  memory_double m;
  size_t i;
  /* Clear it first, in case sizeof (double) < sizeof (memory_double).  */
  memset (&m, 0, sizeof (memory_double));
  m.value = x;
  for (i = 0; i < NWORDS; i++)
    {
      ored_words[i] |= m.word[i];
      anded_words[i] &= m.word[i];
    }
}
int main ()
{
  size_t j;
  FILE *fp = fopen ("conftest.out", "w");
  if (fp == NULL)
    return 1;
  for (j = 0; j < NWORDS; j++)
    anded_words[j] = ~ (unsigned int) 0;
  add_to_ored_words (0.25);
  add_to_ored_words (0.5);
  add_to_ored_words (1.0);
  add_to_ored_words (2.0);
  add_to_ored_words (4.0);
  /* Remove bits that are common (e.g. if representation of the first mantissa
     bit is explicit).  */
  for (j = 0; j < NWORDS; j++)
    ored_words[j] &= ~anded_words[j];
  /* Now find the nonzero word.  */
  for (j = 0; j < NWORDS; j++)
    if (ored_words[j] != 0)
      break;
  if (j < NWORDS)
    {
      size_t i;
      for (i = j + 1; i < NWORDS; i++)
        if (ored_words[i] != 0)
          {
            fprintf (fp, "unknown");
            return (fclose (fp) != 0);
          }
      for (i = 0; ; i++)
        if ((ored_words[j] >> i) & 1)
          {
            fprintf (fp, "word %d bit %d", (int) j, (int) i);
            return (fclose (fp) != 0);
          }
    }
  fprintf (fp, "unknown");
  return (fclose (fp) != 0);
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_cc_double_expbit0=`cat conftest.out`
else
  gl_cv_cc_double_expbit0="unknown"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      rm -f conftest.out

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_expbit0" >&5
$as_echo "$gl_cv_cc_double_expbit0" >&6; }
  case "$gl_cv_cc_double_expbit0" in
    word*bit*)
      word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
      bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'`

cat >>confdefs.h <<_ACEOF
#define DBL_EXPBIT0_WORD $word
_ACEOF


cat >>confdefs.h <<_ACEOF
#define DBL_EXPBIT0_BIT $bit
_ACEOF

      ;;
  esac









  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf returns a byte count as in C99" >&5
$as_echo_n "checking whether snprintf returns a byte count as in C99... " >&6; }
if ${gl_cv_func_snprintf_retval_c99+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
                                 # Guess yes on glibc systems.
           *-gnu* | gnu*)        gl_cv_func_snprintf_retval_c99="guessing yes";;
                                 # Guess yes on musl systems.
           *-musl*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
                                 # Guess yes on FreeBSD >= 5.
           freebsd[1-4].*)       gl_cv_func_snprintf_retval_c99="guessing no";;
           freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
                                 # Guess yes on Mac OS X >= 10.3.
           darwin[1-6].*)        gl_cv_func_snprintf_retval_c99="guessing no";;
           darwin*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
                                 # Guess yes on OpenBSD >= 3.9.
           openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
                                 gl_cv_func_snprintf_retval_c99="guessing no";;
           openbsd*)             gl_cv_func_snprintf_retval_c99="guessing yes";;
                                 # Guess yes on Solaris >= 2.10.
           solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
           solaris*)             gl_cv_func_printf_sizes_c99="guessing no";;
                                 # Guess yes on AIX >= 4.
           aix[1-3]*)            gl_cv_func_snprintf_retval_c99="guessing no";;
           aix*)                 gl_cv_func_snprintf_retval_c99="guessing yes";;
                                 # Guess yes on NetBSD >= 3.
           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
                                 gl_cv_func_snprintf_retval_c99="guessing no";;
           netbsd*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
                                 # Guess yes on BeOS.
           beos*)                gl_cv_func_snprintf_retval_c99="guessing yes";;
                                 # Guess yes on Android.
           linux*-android*)      gl_cv_func_snprintf_retval_c99="guessing yes";;
                                 # Guess yes on MSVC, no on mingw.
           mingw*)               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef _MSC_VER
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_func_snprintf_retval_c99="guessing yes"
else
  gl_cv_func_snprintf_retval_c99="guessing no"
fi
rm -f conftest*

                                 ;;
                                 # If we don't know, obey --enable-cross-guesses.
           *)                    gl_cv_func_snprintf_retval_c99="$gl_cross_guess_normal";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
#if HAVE_SNPRINTF
# define my_snprintf snprintf
#else
# include <stdarg.h>
static int my_snprintf (char *buf, int size, const char *format, ...)
{
  va_list args;
  int ret;
  va_start (args, format);
  ret = vsnprintf (buf, size, format, args);
  va_end (args);
  return ret;
}
#endif
static char buf[100];
int main ()
{
  strcpy (buf, "ABCDEF");
  if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7)
    return 1;
  if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7)
    return 2;
  if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7)
    return 3;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_snprintf_retval_c99=yes
else
  gl_cv_func_snprintf_retval_c99=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_retval_c99" >&5
$as_echo "$gl_cv_func_snprintf_retval_c99" >&6; }






  for ac_func in snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

      ac_fn_c_check_decl "$LINENO" "_snprintf" "ac_cv_have_decl__snprintf" "#include <stdio.h>
"
if test "x$ac_cv_have_decl__snprintf" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL__SNPRINTF $ac_have_decl
_ACEOF



  case "$gl_cv_func_snprintf_retval_c99" in
    *yes)

$as_echo "#define HAVE_SNPRINTF_RETVAL_C99 1" >>confdefs.h

      ;;
  esac


  GNULIB_ACOSF=0;
  GNULIB_ACOSL=0;
  GNULIB_ASINF=0;
  GNULIB_ASINL=0;
  GNULIB_ATANF=0;
  GNULIB_ATANL=0;
  GNULIB_ATAN2F=0;
  GNULIB_CBRT=0;
  GNULIB_CBRTF=0;
  GNULIB_CBRTL=0;
  GNULIB_CEIL=0;
  GNULIB_CEILF=0;
  GNULIB_CEILL=0;
  GNULIB_COPYSIGN=0;
  GNULIB_COPYSIGNF=0;
  GNULIB_COPYSIGNL=0;
  GNULIB_COSF=0;
  GNULIB_COSL=0;
  GNULIB_COSHF=0;
  GNULIB_EXPF=0;
  GNULIB_EXPL=0;
  GNULIB_EXP2=0;
  GNULIB_EXP2F=0;
  GNULIB_EXP2L=0;
  GNULIB_EXPM1=0;
  GNULIB_EXPM1F=0;
  GNULIB_EXPM1L=0;
  GNULIB_FABSF=0;
  GNULIB_FABSL=0;
  GNULIB_FLOOR=0;
  GNULIB_FLOORF=0;
  GNULIB_FLOORL=0;
  GNULIB_FMA=0;
  GNULIB_FMAF=0;
  GNULIB_FMAL=0;
  GNULIB_FMOD=0;
  GNULIB_FMODF=0;
  GNULIB_FMODL=0;
  GNULIB_FREXPF=0;
  GNULIB_FREXP=0;
  GNULIB_FREXPL=0;
  GNULIB_HYPOT=0;
  GNULIB_HYPOTF=0;
  GNULIB_HYPOTL=0;
  GNULIB_ILOGB=0;
  GNULIB_ILOGBF=0;
  GNULIB_ILOGBL=0;
  GNULIB_ISFINITE=0;
  GNULIB_ISINF=0;
  GNULIB_ISNAN=0;
  GNULIB_ISNANF=0;
  GNULIB_ISNAND=0;
  GNULIB_ISNANL=0;
  GNULIB_LDEXPF=0;
  GNULIB_LDEXPL=0;
  GNULIB_LOG=0;
  GNULIB_LOGF=0;
  GNULIB_LOGL=0;
  GNULIB_LOG10=0;
  GNULIB_LOG10F=0;
  GNULIB_LOG10L=0;
  GNULIB_LOG1P=0;
  GNULIB_LOG1PF=0;
  GNULIB_LOG1PL=0;
  GNULIB_LOG2=0;
  GNULIB_LOG2F=0;
  GNULIB_LOG2L=0;
  GNULIB_LOGB=0;
  GNULIB_LOGBF=0;
  GNULIB_LOGBL=0;
  GNULIB_MODF=0;
  GNULIB_MODFF=0;
  GNULIB_MODFL=0;
  GNULIB_POWF=0;
  GNULIB_REMAINDER=0;
  GNULIB_REMAINDERF=0;
  GNULIB_REMAINDERL=0;
  GNULIB_RINT=0;
  GNULIB_RINTF=0;
  GNULIB_RINTL=0;
  GNULIB_ROUND=0;
  GNULIB_ROUNDF=0;
  GNULIB_ROUNDL=0;
  GNULIB_SIGNBIT=0;
  GNULIB_SINF=0;
  GNULIB_SINL=0;
  GNULIB_SINHF=0;
  GNULIB_SQRTF=0;
  GNULIB_SQRTL=0;
  GNULIB_TANF=0;
  GNULIB_TANL=0;
  GNULIB_TANHF=0;
  GNULIB_TRUNC=0;
  GNULIB_TRUNCF=0;
  GNULIB_TRUNCL=0;
    HAVE_ACOSF=1;
  HAVE_ACOSL=1;
  HAVE_ASINF=1;
  HAVE_ASINL=1;
  HAVE_ATANF=1;
  HAVE_ATANL=1;
  HAVE_ATAN2F=1;
  HAVE_CBRT=1;
  HAVE_CBRTF=1;
  HAVE_CBRTL=1;
  HAVE_COPYSIGN=1;
  HAVE_COPYSIGNL=1;
  HAVE_COSF=1;
  HAVE_COSL=1;
  HAVE_COSHF=1;
  HAVE_EXPF=1;
  HAVE_EXPL=1;
  HAVE_EXPM1=1;
  HAVE_EXPM1F=1;
  HAVE_FABSF=1;
  HAVE_FABSL=1;
  HAVE_FMA=1;
  HAVE_FMAF=1;
  HAVE_FMAL=1;
  HAVE_FMODF=1;
  HAVE_FMODL=1;
  HAVE_FREXPF=1;
  HAVE_HYPOTF=1;
  HAVE_HYPOTL=1;
  HAVE_ILOGB=1;
  HAVE_ILOGBF=1;
  HAVE_ILOGBL=1;
  HAVE_ISNANF=1;
  HAVE_ISNAND=1;
  HAVE_ISNANL=1;
  HAVE_LDEXPF=1;
  HAVE_LOGF=1;
  HAVE_LOGL=1;
  HAVE_LOG10F=1;
  HAVE_LOG10L=1;
  HAVE_LOG1P=1;
  HAVE_LOG1PF=1;
  HAVE_LOG1PL=1;
  HAVE_LOGBF=1;
  HAVE_LOGBL=1;
  HAVE_MODFF=1;
  HAVE_MODFL=1;
  HAVE_POWF=1;
  HAVE_REMAINDER=1;
  HAVE_REMAINDERF=1;
  HAVE_RINT=1;
  HAVE_RINTL=1;
  HAVE_SINF=1;
  HAVE_SINL=1;
  HAVE_SINHF=1;
  HAVE_SQRTF=1;
  HAVE_SQRTL=1;
  HAVE_TANF=1;
  HAVE_TANL=1;
  HAVE_TANHF=1;
  HAVE_DECL_ACOSL=1;
  HAVE_DECL_ASINL=1;
  HAVE_DECL_ATANL=1;
  HAVE_DECL_CBRTF=1;
  HAVE_DECL_CBRTL=1;
  HAVE_DECL_CEILF=1;
  HAVE_DECL_CEILL=1;
  HAVE_DECL_COPYSIGNF=1;
  HAVE_DECL_COSL=1;
  HAVE_DECL_EXPL=1;
  HAVE_DECL_EXP2=1;
  HAVE_DECL_EXP2F=1;
  HAVE_DECL_EXP2L=1;
  HAVE_DECL_EXPM1L=1;
  HAVE_DECL_FLOORF=1;
  HAVE_DECL_FLOORL=1;
  HAVE_DECL_FREXPL=1;
  HAVE_DECL_LDEXPL=1;
  HAVE_DECL_LOGL=1;
  HAVE_DECL_LOG10L=1;
  HAVE_DECL_LOG2=1;
  HAVE_DECL_LOG2F=1;
  HAVE_DECL_LOG2L=1;
  HAVE_DECL_LOGB=1;
  HAVE_DECL_REMAINDER=1;
  HAVE_DECL_REMAINDERL=1;
  HAVE_DECL_RINTF=1;
  HAVE_DECL_ROUND=1;
  HAVE_DECL_ROUNDF=1;
  HAVE_DECL_ROUNDL=1;
  HAVE_DECL_SINL=1;
  HAVE_DECL_SQRTL=1;
  HAVE_DECL_TANL=1;
  HAVE_DECL_TRUNC=1;
  HAVE_DECL_TRUNCF=1;
  HAVE_DECL_TRUNCL=1;
  REPLACE_ACOSF=0;
  REPLACE_ASINF=0;
  REPLACE_ATANF=0;
  REPLACE_ATAN2F=0;
  REPLACE_CBRTF=0;
  REPLACE_CBRTL=0;
  REPLACE_CEIL=0;
  REPLACE_CEILF=0;
  REPLACE_CEILL=0;
  REPLACE_COSF=0;
  REPLACE_COSHF=0;
  REPLACE_EXPF=0;
  REPLACE_EXPL=0;
  REPLACE_EXPM1=0;
  REPLACE_EXPM1F=0;
  REPLACE_EXPM1L=0;
  REPLACE_EXP2=0;
  REPLACE_EXP2L=0;
  REPLACE_FABSL=0;
  REPLACE_FLOOR=0;
  REPLACE_FLOORF=0;
  REPLACE_FLOORL=0;
  REPLACE_FMA=0;
  REPLACE_FMAF=0;
  REPLACE_FMAL=0;
  REPLACE_FMOD=0;
  REPLACE_FMODF=0;
  REPLACE_FMODL=0;
  REPLACE_FREXPF=0;
  REPLACE_FREXP=0;
  REPLACE_FREXPL=0;
  REPLACE_HUGE_VAL=0;
  REPLACE_HYPOT=0;
  REPLACE_HYPOTF=0;
  REPLACE_HYPOTL=0;
  REPLACE_ILOGB=0;
  REPLACE_ILOGBF=0;
  REPLACE_ILOGBL=0;
  REPLACE_ISFINITE=0;
  REPLACE_ISINF=0;
  REPLACE_ISNAN=0;
  REPLACE_LDEXPL=0;
  REPLACE_LOG=0;
  REPLACE_LOGF=0;
  REPLACE_LOGL=0;
  REPLACE_LOG10=0;
  REPLACE_LOG10F=0;
  REPLACE_LOG10L=0;
  REPLACE_LOG1P=0;
  REPLACE_LOG1PF=0;
  REPLACE_LOG1PL=0;
  REPLACE_LOG2=0;
  REPLACE_LOG2F=0;
  REPLACE_LOG2L=0;
  REPLACE_LOGB=0;
  REPLACE_LOGBF=0;
  REPLACE_LOGBL=0;
  REPLACE_MODF=0;
  REPLACE_MODFF=0;
  REPLACE_MODFL=0;
  REPLACE_NAN=0;
  REPLACE_REMAINDER=0;
  REPLACE_REMAINDERF=0;
  REPLACE_REMAINDERL=0;
  REPLACE_RINTL=0;
  REPLACE_ROUND=0;
  REPLACE_ROUNDF=0;
  REPLACE_ROUNDL=0;
  REPLACE_SIGNBIT=0;
  REPLACE_SIGNBIT_USING_GCC=0;
  REPLACE_SINF=0;
  REPLACE_SINHF=0;
  REPLACE_SQRTF=0;
  REPLACE_SQRTL=0;
  REPLACE_TANF=0;
  REPLACE_TANHF=0;
  REPLACE_TRUNC=0;
  REPLACE_TRUNCF=0;
  REPLACE_TRUNCL=0;


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexp() can be used without linking with libm" >&5
$as_echo_n "checking whether frexp() can be used without linking with libm... " >&6; }
if ${gl_cv_func_frexp_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             double x;
int
main ()
{
int e; return frexp (x, &e) > 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_frexp_no_libm=yes
else
  gl_cv_func_frexp_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_no_libm" >&5
$as_echo "$gl_cv_func_frexp_no_libm" >&6; }

ac_fn_c_check_decl "$LINENO" "alarm" "ac_cv_have_decl_alarm" "$ac_includes_default"
if test "x$ac_cv_have_decl_alarm" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_ALARM $ac_have_decl
_ACEOF





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for arithmetic hrtime_t" >&5
$as_echo_n "checking for arithmetic hrtime_t... " >&6; }
if ${gl_cv_arithmetic_hrtime_t+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <time.h>
int
main ()
{
hrtime_t x = 0; return x/x;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_arithmetic_hrtime_t=yes
else
  gl_cv_arithmetic_hrtime_t=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_arithmetic_hrtime_t" >&5
$as_echo "$gl_cv_arithmetic_hrtime_t" >&6; }
  if test $gl_cv_arithmetic_hrtime_t = yes; then

$as_echo "#define HAVE_ARITHMETIC_HRTIME_T 1" >>confdefs.h

  fi



  :




















     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_getopt_h='<'getopt.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <getopt.h>" >&5
$as_echo_n "checking absolute name of <getopt.h>... " >&6; }
if ${gl_cv_next_getopt_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_getopt_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <getopt.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'getopt.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_getopt_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_getopt_h
           gl_cv_next_getopt_h='"'$gl_header'"'
          else
               gl_cv_next_getopt_h='<'getopt.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_getopt_h" >&5
$as_echo "$gl_cv_next_getopt_h" >&6; }
     fi
     NEXT_GETOPT_H=$gl_cv_next_getopt_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'getopt.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_getopt_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_GETOPT_H=$gl_next_as_first_directive




  if test $ac_cv_header_getopt_h = yes; then
    HAVE_GETOPT_H=1
  else
    HAVE_GETOPT_H=0
  fi


  gl_replace_getopt=

    if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
    for ac_header in getopt.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default"
if test "x$ac_cv_header_getopt_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_GETOPT_H 1
_ACEOF

else
  gl_replace_getopt=yes
fi

done

  fi

    if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
    for ac_func in getopt_long_only
do :
  ac_fn_c_check_func "$LINENO" "getopt_long_only" "ac_cv_func_getopt_long_only"
if test "x$ac_cv_func_getopt_long_only" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_GETOPT_LONG_ONLY 1
_ACEOF

else
  gl_replace_getopt=yes
fi
done

  fi

          if test -z "$gl_replace_getopt"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getopt is POSIX compatible" >&5
$as_echo_n "checking whether getopt is POSIX compatible... " >&6; }
if ${gl_cv_func_getopt_posix+:} false; then :
  $as_echo_n "(cached) " >&6
else

                                                if test $cross_compiling = no; then
                              if test "$cross_compiling" = yes; then :
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run test program while cross compiling
See \`config.log' for more details" "$LINENO" 5; }
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int
main ()
{
  static char program[] = "program";
  static char a[] = "-a";
  static char foo[] = "foo";
  static char bar[] = "bar";
  char *argv[] = { program, a, foo, bar, NULL };
  int c;

  c = getopt (4, argv, "ab");
  if (!(c == 'a'))
    return 1;
  c = getopt (4, argv, "ab");
  if (!(c == -1))
    return 2;
  if (!(optind == 2))
    return 3;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_getopt_posix=maybe
else
  gl_cv_func_getopt_posix=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

          if test $gl_cv_func_getopt_posix = maybe; then
                                    if test "$cross_compiling" = yes; then :
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run test program while cross compiling
See \`config.log' for more details" "$LINENO" 5; }
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int
main ()
{
  static char program[] = "program";
  static char donald[] = "donald";
  static char p[] = "-p";
  static char billy[] = "billy";
  static char duck[] = "duck";
  static char a[] = "-a";
  static char bar[] = "bar";
  char *argv[] = { program, donald, p, billy, duck, a, bar, NULL };
  int c;

  c = getopt (7, argv, "+abp:q:");
  if (!(c == -1))
    return 4;
  if (!(strcmp (argv[0], "program") == 0))
    return 5;
  if (!(strcmp (argv[1], "donald") == 0))
    return 6;
  if (!(strcmp (argv[2], "-p") == 0))
    return 7;
  if (!(strcmp (argv[3], "billy") == 0))
    return 8;
  if (!(strcmp (argv[4], "duck") == 0))
    return 9;
  if (!(strcmp (argv[5], "-a") == 0))
    return 10;
  if (!(strcmp (argv[6], "bar") == 0))
    return 11;
  if (!(optind == 1))
    return 12;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_getopt_posix=maybe
else
  gl_cv_func_getopt_posix=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

          fi
          if test $gl_cv_func_getopt_posix = maybe; then
                        if test "$cross_compiling" = yes; then :
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run test program while cross compiling
See \`config.log' for more details" "$LINENO" 5; }
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int
main ()
{
  static char program[] = "program";
  static char ab[] = "-ab";
  char *argv[3] = { program, ab, NULL };
  if (getopt (2, argv, "ab:") != 'a')
    return 13;
  if (getopt (2, argv, "ab:") != '?')
    return 14;
  if (optopt != 'b')
    return 15;
  if (optind != 2)
    return 16;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_getopt_posix=yes
else
  gl_cv_func_getopt_posix=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

          fi
        else
          case "$host_os" in
            darwin* | aix* | mingw*) gl_cv_func_getopt_posix="guessing no";;
            *)                       gl_cv_func_getopt_posix="guessing yes";;
          esac
        fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_posix" >&5
$as_echo "$gl_cv_func_getopt_posix" >&6; }
    case "$gl_cv_func_getopt_posix" in
      *no) gl_replace_getopt=yes ;;
    esac
  fi

  if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working GNU getopt function" >&5
$as_echo_n "checking for working GNU getopt function... " >&6; }
if ${gl_cv_func_getopt_gnu+:} false; then :
  $as_echo_n "(cached) " >&6
else
  # Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the
       # optstring is necessary for programs like m4 that have POSIX-mandated
       # semantics for supporting options interspersed with files.
       # Also, since getopt_long is a GNU extension, we require optind=0.
       # Bash ties 'set -o posix' to a non-exported POSIXLY_CORRECT;
       # so take care to revert to the correct (non-)export state.
       gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }'
       case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" </dev/null` in
         xx) gl_had_POSIXLY_CORRECT=exported ;;
         x)  gl_had_POSIXLY_CORRECT=yes      ;;
         *)  gl_had_POSIXLY_CORRECT=         ;;
       esac
       POSIXLY_CORRECT=1
       export POSIXLY_CORRECT
       if test "$cross_compiling" = yes; then :
                             gl_cv_func_getopt_gnu="$gl_cross_guess_normal"

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <getopt.h>
                           #include <stddef.h>
                           #include <string.h>

#include <stdlib.h>
#if defined __MACH__ && defined __APPLE__
/* Avoid a crash on Mac OS X.  */
#include <mach/mach.h>
#include <mach/mach_error.h>
#include <mach/thread_status.h>
#include <mach/exception.h>
#include <mach/task.h>
#include <pthread.h>
/* The exception port on which our thread listens.  */
static mach_port_t our_exception_port;
/* The main function of the thread listening for exceptions of type
   EXC_BAD_ACCESS.  */
static void *
mach_exception_thread (void *arg)
{
  /* Buffer for a message to be received.  */
  struct {
    mach_msg_header_t head;
    mach_msg_body_t msgh_body;
    char data[1024];
  } msg;
  mach_msg_return_t retval;
  /* Wait for a message on the exception port.  */
  retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
                     our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
  if (retval != MACH_MSG_SUCCESS)
    abort ();
  exit (1);
}
static void
nocrash_init (void)
{
  mach_port_t self = mach_task_self ();
  /* Allocate a port on which the thread shall listen for exceptions.  */
  if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
      == KERN_SUCCESS) {
    /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html.  */
    if (mach_port_insert_right (self, our_exception_port, our_exception_port,
                                MACH_MSG_TYPE_MAKE_SEND)
        == KERN_SUCCESS) {
      /* The exceptions we want to catch.  Only EXC_BAD_ACCESS is interesting
         for us.  */
      exception_mask_t mask = EXC_MASK_BAD_ACCESS;
      /* Create the thread listening on the exception port.  */
      pthread_attr_t attr;
      pthread_t thread;
      if (pthread_attr_init (&attr) == 0
          && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
          && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
        pthread_attr_destroy (&attr);
        /* Replace the exception port info for these exceptions with our own.
           Note that we replace the exception port for the entire task, not only
           for a particular thread.  This has the effect that when our exception
           port gets the message, the thread specific exception port has already
           been asked, and we don't need to bother about it.
           See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html.  */
        task_set_exception_ports (self, mask, our_exception_port,
                                  EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
      }
    }
  }
}
#elif defined _WIN32 && ! defined __CYGWIN__
/* Avoid a crash on native Windows.  */
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winerror.h>
static LONG WINAPI
exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
{
  switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
    {
    case EXCEPTION_ACCESS_VIOLATION:
    case EXCEPTION_IN_PAGE_ERROR:
    case EXCEPTION_STACK_OVERFLOW:
    case EXCEPTION_GUARD_PAGE:
    case EXCEPTION_PRIV_INSTRUCTION:
    case EXCEPTION_ILLEGAL_INSTRUCTION:
    case EXCEPTION_DATATYPE_MISALIGNMENT:
    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
      exit (1);
    }
  return EXCEPTION_CONTINUE_SEARCH;
}
static void
nocrash_init (void)
{
  SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
}
#else
/* Avoid a crash on POSIX systems.  */
#include <signal.h>
#include <unistd.h>
/* A POSIX signal handler.  */
static void
exception_handler (int sig)
{
  _exit (1);
}
static void
nocrash_init (void)
{
#ifdef SIGSEGV
  signal (SIGSEGV, exception_handler);
#endif
#ifdef SIGBUS
  signal (SIGBUS, exception_handler);
#endif
}
#endif


int
main ()
{

             int result = 0;

             nocrash_init();

             /* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw,
                and fails on Mac OS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5,
                OSF/1 5.1, Solaris 10.  */
             {
               static char conftest[] = "conftest";
               static char plus[] = "-+";
               char *argv[3] = { conftest, plus, NULL };
               opterr = 0;
               if (getopt (2, argv, "+a") != '?')
                 result |= 1;
             }
             /* This code succeeds on glibc 2.8, mingw,
                and fails on Mac OS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11,
                IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x.  */
             {
               static char program[] = "program";
               static char p[] = "-p";
               static char foo[] = "foo";
               static char bar[] = "bar";
               char *argv[] = { program, p, foo, bar, NULL };

               optind = 1;
               if (getopt (4, argv, "p::") != 'p')
                 result |= 2;
               else if (optarg != NULL)
                 result |= 4;
               else if (getopt (4, argv, "p::") != -1)
                 result |= 6;
               else if (optind != 2)
                 result |= 8;
             }
             /* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0.  */
             {
               static char program[] = "program";
               static char foo[] = "foo";
               static char p[] = "-p";
               char *argv[] = { program, foo, p, NULL };
               optind = 0;
               if (getopt (3, argv, "-p") != 1)
                 result |= 16;
               else if (getopt (3, argv, "-p") != 'p')
                 result |= 16;
             }
             /* This code fails on glibc 2.11.  */
             {
               static char program[] = "program";
               static char b[] = "-b";
               static char a[] = "-a";
               char *argv[] = { program, b, a, NULL };
               optind = opterr = 0;
               if (getopt (3, argv, "+:a:b") != 'b')
                 result |= 32;
               else if (getopt (3, argv, "+:a:b") != ':')
                 result |= 32;
             }
             /* This code dumps core on glibc 2.14.  */
             {
               static char program[] = "program";
               static char w[] = "-W";
               static char dummy[] = "dummy";
               char *argv[] = { program, w, dummy, NULL };
               optind = opterr = 1;
               if (getopt (3, argv, "W;") != 'W')
                 result |= 64;
             }
             return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_getopt_gnu=yes
else
  gl_cv_func_getopt_gnu=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

       case $gl_had_POSIXLY_CORRECT in
         exported) ;;
         yes) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}; POSIXLY_CORRECT=1 ;;
         *) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;} ;;
       esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_gnu" >&5
$as_echo "$gl_cv_func_getopt_gnu" >&6; }
    if test "$gl_cv_func_getopt_gnu" != yes; then
      gl_replace_getopt=yes
    else
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working GNU getopt_long function" >&5
$as_echo_n "checking for working GNU getopt_long function... " >&6; }
if ${gl_cv_func_getopt_long_gnu+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
              case "$host_os" in
              openbsd*) gl_cv_func_getopt_long_gnu="guessing no";;
              *)        gl_cv_func_getopt_long_gnu="guessing yes";;
            esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <getopt.h>
                #include <stddef.h>
                #include <string.h>

int
main ()
{
static const struct option long_options[] =
                  {
                    { "xtremely-",no_argument,       NULL, 1003 },
                    { "xtra",     no_argument,       NULL, 1001 },
                    { "xtreme",   no_argument,       NULL, 1002 },
                    { "xtremely", no_argument,       NULL, 1003 },
                    { NULL,       0,                 NULL, 0 }
                  };
                /* This code fails on OpenBSD 5.0.  */
                {
                  static char program[] = "program";
                  static char xtremel[] = "--xtremel";
                  char *argv[] = { program, xtremel, NULL };
                  int option_index;
                  optind = 1; opterr = 0;
                  if (getopt_long (2, argv, "", long_options, &option_index) != 1003)
                    return 1;
                }
                return 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_getopt_long_gnu=yes
else
  gl_cv_func_getopt_long_gnu=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_long_gnu" >&5
$as_echo "$gl_cv_func_getopt_long_gnu" >&6; }
      case "$gl_cv_func_getopt_long_gnu" in
        *yes) ;;
        *) gl_replace_getopt=yes ;;
      esac
    fi
  fi








  GNULIB_GETRUSAGE=0;
    HAVE_GETRUSAGE=1;



:



  GNULIB_GETTIMEOFDAY=0;
    HAVE_GETTIMEOFDAY=1;
  HAVE_STRUCT_TIMEVAL=1;
  HAVE_SYS_TIME_H=1;
  REPLACE_GETTIMEOFDAY=0;
  REPLACE_STRUCT_TIMEVAL=0;

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5
$as_echo_n "checking for C/C++ restrict keyword... " >&6; }
if ${ac_cv_c_restrict+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_c_restrict=no
   # The order here caters to the fact that C++ does not require restrict.
   for ac_kw in __restrict __restrict__ _Restrict restrict; do
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
typedef int *int_ptr;
           int foo (int_ptr $ac_kw ip) { return ip[0]; }
           int bar (int [$ac_kw]); /* Catch GCC bug 14050.  */
           int bar (int ip[$ac_kw]) { return ip[0]; }

int
main ()
{
int s[1];
           int *$ac_kw t = s;
           t[0] = 0;
           return foo (t) + bar (t);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_restrict=$ac_kw
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
     test "$ac_cv_c_restrict" != no && break
   done

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5
$as_echo "$ac_cv_c_restrict" >&6; }

 case $ac_cv_c_restrict in
   restrict) ;;
   no) $as_echo "#define restrict /**/" >>confdefs.h
 ;;
   *)  cat >>confdefs.h <<_ACEOF
#define restrict $ac_cv_c_restrict
_ACEOF
 ;;
 esac
















     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_sys_time_h='<'sys/time.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/time.h>" >&5
$as_echo_n "checking absolute name of <sys/time.h>... " >&6; }
if ${gl_cv_next_sys_time_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_sys_time_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/time.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'sys/time.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_sys_time_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_sys_time_h
           gl_cv_next_sys_time_h='"'$gl_header'"'
          else
               gl_cv_next_sys_time_h='<'sys/time.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_time_h" >&5
$as_echo "$gl_cv_next_sys_time_h" >&6; }
     fi
     NEXT_SYS_TIME_H=$gl_cv_next_sys_time_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'sys/time.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_sys_time_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H=$gl_next_as_first_directive





  if test $ac_cv_header_sys_time_h != yes; then
    HAVE_SYS_TIME_H=0
  fi





  if test $ac_cv_header_sys_socket_h != yes; then
                    for ac_header in winsock2.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
if test "x$ac_cv_header_winsock2_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_WINSOCK2_H 1
_ACEOF

fi

done

  fi
  if test "$ac_cv_header_winsock2_h" = yes; then
    HAVE_WINSOCK2_H=1
    UNISTD_H_HAVE_WINSOCK2_H=1
    SYS_IOCTL_H_HAVE_WINSOCK2_H=1
  else
    HAVE_WINSOCK2_H=0
  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timeval" >&5
$as_echo_n "checking for struct timeval... " >&6; }
if ${gl_cv_sys_struct_timeval+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if HAVE_SYS_TIME_H
             #include <sys/time.h>
            #endif
            #include <time.h>
            #if HAVE_WINSOCK2_H
            # include <winsock2.h>
            #endif

int
main ()
{
static struct timeval x; x.tv_sec = x.tv_usec;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_sys_struct_timeval=yes
else
  gl_cv_sys_struct_timeval=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timeval" >&5
$as_echo "$gl_cv_sys_struct_timeval" >&6; }
  if test $gl_cv_sys_struct_timeval != yes; then
    HAVE_STRUCT_TIMEVAL=0
  else
                            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wide-enough struct timeval.tv_sec member" >&5
$as_echo_n "checking for wide-enough struct timeval.tv_sec member... " >&6; }
if ${gl_cv_sys_struct_timeval_tv_sec+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if HAVE_SYS_TIME_H
               #include <sys/time.h>
              #endif
              #include <time.h>
              #if HAVE_WINSOCK2_H
              # include <winsock2.h>
              #endif

int
main ()
{
static struct timeval x;
              typedef int verify_tv_sec_type[
                sizeof (time_t) <= sizeof x.tv_sec ? 1 : -1
              ];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_sys_struct_timeval_tv_sec=yes
else
  gl_cv_sys_struct_timeval_tv_sec=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timeval_tv_sec" >&5
$as_echo "$gl_cv_sys_struct_timeval_tv_sec" >&6; }
    if test $gl_cv_sys_struct_timeval_tv_sec != yes; then
      REPLACE_STRUCT_TIMEVAL=1
    fi
  fi









  NEED_LOCALTIME_BUFFER=0


  GNULIB_CTIME=0;
  GNULIB_MKTIME=0;
  GNULIB_LOCALTIME=0;
  GNULIB_NANOSLEEP=0;
  GNULIB_STRFTIME=0;
  GNULIB_STRPTIME=0;
  GNULIB_TIMEGM=0;
  GNULIB_TIME_R=0;
  GNULIB_TIME_RZ=0;
  GNULIB_TZSET=0;
    HAVE_DECL_LOCALTIME_R=1;
  HAVE_NANOSLEEP=1;
  HAVE_STRPTIME=1;
  HAVE_TIMEGM=1;
  HAVE_TZSET=1;
    HAVE_TIMEZONE_T=0;
        REPLACE_CTIME=GNULIB_PORTCHECK;
  REPLACE_LOCALTIME_R=GNULIB_PORTCHECK;
  REPLACE_MKTIME=GNULIB_PORTCHECK;
  REPLACE_NANOSLEEP=GNULIB_PORTCHECK;
  REPLACE_STRFTIME=GNULIB_PORTCHECK;
  REPLACE_TIMEGM=GNULIB_PORTCHECK;
  REPLACE_TZSET=GNULIB_PORTCHECK;

      : ${GNULIB_GETTIMEOFDAY=0};
        REPLACE_GMTIME=0;
  REPLACE_LOCALTIME=0;













     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_limits_h='<'limits.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <limits.h>" >&5
$as_echo_n "checking absolute name of <limits.h>... " >&6; }
if ${gl_cv_next_limits_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_limits_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'limits.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_limits_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_limits_h
           gl_cv_next_limits_h='"'$gl_header'"'
          else
               gl_cv_next_limits_h='<'limits.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_limits_h" >&5
$as_echo "$gl_cv_next_limits_h" >&6; }
     fi
     NEXT_LIMITS_H=$gl_cv_next_limits_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'limits.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_limits_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_LIMITS_H=$gl_next_as_first_directive





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc." >&5
$as_echo_n "checking whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc.... " >&6; }
if ${gl_cv_header_limits_width+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
             #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
            #endif
            #include <limits.h>
            long long llm = LLONG_MAX;
            int wb = WORD_BIT;
            int ullw = ULLONG_WIDTH;

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_header_limits_width=yes
else
  gl_cv_header_limits_width=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_limits_width" >&5
$as_echo "$gl_cv_header_limits_width" >&6; }
  if test "$gl_cv_header_limits_width" = yes; then
    LIMITS_H=
  else
    LIMITS_H=limits.h
  fi

   if test -n "$LIMITS_H"; then
  GL_GENERATE_LIMITS_H_TRUE=
  GL_GENERATE_LIMITS_H_FALSE='#'
else
  GL_GENERATE_LIMITS_H_TRUE='#'
  GL_GENERATE_LIMITS_H_FALSE=
fi












  if test $ac_cv_type_long_long_int = yes; then
    HAVE_LONG_LONG_INT=1
  else
    HAVE_LONG_LONG_INT=0
  fi


  if test $ac_cv_type_unsigned_long_long_int = yes; then
    HAVE_UNSIGNED_LONG_LONG_INT=1
  else
    HAVE_UNSIGNED_LONG_LONG_INT=0
  fi



  if test $ac_cv_header_wchar_h = yes; then
    HAVE_WCHAR_H=1
  else
    HAVE_WCHAR_H=0
  fi


      if test $ac_cv_header_inttypes_h = yes; then
    HAVE_INTTYPES_H=1
  else
    HAVE_INTTYPES_H=0
  fi


      if test $ac_cv_header_sys_types_h = yes; then
    HAVE_SYS_TYPES_H=1
  else
    HAVE_SYS_TYPES_H=0
  fi











     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_stdint_h='<'stdint.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdint.h>" >&5
$as_echo_n "checking absolute name of <stdint.h>... " >&6; }
if ${gl_cv_next_stdint_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_stdint_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdint.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'stdint.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_stdint_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_stdint_h
           gl_cv_next_stdint_h='"'$gl_header'"'
          else
               gl_cv_next_stdint_h='<'stdint.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdint_h" >&5
$as_echo "$gl_cv_next_stdint_h" >&6; }
     fi
     NEXT_STDINT_H=$gl_cv_next_stdint_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'stdint.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_stdint_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_STDINT_H=$gl_next_as_first_directive




  if test $ac_cv_header_stdint_h = yes; then
    HAVE_STDINT_H=1
  else
    HAVE_STDINT_H=0
  fi


    if test $ac_cv_header_stdint_h = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h conforms to C99" >&5
$as_echo_n "checking whether stdint.h conforms to C99... " >&6; }
if ${gl_cv_header_working_stdint_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_cv_header_working_stdint_h=no
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
#define __STDC_CONSTANT_MACROS 1
#define __STDC_LIMIT_MACROS 1
#include <stdint.h>
/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in <wchar.h>.  */
#if !(defined WCHAR_MIN && defined WCHAR_MAX)
#error "WCHAR_MIN, WCHAR_MAX not defined in <stdint.h>"
#endif


  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
     included before <wchar.h>.  */
  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_H
  # include <stdio.h>
  # include <time.h>
  # include <wchar.h>
  #endif


#ifdef INT8_MAX
int8_t a1 = INT8_MAX;
int8_t a1min = INT8_MIN;
#endif
#ifdef INT16_MAX
int16_t a2 = INT16_MAX;
int16_t a2min = INT16_MIN;
#endif
#ifdef INT32_MAX
int32_t a3 = INT32_MAX;
int32_t a3min = INT32_MIN;
#endif
#ifdef INT64_MAX
int64_t a4 = INT64_MAX;
int64_t a4min = INT64_MIN;
#endif
#ifdef UINT8_MAX
uint8_t b1 = UINT8_MAX;
#else
typedef int b1[(unsigned char) -1 != 255 ? 1 : -1];
#endif
#ifdef UINT16_MAX
uint16_t b2 = UINT16_MAX;
#endif
#ifdef UINT32_MAX
uint32_t b3 = UINT32_MAX;
#endif
#ifdef UINT64_MAX
uint64_t b4 = UINT64_MAX;
#endif
int_least8_t c1 = INT8_C (0x7f);
int_least8_t c1max = INT_LEAST8_MAX;
int_least8_t c1min = INT_LEAST8_MIN;
int_least16_t c2 = INT16_C (0x7fff);
int_least16_t c2max = INT_LEAST16_MAX;
int_least16_t c2min = INT_LEAST16_MIN;
int_least32_t c3 = INT32_C (0x7fffffff);
int_least32_t c3max = INT_LEAST32_MAX;
int_least32_t c3min = INT_LEAST32_MIN;
int_least64_t c4 = INT64_C (0x7fffffffffffffff);
int_least64_t c4max = INT_LEAST64_MAX;
int_least64_t c4min = INT_LEAST64_MIN;
uint_least8_t d1 = UINT8_C (0xff);
uint_least8_t d1max = UINT_LEAST8_MAX;
uint_least16_t d2 = UINT16_C (0xffff);
uint_least16_t d2max = UINT_LEAST16_MAX;
uint_least32_t d3 = UINT32_C (0xffffffff);
uint_least32_t d3max = UINT_LEAST32_MAX;
uint_least64_t d4 = UINT64_C (0xffffffffffffffff);
uint_least64_t d4max = UINT_LEAST64_MAX;
int_fast8_t e1 = INT_FAST8_MAX;
int_fast8_t e1min = INT_FAST8_MIN;
int_fast16_t e2 = INT_FAST16_MAX;
int_fast16_t e2min = INT_FAST16_MIN;
int_fast32_t e3 = INT_FAST32_MAX;
int_fast32_t e3min = INT_FAST32_MIN;
int_fast64_t e4 = INT_FAST64_MAX;
int_fast64_t e4min = INT_FAST64_MIN;
uint_fast8_t f1 = UINT_FAST8_MAX;
uint_fast16_t f2 = UINT_FAST16_MAX;
uint_fast32_t f3 = UINT_FAST32_MAX;
uint_fast64_t f4 = UINT_FAST64_MAX;
#ifdef INTPTR_MAX
intptr_t g = INTPTR_MAX;
intptr_t gmin = INTPTR_MIN;
#endif
#ifdef UINTPTR_MAX
uintptr_t h = UINTPTR_MAX;
#endif
intmax_t i = INTMAX_MAX;
uintmax_t j = UINTMAX_MAX;

/* Check that SIZE_MAX has the correct type, if possible.  */
#if 201112 <= __STDC_VERSION__
int k = _Generic (SIZE_MAX, size_t: 0);
#elif (2 <= __GNUC__ || defined __IBM__TYPEOF__ \
       || (0x5110 <= __SUNPRO_C && !__STDC__))
extern size_t k;
extern __typeof__ (SIZE_MAX) k;
#endif

#include <limits.h> /* for CHAR_BIT */
#define TYPE_MINIMUM(t) \
  ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t)))
#define TYPE_MAXIMUM(t) \
  ((t) ((t) 0 < (t) -1 \
        ? (t) -1 \
        : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
struct s {
  int check_PTRDIFF:
      PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t)
      && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t)
      ? 1 : -1;
  /* Detect bug in FreeBSD 6.0 / ia64.  */
  int check_SIG_ATOMIC:
      SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t)
      && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t)
      ? 1 : -1;
  int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1;
  int check_WCHAR:
      WCHAR_MIN == TYPE_MINIMUM (wchar_t)
      && WCHAR_MAX == TYPE_MAXIMUM (wchar_t)
      ? 1 : -1;
  /* Detect bug in mingw.  */
  int check_WINT:
      WINT_MIN == TYPE_MINIMUM (wint_t)
      && WINT_MAX == TYPE_MAXIMUM (wint_t)
      ? 1 : -1;

  /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others.  */
  int check_UINT8_C:
        (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1;
  int check_UINT16_C:
        (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1;

  /* Detect bugs in OpenBSD 3.9 stdint.h.  */
#ifdef UINT8_MAX
  int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1;
#endif
#ifdef UINT16_MAX
  int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1;
#endif
#ifdef UINT32_MAX
  int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1;
#endif
#ifdef UINT64_MAX
  int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1;
#endif
  int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1;
  int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1;
  int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1;
  int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1;
  int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1;
  int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1;
  int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1;
  int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1;
  int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;
  int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1;
  int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1;
};

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
                                                    if test "$cross_compiling" = yes; then :
  case "$host_os" in
                         # Guess yes on native Windows.
                 mingw*) gl_cv_header_working_stdint_h="guessing yes" ;;
                         # In general, assume it works.
                 *)      gl_cv_header_working_stdint_h="guessing yes" ;;
               esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
#define __STDC_CONSTANT_MACROS 1
#define __STDC_LIMIT_MACROS 1
#include <stdint.h>


  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
     included before <wchar.h>.  */
  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_H
  # include <stdio.h>
  # include <time.h>
  # include <wchar.h>
  #endif


#include <stdio.h>
#include <string.h>
#define MVAL(macro) MVAL1(macro)
#define MVAL1(expression) #expression
static const char *macro_values[] =
  {
#ifdef INT8_MAX
    MVAL (INT8_MAX),
#endif
#ifdef INT16_MAX
    MVAL (INT16_MAX),
#endif
#ifdef INT32_MAX
    MVAL (INT32_MAX),
#endif
#ifdef INT64_MAX
    MVAL (INT64_MAX),
#endif
#ifdef UINT8_MAX
    MVAL (UINT8_MAX),
#endif
#ifdef UINT16_MAX
    MVAL (UINT16_MAX),
#endif
#ifdef UINT32_MAX
    MVAL (UINT32_MAX),
#endif
#ifdef UINT64_MAX
    MVAL (UINT64_MAX),
#endif
    NULL
  };

int
main ()
{

  const char **mv;
  for (mv = macro_values; *mv != NULL; mv++)
    {
      const char *value = *mv;
      /* Test whether it looks like a cast expression.  */
      if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0
          || strncmp (value, "((unsigned short)"/*)*/, 17) == 0
          || strncmp (value, "((unsigned char)"/*)*/, 16) == 0
          || strncmp (value, "((int)"/*)*/, 6) == 0
          || strncmp (value, "((signed short)"/*)*/, 15) == 0
          || strncmp (value, "((signed char)"/*)*/, 14) == 0)
        return mv - macro_values + 1;
    }
  return 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_header_working_stdint_h=yes
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdint_h" >&5
$as_echo "$gl_cv_header_working_stdint_h" >&6; }
  fi

  HAVE_C99_STDINT_H=0
  HAVE_SYS_BITYPES_H=0
  HAVE_SYS_INTTYPES_H=0
  STDINT_H=stdint.h
  case "$gl_cv_header_working_stdint_h" in
    *yes)
      HAVE_C99_STDINT_H=1
                  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h predates C++11" >&5
$as_echo_n "checking whether stdint.h predates C++11... " >&6; }
if ${gl_cv_header_stdint_predates_cxx11_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_cv_header_stdint_predates_cxx11_h=yes
         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
#include <stdint.h>


  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
     included before <wchar.h>.  */
  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_H
  # include <stdio.h>
  # include <time.h>
  # include <wchar.h>
  #endif


intmax_t im = INTMAX_MAX;
int32_t i32 = INT32_C (0x7fffffff);

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_header_stdint_predates_cxx11_h=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_predates_cxx11_h" >&5
$as_echo "$gl_cv_header_stdint_predates_cxx11_h" >&6; }

      if test "$gl_cv_header_stdint_predates_cxx11_h" = yes; then

$as_echo "#define __STDC_CONSTANT_MACROS 1" >>confdefs.h


$as_echo "#define __STDC_LIMIT_MACROS 1" >>confdefs.h

      fi
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h has UINTMAX_WIDTH etc." >&5
$as_echo_n "checking whether stdint.h has UINTMAX_WIDTH etc.... " >&6; }
if ${gl_cv_header_stdint_width+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_cv_header_stdint_width=no
         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

              /* Work if build is not clean.  */
              #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1
              #ifndef __STDC_WANT_IEC_60559_BFP_EXT__
               #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
              #endif
              #include <stdint.h>

  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
     included before <wchar.h>.  */
  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_H
  # include <stdio.h>
  # include <time.h>
  # include <wchar.h>
  #endif

              int iw = UINTMAX_WIDTH;

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_header_stdint_width=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_width" >&5
$as_echo "$gl_cv_header_stdint_width" >&6; }
      if test "$gl_cv_header_stdint_width" = yes; then
        STDINT_H=
      fi
      ;;
    *)
                  for ac_header in sys/inttypes.h sys/bitypes.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

fi

done

      if test $ac_cv_header_sys_inttypes_h = yes; then
        HAVE_SYS_INTTYPES_H=1
      fi
      if test $ac_cv_header_sys_bitypes_h = yes; then
        HAVE_SYS_BITYPES_H=1
      fi


  if test $APPLE_UNIVERSAL_BUILD = 0; then


  for gltype in ptrdiff_t size_t ; do
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5
$as_echo_n "checking for bit size of $gltype... " >&6; }
if eval \${gl_cv_bitsizeof_${gltype}+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result"        "
  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
     included before <wchar.h>.  */
  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_H
  # include <stdio.h>
  # include <time.h>
  # include <wchar.h>
  #endif

#include <limits.h>"; then :

else
  result=unknown
fi

       eval gl_cv_bitsizeof_${gltype}=\$result

fi
eval ac_res=\$gl_cv_bitsizeof_${gltype}
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
    eval result=\$gl_cv_bitsizeof_${gltype}
    if test $result = unknown; then
                                                result=0
    fi
    GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
    cat >>confdefs.h <<_ACEOF
#define BITSIZEOF_${GLTYPE} $result
_ACEOF

    eval BITSIZEOF_${GLTYPE}=\$result
  done


  fi


  for gltype in sig_atomic_t wchar_t wint_t ; do
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5
$as_echo_n "checking for bit size of $gltype... " >&6; }
if eval \${gl_cv_bitsizeof_${gltype}+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result"        "
  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
     included before <wchar.h>.  */
  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_H
  # include <stdio.h>
  # include <time.h>
  # include <wchar.h>
  #endif

#include <limits.h>"; then :

else
  result=unknown
fi

       eval gl_cv_bitsizeof_${gltype}=\$result

fi
eval ac_res=\$gl_cv_bitsizeof_${gltype}
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
    eval result=\$gl_cv_bitsizeof_${gltype}
    if test $result = unknown; then
                                                result=0
    fi
    GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
    cat >>confdefs.h <<_ACEOF
#define BITSIZEOF_${GLTYPE} $result
_ACEOF

    eval BITSIZEOF_${GLTYPE}=\$result
  done




  for gltype in sig_atomic_t wchar_t wint_t ; do
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gltype is signed" >&5
$as_echo_n "checking whether $gltype is signed... " >&6; }
if eval \${gl_cv_type_${gltype}_signed+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
     included before <wchar.h>.  */
  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_H
  # include <stdio.h>
  # include <time.h>
  # include <wchar.h>
  #endif

            int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  result=yes
else
  result=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
       eval gl_cv_type_${gltype}_signed=\$result

fi
eval ac_res=\$gl_cv_type_${gltype}_signed
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
    eval result=\$gl_cv_type_${gltype}_signed
    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
    if test "$result" = yes; then
      cat >>confdefs.h <<_ACEOF
#define HAVE_SIGNED_${GLTYPE} 1
_ACEOF

      eval HAVE_SIGNED_${GLTYPE}=1
    else
      eval HAVE_SIGNED_${GLTYPE}=0
    fi
  done


  gl_cv_type_ptrdiff_t_signed=yes
  gl_cv_type_size_t_signed=no
  if test $APPLE_UNIVERSAL_BUILD = 0; then


  for gltype in ptrdiff_t size_t ; do
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5
$as_echo_n "checking for $gltype integer literal suffix... " >&6; }
if eval \${gl_cv_type_${gltype}_suffix+:} false; then :
  $as_echo_n "(cached) " >&6
else
  eval gl_cv_type_${gltype}_suffix=no
       eval result=\$gl_cv_type_${gltype}_signed
       if test "$result" = yes; then
         glsufu=
       else
         glsufu=u
       fi
       for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
         case $glsuf in
           '')  gltype1='int';;
           l)   gltype1='long int';;
           ll)  gltype1='long long int';;
           i64) gltype1='__int64';;
           u)   gltype1='unsigned int';;
           ul)  gltype1='unsigned long int';;
           ull) gltype1='unsigned long long int';;
           ui64)gltype1='unsigned __int64';;
         esac
         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
     included before <wchar.h>.  */
  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_H
  # include <stdio.h>
  # include <time.h>
  # include <wchar.h>
  #endif

              extern $gltype foo;
              extern $gltype1 foo;
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  eval gl_cv_type_${gltype}_suffix=\$glsuf
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
         eval result=\$gl_cv_type_${gltype}_suffix
         test "$result" != no && break
       done
fi
eval ac_res=\$gl_cv_type_${gltype}_suffix
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
    eval result=\$gl_cv_type_${gltype}_suffix
    test "$result" = no && result=
    eval ${GLTYPE}_SUFFIX=\$result
    cat >>confdefs.h <<_ACEOF
#define ${GLTYPE}_SUFFIX $result
_ACEOF

  done


  fi


  for gltype in sig_atomic_t wchar_t wint_t ; do
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5
$as_echo_n "checking for $gltype integer literal suffix... " >&6; }
if eval \${gl_cv_type_${gltype}_suffix+:} false; then :
  $as_echo_n "(cached) " >&6
else
  eval gl_cv_type_${gltype}_suffix=no
       eval result=\$gl_cv_type_${gltype}_signed
       if test "$result" = yes; then
         glsufu=
       else
         glsufu=u
       fi
       for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
         case $glsuf in
           '')  gltype1='int';;
           l)   gltype1='long int';;
           ll)  gltype1='long long int';;
           i64) gltype1='__int64';;
           u)   gltype1='unsigned int';;
           ul)  gltype1='unsigned long int';;
           ull) gltype1='unsigned long long int';;
           ui64)gltype1='unsigned __int64';;
         esac
         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
     included before <wchar.h>.  */
  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_H
  # include <stdio.h>
  # include <time.h>
  # include <wchar.h>
  #endif

              extern $gltype foo;
              extern $gltype1 foo;
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  eval gl_cv_type_${gltype}_suffix=\$glsuf
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
         eval result=\$gl_cv_type_${gltype}_suffix
         test "$result" != no && break
       done
fi
eval ac_res=\$gl_cv_type_${gltype}_suffix
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
    eval result=\$gl_cv_type_${gltype}_suffix
    test "$result" = no && result=
    eval ${GLTYPE}_SUFFIX=\$result
    cat >>confdefs.h <<_ACEOF
#define ${GLTYPE}_SUFFIX $result
_ACEOF

  done



          if test $GNULIB_OVERRIDES_WINT_T = 1; then
    BITSIZEOF_WINT_T=32
  fi

      ;;
  esac



  LIMITS_H='limits.h'
   if test -n "$LIMITS_H"; then
  GL_GENERATE_LIMITS_H_TRUE=
  GL_GENERATE_LIMITS_H_FALSE='#'
else
  GL_GENERATE_LIMITS_H_TRUE='#'
  GL_GENERATE_LIMITS_H_FALSE=
fi







   if test -n "$STDINT_H"; then
  GL_GENERATE_STDINT_H_TRUE=
  GL_GENERATE_STDINT_H_FALSE='#'
else
  GL_GENERATE_STDINT_H_TRUE='#'
  GL_GENERATE_STDINT_H_FALSE=
fi





  GNULIB_IMAXABS=0;
  GNULIB_IMAXDIV=0;
  GNULIB_STRTOIMAX=0;
  GNULIB_STRTOUMAX=0;
    HAVE_DECL_IMAXABS=1;
  HAVE_DECL_IMAXDIV=1;
  HAVE_DECL_STRTOIMAX=1;
  HAVE_DECL_STRTOUMAX=1;
  HAVE_IMAXDIV_T=1;
  REPLACE_STRTOIMAX=0;
  REPLACE_STRTOUMAX=0;
  INT32_MAX_LT_INTMAX_MAX=1;
  INT64_MAX_EQ_LONG_MAX='defined _LP64';
  PRI_MACROS_BROKEN=0;
  PRIPTR_PREFIX=__PRIPTR_PREFIX;
  UINT32_MAX_LT_UINTMAX_MAX=1;
  UINT64_MAX_EQ_ULONG_MAX='defined _LP64';















     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_inttypes_h='<'inttypes.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <inttypes.h>" >&5
$as_echo_n "checking absolute name of <inttypes.h>... " >&6; }
if ${gl_cv_next_inttypes_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_inttypes_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <inttypes.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'inttypes.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_inttypes_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_inttypes_h
           gl_cv_next_inttypes_h='"'$gl_header'"'
          else
               gl_cv_next_inttypes_h='<'inttypes.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_inttypes_h" >&5
$as_echo "$gl_cv_next_inttypes_h" >&6; }
     fi
     NEXT_INTTYPES_H=$gl_cv_next_inttypes_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'inttypes.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_inttypes_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H=$gl_next_as_first_directive












  for ac_header in inttypes.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default"
if test "x$ac_cv_header_inttypes_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_INTTYPES_H 1
_ACEOF

fi

done

  if test $ac_cv_header_inttypes_h = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the inttypes.h PRIxNN macros are broken" >&5
$as_echo_n "checking whether the inttypes.h PRIxNN macros are broken... " >&6; }
if ${gt_cv_inttypes_pri_broken+:} false; then :
  $as_echo_n "(cached) " >&6
else

        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <inttypes.h>
#ifdef PRId32
char *p = PRId32;
#endif

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gt_cv_inttypes_pri_broken=no
else
  gt_cv_inttypes_pri_broken=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_inttypes_pri_broken" >&5
$as_echo "$gt_cv_inttypes_pri_broken" >&6; }
  fi
  if test "$gt_cv_inttypes_pri_broken" = yes; then

cat >>confdefs.h <<_ACEOF
#define PRI_MACROS_BROKEN 1
_ACEOF

    PRI_MACROS_BROKEN=1
  else
    PRI_MACROS_BROKEN=0
  fi



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5
$as_echo_n "checking where to find the exponent in a 'float'... " >&6; }
if ${gl_cv_cc_float_expbit0+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  gl_cv_cc_float_expbit0="word 0 bit 23"
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <float.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#define NWORDS \
  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { float value; unsigned int word[NWORDS]; } memory_float;
static unsigned int ored_words[NWORDS];
static unsigned int anded_words[NWORDS];
static void add_to_ored_words (float x)
{
  memory_float m;
  size_t i;
  /* Clear it first, in case
     sizeof (float) < sizeof (memory_float).  */
  memset (&m, 0, sizeof (memory_float));
  m.value = x;
  for (i = 0; i < NWORDS; i++)
    {
      ored_words[i] |= m.word[i];
      anded_words[i] &= m.word[i];
    }
}
int main ()
{
  size_t j;
  FILE *fp = fopen ("conftest.out", "w");
  if (fp == NULL)
    return 1;
  for (j = 0; j < NWORDS; j++)
    anded_words[j] = ~ (unsigned int) 0;
  add_to_ored_words (0.25f);
  add_to_ored_words (0.5f);
  add_to_ored_words (1.0f);
  add_to_ored_words (2.0f);
  add_to_ored_words (4.0f);
  /* Remove bits that are common (e.g. if representation of the first mantissa
     bit is explicit).  */
  for (j = 0; j < NWORDS; j++)
    ored_words[j] &= ~anded_words[j];
  /* Now find the nonzero word.  */
  for (j = 0; j < NWORDS; j++)
    if (ored_words[j] != 0)
      break;
  if (j < NWORDS)
    {
      size_t i;
      for (i = j + 1; i < NWORDS; i++)
        if (ored_words[i] != 0)
          {
            fprintf (fp, "unknown");
            return (fclose (fp) != 0);
          }
      for (i = 0; ; i++)
        if ((ored_words[j] >> i) & 1)
          {
            fprintf (fp, "word %d bit %d", (int) j, (int) i);
            return (fclose (fp) != 0);
          }
    }
  fprintf (fp, "unknown");
  return (fclose (fp) != 0);
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_cc_float_expbit0=`cat conftest.out`
else
  gl_cv_cc_float_expbit0="unknown"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      rm -f conftest.out

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5
$as_echo "$gl_cv_cc_float_expbit0" >&6; }
  case "$gl_cv_cc_float_expbit0" in
    word*bit*)
      word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
      bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'`

cat >>confdefs.h <<_ACEOF
#define FLT_EXPBIT0_WORD $word
_ACEOF


cat >>confdefs.h <<_ACEOF
#define FLT_EXPBIT0_BIT $bit
_ACEOF

      ;;
  esac



  ISNANF_LIBM=

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used without linking with libm" >&5
$as_echo_n "checking whether isnan(float) can be used without linking with libm... " >&6; }
if ${gl_cv_func_isnanf_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             #if __GNUC__ >= 4
             # undef isnanf
             # define isnanf(x) __builtin_isnanf ((float)(x))
             #elif defined isnan
             # undef isnanf
             # define isnanf(x) isnan ((float)(x))
             #endif
             float x;
int
main ()
{
return isnanf (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_isnanf_no_libm=yes
else
  gl_cv_func_isnanf_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_no_libm" >&5
$as_echo "$gl_cv_func_isnanf_no_libm" >&6; }

  if test $gl_cv_func_isnanf_no_libm = no; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used with libm" >&5
$as_echo_n "checking whether isnan(float) can be used with libm... " >&6; }
if ${gl_cv_func_isnanf_in_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      save_LIBS="$LIBS"
      LIBS="$LIBS -lm"
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             #if __GNUC__ >= 4
             # undef isnanf
             # define isnanf(x) __builtin_isnanf ((float)(x))
             #elif defined isnan
             # undef isnanf
             # define isnanf(x) isnan ((float)(x))
             #endif
             float x;
int
main ()
{
return isnanf (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_isnanf_in_libm=yes
else
  gl_cv_func_isnanf_in_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      LIBS="$save_LIBS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_in_libm" >&5
$as_echo "$gl_cv_func_isnanf_in_libm" >&6; }

    if test $gl_cv_func_isnanf_in_libm = yes; then
      ISNANF_LIBM=-lm
    fi
  fi
    if test $gl_cv_func_isnanf_no_libm = yes \
     || test $gl_cv_func_isnanf_in_libm = yes; then
    save_LIBS="$LIBS"
    LIBS="$LIBS $ISNANF_LIBM"



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) works" >&5
$as_echo_n "checking whether isnan(float) works... " >&6; }
if ${gl_cv_func_isnanf_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
           irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;;
           mingw*) # Guess yes on mingw, no on MSVC.
             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef __MINGW32__
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_func_isnanf_works="guessing yes"
else
  gl_cv_func_isnanf_works="guessing no"
fi
rm -f conftest*

             ;;
           *) gl_cv_func_isnanf_works="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <math.h>
#if __GNUC__ >= 4
# undef isnanf
# define isnanf(x) __builtin_isnanf ((float)(x))
#elif defined isnan
# undef isnanf
# define isnanf(x) isnan ((float)(x))
#endif
/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0.  */
#ifdef __DECC
static float
NaN ()
{
  static float zero = 0.0f;
  return zero / zero;
}
#else
# define NaN() (0.0f / 0.0f)
#endif
#define NWORDS \
  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { unsigned int word[NWORDS]; float value; } memory_float;
int main()
{
  int result = 0;

  if (isnanf (1.0f / 0.0f))
    result |= 1;

  if (!isnanf (NaN ()))
    result |= 2;

#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
  /* The isnanf function should be immune against changes in the sign bit and
     in the mantissa bits.  The xor operation twiddles a bit that can only be
     a sign bit or a mantissa bit.  */
  if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0)
    {
      memory_float m;

      m.value = NaN ();
      /* Set the bits below the exponent to 01111...111.  */
      m.word[0] &= -1U << FLT_EXPBIT0_BIT;
      m.word[0] |= 1U << (FLT_EXPBIT0_BIT - 1) - 1;
      if (!isnanf (m.value))
        result |= 4;
    }
#endif

  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_isnanf_works=yes
else
  gl_cv_func_isnanf_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_works" >&5
$as_echo "$gl_cv_func_isnanf_works" >&6; }

    LIBS="$save_LIBS"
    case "$gl_cv_func_isnanf_works" in
      *yes) gl_func_isnanf=yes ;;
      *)    gl_func_isnanf=no; ISNANF_LIBM= ;;
    esac
  else
    gl_func_isnanf=no
  fi
  if test $gl_func_isnanf != yes; then
    HAVE_ISNANF=0
  fi




  ISNAND_LIBM=

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used without linking with libm" >&5
$as_echo_n "checking whether isnan(double) can be used without linking with libm... " >&6; }
if ${gl_cv_func_isnand_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             #if __GNUC__ >= 4
             # undef isnand
             # define isnand(x) __builtin_isnan ((double)(x))
             #else
             # undef isnand
             # define isnand(x) isnan ((double)(x))
             #endif
             double x;
int
main ()
{
return isnand (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_isnand_no_libm=yes
else
  gl_cv_func_isnand_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_no_libm" >&5
$as_echo "$gl_cv_func_isnand_no_libm" >&6; }

  if test $gl_cv_func_isnand_no_libm = no; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used with libm" >&5
$as_echo_n "checking whether isnan(double) can be used with libm... " >&6; }
if ${gl_cv_func_isnand_in_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      save_LIBS="$LIBS"
      LIBS="$LIBS -lm"
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             #if __GNUC__ >= 4
             # undef isnand
             # define isnand(x) __builtin_isnan ((double)(x))
             #elif defined isnan
             # undef isnand
             # define isnand(x) isnan ((double)(x))
             #endif
             double x;
int
main ()
{
return isnand (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_isnand_in_libm=yes
else
  gl_cv_func_isnand_in_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      LIBS="$save_LIBS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_in_libm" >&5
$as_echo "$gl_cv_func_isnand_in_libm" >&6; }

    if test $gl_cv_func_isnand_in_libm = yes; then
      ISNAND_LIBM=-lm
    fi
  fi
    if test $gl_cv_func_isnand_no_libm = yes \
     || test $gl_cv_func_isnand_in_libm = yes; then
    gl_func_isnand=yes
  else
    gl_func_isnand=no
    HAVE_ISNAND=0
  fi




  ISNANL_LIBM=

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used without linking with libm" >&5
$as_echo_n "checking whether isnan(long double) can be used without linking with libm... " >&6; }
if ${gl_cv_func_isnanl_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             #if __GNUC__ >= 4
             # undef isnanl
             # define isnanl(x) __builtin_isnanl ((long double)(x))
             #elif defined isnan
             # undef isnanl
             # define isnanl(x) isnan ((long double)(x))
             #endif
             long double x;
int
main ()
{
return isnanl (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_isnanl_no_libm=yes
else
  gl_cv_func_isnanl_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_no_libm" >&5
$as_echo "$gl_cv_func_isnanl_no_libm" >&6; }

  if test $gl_cv_func_isnanl_no_libm = no; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used with libm" >&5
$as_echo_n "checking whether isnan(long double) can be used with libm... " >&6; }
if ${gl_cv_func_isnanl_in_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      save_LIBS="$LIBS"
      LIBS="$LIBS -lm"
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             #if __GNUC__ >= 4
             # undef isnanl
             # define isnanl(x) __builtin_isnanl ((long double)(x))
             #elif defined isnan
             # undef isnanl
             # define isnanl(x) isnan ((long double)(x))
             #endif
             long double x;
int
main ()
{
return isnanl (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_isnanl_in_libm=yes
else
  gl_cv_func_isnanl_in_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      LIBS="$save_LIBS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_in_libm" >&5
$as_echo "$gl_cv_func_isnanl_in_libm" >&6; }

    if test $gl_cv_func_isnanl_in_libm = yes; then
      ISNANL_LIBM=-lm
    fi
  fi
    if test $gl_cv_func_isnanl_no_libm = yes \
     || test $gl_cv_func_isnanl_in_libm = yes; then
    save_LIBS="$LIBS"
    LIBS="$LIBS $ISNANL_LIBM"




     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnanl works" >&5
$as_echo_n "checking whether isnanl works... " >&6; }
if ${gl_cv_func_isnanl_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
           mingw*) # Guess yes on mingw, no on MSVC.
             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef __MINGW32__
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_func_isnanl_works="guessing yes"
else
  gl_cv_func_isnanl_works="guessing no"
fi
rm -f conftest*

             ;;
           *) gl_cv_func_isnanl_works="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <float.h>
#include <limits.h>
#include <math.h>
#if __GNUC__ >= 4
# undef isnanl
# define isnanl(x) __builtin_isnanl ((long double)(x))
#elif defined isnan
# undef isnanl
# define isnanl(x) isnan ((long double)(x))
#endif
#define NWORDS \
  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { unsigned int word[NWORDS]; long double value; }
        memory_long_double;
/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
   runtime type conversion.  */
#ifdef __sgi
static long double NaNl ()
{
  double zero = 0.0;
  return zero / zero;
}
#else
# define NaNl() (0.0L / 0.0L)
#endif
int main ()
{
  int result = 0;

  if (!isnanl (NaNl ()))
    result |= 1;

  {
    memory_long_double m;
    unsigned int i;

    /* The isnanl function should be immune against changes in the sign bit and
       in the mantissa bits.  The xor operation twiddles a bit that can only be
       a sign bit or a mantissa bit (since the exponent never extends to
       bit 31).  */
    m.value = NaNl ();
    m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
    for (i = 0; i < NWORDS; i++)
      m.word[i] |= 1;
    if (!isnanl (m.value))
      result |= 1;
  }

#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
/* Representation of an 80-bit 'long double' as an initializer for a sequence
   of 'unsigned int' words.  */
# ifdef WORDS_BIGENDIAN
#  define LDBL80_WORDS(exponent,manthi,mantlo) \
     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
       ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16),   \
       (unsigned int) (mantlo) << 16                                        \
     }
# else
#  define LDBL80_WORDS(exponent,manthi,mantlo) \
     { mantlo, manthi, exponent }
# endif
  { /* Quiet NaN.  */
    static memory_long_double x =
      { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
    if (!isnanl (x.value))
      result |= 2;
  }
  {
    /* Signalling NaN.  */
    static memory_long_double x =
      { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
    if (!isnanl (x.value))
      result |= 2;
  }
  /* isnanl should return something even for noncanonical values.  */
  { /* Pseudo-NaN.  */
    static memory_long_double x =
      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
    if (isnanl (x.value) && !isnanl (x.value))
      result |= 4;
  }
  { /* Pseudo-Infinity.  */
    static memory_long_double x =
      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
    if (isnanl (x.value) && !isnanl (x.value))
      result |= 8;
  }
  { /* Pseudo-Zero.  */
    static memory_long_double x =
      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
    if (isnanl (x.value) && !isnanl (x.value))
      result |= 16;
  }
  { /* Unnormalized number.  */
    static memory_long_double x =
      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
    if (isnanl (x.value) && !isnanl (x.value))
      result |= 32;
  }
  { /* Pseudo-Denormal.  */
    static memory_long_double x =
      { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
    if (isnanl (x.value) && !isnanl (x.value))
      result |= 64;
  }
#endif

  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_isnanl_works=yes
else
  gl_cv_func_isnanl_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_works" >&5
$as_echo "$gl_cv_func_isnanl_works" >&6; }

    LIBS="$save_LIBS"
    case "$gl_cv_func_isnanl_works" in
      *yes) gl_func_isnanl=yes ;;
      *)    gl_func_isnanl=no; ISNANL_LIBM= ;;
    esac
  else
    gl_func_isnanl=no
  fi
  if test $gl_func_isnanl != yes; then
    HAVE_ISNANL=0
  fi



  GNULIB_ISWBLANK=0;
  GNULIB_WCTYPE=0;
  GNULIB_ISWCTYPE=0;
  GNULIB_WCTRANS=0;
  GNULIB_TOWCTRANS=0;
    HAVE_ISWBLANK=1;
  HAVE_WCTYPE_T=1;
  HAVE_WCTRANS_T=1;
  REPLACE_ISWBLANK=0;







  if test $ac_cv_header_crtdefs_h = yes; then
    HAVE_CRTDEFS_H=1
  else
    HAVE_CRTDEFS_H=0
  fi









  if test $ac_cv_func_iswcntrl = yes; then
    HAVE_ISWCNTRL=1
  else
    HAVE_ISWCNTRL=0
  fi



  if test $gt_cv_c_wint_t = yes; then
    HAVE_WINT_T=1
  else
    HAVE_WINT_T=0
  fi













     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_wctype_h='<'wctype.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <wctype.h>" >&5
$as_echo_n "checking absolute name of <wctype.h>... " >&6; }
if ${gl_cv_next_wctype_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_wctype_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wctype.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'wctype.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_wctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_wctype_h
           gl_cv_next_wctype_h='"'$gl_header'"'
          else
               gl_cv_next_wctype_h='<'wctype.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wctype_h" >&5
$as_echo "$gl_cv_next_wctype_h" >&6; }
     fi
     NEXT_WCTYPE_H=$gl_cv_next_wctype_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'wctype.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_wctype_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H=$gl_next_as_first_directive




  if test $ac_cv_header_wctype_h = yes; then
    if test $ac_cv_func_iswcntrl = yes; then
                  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iswcntrl works" >&5
$as_echo_n "checking whether iswcntrl works... " >&6; }
if ${gl_cv_func_iswcntrl_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

          if test "$cross_compiling" = yes; then :
               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
                          #if __GNU_LIBRARY__ == 1
                          Linux libc5 i18n is broken.
                          #endif
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_func_iswcntrl_works="guessing yes"
else
  gl_cv_func_iswcntrl_works="guessing no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

               /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
                  included before <wchar.h>.
                  BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
                  must be included before <wchar.h>.  */
               #include <stddef.h>
               #include <stdio.h>
               #include <time.h>
               #include <wchar.h>
               #include <wctype.h>
               int main () { return iswprint ('x') == 0; }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_iswcntrl_works=yes
else
  gl_cv_func_iswcntrl_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswcntrl_works" >&5
$as_echo "$gl_cv_func_iswcntrl_works" >&6; }
    fi
    HAVE_WCTYPE_H=1
  else
    HAVE_WCTYPE_H=0
  fi


  if test $GNULIB_OVERRIDES_WINT_T = 1; then
    REPLACE_ISWCNTRL=1
  else
    case "$gl_cv_func_iswcntrl_works" in
      *yes) REPLACE_ISWCNTRL=0 ;;
      *)    REPLACE_ISWCNTRL=1 ;;
    esac
  fi


  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
        :
  fi

  if test $REPLACE_ISWCNTRL = 1; then
    REPLACE_TOWLOWER=1
  else
    for ac_func in towlower
do :
  ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower"
if test "x$ac_cv_func_towlower" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_TOWLOWER 1
_ACEOF

fi
done

    if test $ac_cv_func_towlower = yes; then
      REPLACE_TOWLOWER=0
    else
      ac_fn_c_check_decl "$LINENO" "towlower" "ac_cv_have_decl_towlower" "/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
             included before <wchar.h>.
             BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
             must be included before <wchar.h>.  */
          #include <stddef.h>
          #include <stdio.h>
          #include <time.h>
          #include <wchar.h>
          #if HAVE_WCTYPE_H
          # include <wctype.h>
          #endif

"
if test "x$ac_cv_have_decl_towlower" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_TOWLOWER $ac_have_decl
_ACEOF

      if test $ac_cv_have_decl_towlower = yes; then
                                REPLACE_TOWLOWER=1
      else
        REPLACE_TOWLOWER=0
      fi
    fi
  fi


  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then
        :
  fi

          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wctype_t" >&5
$as_echo_n "checking for wctype_t... " >&6; }
if ${gl_cv_type_wctype_t+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
               included before <wchar.h>.
               BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
               must be included before <wchar.h>.  */
            #include <stddef.h>
            #include <stdio.h>
            #include <time.h>
            #include <wchar.h>
            #if HAVE_WCTYPE_H
            # include <wctype.h>
            #endif
            wctype_t a;

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_type_wctype_t=yes
else
  gl_cv_type_wctype_t=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctype_t" >&5
$as_echo "$gl_cv_type_wctype_t" >&6; }
  if test $gl_cv_type_wctype_t = no; then
    HAVE_WCTYPE_T=0
  fi

      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wctrans_t" >&5
$as_echo_n "checking for wctrans_t... " >&6; }
if ${gl_cv_type_wctrans_t+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
               included before <wchar.h>.
               BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
               must be included before <wchar.h>.  */
            #include <stddef.h>
            #include <stdio.h>
            #include <time.h>
            #include <wchar.h>
            #include <wctype.h>
            wctrans_t a;

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_type_wctrans_t=yes
else
  gl_cv_type_wctrans_t=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctrans_t" >&5
$as_echo "$gl_cv_type_wctrans_t" >&6; }
  if test $gl_cv_type_wctrans_t = no; then
    HAVE_WCTRANS_T=0
  fi









  case "$host_os" in
    mingw*)
                        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit off_t" >&5
$as_echo_n "checking for 64-bit off_t... " >&6; }
if ${gl_cv_type_off_t_64+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
                int verify_off_t_size[sizeof (off_t) >= 8 ? 1 : -1];

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_type_off_t_64=yes
else
  gl_cv_type_off_t_64=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_off_t_64" >&5
$as_echo "$gl_cv_type_off_t_64" >&6; }
      if test $gl_cv_type_off_t_64 = no; then
        WINDOWS_64_BIT_OFF_T=1
      else
        WINDOWS_64_BIT_OFF_T=0
      fi
                        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit st_size" >&5
$as_echo_n "checking for 64-bit st_size... " >&6; }
if ${gl_cv_member_st_size_64+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
                struct stat buf;
                int verify_st_size_size[sizeof (buf.st_size) >= 8 ? 1 : -1];

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_member_st_size_64=yes
else
  gl_cv_member_st_size_64=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_member_st_size_64" >&5
$as_echo "$gl_cv_member_st_size_64" >&6; }
      if test $gl_cv_member_st_size_64 = no; then
        WINDOWS_64_BIT_ST_SIZE=1
      else
        WINDOWS_64_BIT_ST_SIZE=0
      fi
      ;;
    *)
                                                      WINDOWS_64_BIT_OFF_T=0
      WINDOWS_64_BIT_ST_SIZE=0
      ;;
  esac


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexp() can be used without linking with libm" >&5
$as_echo_n "checking whether ldexp() can be used without linking with libm... " >&6; }
if ${gl_cv_func_ldexp_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __NO_MATH_INLINES
                           # define __NO_MATH_INLINES 1 /* for glibc */
                           #endif
                           #include <math.h>
                           double (*funcptr) (double, int) = ldexp;
                           double x;
int
main ()
{
return ldexp (x, -1) > 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_ldexp_no_libm=yes
else
  gl_cv_func_ldexp_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_no_libm" >&5
$as_echo "$gl_cv_func_ldexp_no_libm" >&6; }



  LDEXP_LIBM=
  if test $gl_cv_func_ldexp_no_libm = no; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexp() can be used with libm" >&5
$as_echo_n "checking whether ldexp() can be used with libm... " >&6; }
if ${gl_cv_func_ldexp_in_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

        save_LIBS="$LIBS"
        LIBS="$LIBS -lm"
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __NO_MATH_INLINES
                             # define __NO_MATH_INLINES 1 /* for glibc */
                             #endif
                             #include <math.h>
                             double (*funcptr) (double, int) = ldexp;
                             double x;
int
main ()
{
return ldexp (x, -1) > 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_ldexp_in_libm=yes
else
  gl_cv_func_ldexp_in_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
        LIBS="$save_LIBS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_in_libm" >&5
$as_echo "$gl_cv_func_ldexp_in_libm" >&6; }
    if test $gl_cv_func_ldexp_in_libm = yes; then
      LDEXP_LIBM=-lm
    fi
  fi



      if test "X$prefix" = "XNONE"; then
    acl_final_prefix="$ac_default_prefix"
  else
    acl_final_prefix="$prefix"
  fi
  if test "X$exec_prefix" = "XNONE"; then
    acl_final_exec_prefix='${prefix}'
  else
    acl_final_exec_prefix="$exec_prefix"
  fi
  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
  prefix="$acl_save_prefix"



# Check whether --with-gnu-ld was given.
if test "${with_gnu_ld+set}" = set; then :
  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
else
  with_gnu_ld=no
fi

# Prepare PATH_SEPARATOR.
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
  # contains only /bin. Note that ksh looks also at the FPATH variable,
  # so we have to set that as well for the test.
  PATH_SEPARATOR=:
  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
           || PATH_SEPARATOR=';'
       }
fi

if test -n "$LD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld" >&5
$as_echo_n "checking for ld... " >&6; }
elif test "$GCC" = yes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
$as_echo_n "checking for ld used by $CC... " >&6; }
elif test "$with_gnu_ld" = yes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
$as_echo_n "checking for GNU ld... " >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
$as_echo_n "checking for non-GNU ld... " >&6; }
fi
if test -n "$LD"; then
  # Let the user override the test with a path.
  :
else
  if ${acl_cv_path_LD+:} false; then :
  $as_echo_n "(cached) " >&6
else

    acl_cv_path_LD= # Final result of this test
    ac_prog=ld # Program to search in $PATH
    if test "$GCC" = yes; then
      # Check if gcc -print-prog-name=ld gives a path.
      case $host in
        *-*-mingw*)
          # gcc leaves a trailing carriage return which upsets mingw
          acl_output=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
        *)
          acl_output=`($CC -print-prog-name=ld) 2>&5` ;;
      esac
      case $acl_output in
        # Accept absolute paths.
        [\\/]* | ?:[\\/]*)
          re_direlt='/[^/][^/]*/\.\./'
          # Canonicalize the pathname of ld
          acl_output=`echo "$acl_output" | sed 's%\\\\%/%g'`
          while echo "$acl_output" | grep "$re_direlt" > /dev/null 2>&1; do
            acl_output=`echo $acl_output | sed "s%$re_direlt%/%"`
          done
          # Got the pathname. No search in PATH is needed.
          acl_cv_path_LD="$acl_output"
          ac_prog=
          ;;
        "")
          # If it fails, then pretend we aren't using GCC.
          ;;
        *)
          # If it is relative, then search for the first ld in PATH.
          with_gnu_ld=unknown
          ;;
      esac
    fi
    if test -n "$ac_prog"; then
      # Search for $ac_prog in $PATH.
      acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
      for ac_dir in $PATH; do
        IFS="$acl_save_ifs"
        test -z "$ac_dir" && ac_dir=.
        if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
          acl_cv_path_LD="$ac_dir/$ac_prog"
          # Check to see if the program is GNU ld.  I'd rather use --version,
          # but apparently some variants of GNU ld only accept -v.
          # Break only if it was the GNU/non-GNU ld that we prefer.
          case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
            *GNU* | *'with BFD'*)
              test "$with_gnu_ld" != no && break
              ;;
            *)
              test "$with_gnu_ld" != yes && break
              ;;
          esac
        fi
      done
      IFS="$acl_save_ifs"
    fi
    case $host in
      *-*-aix*)
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if defined __powerpc64__ || defined _ARCH_PPC64
                int ok;
               #else
                error fail
               #endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  # The compiler produces 64-bit code. Add option '-b64' so that the
           # linker groks 64-bit object files.
           case "$acl_cv_path_LD " in
             *" -b64 "*) ;;
             *) acl_cv_path_LD="$acl_cv_path_LD -b64" ;;
           esac

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
        ;;
      sparc64-*-netbsd*)
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if defined __sparcv9 || defined __arch64__
                int ok;
               #else
                error fail
               #endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

else
  # The compiler produces 32-bit code. Add option '-m elf32_sparc'
           # so that the linker groks 32-bit object files.
           case "$acl_cv_path_LD " in
             *" -m elf32_sparc "*) ;;
             *) acl_cv_path_LD="$acl_cv_path_LD -m elf32_sparc" ;;
           esac

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
        ;;
    esac

fi

  LD="$acl_cv_path_LD"
fi
if test -n "$LD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
$as_echo "$LD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
  as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
if ${acl_cv_prog_gnu_ld+:} false; then :
  $as_echo_n "(cached) " >&6
else
  # I'd rather use --version here, but apparently some GNU lds only accept -v.
case `$LD -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
  acl_cv_prog_gnu_ld=yes
  ;;
*)
  acl_cv_prog_gnu_ld=no
  ;;
esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5
$as_echo "$acl_cv_prog_gnu_ld" >&6; }
with_gnu_ld=$acl_cv_prog_gnu_ld




                                                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5
$as_echo_n "checking for shared library run path origin... " >&6; }
if ${acl_cv_rpath+:} false; then :
  $as_echo_n "(cached) " >&6
else

    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
    . ./conftest.sh
    rm -f ./conftest.sh
    acl_cv_rpath=done

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5
$as_echo "$acl_cv_rpath" >&6; }
  wl="$acl_cv_wl"
  acl_libext="$acl_cv_libext"
  acl_shlibext="$acl_cv_shlibext"
  acl_libname_spec="$acl_cv_libname_spec"
  acl_library_names_spec="$acl_cv_library_names_spec"
  acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
  acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
  acl_hardcode_direct="$acl_cv_hardcode_direct"
  acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
    # Check whether --enable-rpath was given.
if test "${enable_rpath+set}" = set; then :
  enableval=$enable_rpath; :
else
  enable_rpath=yes
fi




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking 32-bit host C ABI" >&5
$as_echo_n "checking 32-bit host C ABI... " >&6; }
if ${gl_cv_host_cpu_c_abi_32bit+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$gl_cv_host_cpu_c_abi"; then
       case "$gl_cv_host_cpu_c_abi" in
         i386 | x86_64-x32 | arm | armhf | arm64-ilp32 | hppa | ia64-ilp32 | mips | mipsn32 | powerpc | riscv*-ilp32* | s390 | sparc)
           gl_cv_host_cpu_c_abi_32bit=yes ;;
         x86_64 | alpha | arm64 | hppa64 | ia64 | mips64 | powerpc64 | powerpc64-elfv2 | riscv*-lp64* | s390x | sparc64 )
           gl_cv_host_cpu_c_abi_32bit=no ;;
         *)
           gl_cv_host_cpu_c_abi_32bit=unknown ;;
       esac
     else
       case "$host_cpu" in

         # CPUs that only support a 32-bit ABI.
         arc \
         | bfin \
         | cris* \
         | csky \
         | epiphany \
         | ft32 \
         | h8300 \
         | m68k \
         | microblaze | microblazeel \
         | nds32 | nds32le | nds32be \
         | nios2 | nios2eb | nios2el \
         | or1k* \
         | or32 \
         | sh | sh1234 | sh1234elb \
         | tic6x \
         | xtensa* )
           gl_cv_host_cpu_c_abi_32bit=yes
           ;;

         # CPUs that only support a 64-bit ABI.
         alpha | alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] \
         | mmix )
           gl_cv_host_cpu_c_abi_32bit=no
           ;;

         i[34567]86 )
           gl_cv_host_cpu_c_abi_32bit=yes
           ;;

         x86_64 )
           # On x86_64 systems, the C compiler may be generating code in one of
           # these ABIs:
           # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64.
           # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64
           #   with native Windows (mingw, MSVC).
           # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32.
           # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386.
           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if (defined __x86_64__ || defined __amd64__ \
                       || defined _M_X64 || defined _M_AMD64) \
                      && !(defined __ILP32__ || defined _ILP32)
                   int ok;
                  #else
                   error fail
                  #endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_host_cpu_c_abi_32bit=no
else
  gl_cv_host_cpu_c_abi_32bit=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
           ;;

         arm* | aarch64 )
           # Assume arm with EABI.
           # On arm64 systems, the C compiler may be generating code in one of
           # these ABIs:
           # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64.
           # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32.
           # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf.
           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if defined __aarch64__ && !(defined __ILP32__ || defined _ILP32)
                   int ok;
                  #else
                   error fail
                  #endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_host_cpu_c_abi_32bit=no
else
  gl_cv_host_cpu_c_abi_32bit=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
           ;;

         hppa1.0 | hppa1.1 | hppa2.0* | hppa64 )
           # On hppa, the C compiler may be generating 32-bit code or 64-bit
           # code. In the latter case, it defines _LP64 and __LP64__.
           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __LP64__
                   int ok;
                  #else
                   error fail
                  #endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_host_cpu_c_abi_32bit=no
else
  gl_cv_host_cpu_c_abi_32bit=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
           ;;

         ia64* )
           # On ia64 on HP-UX, the C compiler may be generating 64-bit code or
           # 32-bit code. In the latter case, it defines _ILP32.
           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef _ILP32
                   int ok;
                  #else
                   error fail
                  #endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_host_cpu_c_abi_32bit=yes
else
  gl_cv_host_cpu_c_abi_32bit=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
           ;;

         mips* )
           # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this
           # at 32.
           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64)
                   int ok;
                  #else
                   error fail
                  #endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_host_cpu_c_abi_32bit=no
else
  gl_cv_host_cpu_c_abi_32bit=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
           ;;

         powerpc* )
           # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD.
           # No need to distinguish them here; the caller may distinguish
           # them based on the OS.
           # On powerpc64 systems, the C compiler may still be generating
           # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may
           # be generating 64-bit code.
           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if defined __powerpc64__ || defined _ARCH_PPC64
                   int ok;
                  #else
                   error fail
                  #endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_host_cpu_c_abi_32bit=no
else
  gl_cv_host_cpu_c_abi_32bit=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
           ;;

         rs6000 )
           gl_cv_host_cpu_c_abi_32bit=yes
           ;;

         riscv32 | riscv64 )
           # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d.
           # Size of 'long' and 'void *':
           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if defined __LP64__
                    int ok;
                  #else
                    error fail
                  #endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_host_cpu_c_abi_32bit=no
else
  gl_cv_host_cpu_c_abi_32bit=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
           ;;

         s390* )
           # On s390x, the C compiler may be generating 64-bit (= s390x) code
           # or 31-bit (= s390) code.
           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if defined __LP64__ || defined __s390x__
                    int ok;
                  #else
                    error fail
                  #endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_host_cpu_c_abi_32bit=no
else
  gl_cv_host_cpu_c_abi_32bit=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
           ;;

         sparc | sparc64 )
           # UltraSPARCs running Linux have `uname -m` = "sparc64", but the
           # C compiler still generates 32-bit code.
           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if defined __sparcv9 || defined __arch64__
                   int ok;
                  #else
                   error fail
                  #endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_host_cpu_c_abi_32bit=no
else
  gl_cv_host_cpu_c_abi_32bit=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
           ;;

         *)
           gl_cv_host_cpu_c_abi_32bit=unknown
           ;;
       esac
     fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_host_cpu_c_abi_32bit" >&5
$as_echo "$gl_cv_host_cpu_c_abi_32bit" >&6; }

  HOST_CPU_C_ABI_32BIT="$gl_cv_host_cpu_c_abi_32bit"





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ELF binary format" >&5
$as_echo_n "checking for ELF binary format... " >&6; }
if ${gl_cv_elf+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __ELF__
        Extensible Linking Format
        #endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Extensible Linking Format" >/dev/null 2>&1; then :
  gl_cv_elf=yes
else
  gl_cv_elf=no
fi
rm -f conftest*


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_elf" >&5
$as_echo "$gl_cv_elf" >&6; }
  if test $gl_cv_elf; then
    # Extract the ELF class of a file (5th byte) in decimal.
    # Cf. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header
    if od -A x < /dev/null >/dev/null 2>/dev/null; then
      # Use POSIX od.
      func_elfclass ()
      {
        od -A n -t d1 -j 4 -N 1
      }
    else
      # Use BSD hexdump.
      func_elfclass ()
      {
        dd bs=1 count=1 skip=4 2>/dev/null | hexdump -e '1/1 "%3d "'
        echo
      }
    fi
    case $HOST_CPU_C_ABI_32BIT in
      yes)
        # 32-bit ABI.
        acl_is_expected_elfclass ()
        {
          test "`func_elfclass | sed -e 's/[ 	]//g'`" = 1
        }
        ;;
      no)
        # 64-bit ABI.
        acl_is_expected_elfclass ()
        {
          test "`func_elfclass | sed -e 's/[ 	]//g'`" = 2
        }
        ;;
      *)
        # Unknown.
        acl_is_expected_elfclass ()
        {
          :
        }
        ;;
    esac
  else
    acl_is_expected_elfclass ()
    {
      :
    }
  fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the common suffixes of directories in the library search path" >&5
$as_echo_n "checking for the common suffixes of directories in the library search path... " >&6; }
if ${acl_cv_libdirstems+:} false; then :
  $as_echo_n "(cached) " >&6
else
            acl_libdirstem=lib
     acl_libdirstem2=
     acl_libdirstem3=
     case "$host_os" in
       solaris*)
                                                      if test $HOST_CPU_C_ABI_32BIT = no; then
           acl_libdirstem2=lib/64
           case "$host_cpu" in
             sparc*)        acl_libdirstem3=lib/sparcv9 ;;
             i*86 | x86_64) acl_libdirstem3=lib/amd64 ;;
           esac
         fi
         ;;
       *)
                                                                                 searchpath=`(LC_ALL=C $CC $CPPFLAGS $CFLAGS -print-search-dirs) 2>/dev/null \
                     | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
         if test $HOST_CPU_C_ABI_32BIT != no; then
           # 32-bit or unknown ABI.
           if test -d /usr/lib32; then
             acl_libdirstem2=lib32
           fi
         fi
         if test $HOST_CPU_C_ABI_32BIT != yes; then
           # 64-bit or unknown ABI.
           if test -d /usr/lib64; then
             acl_libdirstem3=lib64
           fi
         fi
         if test -n "$searchpath"; then
           acl_save_IFS="${IFS= 	}"; IFS=":"
           for searchdir in $searchpath; do
             if test -d "$searchdir"; then
               case "$searchdir" in
                 */lib32/ | */lib32 ) acl_libdirstem2=lib32 ;;
                 */lib64/ | */lib64 ) acl_libdirstem3=lib64 ;;
                 */../ | */.. )
                   # Better ignore directories of this form. They are misleading.
                   ;;
                 *) searchdir=`cd "$searchdir" && pwd`
                    case "$searchdir" in
                      */lib32 ) acl_libdirstem2=lib32 ;;
                      */lib64 ) acl_libdirstem3=lib64 ;;
                    esac ;;
               esac
             fi
           done
           IFS="$acl_save_IFS"
           if test $HOST_CPU_C_ABI_32BIT = yes; then
             # 32-bit ABI.
             acl_libdirstem3=
           fi
           if test $HOST_CPU_C_ABI_32BIT = no; then
             # 64-bit ABI.
             acl_libdirstem2=
           fi
         fi
         ;;
     esac
     test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
     test -n "$acl_libdirstem3" || acl_libdirstem3="$acl_libdirstem"
     acl_cv_libdirstems="$acl_libdirstem,$acl_libdirstem2,$acl_libdirstem3"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_libdirstems" >&5
$as_echo "$acl_cv_libdirstems" >&6; }
      acl_libdirstem=`echo "$acl_cv_libdirstems" | sed -e 's/,.*//'`
  acl_libdirstem2=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,//' -e 's/,.*//'`
  acl_libdirstem3=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,[^,]*,//' -e 's/,.*//'`




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5
$as_echo_n "checking for nl_langinfo and CODESET... " >&6; }
if ${am_cv_langinfo_codeset+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <langinfo.h>
int
main ()
{
char* cs = nl_langinfo(CODESET); return !cs;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  am_cv_langinfo_codeset=yes
else
  am_cv_langinfo_codeset=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5
$as_echo "$am_cv_langinfo_codeset" >&6; }
  if test $am_cv_langinfo_codeset = yes; then

$as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h

  fi





  gl_threads_api=none
  LIBTHREAD=
  LTLIBTHREAD=
  LIBMULTITHREAD=
  LTLIBMULTITHREAD=
  if test "$gl_use_threads" != no; then
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5
$as_echo_n "checking whether imported symbols can be declared weak... " >&6; }
if ${gl_cv_have_weak+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_cv_have_weak=no
              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
extern void xyzzy ();
#pragma weak xyzzy
int
main ()
{
xyzzy();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_have_weak=maybe
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
       if test $gl_cv_have_weak = maybe; then
                           if test "$cross_compiling" = yes; then :
                          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __ELF__
               Extensible Linking Format
               #endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Extensible Linking Format" >/dev/null 2>&1; then :
  gl_cv_have_weak="guessing yes"
else
  gl_cv_have_weak="guessing no"
fi
rm -f conftest*


else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#pragma weak fputs
int main ()
{
  return (fputs == NULL);
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_have_weak=yes
else
  gl_cv_have_weak=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

       fi
              case " $LDFLAGS " in
         *" -static "*) gl_cv_have_weak=no ;;
       esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5
$as_echo "$gl_cv_have_weak" >&6; }
    if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then

      :
    fi
    if test "$gl_use_threads" = isoc || test "$gl_use_threads" = isoc+posix; then

      if test $ac_cv_header_threads_h = yes; then
        gl_have_isoc_threads=
        # Test whether both mtx_lock and cnd_timedwait exist in libc.
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <threads.h>
               #include <stddef.h>
               mtx_t m;
               cnd_t c;

int
main ()
{
mtx_lock (&m);
               cnd_timedwait (&c, &m, NULL);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_have_isoc_threads=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      fi
    fi
    if test "$gl_use_threads" = yes \
       || test "$gl_use_threads" = posix \
       || test "$gl_use_threads" = isoc+posix; then


  if test -z "$gl_threadlib_body_done"; then
    gl_pthread_api=no
    LIBPTHREAD=
    LIBPMULTITHREAD=
    # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
    # it groks <pthread.h>. It's added above, in gl_ANYTHREADLIB_EARLY.
    ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
if test "x$ac_cv_header_pthread_h" = xyes; then :
  gl_have_pthread_h=yes
else
  gl_have_pthread_h=no
fi


    if test "$gl_have_pthread_h" = yes; then
      # Other possible tests:
      #   -lpthreads (FSU threads, PCthreads)
      #   -lgthreads
      # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
      # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
      # the second one only in libpthread, and lock.c needs it.
      #
      # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
      # needs -pthread for some reason.  See:
      # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html
      save_LIBS=$LIBS
      for gl_pthread in '' '-pthread'; do
        LIBS="$LIBS $gl_pthread"
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <pthread.h>
               pthread_mutex_t m;
               pthread_mutexattr_t ma;

int
main ()
{
pthread_mutex_lock (&m);
               pthread_mutexattr_init (&ma);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_pthread_api=yes
           LIBPTHREAD=$gl_pthread
           LIBPMULTITHREAD=$gl_pthread
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
        LIBS=$save_LIBS
        test $gl_pthread_api = yes && break
      done

      # Test for libpthread by looking for pthread_kill. (Not pthread_self,
      # since it is defined as a macro on OSF/1.)
      if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then
        # The program links fine without libpthread. But it may actually
        # need to link with libpthread in order to create multiple threads.
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
$as_echo_n "checking for pthread_kill in -lpthread... " >&6; }
if ${ac_cv_lib_pthread_pthread_kill+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lpthread  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char pthread_kill ();
int
main ()
{
return pthread_kill ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_pthread_pthread_kill=yes
else
  ac_cv_lib_pthread_pthread_kill=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
$as_echo "$ac_cv_lib_pthread_pthread_kill" >&6; }
if test "x$ac_cv_lib_pthread_pthread_kill" = xyes; then :
  LIBPMULTITHREAD=-lpthread
           # On Solaris and HP-UX, most pthread functions exist also in libc.
           # Therefore pthread_in_use() needs to actually try to create a
           # thread: pthread_create from libc will fail, whereas
           # pthread_create will actually create a thread.
           # On Solaris 10 or newer, this test is no longer needed, because
           # libc contains the fully functional pthread functions.
           case "$host_os" in
             solaris | solaris2.1-9 | solaris2.1-9.* | hpux*)

$as_echo "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h

           esac

fi

      elif test $gl_pthread_api != yes; then
        # Some library is needed. Try libpthread and libc_r.
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
$as_echo_n "checking for pthread_kill in -lpthread... " >&6; }
if ${ac_cv_lib_pthread_pthread_kill+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lpthread  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char pthread_kill ();
int
main ()
{
return pthread_kill ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_pthread_pthread_kill=yes
else
  ac_cv_lib_pthread_pthread_kill=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
$as_echo "$ac_cv_lib_pthread_pthread_kill" >&6; }
if test "x$ac_cv_lib_pthread_pthread_kill" = xyes; then :
  gl_pthread_api=yes
           LIBPTHREAD=-lpthread
           LIBPMULTITHREAD=-lpthread
fi

        if test $gl_pthread_api != yes; then
          # For FreeBSD 4.
          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lc_r" >&5
$as_echo_n "checking for pthread_kill in -lc_r... " >&6; }
if ${ac_cv_lib_c_r_pthread_kill+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lc_r  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char pthread_kill ();
int
main ()
{
return pthread_kill ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_c_r_pthread_kill=yes
else
  ac_cv_lib_c_r_pthread_kill=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_kill" >&5
$as_echo "$ac_cv_lib_c_r_pthread_kill" >&6; }
if test "x$ac_cv_lib_c_r_pthread_kill" = xyes; then :
  gl_pthread_api=yes
             LIBPTHREAD=-lc_r
             LIBPMULTITHREAD=-lc_r
fi

        fi
      fi
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5
$as_echo_n "checking whether POSIX threads API is available... " >&6; }
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_pthread_api" >&5
$as_echo "$gl_pthread_api" >&6; }


    gl_threadlib_body_done=done
  fi

      LIBTHREAD=$LIBPTHREAD LTLIBTHREAD=$LIBPTHREAD
      LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD
      if test $gl_pthread_api = yes; then
        if test "$gl_use_threads" = isoc+posix && test "$gl_have_isoc_threads" = yes; then
          gl_threads_api='isoc+posix'

$as_echo "#define USE_ISOC_AND_POSIX_THREADS 1" >>confdefs.h

          LIBTHREAD= LTLIBTHREAD=
        else
          gl_threads_api=posix

$as_echo "#define USE_POSIX_THREADS 1" >>confdefs.h

          if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
            if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then

$as_echo "#define USE_POSIX_THREADS_WEAK 1" >>confdefs.h

              LIBTHREAD= LTLIBTHREAD=
            fi
          fi
        fi
      fi
    fi
    if test $gl_threads_api = none; then
      if test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes; then
        gl_threads_api=isoc

$as_echo "#define USE_ISOC_THREADS 1" >>confdefs.h

      fi
    fi
    if test $gl_threads_api = none; then
      case "$gl_use_threads" in
        yes | windows | win32) # The 'win32' is for backward compatibility.
          if { case "$host_os" in
                 mingw*) true;;
                 *) false;;
               esac
             }; then
            gl_threads_api=windows

$as_echo "#define USE_WINDOWS_THREADS 1" >>confdefs.h

          fi
          ;;
      esac
    fi
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for multithread API to use" >&5
$as_echo_n "checking for multithread API to use... " >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_threads_api" >&5
$as_echo "$gl_threads_api" >&6; }









{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
$as_echo_n "checking for a sed that does not truncate output... " >&6; }
if ${ac_cv_path_SED+:} false; then :
  $as_echo_n "(cached) " >&6
else
            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
     for ac_i in 1 2 3 4 5 6 7; do
       ac_script="$ac_script$as_nl$ac_script"
     done
     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
     { ac_script=; unset ac_script;}
     if test -z "$SED"; then
  ac_path_SED_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in sed gsed; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
      as_fn_executable_p "$ac_path_SED" || continue
# Check for GNU ac_path_SED and select it if it is found.
  # Check for GNU $ac_path_SED
case `"$ac_path_SED" --version 2>&1` in
*GNU*)
  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
*)
  ac_count=0
  $as_echo_n 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    $as_echo '' >> "conftest.nl"
    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_SED_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_SED="$ac_path_SED"
      ac_path_SED_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_SED_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_SED"; then
    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
  fi
else
  ac_cv_path_SED=$SED
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
$as_echo "$ac_cv_path_SED" >&6; }
 SED="$ac_cv_path_SED"
  rm -f conftest.sed





   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mbstate_t" >&5
$as_echo_n "checking for mbstate_t... " >&6; }
if ${ac_cv_type_mbstate_t+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
int
main ()
{
mbstate_t x; return sizeof x;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_type_mbstate_t=yes
else
  ac_cv_type_mbstate_t=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_mbstate_t" >&5
$as_echo "$ac_cv_type_mbstate_t" >&6; }
   if test $ac_cv_type_mbstate_t = yes; then

$as_echo "#define HAVE_MBSTATE_T 1" >>confdefs.h

   else

$as_echo "#define mbstate_t int" >>confdefs.h

   fi


  GNULIB_BTOWC=0;
  GNULIB_WCTOB=0;
  GNULIB_MBSINIT=0;
  GNULIB_MBRTOWC=0;
  GNULIB_MBRLEN=0;
  GNULIB_MBSRTOWCS=0;
  GNULIB_MBSNRTOWCS=0;
  GNULIB_WCRTOMB=0;
  GNULIB_WCSRTOMBS=0;
  GNULIB_WCSNRTOMBS=0;
  GNULIB_WCWIDTH=0;
  GNULIB_WMEMCHR=0;
  GNULIB_WMEMCMP=0;
  GNULIB_WMEMCPY=0;
  GNULIB_WMEMMOVE=0;
  GNULIB_WMEMSET=0;
  GNULIB_WCSLEN=0;
  GNULIB_WCSNLEN=0;
  GNULIB_WCSCPY=0;
  GNULIB_WCPCPY=0;
  GNULIB_WCSNCPY=0;
  GNULIB_WCPNCPY=0;
  GNULIB_WCSCAT=0;
  GNULIB_WCSNCAT=0;
  GNULIB_WCSCMP=0;
  GNULIB_WCSNCMP=0;
  GNULIB_WCSCASECMP=0;
  GNULIB_WCSNCASECMP=0;
  GNULIB_WCSCOLL=0;
  GNULIB_WCSXFRM=0;
  GNULIB_WCSDUP=0;
  GNULIB_WCSCHR=0;
  GNULIB_WCSRCHR=0;
  GNULIB_WCSCSPN=0;
  GNULIB_WCSSPN=0;
  GNULIB_WCSPBRK=0;
  GNULIB_WCSSTR=0;
  GNULIB_WCSTOK=0;
  GNULIB_WCSWIDTH=0;
  GNULIB_WCSFTIME=0;
    HAVE_BTOWC=1;
  HAVE_MBSINIT=1;
  HAVE_MBRTOWC=1;
  HAVE_MBRLEN=1;
  HAVE_MBSRTOWCS=1;
  HAVE_MBSNRTOWCS=1;
  HAVE_WCRTOMB=1;
  HAVE_WCSRTOMBS=1;
  HAVE_WCSNRTOMBS=1;
  HAVE_WMEMCHR=1;
  HAVE_WMEMCMP=1;
  HAVE_WMEMCPY=1;
  HAVE_WMEMMOVE=1;
  HAVE_WMEMSET=1;
  HAVE_WCSLEN=1;
  HAVE_WCSNLEN=1;
  HAVE_WCSCPY=1;
  HAVE_WCPCPY=1;
  HAVE_WCSNCPY=1;
  HAVE_WCPNCPY=1;
  HAVE_WCSCAT=1;
  HAVE_WCSNCAT=1;
  HAVE_WCSCMP=1;
  HAVE_WCSNCMP=1;
  HAVE_WCSCASECMP=1;
  HAVE_WCSNCASECMP=1;
  HAVE_WCSCOLL=1;
  HAVE_WCSXFRM=1;
  HAVE_WCSDUP=1;
  HAVE_WCSCHR=1;
  HAVE_WCSRCHR=1;
  HAVE_WCSCSPN=1;
  HAVE_WCSSPN=1;
  HAVE_WCSPBRK=1;
  HAVE_WCSSTR=1;
  HAVE_WCSTOK=1;
  HAVE_WCSWIDTH=1;
  HAVE_WCSFTIME=1;
  HAVE_DECL_WCTOB=1;
  HAVE_DECL_WCWIDTH=1;
  REPLACE_MBSTATE_T=0;
  REPLACE_BTOWC=0;
  REPLACE_WCTOB=0;
  REPLACE_MBSINIT=0;
  REPLACE_MBRTOWC=0;
  REPLACE_MBRLEN=0;
  REPLACE_MBSRTOWCS=0;
  REPLACE_MBSNRTOWCS=0;
  REPLACE_WCRTOMB=0;
  REPLACE_WCSRTOMBS=0;
  REPLACE_WCSNRTOMBS=0;
  REPLACE_WCWIDTH=0;
  REPLACE_WCSWIDTH=0;
  REPLACE_WCSFTIME=0;
  REPLACE_WCSTOK=0;








  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a traditional japanese locale" >&5
$as_echo_n "checking for a traditional japanese locale... " >&6; }
if ${gt_cv_locale_ja+:} false; then :
  $as_echo_n "(cached) " >&6
else

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
#include <time.h>
#if HAVE_LANGINFO_CODESET
# include <langinfo.h>
#endif
#include <stdlib.h>
#include <string.h>
struct tm t;
char buf[16];
int main ()
{
  /* On BeOS and Haiku, locales are not implemented in libc.  Rather, libintl
     imitates locale dependent behaviour by looking at the environment
     variables, and all locales use the UTF-8 encoding.  */
#if defined __BEOS__ || defined __HAIKU__
  return 1;
#else
  /* Check whether the given locale name is recognized by the system.  */
# if defined _WIN32 && !defined __CYGWIN__
  /* On native Windows, setlocale(category, "") looks at the system settings,
     not at the environment variables.  Also, when an encoding suffix such
     as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
     category of the locale to "C".  */
  if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
      || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
    return 1;
# else
  if (setlocale (LC_ALL, "") == NULL) return 1;
# endif
  /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
     On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
     is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
     On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
     succeeds but then nl_langinfo(CODESET) is "646". In this situation,
     some unit tests fail.
     On MirBSD 10, when an unsupported locale is specified, setlocale()
     succeeds but then nl_langinfo(CODESET) is "UTF-8".  */
# if HAVE_LANGINFO_CODESET
  {
    const char *cs = nl_langinfo (CODESET);
    if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0
        || strcmp (cs, "UTF-8") == 0)
      return 1;
  }
# endif
# ifdef __CYGWIN__
  /* On Cygwin, avoid locale names without encoding suffix, because the
     locale_charset() function relies on the encoding suffix.  Note that
     LC_ALL is set on the command line.  */
  if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
# endif
  /* Check whether MB_CUR_MAX is > 1.  This excludes the dysfunctional locales
     on Cygwin 1.5.x.  */
  if (MB_CUR_MAX == 1)
    return 1;
  /* Check whether in a month name, no byte in the range 0x80..0x9F occurs.
     This excludes the UTF-8 encoding (except on MirBSD).  */
  {
    const char *p;
    t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
    if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1;
    for (p = buf; *p != '\0'; p++)
      if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0)
        return 1;
  }
  return 0;
#endif
}

_ACEOF
    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && test -s conftest$ac_exeext; then
      case "$host_os" in
        # Handle native Windows specially, because there setlocale() interprets
        # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
        # "fr" or "fra" as "French" or "French_France.1252",
        # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
        # "ja" as "Japanese" or "Japanese_Japan.932",
        # and similar.
        mingw*)
          # Note that on native Windows, the Japanese locale is
          # Japanese_Japan.932, and CP932 is very different from EUC-JP, so we
          # cannot use it here.
          gt_cv_locale_ja=none
          ;;
        *)
          # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
          # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
          # configure script would override the LC_ALL setting. Likewise for
          # LC_CTYPE, which is also set at the beginning of the configure script.
          # Test for the AIX locale name.
          if (LC_ALL=ja_JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
            gt_cv_locale_ja=ja_JP
          else
            # Test for the locale name with explicit encoding suffix.
            if (LC_ALL=ja_JP.EUC-JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
              gt_cv_locale_ja=ja_JP.EUC-JP
            else
              # Test for the HP-UX, OSF/1, NetBSD locale name.
              if (LC_ALL=ja_JP.eucJP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
                gt_cv_locale_ja=ja_JP.eucJP
              else
                # Test for the IRIX, FreeBSD locale name.
                if (LC_ALL=ja_JP.EUC LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
                  gt_cv_locale_ja=ja_JP.EUC
                else
                  # Test for the Solaris 7 locale name.
                  if (LC_ALL=ja LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
                    gt_cv_locale_ja=ja
                  else
                    # Special test for NetBSD 1.6.
                    if test -f /usr/share/locale/ja_JP.eucJP/LC_CTYPE; then
                      gt_cv_locale_ja=ja_JP.eucJP
                    else
                      # None found.
                      gt_cv_locale_ja=none
                    fi
                  fi
                fi
              fi
            fi
          fi
          ;;
      esac
    fi
    rm -fr conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_ja" >&5
$as_echo "$gt_cv_locale_ja" >&6; }
  LOCALE_JA=$gt_cv_locale_ja




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a french Unicode locale" >&5
$as_echo_n "checking for a french Unicode locale... " >&6; }
if ${gt_cv_locale_fr_utf8+:} false; then :
  $as_echo_n "(cached) " >&6
else

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
#include <time.h>
#if HAVE_LANGINFO_CODESET
# include <langinfo.h>
#endif
#include <stdlib.h>
#include <string.h>
struct tm t;
char buf[16];
int main () {
  /* On BeOS and Haiku, locales are not implemented in libc.  Rather, libintl
     imitates locale dependent behaviour by looking at the environment
     variables, and all locales use the UTF-8 encoding.  */
#if !(defined __BEOS__ || defined __HAIKU__)
  /* Check whether the given locale name is recognized by the system.  */
# if defined _WIN32 && !defined __CYGWIN__
  /* On native Windows, setlocale(category, "") looks at the system settings,
     not at the environment variables.  Also, when an encoding suffix such
     as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
     category of the locale to "C".  */
  if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
      || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
    return 1;
# else
  if (setlocale (LC_ALL, "") == NULL) return 1;
# endif
  /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
     On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
     is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
     On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
     succeeds but then nl_langinfo(CODESET) is "646". In this situation,
     some unit tests fail.  */
# if HAVE_LANGINFO_CODESET
  {
    const char *cs = nl_langinfo (CODESET);
    if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0)
      return 1;
  }
# endif
# ifdef __CYGWIN__
  /* On Cygwin, avoid locale names without encoding suffix, because the
     locale_charset() function relies on the encoding suffix.  Note that
     LC_ALL is set on the command line.  */
  if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
# endif
  /* Check whether in the abbreviation of the second month, the second
     character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is
     two bytes long, with UTF-8 encoding.  */
  t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
  if (strftime (buf, sizeof (buf), "%b", &t) < 4
      || buf[1] != (char) 0xc3 || buf[2] != (char) 0xa9 || buf[3] != 'v')
    return 1;
#endif
#if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy.  */
  /* Check whether the decimal separator is a comma.
     On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point
     are nl_langinfo(RADIXCHAR) are both ".".  */
  if (localeconv () ->decimal_point[0] != ',') return 1;
#endif
  return 0;
}

_ACEOF
    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && test -s conftest$ac_exeext; then
      case "$host_os" in
        # Handle native Windows specially, because there setlocale() interprets
        # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
        # "fr" or "fra" as "French" or "French_France.1252",
        # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
        # "ja" as "Japanese" or "Japanese_Japan.932",
        # and similar.
        mingw*)
          # Test for the hypothetical native Windows locale name.
          if (LC_ALL=French_France.65001 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
            gt_cv_locale_fr_utf8=French_France.65001
          else
            # None found.
            gt_cv_locale_fr_utf8=none
          fi
          ;;
        *)
          # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
          # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
          # configure script would override the LC_ALL setting. Likewise for
          # LC_CTYPE, which is also set at the beginning of the configure script.
          # Test for the usual locale name.
          if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
            gt_cv_locale_fr_utf8=fr_FR
          else
            # Test for the locale name with explicit encoding suffix.
            if (LC_ALL=fr_FR.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
              gt_cv_locale_fr_utf8=fr_FR.UTF-8
            else
              # Test for the Solaris 7 locale name.
              if (LC_ALL=fr.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
                gt_cv_locale_fr_utf8=fr.UTF-8
              else
                # None found.
                gt_cv_locale_fr_utf8=none
              fi
            fi
          fi
          ;;
      esac
    fi
    rm -fr conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_fr_utf8" >&5
$as_echo "$gt_cv_locale_fr_utf8" >&6; }
  LOCALE_FR_UTF8=$gt_cv_locale_fr_utf8





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a transitional chinese locale" >&5
$as_echo_n "checking for a transitional chinese locale... " >&6; }
if ${gt_cv_locale_zh_CN+:} false; then :
  $as_echo_n "(cached) " >&6
else

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
#include <stdlib.h>
#include <time.h>
#if HAVE_LANGINFO_CODESET
# include <langinfo.h>
#endif
#include <stdlib.h>
#include <string.h>
struct tm t;
char buf[16];
int main ()
{
  /* On BeOS and Haiku, locales are not implemented in libc.  Rather, libintl
     imitates locale dependent behaviour by looking at the environment
     variables, and all locales use the UTF-8 encoding.  */
#if defined __BEOS__ || defined __HAIKU__
  return 1;
#else
  /* Check whether the given locale name is recognized by the system.  */
# if defined _WIN32 && !defined __CYGWIN__
  /* On native Windows, setlocale(category, "") looks at the system settings,
     not at the environment variables.  Also, when an encoding suffix such
     as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
     category of the locale to "C".  */
  if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
      || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
    return 1;
# else
  if (setlocale (LC_ALL, "") == NULL) return 1;
# endif
  /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
     On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
     is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
     On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
     succeeds but then nl_langinfo(CODESET) is "646". In this situation,
     some unit tests fail.
     On MirBSD 10, when an unsupported locale is specified, setlocale()
     succeeds but then nl_langinfo(CODESET) is "UTF-8".  */
# if HAVE_LANGINFO_CODESET
  {
    const char *cs = nl_langinfo (CODESET);
    if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0
        || strcmp (cs, "UTF-8") == 0)
      return 1;
  }
# endif
# ifdef __CYGWIN__
  /* On Cygwin, avoid locale names without encoding suffix, because the
     locale_charset() function relies on the encoding suffix.  Note that
     LC_ALL is set on the command line.  */
  if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
# endif
  /* Check whether in a month name, no byte in the range 0x80..0x9F occurs.
     This excludes the UTF-8 encoding (except on MirBSD).  */
  {
    const char *p;
    t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
    if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1;
    for (p = buf; *p != '\0'; p++)
      if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0)
        return 1;
  }
  /* Check whether a typical GB18030 multibyte sequence is recognized as a
     single wide character.  This excludes the GB2312 and GBK encodings.  */
  if (mblen ("\203\062\332\066", 5) != 4)
    return 1;
  return 0;
#endif
}

_ACEOF
    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && test -s conftest$ac_exeext; then
      case "$host_os" in
        # Handle native Windows specially, because there setlocale() interprets
        # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
        # "fr" or "fra" as "French" or "French_France.1252",
        # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
        # "ja" as "Japanese" or "Japanese_Japan.932",
        # and similar.
        mingw*)
          # Test for the hypothetical native Windows locale name.
          if (LC_ALL=Chinese_China.54936 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
            gt_cv_locale_zh_CN=Chinese_China.54936
          else
            # None found.
            gt_cv_locale_zh_CN=none
          fi
          ;;
        solaris2.8)
          # On Solaris 8, the locales zh_CN.GB18030, zh_CN.GBK, zh.GBK are
          # broken. One witness is the test case in gl_MBRTOWC_SANITYCHECK.
          # Another witness is that "LC_ALL=zh_CN.GB18030 bash -c true" dumps core.
          gt_cv_locale_zh_CN=none
          ;;
        *)
          # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
          # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
          # configure script would override the LC_ALL setting. Likewise for
          # LC_CTYPE, which is also set at the beginning of the configure script.
          # Test for the locale name without encoding suffix.
          if (LC_ALL=zh_CN LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
            gt_cv_locale_zh_CN=zh_CN
          else
            # Test for the locale name with explicit encoding suffix.
            if (LC_ALL=zh_CN.GB18030 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
              gt_cv_locale_zh_CN=zh_CN.GB18030
            else
              # None found.
              gt_cv_locale_zh_CN=none
            fi
          fi
          ;;
      esac
    else
      # If there was a link error, due to mblen(), the system is so old that
      # it certainly doesn't have a chinese locale.
      gt_cv_locale_zh_CN=none
    fi
    rm -fr conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_zh_CN" >&5
$as_echo "$gt_cv_locale_zh_CN" >&6; }
  LOCALE_ZH_CN=$gt_cv_locale_zh_CN









  GNULIB_EXPLICIT_BZERO=0;
  GNULIB_FFSL=0;
  GNULIB_FFSLL=0;
  GNULIB_MEMCHR=0;
  GNULIB_MEMMEM=0;
  GNULIB_MEMPCPY=0;
  GNULIB_MEMRCHR=0;
  GNULIB_RAWMEMCHR=0;
  GNULIB_STPCPY=0;
  GNULIB_STPNCPY=0;
  GNULIB_STRCHRNUL=0;
  GNULIB_STRDUP=0;
  GNULIB_STRNCAT=0;
  GNULIB_STRNDUP=0;
  GNULIB_STRNLEN=0;
  GNULIB_STRPBRK=0;
  GNULIB_STRSEP=0;
  GNULIB_STRSTR=0;
  GNULIB_STRCASESTR=0;
  GNULIB_STRTOK_R=0;
  GNULIB_MBSLEN=0;
  GNULIB_MBSNLEN=0;
  GNULIB_MBSCHR=0;
  GNULIB_MBSRCHR=0;
  GNULIB_MBSSTR=0;
  GNULIB_MBSCASECMP=0;
  GNULIB_MBSNCASECMP=0;
  GNULIB_MBSPCASECMP=0;
  GNULIB_MBSCASESTR=0;
  GNULIB_MBSCSPN=0;
  GNULIB_MBSPBRK=0;
  GNULIB_MBSSPN=0;
  GNULIB_MBSSEP=0;
  GNULIB_MBSTOK_R=0;
  GNULIB_STRERROR=0;
  GNULIB_STRERROR_R=0;
  GNULIB_STRSIGNAL=0;
  GNULIB_STRVERSCMP=0;
  HAVE_MBSLEN=0;
    HAVE_EXPLICIT_BZERO=1;
  HAVE_FFSL=1;
  HAVE_FFSLL=1;
  HAVE_MEMCHR=1;
  HAVE_DECL_MEMMEM=1;
  HAVE_MEMPCPY=1;
  HAVE_DECL_MEMRCHR=1;
  HAVE_RAWMEMCHR=1;
  HAVE_STPCPY=1;
  HAVE_STPNCPY=1;
  HAVE_STRCHRNUL=1;
  HAVE_DECL_STRDUP=1;
  HAVE_DECL_STRNDUP=1;
  HAVE_DECL_STRNLEN=1;
  HAVE_STRPBRK=1;
  HAVE_STRSEP=1;
  HAVE_STRCASESTR=1;
  HAVE_DECL_STRTOK_R=1;
  HAVE_DECL_STRERROR_R=1;
  HAVE_DECL_STRSIGNAL=1;
  HAVE_STRVERSCMP=1;
  REPLACE_MEMCHR=0;
  REPLACE_MEMMEM=0;
  REPLACE_STPNCPY=0;
  REPLACE_STRCHRNUL=0;
  REPLACE_STRDUP=0;
  REPLACE_STRNCAT=0;
  REPLACE_STRNDUP=0;
  REPLACE_STRNLEN=0;
  REPLACE_STRSTR=0;
  REPLACE_STRCASESTR=0;
  REPLACE_STRTOK_R=0;
  REPLACE_STRERROR=0;
  REPLACE_STRERROR_R=0;
  REPLACE_STRSIGNAL=0;
  UNDEFINE_STRTOK_R=0;






  # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it
  # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is
  # irrelevant for anonymous mappings.
  ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap"
if test "x$ac_cv_func_mmap" = xyes; then :
  gl_have_mmap=yes
else
  gl_have_mmap=no
fi


  # Try to allow MAP_ANONYMOUS.
  gl_have_mmap_anonymous=no
  if test $gl_have_mmap = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAP_ANONYMOUS" >&5
$as_echo_n "checking for MAP_ANONYMOUS... " >&6; }
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/mman.h>
#ifdef MAP_ANONYMOUS
    I cannot identify this map
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "I cannot identify this map" >/dev/null 2>&1; then :
  gl_have_mmap_anonymous=yes
fi
rm -f conftest*

    if test $gl_have_mmap_anonymous != yes; then
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/mman.h>
#ifdef MAP_ANON
    I cannot identify this map
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "I cannot identify this map" >/dev/null 2>&1; then :

$as_echo "#define MAP_ANONYMOUS MAP_ANON" >>confdefs.h

         gl_have_mmap_anonymous=yes
fi
rm -f conftest*

    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_have_mmap_anonymous" >&5
$as_echo "$gl_have_mmap_anonymous" >&6; }
    if test $gl_have_mmap_anonymous = yes; then

$as_echo "#define HAVE_MAP_ANONYMOUS 1" >>confdefs.h

    fi
  fi






  if test $HAVE_MEMCHR = 1; then
    # Detect platform-specific bugs in some versions of glibc:
    # memchr should not dereference anything with length 0
    #   https://bugzilla.redhat.com/show_bug.cgi?id=499689
    # memchr should not dereference overestimated length after a match
    #   https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737
    #   https://sourceware.org/bugzilla/show_bug.cgi?id=10162
    # memchr should cast the second argument to 'unsigned char'.
    #   This bug exists in Android 4.3.
    # Assume that memchr works on platforms that lack mprotect.
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether memchr works" >&5
$as_echo_n "checking whether memchr works... " >&6; }
if ${gl_cv_func_memchr_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  case "$host_os" in
                             # Guess no on Android.
            linux*-android*) gl_cv_func_memchr_works="guessing no" ;;
                             # Guess yes on native Windows.
            mingw*)          gl_cv_func_memchr_works="guessing yes" ;;
                             # If we don't know, obey --enable-cross-guesses.
            *)               gl_cv_func_memchr_works="$gl_cross_guess_normal" ;;
          esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <string.h>
#if HAVE_SYS_MMAN_H
# include <fcntl.h>
# include <unistd.h>
# include <sys/types.h>
# include <sys/mman.h>
# ifndef MAP_FILE
#  define MAP_FILE 0
# endif
#endif

int
main ()
{

  int result = 0;
  char *fence = NULL;
#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
# if HAVE_MAP_ANONYMOUS
  const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
  const int fd = -1;
# else /* !HAVE_MAP_ANONYMOUS */
  const int flags = MAP_FILE | MAP_PRIVATE;
  int fd = open ("/dev/zero", O_RDONLY, 0666);
  if (fd >= 0)
# endif
    {
      int pagesize = getpagesize ();
      char *two_pages =
        (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
                       flags, fd, 0);
      if (two_pages != (char *)(-1)
          && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
        fence = two_pages + pagesize;
    }
#endif
  if (fence)
    {
      if (memchr (fence, 0, 0))
        result |= 1;
      strcpy (fence - 9, "12345678");
      if (memchr (fence - 9, 0, 79) != fence - 1)
        result |= 2;
      if (memchr (fence - 1, 0, 3) != fence - 1)
        result |= 4;
    }
  /* Test against bug on Android 4.3.  */
  {
    char input[3];
    input[0] = 'a';
    input[1] = 'b';
    input[2] = 'c';
    if (memchr (input, 0x789abc00 | 'b', 3) != input + 1)
      result |= 8;
  }
  return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_memchr_works=yes
else
  gl_cv_func_memchr_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_memchr_works" >&5
$as_echo "$gl_cv_func_memchr_works" >&6; }
    case "$gl_cv_func_memchr_works" in
      *yes) ;;
      *) REPLACE_MEMCHR=1 ;;
    esac
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <limits.h> defines MIN and MAX" >&5
$as_echo_n "checking whether <limits.h> defines MIN and MAX... " >&6; }
if ${gl_cv_minmax_in_limits_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>
            int x = MIN (42, 17);
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_minmax_in_limits_h=yes
else
  gl_cv_minmax_in_limits_h=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_minmax_in_limits_h" >&5
$as_echo "$gl_cv_minmax_in_limits_h" >&6; }
  if test $gl_cv_minmax_in_limits_h = yes; then

$as_echo "#define HAVE_MINMAX_IN_LIMITS_H 1" >>confdefs.h

  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <sys/param.h> defines MIN and MAX" >&5
$as_echo_n "checking whether <sys/param.h> defines MIN and MAX... " >&6; }
if ${gl_cv_minmax_in_sys_param_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/param.h>
            int x = MIN (42, 17);
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_minmax_in_sys_param_h=yes
else
  gl_cv_minmax_in_sys_param_h=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_minmax_in_sys_param_h" >&5
$as_echo "$gl_cv_minmax_in_sys_param_h" >&6; }
  if test $gl_cv_minmax_in_sys_param_h = yes; then

$as_echo "#define HAVE_MINMAX_IN_SYS_PARAM_H 1" >>confdefs.h

  fi









ac_fn_c_check_decl "$LINENO" "obstack_printf" "ac_cv_have_decl_obstack_printf" "$ac_includes_default"
if test "x$ac_cv_have_decl_obstack_printf" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_OBSTACK_PRINTF $ac_have_decl
_ACEOF


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for O_CLOEXEC" >&5
$as_echo_n "checking for O_CLOEXEC... " >&6; }
if ${gl_cv_macro_O_CLOEXEC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <fcntl.h>
                          #ifndef O_CLOEXEC
                            choke me;
                          #endif

int
main ()
{
return O_CLOEXEC;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_macro_O_CLOEXEC=yes
else
  gl_cv_macro_O_CLOEXEC=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_macro_O_CLOEXEC" >&5
$as_echo "$gl_cv_macro_O_CLOEXEC" >&6; }





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for promoted mode_t type" >&5
$as_echo_n "checking for promoted mode_t type... " >&6; }
if ${gl_cv_promoted_mode_t+:} false; then :
  $as_echo_n "(cached) " >&6
else

                cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
int
main ()
{
typedef int array[2 * (sizeof (mode_t) < sizeof (int)) - 1];
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_promoted_mode_t='int'
else
  gl_cv_promoted_mode_t='mode_t'
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_promoted_mode_t" >&5
$as_echo "$gl_cv_promoted_mode_t" >&6; }

cat >>confdefs.h <<_ACEOF
#define PROMOTED_MODE_T $gl_cv_promoted_mode_t
_ACEOF



     REPLACE_STRERROR_0=0
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror(0) succeeds" >&5
$as_echo_n "checking whether strerror(0) succeeds... " >&6; }
if ${gl_cv_func_strerror_0_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  case "$host_os" in
                        # Guess yes on glibc systems.
         *-gnu* | gnu*) gl_cv_func_strerror_0_works="guessing yes" ;;
                        # Guess yes on musl systems.
         *-musl*)       gl_cv_func_strerror_0_works="guessing yes" ;;
                        # Guess yes on native Windows.
         mingw*)        gl_cv_func_strerror_0_works="guessing yes" ;;
                        # If we don't know, obey --enable-cross-guesses.
         *)             gl_cv_func_strerror_0_works="$gl_cross_guess_normal" ;;
       esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <string.h>
           #include <errno.h>

int
main ()
{
int result = 0;
           char *str;
           errno = 0;
           str = strerror (0);
           if (!*str) result |= 1;
           if (errno) result |= 2;
           if (strstr (str, "nknown") || strstr (str, "ndefined"))
             result |= 4;
           return result;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_strerror_0_works=yes
else
  gl_cv_func_strerror_0_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_0_works" >&5
$as_echo "$gl_cv_func_strerror_0_works" >&6; }
  case "$gl_cv_func_strerror_0_works" in
    *yes) ;;
    *)
      REPLACE_STRERROR_0=1

$as_echo "#define REPLACE_STRERROR_0 1" >>confdefs.h

      ;;
  esac










  if test $ac_cv_func_strerror_r = yes; then
    if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
                        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strerror_r with POSIX signature" >&5
$as_echo_n "checking for strerror_r with POSIX signature... " >&6; }
if ${gl_cv_func_strerror_r_posix_signature+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <string.h>
                int strerror_r (int, char *, size_t);

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_func_strerror_r_posix_signature=yes
else
  gl_cv_func_strerror_r_posix_signature=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_r_posix_signature" >&5
$as_echo "$gl_cv_func_strerror_r_posix_signature" >&6; }
      if test $gl_cv_func_strerror_r_posix_signature = yes; then
                                                        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror_r works" >&5
$as_echo_n "checking whether strerror_r works... " >&6; }
if ${gl_cv_func_strerror_r_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :

              case "$host_os" in
                       # Guess no on AIX.
                aix*)  gl_cv_func_strerror_r_works="guessing no";;
                       # Guess no on HP-UX.
                hpux*) gl_cv_func_strerror_r_works="guessing no";;
                       # Guess no on BSD variants.
                *bsd*)  gl_cv_func_strerror_r_works="guessing no";;
                       # Guess yes otherwise.
                *)     gl_cv_func_strerror_r_works="guessing yes";;
              esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
                  #include <string.h>

int
main ()
{
int result = 0;
                  char buf[79];
                  if (strerror_r (EACCES, buf, 0) < 0)
                    result |= 1;
                  errno = 0;
                  if (strerror_r (EACCES, buf, sizeof buf) != 0)
                    result |= 2;
                  strcpy (buf, "Unknown");
                  if (strerror_r (0, buf, sizeof buf) != 0)
                    result |= 4;
                  if (errno)
                    result |= 8;
                  if (strstr (buf, "nknown") || strstr (buf, "ndefined"))
                    result |= 0x10;
                  errno = 0;
                  *buf = 0;
                  if (strerror_r (-3, buf, sizeof buf) < 0)
                    result |= 0x20;
                  if (errno)
                    result |= 0x40;
                  if (!*buf)
                    result |= 0x80;
                  return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_strerror_r_works=yes
else
  gl_cv_func_strerror_r_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_r_works" >&5
$as_echo "$gl_cv_func_strerror_r_works" >&6; }
      else

                        if test $ac_cv_func___xpg_strerror_r = yes; then
          { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __xpg_strerror_r works" >&5
$as_echo_n "checking whether __xpg_strerror_r works... " >&6; }
if ${gl_cv_func_strerror_r_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
                                  gl_cv_func_strerror_r_works="$gl_cross_guess_normal"

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
                    #include <string.h>
                    extern
                    #ifdef __cplusplus
                    "C"
                    #endif
                    int __xpg_strerror_r(int, char *, size_t);

int
main ()
{
int result = 0;
                    char buf[256] = "^";
                    char copy[256];
                    char *str = strerror (-1);
                    strcpy (copy, str);
                    if (__xpg_strerror_r (-2, buf, 1) == 0)
                      result |= 1;
                    if (*buf)
                      result |= 2;
                    __xpg_strerror_r (-2, buf, 256);
                    if (strcmp (str, copy))
                      result |= 4;
                    return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_strerror_r_works=yes
else
  gl_cv_func_strerror_r_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_r_works" >&5
$as_echo "$gl_cv_func_strerror_r_works" >&6; }
        fi
      fi
    fi
  fi

ac_fn_c_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default"
if test "x$ac_cv_have_decl_strerror_r" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_STRERROR_R $ac_have_decl
_ACEOF








  if test $ac_cv_have_decl_strerror_r = no; then
    HAVE_DECL_STRERROR_R=0
  fi

  if test $ac_cv_func_strerror_r = yes; then
    if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
      if test $gl_cv_func_strerror_r_posix_signature = yes; then
        case "$gl_cv_func_strerror_r_works" in
                    *no) REPLACE_STRERROR_R=1 ;;
        esac
      else
                REPLACE_STRERROR_R=1
      fi
    else
                  REPLACE_STRERROR_R=1
    fi
  fi




  GNULIB_POSIX_SPAWN=0;
  GNULIB_POSIX_SPAWNP=0;
  GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT=0;
  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=0;
  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=0;
  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=0;
  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=0;
  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=0;
  GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY=0;
  GNULIB_POSIX_SPAWNATTR_INIT=0;
  GNULIB_POSIX_SPAWNATTR_GETFLAGS=0;
  GNULIB_POSIX_SPAWNATTR_SETFLAGS=0;
  GNULIB_POSIX_SPAWNATTR_GETPGROUP=0;
  GNULIB_POSIX_SPAWNATTR_SETPGROUP=0;
  GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM=0;
  GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM=0;
  GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY=0;
  GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY=0;
  GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT=0;
  GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT=0;
  GNULIB_POSIX_SPAWNATTR_GETSIGMASK=0;
  GNULIB_POSIX_SPAWNATTR_SETSIGMASK=0;
  GNULIB_POSIX_SPAWNATTR_DESTROY=0;
    HAVE_POSIX_SPAWN=1;
  HAVE_POSIX_SPAWNATTR_T=1;
  HAVE_POSIX_SPAWN_FILE_ACTIONS_T=1;

  HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=1;

  HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=1;

  REPLACE_POSIX_SPAWN=0;
  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=0;

  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=0;

  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=0;

  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=0;

  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=0;





  LIB_POSIX_SPAWN=

  gl_saved_libs=$LIBS
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing posix_spawn" >&5
$as_echo_n "checking for library containing posix_spawn... " >&6; }
if ${ac_cv_search_posix_spawn+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char posix_spawn ();
int
main ()
{
return posix_spawn ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' rt; do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_search_posix_spawn=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if ${ac_cv_search_posix_spawn+:} false; then :
  break
fi
done
if ${ac_cv_search_posix_spawn+:} false; then :

else
  ac_cv_search_posix_spawn=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_posix_spawn" >&5
$as_echo "$ac_cv_search_posix_spawn" >&6; }
ac_res=$ac_cv_search_posix_spawn
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
  test "$ac_cv_search_posix_spawn" = "none required" ||
                    LIB_POSIX_SPAWN=$ac_cv_search_posix_spawn
fi

    for ac_func in posix_spawn
do :
  ac_fn_c_check_func "$LINENO" "posix_spawn" "ac_cv_func_posix_spawn"
if test "x$ac_cv_func_posix_spawn" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POSIX_SPAWN 1
_ACEOF

fi
done

  LIBS=$gl_saved_libs

  if test $ac_cv_func_posix_spawn != yes; then
    HAVE_POSIX_SPAWN=0
  fi




                                      if test $ac_cv_func_posix_spawn = yes; then


    if test $REPLACE_POSIX_SPAWN = 0; then


     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn works" >&5
$as_echo_n "checking whether posix_spawn works... " >&6; }
if ${gl_cv_func_posix_spawn_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test $cross_compiling = no; then
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <spawn.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

extern char **environ;

#ifndef STDIN_FILENO
# define STDIN_FILENO 0
#endif
#ifndef STDOUT_FILENO
# define STDOUT_FILENO 1
#endif
#ifndef STDERR_FILENO
# define STDERR_FILENO 2
#endif

#ifndef WTERMSIG
# define WTERMSIG(x) ((x) & 0x7f)
#endif
#ifndef WIFEXITED
# define WIFEXITED(x) (WTERMSIG (x) == 0)
#endif
#ifndef WEXITSTATUS
# define WEXITSTATUS(x) (((x) >> 8) & 0xff)
#endif

#define CHILD_PROGRAM_FILENAME "/non/exist/ent"

static int
fd_safer (int fd)
{
  if (0 <= fd && fd <= 2)
    {
      int f = fd_safer (dup (fd));
      int e = errno;
      close (fd);
      errno = e;
      fd = f;
    }

  return fd;
}

int
main ()
{
  char *argv[2] = { CHILD_PROGRAM_FILENAME, NULL };
  int ofd[2];
  sigset_t blocked_signals;
  sigset_t fatal_signal_set;
  posix_spawn_file_actions_t actions;
  bool actions_allocated;
  posix_spawnattr_t attrs;
  bool attrs_allocated;
  int err;
  pid_t child;
  int status;
  int exitstatus;

  setvbuf (stdout, NULL, _IOFBF, 0);
  puts ("This should be seen only once.");
  if (pipe (ofd) < 0 || (ofd[1] = fd_safer (ofd[1])) < 0)
    {
      perror ("cannot create pipe");
      exit (1);
    }
  sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
  sigemptyset (&fatal_signal_set);
  sigaddset (&fatal_signal_set, SIGINT);
  sigaddset (&fatal_signal_set, SIGTERM);
  sigaddset (&fatal_signal_set, SIGHUP);
  sigaddset (&fatal_signal_set, SIGPIPE);
  sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL);
  actions_allocated = false;
  attrs_allocated = false;
  if ((err = posix_spawn_file_actions_init (&actions)) != 0
      || (actions_allocated = true,
          (err = posix_spawn_file_actions_adddup2 (&actions, ofd[0], STDIN_FILENO)) != 0
          || (err = posix_spawn_file_actions_addclose (&actions, ofd[0])) != 0
          || (err = posix_spawn_file_actions_addclose (&actions, ofd[1])) != 0
          || (err = posix_spawnattr_init (&attrs)) != 0
          || (attrs_allocated = true,
              (err = posix_spawnattr_setsigmask (&attrs, &blocked_signals)) != 0
              || (err = posix_spawnattr_setflags (&attrs, POSIX_SPAWN_SETSIGMASK)) != 0)
          || (err = posix_spawnp (&child, CHILD_PROGRAM_FILENAME, &actions, &attrs, argv, environ)) != 0))
    {
      if (actions_allocated)
        posix_spawn_file_actions_destroy (&actions);
      if (attrs_allocated)
        posix_spawnattr_destroy (&attrs);
      sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
      if (err == ENOENT)
        return 0;
      else
        {
          errno = err;
          perror ("subprocess failed");
          exit (1);
        }
    }
  posix_spawn_file_actions_destroy (&actions);
  posix_spawnattr_destroy (&attrs);
  sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
  close (ofd[0]);
  close (ofd[1]);
  status = 0;
  while (waitpid (child, &status, 0) != child)
    ;
  if (!WIFEXITED (status))
    {
      fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
      exit (1);
    }
  exitstatus = WEXITSTATUS (status);
  if (exitstatus != 127)
    {
      fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
      exit (1);
    }
  return 0;
}

_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  if test -s conftest$ac_exeext \
             && ./conftest$ac_exeext > conftest.out \
             && echo 'This should be seen only once.' > conftest.ok \
             && cmp conftest.out conftest.ok >/dev/null 2>&1; then
            gl_cv_func_posix_spawn_works=yes
          else
            gl_cv_func_posix_spawn_works=no
          fi
else
  gl_cv_func_posix_spawn_works=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
       if test $gl_cv_func_posix_spawn_works = yes; then
         if test "$cross_compiling" = yes; then :
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run test program while cross compiling
See \`config.log' for more details" "$LINENO" 5; }
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Test whether posix_spawn_file_actions_addopen supports filename arguments
   that contain special characters such as '*'.  */

#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <spawn.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

extern char **environ;

#ifndef STDIN_FILENO
# define STDIN_FILENO 0
#endif
#ifndef STDOUT_FILENO
# define STDOUT_FILENO 1
#endif
#ifndef STDERR_FILENO
# define STDERR_FILENO 2
#endif

#ifndef WTERMSIG
# define WTERMSIG(x) ((x) & 0x7f)
#endif
#ifndef WIFEXITED
# define WIFEXITED(x) (WTERMSIG (x) == 0)
#endif
#ifndef WEXITSTATUS
# define WEXITSTATUS(x) (((x) >> 8) & 0xff)
#endif

#define CHILD_PROGRAM_FILENAME "conftest"
#define DATA_FILENAME "conftest%=*#?"

static int
parent_main (void)
{
  FILE *fp;
  char *argv[3] = { CHILD_PROGRAM_FILENAME, "-child", NULL };
  posix_spawn_file_actions_t actions;
  bool actions_allocated;
  int err;
  pid_t child;
  int status;
  int exitstatus;

  /* Create a data file with specific contents.  */
  fp = fopen (DATA_FILENAME, "wb");
  if (fp == NULL)
    {
      perror ("cannot create data file");
      return 1;
    }
  fwrite ("Halle Potta", 1, 11, fp);
  if (fflush (fp) || fclose (fp))
    {
      perror ("cannot prepare data file");
      return 2;
    }

  /* Avoid reading from our stdin, as it could block.  */
  freopen ("/dev/null", "rb", stdin);

  /* Test whether posix_spawn_file_actions_addopen with this file name
     actually works, but spawning a child that reads from this file.  */
  actions_allocated = false;
  if ((err = posix_spawn_file_actions_init (&actions)) != 0
      || (actions_allocated = true,
          (err = posix_spawn_file_actions_addopen (&actions, STDIN_FILENO, DATA_FILENAME, O_RDONLY, 0600)) != 0
          || (err = posix_spawn (&child, CHILD_PROGRAM_FILENAME, &actions, NULL, argv, environ)) != 0))
    {
      if (actions_allocated)
        posix_spawn_file_actions_destroy (&actions);
      errno = err;
      perror ("subprocess failed");
      return 3;
    }
  posix_spawn_file_actions_destroy (&actions);
  status = 0;
  while (waitpid (child, &status, 0) != child)
    ;
  if (!WIFEXITED (status))
    {
      fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
      return 4;
    }
  exitstatus = WEXITSTATUS (status);
  if (exitstatus != 0)
    {
      fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
      return 5;
    }
  return 0;
}

static int
child_main (void)
{
  char buf[1024];

  /* See if reading from STDIN_FILENO yields the expected contents.  */
  if (fread (buf, 1, sizeof (buf), stdin) == 11
      && memcmp (buf, "Halle Potta", 11) == 0)
    return 0;
  else
    return 8;
}

static void
cleanup_then_die (int sig)
{
  /* Clean up data file.  */
  unlink (DATA_FILENAME);

  /* Re-raise the signal and die from it.  */
  signal (sig, SIG_DFL);
  raise (sig);
}

int
main (int argc, char *argv[])
{
  int exitstatus;

  if (!(argc > 1 && strcmp (argv[1], "-child") == 0))
    {
      /* This is the parent process.  */
      signal (SIGINT, cleanup_then_die);
      signal (SIGTERM, cleanup_then_die);
      #ifdef SIGHUP
      signal (SIGHUP, cleanup_then_die);
      #endif

      exitstatus = parent_main ();
    }
  else
    {
      /* This is the child process.  */

      exitstatus = child_main ();
    }
  unlink (DATA_FILENAME);
  return exitstatus;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :

else
  gl_cv_func_posix_spawn_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

       fi
     else
       case "$host_os" in
         aix*) gl_cv_func_posix_spawn_works="guessing no";;
         *)    gl_cv_func_posix_spawn_works="guessing yes";;
       esac
     fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_works" >&5
$as_echo "$gl_cv_func_posix_spawn_works" >&6; }

      case "$gl_cv_func_posix_spawn_works" in
        *yes)
                                                  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether posix_spawnattr_setschedpolicy is supported" >&5
$as_echo_n "checking whether posix_spawnattr_setschedpolicy is supported... " >&6; }
if ${gl_cv_func_spawnattr_setschedpolicy+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <spawn.h>
#if POSIX_SPAWN_SETSCHEDULER
 POSIX scheduling supported
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "POSIX scheduling supported" >/dev/null 2>&1; then :
  gl_cv_func_spawnattr_setschedpolicy=yes
else
  gl_cv_func_spawnattr_setschedpolicy=no
fi
rm -f conftest*


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_spawnattr_setschedpolicy" >&5
$as_echo "$gl_cv_func_spawnattr_setschedpolicy" >&6; }
                                                  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether posix_spawnattr_setschedparam is supported" >&5
$as_echo_n "checking whether posix_spawnattr_setschedparam is supported... " >&6; }
if ${gl_cv_func_spawnattr_setschedparam+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <spawn.h>
#if POSIX_SPAWN_SETSCHEDPARAM
 POSIX scheduling supported
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "POSIX scheduling supported" >/dev/null 2>&1; then :
  gl_cv_func_spawnattr_setschedparam=yes
else
  gl_cv_func_spawnattr_setschedparam=no
fi
rm -f conftest*


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_spawnattr_setschedparam" >&5
$as_echo "$gl_cv_func_spawnattr_setschedparam" >&6; }
          ;;
        *) REPLACE_POSIX_SPAWN=1 ;;
      esac
    fi
  fi
  if test $ac_cv_func_posix_spawn != yes || test $REPLACE_POSIX_SPAWN = 1; then

$as_echo "#define REPLACE_POSIX_SPAWN 1" >>confdefs.h

  fi
















  gl_cv_func_vfprintf_posix=no
  case "$gl_cv_func_printf_sizes_c99" in
    *yes)
      case "$gl_cv_func_printf_long_double" in
        *yes)
          case "$gl_cv_func_printf_infinite" in
            *yes)
              case "$gl_cv_func_printf_infinite_long_double" in
                *yes)
                  case "$gl_cv_func_printf_directive_a" in
                    *yes)
                      case "$gl_cv_func_printf_directive_f" in
                        *yes)
                          case "$gl_cv_func_printf_directive_n" in
                            *yes)
                              case "$gl_cv_func_printf_directive_ls" in
                                *yes)
                                  case "$gl_cv_func_printf_positions" in
                                    *yes)
                                      case "$gl_cv_func_printf_flag_grouping" in
                                        *yes)
                                          case "$gl_cv_func_printf_flag_leftadjust" in
                                            *yes)
                                              case "$gl_cv_func_printf_flag_zero" in
                                                *yes)
                                                  case "$gl_cv_func_printf_precision" in
                                                    *yes)
                                                      case "$gl_cv_func_printf_enomem" in
                                                        *yes)
                                                          # vfprintf exists and is
                                                          # already POSIX compliant.
                                                          gl_cv_func_vfprintf_posix=yes
                                                          ;;
                                                      esac
                                                      ;;
                                                  esac
                                                  ;;
                                              esac
                                              ;;
                                          esac
                                          ;;
                                      esac
                                      ;;
                                  esac
                                  ;;
                              esac
                              ;;
                          esac
                          ;;
                      esac
                      ;;
                  esac
                  ;;
              esac
              ;;
          esac
          ;;
      esac
      ;;
  esac
  if test $gl_cv_func_vfprintf_posix = no; then



  case "$gl_cv_func_printf_infinite" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h

      ;;
  esac




  case "$gl_cv_func_printf_long_double" in
    *yes)
      case "$gl_cv_func_printf_infinite_long_double" in
        *yes)
          ;;
        *)

$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h

          ;;
      esac
      ;;
  esac



  case "$gl_cv_func_printf_directive_a" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h

      for ac_func in nl_langinfo
do :
  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
if test "x$ac_cv_func_nl_langinfo" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_NL_LANGINFO 1
_ACEOF

fi
done

      ;;
  esac



  case "$gl_cv_func_printf_directive_f" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_directive_ls" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_grouping" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_leftadjust" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_zero" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_precision" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_enomem" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac











  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"

  if test $ac_cv_func_vasnprintf = yes; then

$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h

  fi











  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
if test "x$ac_cv_type_ptrdiff_t" = xyes; then :

else

$as_echo "#define ptrdiff_t long" >>confdefs.h


fi

















  gl_LIBOBJS="$gl_LIBOBJS vfprintf.$ac_objext"

  REPLACE_VFPRINTF=1

$as_echo "#define REPLACE_VFPRINTF_POSIX 1" >>confdefs.h

  :

  fi


  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef _MSC_VER
MicrosoftCompiler
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "MicrosoftCompiler" >/dev/null 2>&1; then :
  gl_asmext='asm'
     gl_c_asm_opt='-c -Fa'

else
  gl_asmext='s'
     gl_c_asm_opt='-S'

fi
rm -f conftest*





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C symbols are prefixed with underscore at the linker level" >&5
$as_echo_n "checking whether C symbols are prefixed with underscore at the linker level... " >&6; }
if ${gl_cv_prog_as_underscore+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat > conftest.c <<EOF
#ifdef __cplusplus
extern "C" int foo (void);
#endif
int foo(void) { return 0; }
EOF
     # Look for the assembly language name in the .s file.
     { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c'
  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; } >/dev/null 2>&1
     if LC_ALL=C $EGREP '(^|[^a-zA-Z0-9_])_foo([^a-zA-Z0-9_]|$)' conftest.$gl_asmext >/dev/null; then
       gl_cv_prog_as_underscore=yes
     else
       gl_cv_prog_as_underscore=no
     fi
     rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_prog_as_underscore" >&5
$as_echo "$gl_cv_prog_as_underscore" >&6; }
  if test $gl_cv_prog_as_underscore = yes; then
    USER_LABEL_PREFIX=_
  else
    USER_LABEL_PREFIX=
  fi

cat >>confdefs.h <<_ACEOF
#define USER_LABEL_PREFIX $USER_LABEL_PREFIX
_ACEOF

  ASM_SYMBOL_PREFIX='"'${USER_LABEL_PREFIX}'"'



  GNULIB_PTHREAD_SIGMASK=0;
  GNULIB_RAISE=0;
  GNULIB_SIGNAL_H_SIGPIPE=0;
  GNULIB_SIGPROCMASK=0;
  GNULIB_SIGACTION=0;
    HAVE_POSIX_SIGNALBLOCKING=1;
  HAVE_PTHREAD_SIGMASK=1;
  HAVE_RAISE=1;
  HAVE_SIGSET_T=1;
  HAVE_SIGINFO_T=1;
  HAVE_SIGACTION=1;
  HAVE_STRUCT_SIGACTION_SA_SIGACTION=1;

  HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=1;

  HAVE_SIGHANDLER_T=1;
  REPLACE_PTHREAD_SIGMASK=0;
  REPLACE_RAISE=0;


  ac_fn_c_check_type "$LINENO" "sigset_t" "ac_cv_type_sigset_t" "
      #include <signal.h>
      /* Mingw defines sigset_t not in <signal.h>, but in <sys/types.h>.  */
      #include <sys/types.h>

"
if test "x$ac_cv_type_sigset_t" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_SIGSET_T 1
_ACEOF

gl_cv_type_sigset_t=yes
else
  gl_cv_type_sigset_t=no
fi

  if test $gl_cv_type_sigset_t != yes; then
    HAVE_SIGSET_T=0
  fi


                              { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library path variable" >&5
$as_echo_n "checking for shared library path variable... " >&6; }
if ${acl_cv_libpath+:} false; then :
  $as_echo_n "(cached) " >&6
else

    LD="$LD" \
    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.libpath" "$host" > conftest.sh
    . ./conftest.sh
    rm -f ./conftest.sh
    acl_cv_libpath=${acl_cv_shlibpath_var:-none}

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_libpath" >&5
$as_echo "$acl_cv_libpath" >&6; }
  shlibpath_var="$acl_cv_shlibpath_var"


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to activate relocatable installation" >&5
$as_echo_n "checking whether to activate relocatable installation... " >&6; }
  # Check whether --enable-relocatable was given.
if test "${enable_relocatable+set}" = set; then :
  enableval=$enable_relocatable; if test "$enableval" != no; then
       RELOCATABLE=yes
     else
       RELOCATABLE=no
     fi

else
  RELOCATABLE=no
fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RELOCATABLE" >&5
$as_echo "$RELOCATABLE" >&6; }



    if test "X$prefix" = "XNONE"; then
    reloc_final_prefix="$ac_default_prefix"
  else
    reloc_final_prefix="$prefix"
  fi

cat >>confdefs.h <<_ACEOF
#define INSTALLPREFIX "${reloc_final_prefix}"
_ACEOF

  if test $RELOCATABLE = yes; then

$as_echo "#define ENABLE_RELOCATABLE 1" >>confdefs.h

  fi








  is_noop=no
  use_elf_origin_trick=no
  use_macos_tools=no
  use_wrapper=no
  if test $RELOCATABLE = yes; then
    # --enable-relocatable implies --disable-rpath
    enable_rpath=no
    for ac_header in mach-o/dyld.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "mach-o/dyld.h" "ac_cv_header_mach_o_dyld_h" "$ac_includes_default"
if test "x$ac_cv_header_mach_o_dyld_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MACH_O_DYLD_H 1
_ACEOF

fi

done

    for ac_func in _NSGetExecutablePath
do :
  ac_fn_c_check_func "$LINENO" "_NSGetExecutablePath" "ac_cv_func__NSGetExecutablePath"
if test "x$ac_cv_func__NSGetExecutablePath" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__NSGETEXECUTABLEPATH 1
_ACEOF

fi
done

    case "$host_os" in
      mingw*) is_noop=yes ;;
      # For the platforms that support $ORIGIN, see
      # <https://lekensteyn.nl/rpath.html>.
      # glibc systems, Linux with musl libc: yes. Android: no.
      linux*-android*) ;;
      linux* | kfreebsd*) use_elf_origin_trick=yes ;;
      # Hurd: <https://lists.gnu.org/r/bug-hurd/2019-02/msg00049.html>
      # only after the glibc commit from 2018-01-08
      # <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=311ba8dc4416467947eff2ab327854f124226309>
      gnu*)
        # Test for a glibc version >= 2.27.
        for ac_func in copy_file_range
do :
  ac_fn_c_check_func "$LINENO" "copy_file_range" "ac_cv_func_copy_file_range"
if test "x$ac_cv_func_copy_file_range" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_COPY_FILE_RANGE 1
_ACEOF

fi
done

        if test $ac_cv_func_copy_file_range = yes; then
          use_elf_origin_trick=yes
        fi
        ;;
      # FreeBSD >= 7.3, DragonFly >= 3.0: yes.
      freebsd | freebsd[1-7] | freebsd[1-6].* | freebsd7.[0-2]) ;;
      dragonfly | dragonfly[1-2] | dragonfly[1-2].*) ;;
      freebsd* | dragonfly*) use_elf_origin_trick=yes ;;
      # NetBSD >= 8.0: yes.
      netbsd | netbsd[1-7] | netbsd[1-7].*) ;;
      netbsdelf | netbsdelf[1-7] | netbsdelf[1-7].*) ;;
      netbsd*) use_elf_origin_trick=yes ;;
      # OpenBSD >= 5.4: yes.
      openbsd | openbsd[1-5] | openbsd[1-4].* | openbsd5.[0-3]) ;;
      openbsd*) use_elf_origin_trick=yes ;;
      # Solaris >= 10: yes.
      solaris | solaris2.[1-9] | solaris2.[1-9].*) ;;
      solaris*) use_elf_origin_trick=yes ;;
      # Haiku: yes.
      haiku*) use_elf_origin_trick=yes ;;
      # On Mac OS X 10.4 or newer, use Mac OS X tools. See
      # <https://wincent.com/wiki/@executable_path,_@load_path_and_@rpath>.
      darwin | darwin[1-7].*) ;;
      darwin*) use_macos_tools=yes ;;
    esac
    if test $is_noop = yes; then
      RELOCATABLE_LDFLAGS=:

    else
      if test $use_elf_origin_trick = yes || test $use_macos_tools = yes; then
                case "$ac_aux_dir" in
          /*) reloc_ldflags="$ac_aux_dir/reloc-ldflags" ;;
          *) reloc_ldflags="\$(top_builddir)/$ac_aux_dir/reloc-ldflags" ;;
        esac
        RELOCATABLE_LDFLAGS="\"$reloc_ldflags\" \"\$(host)\" \"\$(RELOCATABLE_LIBRARY_PATH)\""

        if test $use_macos_tools = yes; then
                    case "$ac_aux_dir" in
            /*) LIBTOOL="${CONFIG_SHELL-$SHELL} $ac_aux_dir/libtool-reloc $LIBTOOL" ;;
            *) LIBTOOL="${CONFIG_SHELL-$SHELL} \$(top_builddir)/$ac_aux_dir/libtool-reloc $LIBTOOL" ;;
          esac
        fi
      else
        use_wrapper=yes
                                        INSTALL_PROGRAM_ENV="RELOC_LIBRARY_PATH_VAR=\"$shlibpath_var\" RELOC_LIBRARY_PATH_VALUE=\"\$(RELOCATABLE_LIBRARY_PATH)\" RELOC_PREFIX=\"\$(prefix)\" RELOC_DESTDIR=\"\$(DESTDIR)\" RELOC_COMPILE_COMMAND=\"\$(CC) \$(CPPFLAGS) \$(CFLAGS) \$(LDFLAGS)\" RELOC_SRCDIR=\"\$(RELOCATABLE_SRC_DIR)\" RELOC_BUILDDIR=\"\$(RELOCATABLE_BUILD_DIR)\" RELOC_CONFIG_H_DIR=\"\$(RELOCATABLE_CONFIG_H_DIR)\" RELOC_EXEEXT=\"\$(EXEEXT)\" RELOC_STRIP_PROG=\"\$(RELOCATABLE_STRIP)\" RELOC_INSTALL_PROG=\"$INSTALL_PROGRAM\""

        case "$ac_aux_dir" in
          /*) INSTALL_PROGRAM="$ac_aux_dir/install-reloc" ;;
          *) INSTALL_PROGRAM="\$(top_builddir)/$ac_aux_dir/install-reloc" ;;
        esac
      fi
    fi
  fi
   if test $is_noop = yes || test $use_elf_origin_trick = yes || test $use_macos_tools = yes; then
  RELOCATABLE_VIA_LD_TRUE=
  RELOCATABLE_VIA_LD_FALSE='#'
else
  RELOCATABLE_VIA_LD_TRUE='#'
  RELOCATABLE_VIA_LD_FALSE=
fi

   if test $use_wrapper = yes; then
  RELOCATABLE_VIA_WRAPPER_TRUE=
  RELOCATABLE_VIA_WRAPPER_FALSE='#'
else
  RELOCATABLE_VIA_WRAPPER_TRUE='#'
  RELOCATABLE_VIA_WRAPPER_FALSE=
fi








      RELOCATABLE_STRIP=':'




      for ac_header in stdlib.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
if test "x$ac_cv_header_stdlib_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STDLIB_H 1
_ACEOF

fi

done

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5
$as_echo_n "checking for GNU libc compatible malloc... " >&6; }
if ${ac_cv_func_malloc_0_nonnull+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  case "$host_os" in
          # Guess yes on platforms where we know the result.
          *-gnu* | gnu* | *-musl* | freebsd* | netbsd* | openbsd* \
          | hpux* | solaris* | cygwin* | mingw*)
            ac_cv_func_malloc_0_nonnull="guessing yes" ;;
          # If we don't know, obey --enable-cross-guesses.
          *) ac_cv_func_malloc_0_nonnull="$gl_cross_guess_normal" ;;
        esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if defined STDC_HEADERS || defined HAVE_STDLIB_H
            # include <stdlib.h>
            #else
            char *malloc ();
            #endif

int
main ()
{
char *p = malloc (0);
            int result = !p;
            free (p);
            return result;
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_func_malloc_0_nonnull=yes
else
  ac_cv_func_malloc_0_nonnull=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5
$as_echo "$ac_cv_func_malloc_0_nonnull" >&6; }
  case "$ac_cv_func_malloc_0_nonnull" in
    *yes)
      gl_cv_func_malloc_0_nonnull=1
      ;;
    *)
      gl_cv_func_malloc_0_nonnull=0
      ;;
  esac


cat >>confdefs.h <<_ACEOF
#define MALLOC_0_IS_NONNULL $gl_cv_func_malloc_0_nonnull
_ACEOF


ac_fn_c_check_decl "$LINENO" "setenv" "ac_cv_have_decl_setenv" "$ac_includes_default"
if test "x$ac_cv_have_decl_setenv" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_SETENV $ac_have_decl
_ACEOF






  GNULIB_SCHED_YIELD=0;
    HAVE_SCHED_YIELD=1;
  REPLACE_SCHED_YIELD=0;



{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5
$as_echo_n "checking for uid_t in sys/types.h... " >&6; }
if ${ac_cv_type_uid_t+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "uid_t" >/dev/null 2>&1; then :
  ac_cv_type_uid_t=yes
else
  ac_cv_type_uid_t=no
fi
rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5
$as_echo "$ac_cv_type_uid_t" >&6; }
if test $ac_cv_type_uid_t = no; then

$as_echo "#define uid_t int" >>confdefs.h


$as_echo "#define gid_t int" >>confdefs.h

fi





ac_fn_c_check_decl "$LINENO" "snprintf" "ac_cv_have_decl_snprintf" "$ac_includes_default"
if test "x$ac_cv_have_decl_snprintf" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_SNPRINTF $ac_have_decl
_ACEOF



{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5
$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; }
if ${ac_cv_header_stdbool_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

             #include <stdbool.h>

             #ifdef __cplusplus
              typedef bool Bool;
             #else
              typedef _Bool Bool;
              #ifndef bool
               "error: bool is not defined"
              #endif
              #ifndef false
               "error: false is not defined"
              #endif
              #if false
               "error: false is not 0"
              #endif
              #ifndef true
               "error: true is not defined"
              #endif
              #if true != 1
               "error: true is not 1"
              #endif
             #endif

             #ifndef __bool_true_false_are_defined
              "error: __bool_true_false_are_defined is not defined"
             #endif

             struct s { Bool s: 1; Bool t; bool u: 1; bool v; } s;

             char a[true == 1 ? 1 : -1];
             char b[false == 0 ? 1 : -1];
             char c[__bool_true_false_are_defined == 1 ? 1 : -1];
             char d[(bool) 0.5 == true ? 1 : -1];
             /* See body of main program for 'e'.  */
             char f[(Bool) 0.0 == false ? 1 : -1];
             char g[true];
             char h[sizeof (Bool)];
             char i[sizeof s.t];
             enum { j = false, k = true, l = false * true, m = true * 256 };
             /* The following fails for
                HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
             Bool n[m];
             char o[sizeof n == m * sizeof n[0] ? 1 : -1];
             char p[-1 - (Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
             /* Catch a bug in an HP-UX C compiler.  See
                https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
                https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html
              */
             Bool q = true;
             Bool *pq = &q;
             bool *qq = &q;

int
main ()
{

             bool e = &s;
             *pq |= q; *pq |= ! q;
             *qq |= q; *qq |= ! q;
             /* Refer to every declared value, to avoid compiler optimizations.  */
             return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
                     + !m + !n + !o + !p + !q + !pq + !qq);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_header_stdbool_h=yes
else
  ac_cv_header_stdbool_h=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5
$as_echo "$ac_cv_header_stdbool_h" >&6; }
   ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
if test "x$ac_cv_type__Bool" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE__BOOL 1
_ACEOF


fi



    REPLACE_NULL=0;
  HAVE_MAX_ALIGN_T=1;
  HAVE_WCHAR_T=1;



ac_fn_c_check_decl "$LINENO" "strdup" "ac_cv_have_decl_strdup" "$ac_includes_default"
if test "x$ac_cv_have_decl_strdup" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_STRDUP $ac_have_decl
_ACEOF












     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_string_h='<'string.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <string.h>" >&5
$as_echo_n "checking absolute name of <string.h>... " >&6; }
if ${gl_cv_next_string_h+:} false; then :
  $as_echo_n "(cached) " >&6
else



  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <string.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'string.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_string_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_string_h
           gl_cv_next_string_h='"'$gl_header'"'


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_string_h" >&5
$as_echo "$gl_cv_next_string_h" >&6; }
     fi
     NEXT_STRING_H=$gl_cv_next_string_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'string.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_string_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_STRING_H=$gl_next_as_first_directive









ac_fn_c_check_decl "$LINENO" "strndup" "ac_cv_have_decl_strndup" "$ac_includes_default"
if test "x$ac_cv_have_decl_strndup" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_STRNDUP $ac_have_decl
_ACEOF






  GNULIB_TIMES=0;
  HAVE_STRUCT_TMS=1;
  HAVE_TIMES=1;













$as_echo "#define _USE_STD_STAT 1" >>confdefs.h











     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_sys_types_h='<'sys/types.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/types.h>" >&5
$as_echo_n "checking absolute name of <sys/types.h>... " >&6; }
if ${gl_cv_next_sys_types_h+:} false; then :
  $as_echo_n "(cached) " >&6
else



  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'sys/types.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_sys_types_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_sys_types_h
           gl_cv_next_sys_types_h='"'$gl_header'"'


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_types_h" >&5
$as_echo "$gl_cv_next_sys_types_h" >&6; }
     fi
     NEXT_SYS_TYPES_H=$gl_cv_next_sys_types_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'sys/types.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_sys_types_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H=$gl_next_as_first_directive












    WINDOWS_STAT_INODES=0




  GNULIB_WAITPID=0;





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <time.h>" >&5
$as_echo_n "checking for struct timespec in <time.h>... " >&6; }
if ${gl_cv_sys_struct_timespec_in_time_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <time.h>

int
main ()
{
static struct timespec x; x.tv_sec = x.tv_nsec;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_sys_struct_timespec_in_time_h=yes
else
  gl_cv_sys_struct_timespec_in_time_h=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_time_h" >&5
$as_echo "$gl_cv_sys_struct_timespec_in_time_h" >&6; }

  TIME_H_DEFINES_STRUCT_TIMESPEC=0
  SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=0
  PTHREAD_H_DEFINES_STRUCT_TIMESPEC=0
  UNISTD_H_DEFINES_STRUCT_TIMESPEC=0
  if test $gl_cv_sys_struct_timespec_in_time_h = yes; then
    TIME_H_DEFINES_STRUCT_TIMESPEC=1
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <sys/time.h>" >&5
$as_echo_n "checking for struct timespec in <sys/time.h>... " >&6; }
if ${gl_cv_sys_struct_timespec_in_sys_time_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/time.h>

int
main ()
{
static struct timespec x; x.tv_sec = x.tv_nsec;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_sys_struct_timespec_in_sys_time_h=yes
else
  gl_cv_sys_struct_timespec_in_sys_time_h=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_sys_time_h" >&5
$as_echo "$gl_cv_sys_struct_timespec_in_sys_time_h" >&6; }
    if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then
      SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1
    else
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <pthread.h>" >&5
$as_echo_n "checking for struct timespec in <pthread.h>... " >&6; }
if ${gl_cv_sys_struct_timespec_in_pthread_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <pthread.h>

int
main ()
{
static struct timespec x; x.tv_sec = x.tv_nsec;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_sys_struct_timespec_in_pthread_h=yes
else
  gl_cv_sys_struct_timespec_in_pthread_h=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_pthread_h" >&5
$as_echo "$gl_cv_sys_struct_timespec_in_pthread_h" >&6; }
      if test $gl_cv_sys_struct_timespec_in_pthread_h = yes; then
        PTHREAD_H_DEFINES_STRUCT_TIMESPEC=1
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <unistd.h>" >&5
$as_echo_n "checking for struct timespec in <unistd.h>... " >&6; }
if ${gl_cv_sys_struct_timespec_in_unistd_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>

int
main ()
{
static struct timespec x; x.tv_sec = x.tv_nsec;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_sys_struct_timespec_in_unistd_h=yes
else
  gl_cv_sys_struct_timespec_in_unistd_h=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_unistd_h" >&5
$as_echo "$gl_cv_sys_struct_timespec_in_unistd_h" >&6; }
        if test $gl_cv_sys_struct_timespec_in_unistd_h = yes; then
          UNISTD_H_DEFINES_STRUCT_TIMESPEC=1
        fi
      fi
    fi
  fi
















     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_time_h='<'time.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <time.h>" >&5
$as_echo_n "checking absolute name of <time.h>... " >&6; }
if ${gl_cv_next_time_h+:} false; then :
  $as_echo_n "(cached) " >&6
else



  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <time.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'time.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_time_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_time_h
           gl_cv_next_time_h='"'$gl_header'"'


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_time_h" >&5
$as_echo "$gl_cv_next_time_h" >&6; }
     fi
     NEXT_TIME_H=$gl_cv_next_time_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'time.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_time_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_TIME_H=$gl_next_as_first_directive














gl_libunistring_sed_extract_major='/^[0-9]/{s/^\([0-9]*\).*/\1/p;q;}
i\
0
q
'
gl_libunistring_sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{s/^[0-9]*[.]\([0-9]*\).*/\1/p;q;}
i\
0
q
'
gl_libunistring_sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p;q;}
i\
0
q
'


  if test "$HAVE_LIBUNISTRING" = yes; then
    LIBUNISTRING_VERSION_MAJOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_major"`
    LIBUNISTRING_VERSION_MINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_minor"`
    LIBUNISTRING_VERSION_SUBMINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_subminor"`
  fi

ac_fn_c_check_decl "$LINENO" "clearerr_unlocked" "ac_cv_have_decl_clearerr_unlocked" "$ac_includes_default"
if test "x$ac_cv_have_decl_clearerr_unlocked" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_CLEARERR_UNLOCKED $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "feof_unlocked" "ac_cv_have_decl_feof_unlocked" "$ac_includes_default"
if test "x$ac_cv_have_decl_feof_unlocked" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_FEOF_UNLOCKED $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "ferror_unlocked" "ac_cv_have_decl_ferror_unlocked" "$ac_includes_default"
if test "x$ac_cv_have_decl_ferror_unlocked" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_FERROR_UNLOCKED $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "fflush_unlocked" "ac_cv_have_decl_fflush_unlocked" "$ac_includes_default"
if test "x$ac_cv_have_decl_fflush_unlocked" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_FFLUSH_UNLOCKED $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "fgets_unlocked" "ac_cv_have_decl_fgets_unlocked" "$ac_includes_default"
if test "x$ac_cv_have_decl_fgets_unlocked" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_FGETS_UNLOCKED $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "fputc_unlocked" "ac_cv_have_decl_fputc_unlocked" "$ac_includes_default"
if test "x$ac_cv_have_decl_fputc_unlocked" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_FPUTC_UNLOCKED $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "fputs_unlocked" "ac_cv_have_decl_fputs_unlocked" "$ac_includes_default"
if test "x$ac_cv_have_decl_fputs_unlocked" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_FPUTS_UNLOCKED $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "fread_unlocked" "ac_cv_have_decl_fread_unlocked" "$ac_includes_default"
if test "x$ac_cv_have_decl_fread_unlocked" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_FREAD_UNLOCKED $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "fwrite_unlocked" "ac_cv_have_decl_fwrite_unlocked" "$ac_includes_default"
if test "x$ac_cv_have_decl_fwrite_unlocked" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_FWRITE_UNLOCKED $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default"
if test "x$ac_cv_have_decl_getc_unlocked" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "getchar_unlocked" "ac_cv_have_decl_getchar_unlocked" "$ac_includes_default"
if test "x$ac_cv_have_decl_getchar_unlocked" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_GETCHAR_UNLOCKED $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "putc_unlocked" "ac_cv_have_decl_putc_unlocked" "$ac_includes_default"
if test "x$ac_cv_have_decl_putc_unlocked" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_PUTC_UNLOCKED $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "putchar_unlocked" "ac_cv_have_decl_putchar_unlocked" "$ac_includes_default"
if test "x$ac_cv_have_decl_putchar_unlocked" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_PUTCHAR_UNLOCKED $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "unsetenv" "ac_cv_have_decl_unsetenv" "$ac_includes_default"
if test "x$ac_cv_have_decl_unsetenv" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_UNSETENV $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "vsnprintf" "ac_cv_have_decl_vsnprintf" "$ac_includes_default"
if test "x$ac_cv_have_decl_vsnprintf" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_VSNPRINTF $ac_have_decl
_ACEOF


            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <wchar.h> uses 'inline' correctly" >&5
$as_echo_n "checking whether <wchar.h> uses 'inline' correctly... " >&6; }
if ${gl_cv_header_wchar_h_correct_inline+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_cv_header_wchar_h_correct_inline=yes
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

       #define wcstod renamed_wcstod
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
extern int zero (void);
int main () { return zero(); }

_ACEOF
                              save_ac_compile="$ac_compile"
     ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
     if echo '#include "conftest.c"' >conftest1.c &&
        { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

         #define wcstod renamed_wcstod
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
int zero (void) { return 0; }

_ACEOF
              ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
       if echo '#include "conftest.c"' >conftest2.c &&
          { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
         if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&5 2>&1; then
           :
         else
           gl_cv_header_wchar_h_correct_inline=no
         fi
       fi
     fi
     ac_compile="$save_ac_compile"
     rm -f conftest12.c conftest12.$ac_objext conftest$ac_exeext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_wchar_h_correct_inline" >&5
$as_echo "$gl_cv_header_wchar_h_correct_inline" >&6; }
  if test $gl_cv_header_wchar_h_correct_inline = no; then
    as_fn_error $? "<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
C99 mode. You have four options:
  - Add the flag -fgnu89-inline to CC and reconfigure, or
  - Fix your include files, using parts of
    <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
  - Use a gcc version older than 4.3, or
  - Don't use the flags -std=c99 or -std=gnu99.
Configuration aborted." "$LINENO" 5
  fi



{ $as_echo "$as_me:${as_lineno-$LINENO}: checking POSIX termios" >&5
$as_echo_n "checking POSIX termios... " >&6; }
if ${ac_cv_sys_posix_termios+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
#include <unistd.h>
#include <termios.h>

int
main ()
{
/* SunOS 4.0.3 has termios.h but not the library calls.  */
   tcgetattr(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_sys_posix_termios=yes
else
  ac_cv_sys_posix_termios=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_posix_termios" >&5
$as_echo "$ac_cv_sys_posix_termios" >&6; }


 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether use of TIOCGWINSZ requires termios.h" >&5
$as_echo_n "checking whether use of TIOCGWINSZ requires termios.h... " >&6; }
if ${gl_cv_sys_tiocgwinsz_needs_termios_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_cv_sys_tiocgwinsz_needs_termios_h=no

   if test $ac_cv_sys_posix_termios = yes; then
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
#      include <termios.h>
#      ifdef TIOCGWINSZ
         yes
#      endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  gl_cv_sys_tiocgwinsz_needs_termios_h=yes
fi
rm -f conftest*

   fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_tiocgwinsz_needs_termios_h" >&5
$as_echo "$gl_cv_sys_tiocgwinsz_needs_termios_h" >&6; }




     GNULIB_FCHMODAT=0;
  GNULIB_FSTAT=0;
  GNULIB_FSTATAT=0;
  GNULIB_FUTIMENS=0;
  GNULIB_LCHMOD=0;
  GNULIB_LSTAT=0;
  GNULIB_MKDIRAT=0;
  GNULIB_MKFIFO=0;
  GNULIB_MKFIFOAT=0;
  GNULIB_MKNOD=0;
  GNULIB_MKNODAT=0;
  GNULIB_STAT=0;
  GNULIB_UTIMENSAT=0;
  GNULIB_OVERRIDES_STRUCT_STAT=0;
    HAVE_FCHMODAT=1;
  HAVE_FSTATAT=1;
  HAVE_FUTIMENS=1;
  HAVE_LCHMOD=1;
  HAVE_LSTAT=1;
  HAVE_MKDIRAT=1;
  HAVE_MKFIFO=1;
  HAVE_MKFIFOAT=1;
  HAVE_MKNOD=1;
  HAVE_MKNODAT=1;
  HAVE_UTIMENSAT=1;
  REPLACE_FSTAT=0;
  REPLACE_FSTATAT=0;
  REPLACE_FUTIMENS=0;
  REPLACE_LSTAT=0;
  REPLACE_MKDIR=0;
  REPLACE_MKFIFO=0;
  REPLACE_MKNOD=0;
  REPLACE_STAT=0;
  REPLACE_UTIMENSAT=0;

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5
$as_echo_n "checking whether stat file-mode macros are broken... " >&6; }
if ${ac_cv_header_stat_broken+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
#include <sys/stat.h>

#if defined S_ISBLK && defined S_IFDIR
extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1];
#endif

#if defined S_ISBLK && defined S_IFCHR
extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1];
#endif

#if defined S_ISLNK && defined S_IFREG
extern char c3[S_ISLNK (S_IFREG) ? -1 : 1];
#endif

#if defined S_ISSOCK && defined S_IFREG
extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1];
#endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_header_stat_broken=no
else
  ac_cv_header_stat_broken=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5
$as_echo "$ac_cv_header_stat_broken" >&6; }
if test $ac_cv_header_stat_broken = yes; then

$as_echo "#define STAT_MACROS_BROKEN 1" >>confdefs.h

fi

















     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_sys_stat_h='<'sys/stat.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/stat.h>" >&5
$as_echo_n "checking absolute name of <sys/stat.h>... " >&6; }
if ${gl_cv_next_sys_stat_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_sys_stat_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/stat.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'sys/stat.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_sys_stat_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_sys_stat_h
           gl_cv_next_sys_stat_h='"'$gl_header'"'
          else
               gl_cv_next_sys_stat_h='<'sys/stat.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_stat_h" >&5
$as_echo "$gl_cv_next_sys_stat_h" >&6; }
     fi
     NEXT_SYS_STAT_H=$gl_cv_next_sys_stat_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'sys/stat.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_sys_stat_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H=$gl_next_as_first_directive








    WINDOWS_STAT_TIMESPEC=0








      ac_fn_c_check_type "$LINENO" "nlink_t" "ac_cv_type_nlink_t" "#include <sys/types.h>
     #include <sys/stat.h>
"
if test "x$ac_cv_type_nlink_t" = xyes; then :

else

$as_echo "#define nlink_t int" >>confdefs.h

fi








ac_fn_c_check_decl "$LINENO" "getdtablesize" "ac_cv_have_decl_getdtablesize" "$ac_includes_default"
if test "x$ac_cv_have_decl_getdtablesize" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_GETDTABLESIZE $ac_have_decl
_ACEOF


         { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5
$as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; }
if ${gl_cv_func_lstat_dereferences_slashed_symlink+:} false; then :
  $as_echo_n "(cached) " >&6
else
  rm -f conftest.sym conftest.file
     echo >conftest.file
     if test "$cross_compiling" = yes; then :
  case "$host_os" in
          linux-* | linux)
            # Guess yes on Linux systems.
            gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;;
          *-gnu* | gnu*)
            # Guess yes on glibc systems.
            gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;;
          mingw*)
            # Guess no on native Windows.
            gl_cv_func_lstat_dereferences_slashed_symlink="guessing no" ;;
          *)
            # If we don't know, obey --enable-cross-guesses.
            gl_cv_func_lstat_dereferences_slashed_symlink="$gl_cross_guess_normal" ;;
        esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
int
main ()
{
struct stat sbuf;
            if (symlink ("conftest.file", "conftest.sym") != 0)
              return 1;
            /* Linux will dereference the symlink and fail, as required by
               POSIX.  That is better in the sense that it means we will not
               have to compile and use the lstat wrapper.  */
            return lstat ("conftest.sym/", &sbuf) == 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_lstat_dereferences_slashed_symlink=yes
else
  gl_cv_func_lstat_dereferences_slashed_symlink=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

     rm -f conftest.sym conftest.file

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_lstat_dereferences_slashed_symlink" >&5
$as_echo "$gl_cv_func_lstat_dereferences_slashed_symlink" >&6; }
  case "$gl_cv_func_lstat_dereferences_slashed_symlink" in
    *yes)

cat >>confdefs.h <<_ACEOF
#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1
_ACEOF

      ;;
  esac



ac_fn_c_check_decl "$LINENO" "strnlen" "ac_cv_have_decl_strnlen" "$ac_includes_default"
if test "x$ac_cv_have_decl_strnlen" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_STRNLEN $ac_have_decl
_ACEOF


   if false; then
  GL_COND_LIBTOOL_TRUE=
  GL_COND_LIBTOOL_FALSE='#'
else
  GL_COND_LIBTOOL_TRUE='#'
  GL_COND_LIBTOOL_FALSE=
fi

  gl_cond_libtool=false
  gl_libdeps=
  gl_ltlibdeps=
  gl_m4_base='m4'









  gl_source_base='lib'


  if test $ac_cv_func_alloca_works = no; then
    :
  fi

  # Define an additional variable used in the Makefile substitution.
  if test $ac_cv_working_alloca_h = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca as a compiler built-in" >&5
$as_echo_n "checking for alloca as a compiler built-in... " >&6; }
if ${gl_cv_rpl_alloca+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#if defined __GNUC__ || defined _AIX || defined _MSC_VER
        Need own alloca
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Need own alloca" >/dev/null 2>&1; then :
  gl_cv_rpl_alloca=yes
else
  gl_cv_rpl_alloca=no
fi
rm -f conftest*


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_rpl_alloca" >&5
$as_echo "$gl_cv_rpl_alloca" >&6; }
    if test $gl_cv_rpl_alloca = yes; then

$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h

      ALLOCA_H=alloca.h
    else
                  ALLOCA_H=
    fi
  else
    ALLOCA_H=alloca.h
  fi

   if test -n "$ALLOCA_H"; then
  GL_GENERATE_ALLOCA_H_TRUE=
  GL_GENERATE_ALLOCA_H_FALSE='#'
else
  GL_GENERATE_ALLOCA_H_TRUE='#'
  GL_GENERATE_ALLOCA_H_FALSE=
fi


  if test $ac_cv_working_alloca_h = yes; then
    HAVE_ALLOCA_H=1
  else
    HAVE_ALLOCA_H=0
  fi



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable assertions" >&5
$as_echo_n "checking whether to enable assertions... " >&6; }
  # Check whether --enable-assert was given.
if test "${enable_assert+set}" = set; then :
  enableval=$enable_assert; if test "x$enableval" = xno; then :

$as_echo "#define NDEBUG 1" >>confdefs.h

elif test "x$enableval" != xyes; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-assert" >&5
$as_echo "$as_me: WARNING: invalid argument supplied to --enable-assert" >&2;}
      enable_assert=yes
fi
else
  enable_assert=yes
fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_assert" >&5
$as_echo "$enable_assert" >&6; }




  if test $gl_cv_func_malloc_posix = yes; then

$as_echo "#define HAVE_CALLOC_POSIX 1" >>confdefs.h

  else
    REPLACE_CALLOC=1
  fi

  if test $REPLACE_CALLOC = 1; then








  gl_LIBOBJS="$gl_LIBOBJS calloc.$ac_objext"

  fi





          GNULIB_CALLOC_POSIX=1





$as_echo "#define GNULIB_TEST_CALLOC_POSIX 1" >>confdefs.h






  if test $ac_cv_func_canonicalize_file_name = no; then
    HAVE_CANONICALIZE_FILE_NAME=0
    if test $ac_cv_func_realpath = no; then
      HAVE_REALPATH=0
    else
      case "$gl_cv_func_realpath_works" in
        *yes) ;;
        *)    REPLACE_REALPATH=1 ;;
      esac
    fi
  else
    case "$gl_cv_func_realpath_works" in
      *yes)
        ;;
      *)
        REPLACE_CANONICALIZE_FILE_NAME=1
        REPLACE_REALPATH=1
        ;;
    esac
  fi

  if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then








  gl_LIBOBJS="$gl_LIBOBJS canonicalize-lgpl.$ac_objext"

  fi


cat >>confdefs.h <<_ACEOF
#define GNULIB_CANONICALIZE_LGPL 1
_ACEOF







          GNULIB_CANONICALIZE_FILE_NAME=1





$as_echo "#define GNULIB_TEST_CANONICALIZE_FILE_NAME 1" >>confdefs.h








          GNULIB_REALPATH=1





$as_echo "#define GNULIB_TEST_REALPATH 1" >>confdefs.h







  # Solaris 2.5.1 needs -lposix4 to get the clock_gettime function.
  # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.

  # Save and restore LIBS so e.g., -lrt, isn't added to it.  Otherwise, *all*
  # programs in the package would end up linked with that potentially-shared
  # library, inducing unnecessary run-time overhead.
  LIB_CLOCK_GETTIME=

  gl_saved_libs=$LIBS
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
$as_echo_n "checking for library containing clock_gettime... " >&6; }
if ${ac_cv_search_clock_gettime+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char clock_gettime ();
int
main ()
{
return clock_gettime ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' rt posix4; do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_search_clock_gettime=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if ${ac_cv_search_clock_gettime+:} false; then :
  break
fi
done
if ${ac_cv_search_clock_gettime+:} false; then :

else
  ac_cv_search_clock_gettime=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
$as_echo "$ac_cv_search_clock_gettime" >&6; }
ac_res=$ac_cv_search_clock_gettime
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
  test "$ac_cv_search_clock_gettime" = "none required" ||
                    LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime
fi

    for ac_func in clock_gettime clock_settime
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  LIBS=$gl_saved_libs



$as_echo "#define GNULIB_TEST_CLOEXEC 1" >>confdefs.h






    if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
      REPLACE_CLOSE=1
    fi






  if test $ac_cv_header_sys_socket_h != yes; then
                    for ac_header in winsock2.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
if test "x$ac_cv_header_winsock2_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_WINSOCK2_H 1
_ACEOF

fi

done

  fi
  if test "$ac_cv_header_winsock2_h" = yes; then
    HAVE_WINSOCK2_H=1
    UNISTD_H_HAVE_WINSOCK2_H=1
    SYS_IOCTL_H_HAVE_WINSOCK2_H=1
  else
    HAVE_WINSOCK2_H=0
  fi


    if test $UNISTD_H_HAVE_WINSOCK2_H = 1; then
                        REPLACE_CLOSE=1
    fi



  if test $REPLACE_CLOSE = 1; then








  gl_LIBOBJS="$gl_LIBOBJS close.$ac_objext"

  fi





          GNULIB_CLOSE=1





$as_echo "#define GNULIB_TEST_CLOSE 1" >>confdefs.h





cat >>confdefs.h <<_ACEOF
#define GNULIB_CLOSE_STREAM 1
_ACEOF




  if test "x$lispdir" = x; then
    lispdir='${datarootdir}/emacs/site-lisp'

  fi
    if test "x$runstatedir" = x; then
    runstatedir='${localstatedir}/run'

  fi

      pkglibexecdir='${libexecdir}/${PACKAGE}'







cat >>confdefs.h <<_ACEOF
#define GNULIB_DIRNAME 1
_ACEOF








  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether // is distinct from /" >&5
$as_echo_n "checking whether // is distinct from /... " >&6; }
if ${gl_cv_double_slash_root+:} false; then :
  $as_echo_n "(cached) " >&6
else
   if test x"$cross_compiling" = xyes ; then
        # When cross-compiling, there is no way to tell whether // is special
        # short of a list of hosts.  However, the only known hosts to date
        # that have a distinct // are Apollo DomainOS (too old to port to),
        # Cygwin, and z/OS.  If anyone knows of another system for which // has
        # special semantics and is distinct from /, please report it to
        # <bug-gnulib@gnu.org>.
        case $host in
          *-cygwin | i370-ibm-openedition)
            gl_cv_double_slash_root=yes ;;
          *)
            # Be optimistic and assume that / and // are the same when we
            # don't know.
            gl_cv_double_slash_root='unknown, assuming no' ;;
        esac
      else
        set x `ls -di / // 2>/dev/null`
        if test "$2" = "$4" && wc //dev/null >/dev/null 2>&1; then
          gl_cv_double_slash_root=no
        else
          gl_cv_double_slash_root=yes
        fi
      fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_double_slash_root" >&5
$as_echo "$gl_cv_double_slash_root" >&6; }
  if test "$gl_cv_double_slash_root" = yes; then

$as_echo "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h

  fi






$as_echo "#define HAVE_DUP2 1" >>confdefs.h


  if test $HAVE_DUP2 = 1; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether dup2 works" >&5
$as_echo_n "checking whether dup2 works... " >&6; }
if ${gl_cv_func_dup2_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  case "$host_os" in
           mingw*) # on this platform, dup2 always returns 0 for success
             gl_cv_func_dup2_works="guessing no" ;;
           cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0
             gl_cv_func_dup2_works="guessing no" ;;
           aix* | freebsd*)
                   # on AIX 7.1 and FreeBSD 6.1, dup2 (1,toobig) gives EMFILE,
                   # not EBADF.
             gl_cv_func_dup2_works="guessing no" ;;
           haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC.
             gl_cv_func_dup2_works="guessing no" ;;
           *-android*) # implemented using dup3(), which fails if oldfd == newfd
             gl_cv_func_dup2_works="guessing no" ;;
           os2*) # on OS/2 kLIBC, dup2() does not work on a directory fd.
             gl_cv_func_dup2_works="guessing no" ;;
           *) gl_cv_func_dup2_works="guessing yes" ;;
         esac
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

         #include <errno.h>
             #include <fcntl.h>
             #include <limits.h>
             #include <sys/resource.h>
             #include <unistd.h>
             #ifndef RLIM_SAVED_CUR
             # define RLIM_SAVED_CUR RLIM_INFINITY
             #endif
             #ifndef RLIM_SAVED_MAX
             # define RLIM_SAVED_MAX RLIM_INFINITY
             #endif

int
main ()
{
int result = 0;
             int bad_fd = INT_MAX;
             struct rlimit rlim;
             if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
                 && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
                 && rlim.rlim_cur != RLIM_INFINITY
                 && rlim.rlim_cur != RLIM_SAVED_MAX
                 && rlim.rlim_cur != RLIM_SAVED_CUR)
               bad_fd = rlim.rlim_cur;
             #ifdef FD_CLOEXEC
               if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1)
                 result |= 1;
             #endif
             if (dup2 (1, 1) != 1)
               result |= 2;
             #ifdef FD_CLOEXEC
               if (fcntl (1, F_GETFD) != FD_CLOEXEC)
                 result |= 4;
             #endif
             close (0);
             if (dup2 (0, 0) != -1)
               result |= 8;
             /* Many gnulib modules require POSIX conformance of EBADF.  */
             if (dup2 (2, bad_fd) == -1 && errno != EBADF)
               result |= 16;
             /* Flush out some cygwin core dumps.  */
             if (dup2 (2, -1) != -1 || errno != EBADF)
               result |= 32;
             dup2 (2, 255);
             dup2 (2, 256);
             /* On OS/2 kLIBC, dup2() does not work on a directory fd.  */
             {
               int fd = open (".", O_RDONLY);
               if (fd == -1)
                 result |= 64;
               else if (dup2 (fd, fd + 1) == -1)
                 result |= 128;

               close (fd);
             }
             return result;
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_dup2_works=yes
else
  gl_cv_func_dup2_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_dup2_works" >&5
$as_echo "$gl_cv_func_dup2_works" >&6; }
    case "$gl_cv_func_dup2_works" in
      *yes) ;;
      *)
        REPLACE_DUP2=1
        for ac_func in setdtablesize
do :
  ac_fn_c_check_func "$LINENO" "setdtablesize" "ac_cv_func_setdtablesize"
if test "x$ac_cv_func_setdtablesize" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SETDTABLESIZE 1
_ACEOF

fi
done

        ;;
    esac
  fi


  if test $HAVE_DUP2 = 0 || test $REPLACE_DUP2 = 1; then








  gl_LIBOBJS="$gl_LIBOBJS dup2.$ac_objext"


  fi





          GNULIB_DUP2=1





$as_echo "#define GNULIB_TEST_DUP2 1" >>confdefs.h









          GNULIB_ENVIRON=1





$as_echo "#define GNULIB_TEST_ENVIRON 1" >>confdefs.h





      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5
$as_echo_n "checking for error_at_line... " >&6; }
if ${ac_cv_lib_error_at_line+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <error.h>
int
main ()
{
error_at_line (0, 0, "", 0, "an error occurred");
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_error_at_line=yes
else
  ac_cv_lib_error_at_line=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5
$as_echo "$ac_cv_lib_error_at_line" >&6; }

  if test $ac_cv_lib_error_at_line = no; then








  gl_LIBOBJS="$gl_LIBOBJS error.$ac_objext"



  :

  fi


  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error:3:c-format"



  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error_at_line:5:c-format"





  :






  if test $ac_cv_func_fcntl = no; then



  if test $ac_cv_func_fcntl = no; then
    HAVE_FCNTL=0
  else
    REPLACE_FCNTL=1
  fi

  else
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fcntl handles F_DUPFD correctly" >&5
$as_echo_n "checking whether fcntl handles F_DUPFD correctly... " >&6; }
if ${gl_cv_func_fcntl_f_dupfd_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  case $host_os in
            aix* | cygwin* | haiku*)
               gl_cv_func_fcntl_f_dupfd_works="guessing no" ;;
            *) gl_cv_func_fcntl_f_dupfd_works="guessing yes" ;;
          esac
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
              #include <fcntl.h>
              #include <limits.h>
              #include <sys/resource.h>
              #include <unistd.h>
              #ifndef RLIM_SAVED_CUR
              # define RLIM_SAVED_CUR RLIM_INFINITY
              #endif
              #ifndef RLIM_SAVED_MAX
              # define RLIM_SAVED_MAX RLIM_INFINITY
              #endif

int
main ()
{
int result = 0;
              int bad_fd = INT_MAX;
              struct rlimit rlim;
              if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
                  && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
                  && rlim.rlim_cur != RLIM_INFINITY
                  && rlim.rlim_cur != RLIM_SAVED_MAX
                  && rlim.rlim_cur != RLIM_SAVED_CUR)
                bad_fd = rlim.rlim_cur;
              if (fcntl (0, F_DUPFD, -1) != -1) result |= 1;
              if (errno != EINVAL) result |= 2;
              if (fcntl (0, F_DUPFD, bad_fd) != -1) result |= 4;
              if (errno != EINVAL) result |= 8;
              /* On OS/2 kLIBC, F_DUPFD does not work on a directory fd */
              {
                int fd;
                fd = open (".", O_RDONLY);
                if (fd == -1)
                  result |= 16;
                else if (fcntl (fd, F_DUPFD, STDERR_FILENO + 1) == -1)
                  result |= 32;

                close (fd);
              }
              return result;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_fcntl_f_dupfd_works=yes
else
  gl_cv_func_fcntl_f_dupfd_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_works" >&5
$as_echo "$gl_cv_func_fcntl_f_dupfd_works" >&6; }
    case $gl_cv_func_fcntl_f_dupfd_works in
      *yes) ;;
      *)


  if test $ac_cv_func_fcntl = no; then
    HAVE_FCNTL=0
  else
    REPLACE_FCNTL=1
  fi


$as_echo "#define FCNTL_DUPFD_BUGGY 1" >>confdefs.h
 ;;
    esac

        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fcntl understands F_DUPFD_CLOEXEC" >&5
$as_echo_n "checking whether fcntl understands F_DUPFD_CLOEXEC... " >&6; }
if ${gl_cv_func_fcntl_f_dupfd_cloexec+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <fcntl.h>
#ifndef F_DUPFD_CLOEXEC
choke me
#endif

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef __linux__
/* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace
   it to support the semantics on older kernels that failed with EINVAL.  */
choke me
#endif

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_func_fcntl_f_dupfd_cloexec=yes
else
  gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  gl_cv_func_fcntl_f_dupfd_cloexec=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_cloexec" >&5
$as_echo "$gl_cv_func_fcntl_f_dupfd_cloexec" >&6; }
    if test "$gl_cv_func_fcntl_f_dupfd_cloexec" != yes; then



  if test $ac_cv_func_fcntl = no; then
    HAVE_FCNTL=0
  else
    REPLACE_FCNTL=1
  fi

          fi
  fi


  if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then








  gl_LIBOBJS="$gl_LIBOBJS fcntl.$ac_objext"

  fi





          GNULIB_FCNTL=1





$as_echo "#define GNULIB_TEST_FCNTL 1" >>confdefs.h














     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_fcntl_h='<'fcntl.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <fcntl.h>" >&5
$as_echo_n "checking absolute name of <fcntl.h>... " >&6; }
if ${gl_cv_next_fcntl_h+:} false; then :
  $as_echo_n "(cached) " >&6
else



  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <fcntl.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'fcntl.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_fcntl_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_fcntl_h
           gl_cv_next_fcntl_h='"'$gl_header'"'


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_fcntl_h" >&5
$as_echo "$gl_cv_next_fcntl_h" >&6; }
     fi
     NEXT_FCNTL_H=$gl_cv_next_fcntl_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'fcntl.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_fcntl_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_FCNTL_H=$gl_next_as_first_directive















cat >>confdefs.h <<_ACEOF
#define GNULIB_FD_SAFER_FLAG 1
_ACEOF





  FLOAT_H=
  REPLACE_FLOAT_LDBL=0
  case "$host_os" in
    aix* | beos* | openbsd* | mirbsd* | irix*)
      FLOAT_H=float.h
      ;;
    freebsd* | dragonfly*)
      case "$host_cpu" in
        i[34567]86 )
          FLOAT_H=float.h
          ;;
        x86_64 )
          # On x86_64 systems, the C compiler may still be generating
          # 32-bit code.
          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if defined __LP64__ || defined __x86_64__ || defined __amd64__
                  int ok;
                 #else
                  error fail
                 #endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

else
  FLOAT_H=float.h
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
          ;;
      esac
      ;;
    linux*)
      case "$host_cpu" in
        powerpc*)
          FLOAT_H=float.h
          ;;
      esac
      ;;
  esac
  case "$host_os" in
    aix* | freebsd* | dragonfly* | linux*)
      if test -n "$FLOAT_H"; then
        REPLACE_FLOAT_LDBL=1
      fi
      ;;
  esac

    REPLACE_ITOLD=0
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether conversion from 'int' to 'long double' works" >&5
$as_echo_n "checking whether conversion from 'int' to 'long double' works... " >&6; }
if ${gl_cv_func_itold_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host" in
           sparc*-*-linux*)
             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if defined __LP64__ || defined __arch64__
                    int ok;
                   #else
                    error fail
                   #endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_func_itold_works="guessing no"
else
  gl_cv_func_itold_works="guessing yes"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
             ;;
                   # Guess yes on native Windows.
           mingw*) gl_cv_func_itold_works="guessing yes" ;;
           *)      gl_cv_func_itold_works="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int i = -1;
volatile long double ld;
int main ()
{
  ld += i * 1.0L;
  if (ld > 0)
    return 1;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_itold_works=yes
else
  gl_cv_func_itold_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_itold_works" >&5
$as_echo "$gl_cv_func_itold_works" >&6; }
  case "$gl_cv_func_itold_works" in
    *no)
      REPLACE_ITOLD=1
                  FLOAT_H=float.h
      ;;
  esac

  if test -n "$FLOAT_H"; then








     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_float_h='<'float.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <float.h>" >&5
$as_echo_n "checking absolute name of <float.h>... " >&6; }
if ${gl_cv_next_float_h+:} false; then :
  $as_echo_n "(cached) " >&6
else



  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <float.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'float.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_float_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_float_h
           gl_cv_next_float_h='"'$gl_header'"'


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_float_h" >&5
$as_echo "$gl_cv_next_float_h" >&6; }
     fi
     NEXT_FLOAT_H=$gl_cv_next_float_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'float.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_float_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_FLOAT_H=$gl_next_as_first_directive




  fi

   if test -n "$FLOAT_H"; then
  GL_GENERATE_FLOAT_H_TRUE=
  GL_GENERATE_FLOAT_H_FALSE='#'
else
  GL_GENERATE_FLOAT_H_TRUE='#'
  GL_GENERATE_FLOAT_H_FALSE=
fi



  if test $REPLACE_FLOAT_LDBL = 1; then








  gl_LIBOBJS="$gl_LIBOBJS float.$ac_objext"

  fi
  if test $REPLACE_ITOLD = 1; then








  gl_LIBOBJS="$gl_LIBOBJS itold.$ac_objext"

  fi



  case "$host_os" in
    mingw* | pw*)
            REPLACE_FOPEN=1
            gl_cv_func_fopen_slash="guessing no"
      ;;
    *)
                  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fopen recognizes a trailing slash" >&5
$as_echo_n "checking whether fopen recognizes a trailing slash... " >&6; }
if ${gl_cv_func_fopen_slash+:} false; then :
  $as_echo_n "(cached) " >&6
else

          if test "$cross_compiling" = yes; then :

             case "$host_os" in
               aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*)
                 gl_cv_func_fopen_slash="guessing no" ;;
               *)
                 gl_cv_func_fopen_slash="guessing yes" ;;
             esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stddef.h>
#include <stdio.h>
int main ()
{
  FILE *fp = fopen ("conftest.sl/", "w");
  int result = (fp != NULL);
  if (fp != NULL)
    fclose (fp);
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_fopen_slash=yes
else
  gl_cv_func_fopen_slash=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

          rm -f conftest.sl

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fopen_slash" >&5
$as_echo "$gl_cv_func_fopen_slash" >&6; }
      ;;
  esac
  case "$gl_cv_func_fopen_slash" in
    *no)

$as_echo "#define FOPEN_TRAILING_SLASH_BUG 1" >>confdefs.h

      REPLACE_FOPEN=1
      ;;
  esac

  if test $REPLACE_FOPEN = 1; then








  gl_LIBOBJS="$gl_LIBOBJS fopen.$ac_objext"

    :
  fi





          GNULIB_FOPEN=1





$as_echo "#define GNULIB_TEST_FOPEN 1" >>confdefs.h





cat >>confdefs.h <<_ACEOF
#define GNULIB_FOPEN_SAFER 1
_ACEOF




  fp_headers='
    #include <stdio.h>
    #if HAVE_STDIO_EXT_H
    # include <stdio_ext.h>
    #endif
  '
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __fpending" >&5
$as_echo_n "checking for __fpending... " >&6; }
if ${gl_cv_func___fpending+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$fp_headers
int
main ()
{
return ! __fpending (stdin);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func___fpending=yes
else
  gl_cv_func___fpending=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func___fpending" >&5
$as_echo "$gl_cv_func___fpending" >&6; }
  if test $gl_cv_func___fpending = yes; then
    ac_fn_c_check_decl "$LINENO" "__fpending" "ac_cv_have_decl___fpending" "$fp_headers
"
if test "x$ac_cv_have_decl___fpending" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL___FPENDING $ac_have_decl
_ACEOF

  fi

  if test $gl_cv_func___fpending = no; then








  gl_LIBOBJS="$gl_LIBOBJS fpending.$ac_objext"

  fi















  gl_cv_func_fprintf_posix=no
  case "$gl_cv_func_printf_sizes_c99" in
    *yes)
      case "$gl_cv_func_printf_long_double" in
        *yes)
          case "$gl_cv_func_printf_infinite" in
            *yes)
              case "$gl_cv_func_printf_infinite_long_double" in
                *yes)
                  case "$gl_cv_func_printf_directive_a" in
                    *yes)
                      case "$gl_cv_func_printf_directive_f" in
                        *yes)
                          case "$gl_cv_func_printf_directive_n" in
                            *yes)
                              case "$gl_cv_func_printf_directive_ls" in
                                *yes)
                                  case "$gl_cv_func_printf_positions" in
                                    *yes)
                                      case "$gl_cv_func_printf_flag_grouping" in
                                        *yes)
                                          case "$gl_cv_func_printf_flag_leftadjust" in
                                            *yes)
                                              case "$gl_cv_func_printf_flag_zero" in
                                                *yes)
                                                  case "$gl_cv_func_printf_precision" in
                                                    *yes)
                                                      case "$gl_cv_func_printf_enomem" in
                                                        *yes)
                                                          # fprintf exists and is
                                                          # already POSIX compliant.
                                                          gl_cv_func_fprintf_posix=yes
                                                          ;;
                                                      esac
                                                      ;;
                                                  esac
                                                  ;;
                                              esac
                                              ;;
                                          esac
                                          ;;
                                      esac
                                      ;;
                                  esac
                                  ;;
                              esac
                              ;;
                          esac
                          ;;
                      esac
                      ;;
                  esac
                  ;;
              esac
              ;;
          esac
          ;;
      esac
      ;;
  esac
  if test $gl_cv_func_fprintf_posix = no; then



  case "$gl_cv_func_printf_infinite" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h

      ;;
  esac




  case "$gl_cv_func_printf_long_double" in
    *yes)
      case "$gl_cv_func_printf_infinite_long_double" in
        *yes)
          ;;
        *)

$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h

          ;;
      esac
      ;;
  esac



  case "$gl_cv_func_printf_directive_a" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h

      for ac_func in nl_langinfo
do :
  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
if test "x$ac_cv_func_nl_langinfo" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_NL_LANGINFO 1
_ACEOF

fi
done

      ;;
  esac



  case "$gl_cv_func_printf_directive_f" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_directive_ls" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_grouping" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_leftadjust" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_zero" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_precision" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_enomem" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac











  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"

  if test $ac_cv_func_vasnprintf = yes; then

$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h

  fi











  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
if test "x$ac_cv_type_ptrdiff_t" = xyes; then :

else

$as_echo "#define ptrdiff_t long" >>confdefs.h


fi

















  gl_LIBOBJS="$gl_LIBOBJS fprintf.$ac_objext"

  REPLACE_FPRINTF=1

$as_echo "#define REPLACE_FPRINTF_POSIX 1" >>confdefs.h

  :

  fi






          GNULIB_FPRINTF_POSIX=1





$as_echo "#define GNULIB_TEST_FPRINTF_POSIX 1" >>confdefs.h






  if test $gl_cv_func_frexp_no_libm = yes; then



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexp works" >&5
$as_echo_n "checking whether frexp works... " >&6; }
if ${gl_cv_func_frexp_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
           netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;;
           mingw*) # Guess yes with MSVC, no with mingw.
             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef _MSC_VER
 Good
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Good" >/dev/null 2>&1; then :
  gl_cv_func_frexp_works="guessing yes"
else
  gl_cv_func_frexp_works="guessing no"
fi
rm -f conftest*

             ;;
           *) gl_cv_func_frexp_works="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <float.h>
#include <math.h>
#include <string.h>
#if HAVE_DECL_ALARM
# include <signal.h>
# include <unistd.h>
#endif
/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
   ICC 10.0 has a bug when optimizing the expression -zero.
   The expression -DBL_MIN * DBL_MIN does not work when cross-compiling
   to PowerPC on Mac OS X 10.5.  */
#if defined __hpux || defined __sgi || defined __ICC
static double
compute_minus_zero (void)
{
  return -DBL_MIN * DBL_MIN;
}
# define minus_zero compute_minus_zero ()
#else
double minus_zero = -0.0;
#endif
int main()
{
  int result = 0;
  int i;
  volatile double x;
  double zero = 0.0;
#if HAVE_DECL_ALARM
  /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite
     number.  Let the test fail in this case.  */
  signal (SIGALRM, SIG_DFL);
  alarm (5);
#endif
  /* Test on denormalized numbers.  */
  for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
    ;
  if (x > 0.0)
    {
      int exp;
      double y = frexp (x, &exp);
      /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022.
         On NetBSD: y = 0.75. Correct: y = 0.5.  */
      if (y != 0.5)
        result |= 1;
    }
  /* Test on infinite numbers.  */
  x = 1.0 / zero;
  {
    int exp;
    double y = frexp (x, &exp);
    if (y != x)
      result |= 2;
  }
  /* Test on negative zero.  */
  x = minus_zero;
  {
    int exp;
    double y = frexp (x, &exp);
    if (memcmp (&y, &x, sizeof x))
      result |= 4;
  }
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_frexp_works=yes
else
  gl_cv_func_frexp_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_works" >&5
$as_echo "$gl_cv_func_frexp_works" >&6; }

    case "$gl_cv_func_frexp_works" in
      *yes) gl_func_frexp_no_libm=yes ;;
      *)    gl_func_frexp_no_libm=no; REPLACE_FREXP=1 ;;
    esac
  else
    gl_func_frexp_no_libm=no
        REPLACE_FREXP=1
  fi
  if test $gl_func_frexp_no_libm = yes; then

$as_echo "#define HAVE_FREXP_IN_LIBC 1" >>confdefs.h

  fi

  if test $gl_func_frexp_no_libm != yes; then








  gl_LIBOBJS="$gl_LIBOBJS frexp.$ac_objext"

  fi





          GNULIB_FREXP=1





$as_echo "#define GNULIB_TEST_FREXP 1" >>confdefs.h






      ac_fn_c_check_decl "$LINENO" "frexpl" "ac_cv_have_decl_frexpl" "#include <math.h>
"
if test "x$ac_cv_have_decl_frexpl" = xyes; then :

else
  HAVE_DECL_FREXPL=0
fi

  if test $HAVE_DECL_FREXPL = 1; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl() can be used without linking with libm" >&5
$as_echo_n "checking whether frexpl() can be used without linking with libm... " >&6; }
if ${gl_cv_func_frexpl_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             long double x;
int
main ()
{
int e; return frexpl (x, &e) > 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_frexpl_no_libm=yes
else
  gl_cv_func_frexpl_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_no_libm" >&5
$as_echo "$gl_cv_func_frexpl_no_libm" >&6; }

    if test $gl_cv_func_frexpl_no_libm = yes; then


     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl works" >&5
$as_echo_n "checking whether frexpl works... " >&6; }
if ${gl_cv_func_frexpl_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
           aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*)
              gl_cv_func_frexpl_works="guessing no";;
           *) gl_cv_func_frexpl_works="guessing yes";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <float.h>
#include <math.h>
/* Override the values of <float.h>, like done in float.in.h.  */
#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
# undef LDBL_MIN_EXP
# define LDBL_MIN_EXP    (-16381)
#endif
#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
# undef LDBL_MIN_EXP
# define LDBL_MIN_EXP    (-16381)
#endif
#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
# undef LDBL_MIN_EXP
# define LDBL_MIN_EXP DBL_MIN_EXP
#endif
#if defined __sgi && (LDBL_MANT_DIG >= 106)
# if defined __GNUC__
#  undef LDBL_MIN_EXP
#  define LDBL_MIN_EXP DBL_MIN_EXP
# endif
#endif
extern
#ifdef __cplusplus
"C"
#endif
long double frexpl (long double, int *);
int main()
{
  int result = 0;
  volatile long double x;
  /* Test on finite numbers that fails on AIX 5.1.  */
  x = 16.0L;
  {
    int exp = -9999;
    frexpl (x, &exp);
    if (exp != 5)
      result |= 1;
  }
  /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
     function returns an invalid (incorrectly normalized) value: it returns
               y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
     but the correct result is
          0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 }  */
  x = 1.01L;
  {
    int exp = -9999;
    long double y = frexpl (x, &exp);
    if (!(exp == 1 && y == 0.505L))
      result |= 2;
  }
  /* Test on large finite numbers.  This fails on BeOS at i = 16322, while
     LDBL_MAX_EXP = 16384.
     In the loop end test, we test x against Infinity, rather than comparing
     i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP.  */
  {
    int i;
    for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
      {
        int exp = -9999;
        frexpl (x, &exp);
        if (exp != i)
          {
            result |= 4;
            break;
          }
      }
  }
  /* Test on denormalized numbers.  */
  {
    int i;
    for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
      ;
    if (x > 0.0L)
      {
        int exp;
        long double y = frexpl (x, &exp);
        /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
           exp = -16382, y = 0.5.  On Mac OS X 10.5: exp = -16384, y = 0.5.  */
        if (exp != LDBL_MIN_EXP - 1)
          result |= 8;
      }
  }
  /* Test on infinite numbers.  */
  x = 1.0L / 0.0L;
  {
    int exp;
    long double y = frexpl (x, &exp);
    if (y != x)
      result |= 16;
  }
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_frexpl_works=yes
else
  gl_cv_func_frexpl_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_works" >&5
$as_echo "$gl_cv_func_frexpl_works" >&6; }

      case "$gl_cv_func_frexpl_works" in
        *yes) gl_func_frexpl_no_libm=yes ;;
        *)    gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
      esac
    else
      gl_func_frexpl_no_libm=no
            REPLACE_FREXPL=1
    fi
    if test $gl_func_frexpl_no_libm = yes; then

$as_echo "#define HAVE_FREXPL_IN_LIBC 1" >>confdefs.h

    fi
  fi

  if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl_no_libm = no; then








  gl_LIBOBJS="$gl_LIBOBJS frexpl.$ac_objext"

  fi





          GNULIB_FREXPL=1





$as_echo "#define GNULIB_TEST_FREXPL 1" >>confdefs.h






  if test $ac_cv_func_fsync = no; then
    HAVE_FSYNC=0
  fi

  if test $HAVE_FSYNC = 0; then








  gl_LIBOBJS="$gl_LIBOBJS fsync.$ac_objext"

    :
  fi





          GNULIB_FSYNC=1





$as_echo "#define GNULIB_TEST_FSYNC 1" >>confdefs.h







  ac_fn_c_check_decl "$LINENO" "gethrtime" "ac_cv_have_decl_gethrtime" "#include <time.h>
"
if test "x$ac_cv_have_decl_gethrtime" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_GETHRTIME $ac_have_decl
_ACEOF

  LIB_GETHRXTIME=
  if test $ac_cv_have_decl_gethrtime = no \
     || test $gl_cv_arithmetic_hrtime_t = no; then



    if test $ac_cv_func_nanouptime != yes \
       && { test $ac_cv_have_decl_gethrtime = no \
            || test $gl_cv_arithmetic_hrtime_t = no; }; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CLOCK_MONOTONIC or CLOCK_REALTIME is defined" >&5
$as_echo_n "checking whether CLOCK_MONOTONIC or CLOCK_REALTIME is defined... " >&6; }
if ${gl_cv_have_clock_gettime_macro+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#          include <time.h>
#          if defined CLOCK_MONOTONIC || defined CLOCK_REALTIME
            have_clock_gettime_macro
#          endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "have_clock_gettime_macro" >/dev/null 2>&1; then :
  gl_cv_have_clock_gettime_macro=yes
else
  gl_cv_have_clock_gettime_macro=no
fi
rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_clock_gettime_macro" >&5
$as_echo "$gl_cv_have_clock_gettime_macro" >&6; }
      if test $gl_cv_have_clock_gettime_macro = yes; then
        LIB_GETHRXTIME=$LIB_CLOCK_GETTIME
      fi
    fi
  fi











    REPLACE_GETOPT=0
    if test -n "$gl_replace_getopt"; then
      REPLACE_GETOPT=1
    fi

  if test $REPLACE_GETOPT = 1; then


  if test $ac_cv_header_sys_cdefs_h = yes; then
    HAVE_SYS_CDEFS_H=1
  else
    HAVE_SYS_CDEFS_H=0
  fi



$as_echo "#define __GETOPT_PREFIX rpl_" >>confdefs.h

  GETOPT_H=getopt.h
  GETOPT_CDEFS_H=getopt-cdefs.h



  fi

  if test $REPLACE_GETOPT = 1; then








  gl_LIBOBJS="$gl_LIBOBJS getopt.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS getopt1.$ac_objext"

        GNULIB_GL_UNISTD_H_GETOPT=1
  fi




  ac_found=0
  ac_fn_c_check_decl "$LINENO" "program_invocation_name" "ac_cv_have_decl_program_invocation_name" "#include <errno.h>
"
if test "x$ac_cv_have_decl_program_invocation_name" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_PROGRAM_INVOCATION_NAME $ac_have_decl
_ACEOF
if test $ac_have_decl = 1; then :
  ac_found=1
fi

  ac_fn_c_check_decl "$LINENO" "program_invocation_short_name" "ac_cv_have_decl_program_invocation_short_name" "#include <errno.h>
"
if test "x$ac_cv_have_decl_program_invocation_short_name" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME $ac_have_decl
_ACEOF
if test $ac_have_decl = 1; then :
  ac_found=1
fi

  ac_fn_c_check_decl "$LINENO" "__argv" "ac_cv_have_decl___argv" "#include <stdlib.h>
"
if test "x$ac_cv_have_decl___argv" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL___ARGV $ac_have_decl
_ACEOF
if test $ac_have_decl = 1; then :
  ac_found=1
fi


  # Incur the cost of this test only if none of the above worked.
  if test $ac_found = 0; then
    # On OpenBSD 5.1, using the global __progname variable appears to be
    # the only way to implement getprogname.
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __progname is defined in default libraries" >&5
$as_echo_n "checking whether __progname is defined in default libraries... " >&6; }
if ${gl_cv_var___progname+:} false; then :
  $as_echo_n "(cached) " >&6
else

        gl_cv_var___progname=
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
extern char *__progname;
int
main ()
{
return *__progname;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_var___progname=yes

fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_var___progname" >&5
$as_echo "$gl_cv_var___progname" >&6; }
    if test "$gl_cv_var___progname" = yes; then

$as_echo "#define HAVE_VAR___PROGNAME 1" >>confdefs.h

    fi
  fi




  if test $ac_cv_func_getrusage = no; then
    HAVE_GETRUSAGE=0
  fi

  if test $HAVE_GETRUSAGE = 0; then








  gl_LIBOBJS="$gl_LIBOBJS getrusage.$ac_objext"

  fi





          GNULIB_GETRUSAGE=1





$as_echo "#define GNULIB_TEST_GETRUSAGE 1" >>confdefs.h

















  gl_gettimeofday_timezone=void
  if test $ac_cv_func_gettimeofday != yes; then
    HAVE_GETTIMEOFDAY=0
  else




 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gettimeofday clobbers localtime buffer" >&5
$as_echo_n "checking whether gettimeofday clobbers localtime buffer... " >&6; }
if ${gl_cv_func_gettimeofday_clobber+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  # When cross-compiling:
      case "$host_os" in
                       # Guess all is fine on glibc systems.
        *-gnu* | gnu*) gl_cv_func_gettimeofday_clobber="guessing no" ;;
                       # Guess all is fine on musl systems.
        *-musl*)       gl_cv_func_gettimeofday_clobber="guessing no" ;;
                       # Guess no on native Windows.
        mingw*)        gl_cv_func_gettimeofday_clobber="guessing no" ;;
                       # If we don't know, obey --enable-cross-guesses.
        *)             gl_cv_func_gettimeofday_clobber="$gl_cross_guess_inverted" ;;
      esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <string.h>
          #include <sys/time.h>
          #include <time.h>
          #include <stdlib.h>

int
main ()
{

          time_t t = 0;
          struct tm *lt;
          struct tm saved_lt;
          struct timeval tv;
          lt = localtime (&t);
          saved_lt = *lt;
          gettimeofday (&tv, NULL);
          return memcmp (lt, &saved_lt, sizeof (struct tm)) != 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_gettimeofday_clobber=no
else
  gl_cv_func_gettimeofday_clobber=yes
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_gettimeofday_clobber" >&5
$as_echo "$gl_cv_func_gettimeofday_clobber" >&6; }

 case "$gl_cv_func_gettimeofday_clobber" in
   *yes)
     REPLACE_GETTIMEOFDAY=1

$as_echo "#define GETTIMEOFDAY_CLOBBERS_LOCALTIME 1" >>confdefs.h




  NEED_LOCALTIME_BUFFER=1
  REPLACE_GMTIME=1
  REPLACE_LOCALTIME=1

     ;;
 esac

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettimeofday with POSIX signature" >&5
$as_echo_n "checking for gettimeofday with POSIX signature... " >&6; }
if ${gl_cv_func_gettimeofday_posix_signature+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/time.h>
              struct timeval c;
              int gettimeofday (struct timeval *restrict, void *restrict);

int
main ()
{
/* glibc uses struct timezone * rather than the POSIX void *
                 if _GNU_SOURCE is defined.  However, since the only portable
                 use of gettimeofday uses NULL as the second parameter, and
                 since the glibc definition is actually more typesafe, it is
                 not worth wrapping this to get a compliant signature.  */
              int (*f) (struct timeval *restrict, void *restrict)
                = gettimeofday;
              int x = f (&c, 0);
              return !(x | c.tv_sec | c.tv_usec);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_func_gettimeofday_posix_signature=yes
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/time.h>
int gettimeofday (struct timeval *restrict, struct timezone *restrict);

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_func_gettimeofday_posix_signature=almost
else
  gl_cv_func_gettimeofday_posix_signature=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_gettimeofday_posix_signature" >&5
$as_echo "$gl_cv_func_gettimeofday_posix_signature" >&6; }
    if test $gl_cv_func_gettimeofday_posix_signature = almost; then
      gl_gettimeofday_timezone='struct timezone'
    elif test $gl_cv_func_gettimeofday_posix_signature != yes; then
      REPLACE_GETTIMEOFDAY=1
    fi
        if test $REPLACE_STRUCT_TIMEVAL = 1; then
      REPLACE_GETTIMEOFDAY=1
    fi
            case "$host_os" in
      mingw*) REPLACE_GETTIMEOFDAY=1 ;;
    esac
  fi

cat >>confdefs.h <<_ACEOF
#define GETTIMEOFDAY_TIMEZONE $gl_gettimeofday_timezone
_ACEOF


  if test $HAVE_GETTIMEOFDAY = 0 || test $REPLACE_GETTIMEOFDAY = 1; then








  gl_LIBOBJS="$gl_LIBOBJS gettimeofday.$ac_objext"

    :
  fi





          GNULIB_GETTIMEOFDAY=1





$as_echo "#define GNULIB_TEST_GETTIMEOFDAY 1" >>confdefs.h



  # Autoconf 2.61a.99 and earlier don't support linking a file only
  # in VPATH builds.  But since GNUmakefile is for maintainer use
  # only, it does not matter if we skip the link with older autoconf.
  # Automake 1.10.1 and earlier try to remove GNUmakefile in non-VPATH
  # builds, so use a shell variable to bypass this.
  GNUmakefile=GNUmakefile
  ac_config_links="$ac_config_links $GNUmakefile:$GNUmakefile"






  PRIPTR_PREFIX=
  if test -n "$STDINT_H"; then
        PRIPTR_PREFIX='"l"'
  else
        for glpfx in '' l ll I64; do
      case $glpfx in
        '')  gltype1='int';;
        l)   gltype1='long int';;
        ll)  gltype1='long long int';;
        I64) gltype1='__int64';;
      esac
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdint.h>
           extern intptr_t foo;
           extern $gltype1 foo;
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  PRIPTR_PREFIX='"'$glpfx'"'
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      test -n "$PRIPTR_PREFIX" && break
    done
  fi



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether INT32_MAX < INTMAX_MAX" >&5
$as_echo_n "checking whether INT32_MAX < INTMAX_MAX... " >&6; }
if ${gl_cv_test_INT32_MAX_LT_INTMAX_MAX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* Work also in C++ mode.  */
            #define __STDC_LIMIT_MACROS 1

            /* Work if build is not clean.  */
            #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H

            #include <limits.h>
            #if HAVE_STDINT_H
             #include <stdint.h>
            #endif

            #if defined INT32_MAX && defined INTMAX_MAX
             #define CONDITION (INT32_MAX < INTMAX_MAX)
            #elif HAVE_LONG_LONG_INT
             #define CONDITION (sizeof (int) < sizeof (long long int))
            #else
             #define CONDITION 0
            #endif
            int test[CONDITION ? 1 : -1];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_test_INT32_MAX_LT_INTMAX_MAX=yes
else
  gl_cv_test_INT32_MAX_LT_INTMAX_MAX=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_INT32_MAX_LT_INTMAX_MAX" >&5
$as_echo "$gl_cv_test_INT32_MAX_LT_INTMAX_MAX" >&6; }
  if test $gl_cv_test_INT32_MAX_LT_INTMAX_MAX = yes; then
    INT32_MAX_LT_INTMAX_MAX=1;
  else
    INT32_MAX_LT_INTMAX_MAX=0;
  fi


  if test $APPLE_UNIVERSAL_BUILD = 0; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether INT64_MAX == LONG_MAX" >&5
$as_echo_n "checking whether INT64_MAX == LONG_MAX... " >&6; }
if ${gl_cv_test_INT64_MAX_EQ_LONG_MAX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* Work also in C++ mode.  */
            #define __STDC_LIMIT_MACROS 1

            /* Work if build is not clean.  */
            #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H

            #include <limits.h>
            #if HAVE_STDINT_H
             #include <stdint.h>
            #endif

            #if defined INT64_MAX
             #define CONDITION (INT64_MAX == LONG_MAX)
            #elif HAVE_LONG_LONG_INT
             #define CONDITION (sizeof (long long int) == sizeof (long int))
            #else
             #define CONDITION 0
            #endif
            int test[CONDITION ? 1 : -1];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_test_INT64_MAX_EQ_LONG_MAX=yes
else
  gl_cv_test_INT64_MAX_EQ_LONG_MAX=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_INT64_MAX_EQ_LONG_MAX" >&5
$as_echo "$gl_cv_test_INT64_MAX_EQ_LONG_MAX" >&6; }
  if test $gl_cv_test_INT64_MAX_EQ_LONG_MAX = yes; then
    INT64_MAX_EQ_LONG_MAX=1;
  else
    INT64_MAX_EQ_LONG_MAX=0;
  fi


  else
    INT64_MAX_EQ_LONG_MAX=-1
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UINT32_MAX < UINTMAX_MAX" >&5
$as_echo_n "checking whether UINT32_MAX < UINTMAX_MAX... " >&6; }
if ${gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* Work also in C++ mode.  */
            #define __STDC_LIMIT_MACROS 1

            /* Work if build is not clean.  */
            #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H

            #include <limits.h>
            #if HAVE_STDINT_H
             #include <stdint.h>
            #endif

            #if defined UINT32_MAX && defined UINTMAX_MAX
             #define CONDITION (UINT32_MAX < UINTMAX_MAX)
            #elif HAVE_LONG_LONG_INT
             #define CONDITION (sizeof (unsigned int) < sizeof (unsigned long long int))
            #else
             #define CONDITION 0
            #endif
            int test[CONDITION ? 1 : -1];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX=yes
else
  gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX" >&5
$as_echo "$gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX" >&6; }
  if test $gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX = yes; then
    UINT32_MAX_LT_UINTMAX_MAX=1;
  else
    UINT32_MAX_LT_UINTMAX_MAX=0;
  fi


  if test $APPLE_UNIVERSAL_BUILD = 0; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UINT64_MAX == ULONG_MAX" >&5
$as_echo_n "checking whether UINT64_MAX == ULONG_MAX... " >&6; }
if ${gl_cv_test_UINT64_MAX_EQ_ULONG_MAX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* Work also in C++ mode.  */
            #define __STDC_LIMIT_MACROS 1

            /* Work if build is not clean.  */
            #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H

            #include <limits.h>
            #if HAVE_STDINT_H
             #include <stdint.h>
            #endif

            #if defined UINT64_MAX
             #define CONDITION (UINT64_MAX == ULONG_MAX)
            #elif HAVE_LONG_LONG_INT
             #define CONDITION (sizeof (unsigned long long int) == sizeof (unsigned long int))
            #else
             #define CONDITION 0
            #endif
            int test[CONDITION ? 1 : -1];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_test_UINT64_MAX_EQ_ULONG_MAX=yes
else
  gl_cv_test_UINT64_MAX_EQ_ULONG_MAX=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_UINT64_MAX_EQ_ULONG_MAX" >&5
$as_echo "$gl_cv_test_UINT64_MAX_EQ_ULONG_MAX" >&6; }
  if test $gl_cv_test_UINT64_MAX_EQ_ULONG_MAX = yes; then
    UINT64_MAX_EQ_ULONG_MAX=1;
  else
    UINT64_MAX_EQ_ULONG_MAX=0;
  fi


  else
    UINT64_MAX_EQ_ULONG_MAX=-1
  fi









  # If we replaced any of the underlying isnan* functions, replace
  # the isnan macro; it undoubtedly suffers from the same flaws.
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan macro works" >&5
$as_echo_n "checking whether isnan macro works... " >&6; }
  if test $gl_func_isnanf = yes \
     && test $gl_func_isnand = yes \
     && test $gl_func_isnanl = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
    ISNAN_LIBM=
        case " $ISNAN_LIBM " in
      *" $ISNANF_LIBM "*) ;;
      *) ISNAN_LIBM="$ISNAN_LIBM $ISNANF_LIBM" ;;
    esac
        case " $ISNAN_LIBM " in
      *" $ISNAND_LIBM "*) ;;
      *) ISNAN_LIBM="$ISNAN_LIBM $ISNAND_LIBM" ;;
    esac
        case " $ISNAN_LIBM " in
      *" $ISNANL_LIBM "*) ;;
      *) ISNAN_LIBM="$ISNAN_LIBM $ISNANL_LIBM" ;;
    esac
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
        REPLACE_ISNAN=1
    ISNAN_LIBM=
  fi







          GNULIB_ISNAN=1





$as_echo "#define GNULIB_TEST_ISNAN 1" >>confdefs.h





  ISNAND_LIBM=

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used without linking with libm" >&5
$as_echo_n "checking whether isnan(double) can be used without linking with libm... " >&6; }
if ${gl_cv_func_isnand_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             #if __GNUC__ >= 4
             # undef isnand
             # define isnand(x) __builtin_isnan ((double)(x))
             #else
             # undef isnand
             # define isnand(x) isnan ((double)(x))
             #endif
             double x;
int
main ()
{
return isnand (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_isnand_no_libm=yes
else
  gl_cv_func_isnand_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_no_libm" >&5
$as_echo "$gl_cv_func_isnand_no_libm" >&6; }

  if test $gl_cv_func_isnand_no_libm = no; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used with libm" >&5
$as_echo_n "checking whether isnan(double) can be used with libm... " >&6; }
if ${gl_cv_func_isnand_in_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      save_LIBS="$LIBS"
      LIBS="$LIBS -lm"
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             #if __GNUC__ >= 4
             # undef isnand
             # define isnand(x) __builtin_isnan ((double)(x))
             #elif defined isnan
             # undef isnand
             # define isnand(x) isnan ((double)(x))
             #endif
             double x;
int
main ()
{
return isnand (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_isnand_in_libm=yes
else
  gl_cv_func_isnand_in_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      LIBS="$save_LIBS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_in_libm" >&5
$as_echo "$gl_cv_func_isnand_in_libm" >&6; }

    if test $gl_cv_func_isnand_in_libm = yes; then
      ISNAND_LIBM=-lm
    fi
  fi
    if test $gl_cv_func_isnand_no_libm = yes \
     || test $gl_cv_func_isnand_in_libm = yes; then
    gl_func_isnand=yes
  else
    gl_func_isnand=no
    HAVE_ISNAND=0
  fi





  if test $HAVE_ISNAND = 0 || test $REPLACE_ISNAN = 1; then








  gl_LIBOBJS="$gl_LIBOBJS isnand.$ac_objext"




  fi





          GNULIB_ISNAND=1





$as_echo "#define GNULIB_TEST_ISNAND 1" >>confdefs.h





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(double) can be used without linking with libm" >&5
$as_echo_n "checking whether isnan(double) can be used without linking with libm... " >&6; }
if ${gl_cv_func_isnand_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             #if __GNUC__ >= 4
             # undef isnand
             # define isnand(x) __builtin_isnan ((double)(x))
             #else
             # undef isnand
             # define isnand(x) isnan ((double)(x))
             #endif
             double x;
int
main ()
{
return isnand (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_isnand_no_libm=yes
else
  gl_cv_func_isnand_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnand_no_libm" >&5
$as_echo "$gl_cv_func_isnand_no_libm" >&6; }

  gl_func_isnand_no_libm=$gl_cv_func_isnand_no_libm
  if test $gl_cv_func_isnand_no_libm = yes; then

$as_echo "#define HAVE_ISNAND_IN_LIBC 1" >>confdefs.h

  fi

  if test $gl_func_isnand_no_libm != yes; then








  gl_LIBOBJS="$gl_LIBOBJS isnand.$ac_objext"




  fi


  ISNANF_LIBM=

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used without linking with libm" >&5
$as_echo_n "checking whether isnan(float) can be used without linking with libm... " >&6; }
if ${gl_cv_func_isnanf_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             #if __GNUC__ >= 4
             # undef isnanf
             # define isnanf(x) __builtin_isnanf ((float)(x))
             #elif defined isnan
             # undef isnanf
             # define isnanf(x) isnan ((float)(x))
             #endif
             float x;
int
main ()
{
return isnanf (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_isnanf_no_libm=yes
else
  gl_cv_func_isnanf_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_no_libm" >&5
$as_echo "$gl_cv_func_isnanf_no_libm" >&6; }

  if test $gl_cv_func_isnanf_no_libm = no; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used with libm" >&5
$as_echo_n "checking whether isnan(float) can be used with libm... " >&6; }
if ${gl_cv_func_isnanf_in_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      save_LIBS="$LIBS"
      LIBS="$LIBS -lm"
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             #if __GNUC__ >= 4
             # undef isnanf
             # define isnanf(x) __builtin_isnanf ((float)(x))
             #elif defined isnan
             # undef isnanf
             # define isnanf(x) isnan ((float)(x))
             #endif
             float x;
int
main ()
{
return isnanf (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_isnanf_in_libm=yes
else
  gl_cv_func_isnanf_in_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      LIBS="$save_LIBS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_in_libm" >&5
$as_echo "$gl_cv_func_isnanf_in_libm" >&6; }

    if test $gl_cv_func_isnanf_in_libm = yes; then
      ISNANF_LIBM=-lm
    fi
  fi
    if test $gl_cv_func_isnanf_no_libm = yes \
     || test $gl_cv_func_isnanf_in_libm = yes; then
    save_LIBS="$LIBS"
    LIBS="$LIBS $ISNANF_LIBM"



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) works" >&5
$as_echo_n "checking whether isnan(float) works... " >&6; }
if ${gl_cv_func_isnanf_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
           irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;;
           mingw*) # Guess yes on mingw, no on MSVC.
             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef __MINGW32__
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_func_isnanf_works="guessing yes"
else
  gl_cv_func_isnanf_works="guessing no"
fi
rm -f conftest*

             ;;
           *) gl_cv_func_isnanf_works="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <math.h>
#if __GNUC__ >= 4
# undef isnanf
# define isnanf(x) __builtin_isnanf ((float)(x))
#elif defined isnan
# undef isnanf
# define isnanf(x) isnan ((float)(x))
#endif
/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0.  */
#ifdef __DECC
static float
NaN ()
{
  static float zero = 0.0f;
  return zero / zero;
}
#else
# define NaN() (0.0f / 0.0f)
#endif
#define NWORDS \
  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { unsigned int word[NWORDS]; float value; } memory_float;
int main()
{
  int result = 0;

  if (isnanf (1.0f / 0.0f))
    result |= 1;

  if (!isnanf (NaN ()))
    result |= 2;

#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
  /* The isnanf function should be immune against changes in the sign bit and
     in the mantissa bits.  The xor operation twiddles a bit that can only be
     a sign bit or a mantissa bit.  */
  if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0)
    {
      memory_float m;

      m.value = NaN ();
      /* Set the bits below the exponent to 01111...111.  */
      m.word[0] &= -1U << FLT_EXPBIT0_BIT;
      m.word[0] |= 1U << (FLT_EXPBIT0_BIT - 1) - 1;
      if (!isnanf (m.value))
        result |= 4;
    }
#endif

  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_isnanf_works=yes
else
  gl_cv_func_isnanf_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_works" >&5
$as_echo "$gl_cv_func_isnanf_works" >&6; }

    LIBS="$save_LIBS"
    case "$gl_cv_func_isnanf_works" in
      *yes) gl_func_isnanf=yes ;;
      *)    gl_func_isnanf=no; ISNANF_LIBM= ;;
    esac
  else
    gl_func_isnanf=no
  fi
  if test $gl_func_isnanf != yes; then
    HAVE_ISNANF=0
  fi





  if test $HAVE_ISNANF = 0 || test $REPLACE_ISNAN = 1; then








  gl_LIBOBJS="$gl_LIBOBJS isnanf.$ac_objext"



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5
$as_echo_n "checking where to find the exponent in a 'float'... " >&6; }
if ${gl_cv_cc_float_expbit0+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  gl_cv_cc_float_expbit0="word 0 bit 23"
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <float.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#define NWORDS \
  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { float value; unsigned int word[NWORDS]; } memory_float;
static unsigned int ored_words[NWORDS];
static unsigned int anded_words[NWORDS];
static void add_to_ored_words (float x)
{
  memory_float m;
  size_t i;
  /* Clear it first, in case
     sizeof (float) < sizeof (memory_float).  */
  memset (&m, 0, sizeof (memory_float));
  m.value = x;
  for (i = 0; i < NWORDS; i++)
    {
      ored_words[i] |= m.word[i];
      anded_words[i] &= m.word[i];
    }
}
int main ()
{
  size_t j;
  FILE *fp = fopen ("conftest.out", "w");
  if (fp == NULL)
    return 1;
  for (j = 0; j < NWORDS; j++)
    anded_words[j] = ~ (unsigned int) 0;
  add_to_ored_words (0.25f);
  add_to_ored_words (0.5f);
  add_to_ored_words (1.0f);
  add_to_ored_words (2.0f);
  add_to_ored_words (4.0f);
  /* Remove bits that are common (e.g. if representation of the first mantissa
     bit is explicit).  */
  for (j = 0; j < NWORDS; j++)
    ored_words[j] &= ~anded_words[j];
  /* Now find the nonzero word.  */
  for (j = 0; j < NWORDS; j++)
    if (ored_words[j] != 0)
      break;
  if (j < NWORDS)
    {
      size_t i;
      for (i = j + 1; i < NWORDS; i++)
        if (ored_words[i] != 0)
          {
            fprintf (fp, "unknown");
            return (fclose (fp) != 0);
          }
      for (i = 0; ; i++)
        if ((ored_words[j] >> i) & 1)
          {
            fprintf (fp, "word %d bit %d", (int) j, (int) i);
            return (fclose (fp) != 0);
          }
    }
  fprintf (fp, "unknown");
  return (fclose (fp) != 0);
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_cc_float_expbit0=`cat conftest.out`
else
  gl_cv_cc_float_expbit0="unknown"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      rm -f conftest.out

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5
$as_echo "$gl_cv_cc_float_expbit0" >&6; }
  case "$gl_cv_cc_float_expbit0" in
    word*bit*)
      word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
      bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'`

cat >>confdefs.h <<_ACEOF
#define FLT_EXPBIT0_WORD $word
_ACEOF


cat >>confdefs.h <<_ACEOF
#define FLT_EXPBIT0_BIT $bit
_ACEOF

      ;;
  esac


  fi





          GNULIB_ISNANF=1





$as_echo "#define GNULIB_TEST_ISNANF 1" >>confdefs.h





  ISNANL_LIBM=

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used without linking with libm" >&5
$as_echo_n "checking whether isnan(long double) can be used without linking with libm... " >&6; }
if ${gl_cv_func_isnanl_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             #if __GNUC__ >= 4
             # undef isnanl
             # define isnanl(x) __builtin_isnanl ((long double)(x))
             #elif defined isnan
             # undef isnanl
             # define isnanl(x) isnan ((long double)(x))
             #endif
             long double x;
int
main ()
{
return isnanl (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_isnanl_no_libm=yes
else
  gl_cv_func_isnanl_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_no_libm" >&5
$as_echo "$gl_cv_func_isnanl_no_libm" >&6; }

  if test $gl_cv_func_isnanl_no_libm = no; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used with libm" >&5
$as_echo_n "checking whether isnan(long double) can be used with libm... " >&6; }
if ${gl_cv_func_isnanl_in_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      save_LIBS="$LIBS"
      LIBS="$LIBS -lm"
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             #if __GNUC__ >= 4
             # undef isnanl
             # define isnanl(x) __builtin_isnanl ((long double)(x))
             #elif defined isnan
             # undef isnanl
             # define isnanl(x) isnan ((long double)(x))
             #endif
             long double x;
int
main ()
{
return isnanl (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_isnanl_in_libm=yes
else
  gl_cv_func_isnanl_in_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      LIBS="$save_LIBS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_in_libm" >&5
$as_echo "$gl_cv_func_isnanl_in_libm" >&6; }

    if test $gl_cv_func_isnanl_in_libm = yes; then
      ISNANL_LIBM=-lm
    fi
  fi
    if test $gl_cv_func_isnanl_no_libm = yes \
     || test $gl_cv_func_isnanl_in_libm = yes; then
    save_LIBS="$LIBS"
    LIBS="$LIBS $ISNANL_LIBM"




     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnanl works" >&5
$as_echo_n "checking whether isnanl works... " >&6; }
if ${gl_cv_func_isnanl_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
           mingw*) # Guess yes on mingw, no on MSVC.
             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef __MINGW32__
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_func_isnanl_works="guessing yes"
else
  gl_cv_func_isnanl_works="guessing no"
fi
rm -f conftest*

             ;;
           *) gl_cv_func_isnanl_works="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <float.h>
#include <limits.h>
#include <math.h>
#if __GNUC__ >= 4
# undef isnanl
# define isnanl(x) __builtin_isnanl ((long double)(x))
#elif defined isnan
# undef isnanl
# define isnanl(x) isnan ((long double)(x))
#endif
#define NWORDS \
  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { unsigned int word[NWORDS]; long double value; }
        memory_long_double;
/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
   runtime type conversion.  */
#ifdef __sgi
static long double NaNl ()
{
  double zero = 0.0;
  return zero / zero;
}
#else
# define NaNl() (0.0L / 0.0L)
#endif
int main ()
{
  int result = 0;

  if (!isnanl (NaNl ()))
    result |= 1;

  {
    memory_long_double m;
    unsigned int i;

    /* The isnanl function should be immune against changes in the sign bit and
       in the mantissa bits.  The xor operation twiddles a bit that can only be
       a sign bit or a mantissa bit (since the exponent never extends to
       bit 31).  */
    m.value = NaNl ();
    m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
    for (i = 0; i < NWORDS; i++)
      m.word[i] |= 1;
    if (!isnanl (m.value))
      result |= 1;
  }

#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
/* Representation of an 80-bit 'long double' as an initializer for a sequence
   of 'unsigned int' words.  */
# ifdef WORDS_BIGENDIAN
#  define LDBL80_WORDS(exponent,manthi,mantlo) \
     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
       ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16),   \
       (unsigned int) (mantlo) << 16                                        \
     }
# else
#  define LDBL80_WORDS(exponent,manthi,mantlo) \
     { mantlo, manthi, exponent }
# endif
  { /* Quiet NaN.  */
    static memory_long_double x =
      { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
    if (!isnanl (x.value))
      result |= 2;
  }
  {
    /* Signalling NaN.  */
    static memory_long_double x =
      { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
    if (!isnanl (x.value))
      result |= 2;
  }
  /* isnanl should return something even for noncanonical values.  */
  { /* Pseudo-NaN.  */
    static memory_long_double x =
      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
    if (isnanl (x.value) && !isnanl (x.value))
      result |= 4;
  }
  { /* Pseudo-Infinity.  */
    static memory_long_double x =
      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
    if (isnanl (x.value) && !isnanl (x.value))
      result |= 8;
  }
  { /* Pseudo-Zero.  */
    static memory_long_double x =
      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
    if (isnanl (x.value) && !isnanl (x.value))
      result |= 16;
  }
  { /* Unnormalized number.  */
    static memory_long_double x =
      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
    if (isnanl (x.value) && !isnanl (x.value))
      result |= 32;
  }
  { /* Pseudo-Denormal.  */
    static memory_long_double x =
      { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
    if (isnanl (x.value) && !isnanl (x.value))
      result |= 64;
  }
#endif

  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_isnanl_works=yes
else
  gl_cv_func_isnanl_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_works" >&5
$as_echo "$gl_cv_func_isnanl_works" >&6; }

    LIBS="$save_LIBS"
    case "$gl_cv_func_isnanl_works" in
      *yes) gl_func_isnanl=yes ;;
      *)    gl_func_isnanl=no; ISNANL_LIBM= ;;
    esac
  else
    gl_func_isnanl=no
  fi
  if test $gl_func_isnanl != yes; then
    HAVE_ISNANL=0
  fi





  if test $HAVE_ISNANL = 0 || test $REPLACE_ISNAN = 1; then








  gl_LIBOBJS="$gl_LIBOBJS isnanl.$ac_objext"




     { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'long double'" >&5
$as_echo_n "checking where to find the exponent in a 'long double'... " >&6; }
if ${gl_cv_cc_long_double_expbit0+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

                              gl_cv_cc_long_double_expbit0="unknown"
          case "$host_os" in
            mingw*) # On native Windows (little-endian), we know the result
                    # in two cases: mingw, MSVC.
              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef __MINGW32__
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_cc_long_double_expbit0="word 2 bit 0"
fi
rm -f conftest*

              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef _MSC_VER
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_cc_long_double_expbit0="word 1 bit 20"
fi
rm -f conftest*

              ;;
          esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <float.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#define NWORDS \
  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { long double value; unsigned int word[NWORDS]; }
        memory_long_double;
static unsigned int ored_words[NWORDS];
static unsigned int anded_words[NWORDS];
static void add_to_ored_words (long double x)
{
  memory_long_double m;
  size_t i;
  /* Clear it first, in case
     sizeof (long double) < sizeof (memory_long_double).  */
  memset (&m, 0, sizeof (memory_long_double));
  m.value = x;
  for (i = 0; i < NWORDS; i++)
    {
      ored_words[i] |= m.word[i];
      anded_words[i] &= m.word[i];
    }
}
int main ()
{
  size_t j;
  FILE *fp = fopen ("conftest.out", "w");
  if (fp == NULL)
    return 1;
  for (j = 0; j < NWORDS; j++)
    anded_words[j] = ~ (unsigned int) 0;
  add_to_ored_words (0.25L);
  add_to_ored_words (0.5L);
  add_to_ored_words (1.0L);
  add_to_ored_words (2.0L);
  add_to_ored_words (4.0L);
  /* Remove bits that are common (e.g. if representation of the first mantissa
     bit is explicit).  */
  for (j = 0; j < NWORDS; j++)
    ored_words[j] &= ~anded_words[j];
  /* Now find the nonzero word.  */
  for (j = 0; j < NWORDS; j++)
    if (ored_words[j] != 0)
      break;
  if (j < NWORDS)
    {
      size_t i;
      for (i = j + 1; i < NWORDS; i++)
        if (ored_words[i] != 0)
          {
            fprintf (fp, "unknown");
            return (fclose (fp) != 0);
          }
      for (i = 0; ; i++)
        if ((ored_words[j] >> i) & 1)
          {
            fprintf (fp, "word %d bit %d", (int) j, (int) i);
            return (fclose (fp) != 0);
          }
    }
  fprintf (fp, "unknown");
  return (fclose (fp) != 0);
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_cc_long_double_expbit0=`cat conftest.out`
else
  gl_cv_cc_long_double_expbit0="unknown"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      rm -f conftest.out

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_expbit0" >&5
$as_echo "$gl_cv_cc_long_double_expbit0" >&6; }
  case "$gl_cv_cc_long_double_expbit0" in
    word*bit*)
      word=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
      bit=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word.*bit //'`

cat >>confdefs.h <<_ACEOF
#define LDBL_EXPBIT0_WORD $word
_ACEOF


cat >>confdefs.h <<_ACEOF
#define LDBL_EXPBIT0_BIT $bit
_ACEOF

      ;;
  esac



  fi





          GNULIB_ISNANL=1





$as_echo "#define GNULIB_TEST_ISNANL 1" >>confdefs.h





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(long double) can be used without linking with libm" >&5
$as_echo_n "checking whether isnan(long double) can be used without linking with libm... " >&6; }
if ${gl_cv_func_isnanl_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             #if __GNUC__ >= 4
             # undef isnanl
             # define isnanl(x) __builtin_isnanl ((long double)(x))
             #elif defined isnan
             # undef isnanl
             # define isnanl(x) isnan ((long double)(x))
             #endif
             long double x;
int
main ()
{
return isnanl (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_isnanl_no_libm=yes
else
  gl_cv_func_isnanl_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_no_libm" >&5
$as_echo "$gl_cv_func_isnanl_no_libm" >&6; }

  gl_func_isnanl_no_libm=$gl_cv_func_isnanl_no_libm
  if test $gl_func_isnanl_no_libm = yes; then




     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnanl works" >&5
$as_echo_n "checking whether isnanl works... " >&6; }
if ${gl_cv_func_isnanl_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
           mingw*) # Guess yes on mingw, no on MSVC.
             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef __MINGW32__
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_func_isnanl_works="guessing yes"
else
  gl_cv_func_isnanl_works="guessing no"
fi
rm -f conftest*

             ;;
           *) gl_cv_func_isnanl_works="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <float.h>
#include <limits.h>
#include <math.h>
#if __GNUC__ >= 4
# undef isnanl
# define isnanl(x) __builtin_isnanl ((long double)(x))
#elif defined isnan
# undef isnanl
# define isnanl(x) isnan ((long double)(x))
#endif
#define NWORDS \
  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { unsigned int word[NWORDS]; long double value; }
        memory_long_double;
/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
   runtime type conversion.  */
#ifdef __sgi
static long double NaNl ()
{
  double zero = 0.0;
  return zero / zero;
}
#else
# define NaNl() (0.0L / 0.0L)
#endif
int main ()
{
  int result = 0;

  if (!isnanl (NaNl ()))
    result |= 1;

  {
    memory_long_double m;
    unsigned int i;

    /* The isnanl function should be immune against changes in the sign bit and
       in the mantissa bits.  The xor operation twiddles a bit that can only be
       a sign bit or a mantissa bit (since the exponent never extends to
       bit 31).  */
    m.value = NaNl ();
    m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
    for (i = 0; i < NWORDS; i++)
      m.word[i] |= 1;
    if (!isnanl (m.value))
      result |= 1;
  }

#if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
/* Representation of an 80-bit 'long double' as an initializer for a sequence
   of 'unsigned int' words.  */
# ifdef WORDS_BIGENDIAN
#  define LDBL80_WORDS(exponent,manthi,mantlo) \
     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
       ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16),   \
       (unsigned int) (mantlo) << 16                                        \
     }
# else
#  define LDBL80_WORDS(exponent,manthi,mantlo) \
     { mantlo, manthi, exponent }
# endif
  { /* Quiet NaN.  */
    static memory_long_double x =
      { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
    if (!isnanl (x.value))
      result |= 2;
  }
  {
    /* Signalling NaN.  */
    static memory_long_double x =
      { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
    if (!isnanl (x.value))
      result |= 2;
  }
  /* isnanl should return something even for noncanonical values.  */
  { /* Pseudo-NaN.  */
    static memory_long_double x =
      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
    if (isnanl (x.value) && !isnanl (x.value))
      result |= 4;
  }
  { /* Pseudo-Infinity.  */
    static memory_long_double x =
      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
    if (isnanl (x.value) && !isnanl (x.value))
      result |= 8;
  }
  { /* Pseudo-Zero.  */
    static memory_long_double x =
      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
    if (isnanl (x.value) && !isnanl (x.value))
      result |= 16;
  }
  { /* Unnormalized number.  */
    static memory_long_double x =
      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
    if (isnanl (x.value) && !isnanl (x.value))
      result |= 32;
  }
  { /* Pseudo-Denormal.  */
    static memory_long_double x =
      { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
    if (isnanl (x.value) && !isnanl (x.value))
      result |= 64;
  }
#endif

  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_isnanl_works=yes
else
  gl_cv_func_isnanl_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanl_works" >&5
$as_echo "$gl_cv_func_isnanl_works" >&6; }

    case "$gl_cv_func_isnanl_works" in
      *yes) ;;
      *)    gl_func_isnanl_no_libm=no ;;
    esac
  fi
  if test $gl_func_isnanl_no_libm = yes; then

$as_echo "#define HAVE_ISNANL_IN_LIBC 1" >>confdefs.h

  fi

  if test $gl_func_isnanl_no_libm != yes; then








  gl_LIBOBJS="$gl_LIBOBJS isnanl.$ac_objext"




     { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'long double'" >&5
$as_echo_n "checking where to find the exponent in a 'long double'... " >&6; }
if ${gl_cv_cc_long_double_expbit0+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

                              gl_cv_cc_long_double_expbit0="unknown"
          case "$host_os" in
            mingw*) # On native Windows (little-endian), we know the result
                    # in two cases: mingw, MSVC.
              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef __MINGW32__
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_cc_long_double_expbit0="word 2 bit 0"
fi
rm -f conftest*

              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef _MSC_VER
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_cc_long_double_expbit0="word 1 bit 20"
fi
rm -f conftest*

              ;;
          esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <float.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#define NWORDS \
  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { long double value; unsigned int word[NWORDS]; }
        memory_long_double;
static unsigned int ored_words[NWORDS];
static unsigned int anded_words[NWORDS];
static void add_to_ored_words (long double x)
{
  memory_long_double m;
  size_t i;
  /* Clear it first, in case
     sizeof (long double) < sizeof (memory_long_double).  */
  memset (&m, 0, sizeof (memory_long_double));
  m.value = x;
  for (i = 0; i < NWORDS; i++)
    {
      ored_words[i] |= m.word[i];
      anded_words[i] &= m.word[i];
    }
}
int main ()
{
  size_t j;
  FILE *fp = fopen ("conftest.out", "w");
  if (fp == NULL)
    return 1;
  for (j = 0; j < NWORDS; j++)
    anded_words[j] = ~ (unsigned int) 0;
  add_to_ored_words (0.25L);
  add_to_ored_words (0.5L);
  add_to_ored_words (1.0L);
  add_to_ored_words (2.0L);
  add_to_ored_words (4.0L);
  /* Remove bits that are common (e.g. if representation of the first mantissa
     bit is explicit).  */
  for (j = 0; j < NWORDS; j++)
    ored_words[j] &= ~anded_words[j];
  /* Now find the nonzero word.  */
  for (j = 0; j < NWORDS; j++)
    if (ored_words[j] != 0)
      break;
  if (j < NWORDS)
    {
      size_t i;
      for (i = j + 1; i < NWORDS; i++)
        if (ored_words[i] != 0)
          {
            fprintf (fp, "unknown");
            return (fclose (fp) != 0);
          }
      for (i = 0; ; i++)
        if ((ored_words[j] >> i) & 1)
          {
            fprintf (fp, "word %d bit %d", (int) j, (int) i);
            return (fclose (fp) != 0);
          }
    }
  fprintf (fp, "unknown");
  return (fclose (fp) != 0);
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_cc_long_double_expbit0=`cat conftest.out`
else
  gl_cv_cc_long_double_expbit0="unknown"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      rm -f conftest.out

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_expbit0" >&5
$as_echo "$gl_cv_cc_long_double_expbit0" >&6; }
  case "$gl_cv_cc_long_double_expbit0" in
    word*bit*)
      word=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
      bit=`echo "$gl_cv_cc_long_double_expbit0" | sed -e 's/word.*bit //'`

cat >>confdefs.h <<_ACEOF
#define LDBL_EXPBIT0_WORD $word
_ACEOF


cat >>confdefs.h <<_ACEOF
#define LDBL_EXPBIT0_BIT $bit
_ACEOF

      ;;
  esac



  fi





  ac_fn_c_check_decl "$LINENO" "iswblank" "ac_cv_have_decl_iswblank" "
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
   before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
#include <wctype.h>

"
if test "x$ac_cv_have_decl_iswblank" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_ISWBLANK $ac_have_decl
_ACEOF

  if test $ac_cv_func_iswblank = no; then
    HAVE_ISWBLANK=0
    if test $ac_cv_have_decl_iswblank = yes; then
      REPLACE_ISWBLANK=1
    fi
  fi
  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
        :
  else
    if test $HAVE_ISWBLANK = 0 || test $REPLACE_ISWBLANK = 1; then
            :
    fi
  fi


  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
    :
  else
    if test $HAVE_ISWBLANK = 0 || test $REPLACE_ISWBLANK = 1; then








  gl_LIBOBJS="$gl_LIBOBJS iswblank.$ac_objext"

    fi
  fi





          GNULIB_ISWBLANK=1





$as_echo "#define GNULIB_TEST_ISWBLANK 1" >>confdefs.h



  # You need to invoke gt_JAVACOMP yourself, possibly with arguments.
  ac_config_files="$ac_config_files javacomp.sh:build-aux/javacomp.sh.in"

  # You need to invoke gt_JAVAEXEC yourself, possibly with arguments.
  ac_config_files="$ac_config_files javaexec.sh:build-aux/javaexec.sh.in"








      ac_fn_c_check_decl "$LINENO" "ldexpl" "ac_cv_have_decl_ldexpl" "#include <math.h>
"
if test "x$ac_cv_have_decl_ldexpl" = xyes; then :

else
  HAVE_DECL_LDEXPL=0
fi


  LDEXPL_LIBM=
  if test $HAVE_DECL_LDEXPL = 1; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexpl() can be used without linking with libm" >&5
$as_echo_n "checking whether ldexpl() can be used without linking with libm... " >&6; }
if ${gl_cv_func_ldexpl_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             long double x;
int
main ()
{
return ldexpl (x, -1) > 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_ldexpl_no_libm=yes
else
  gl_cv_func_ldexpl_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_no_libm" >&5
$as_echo "$gl_cv_func_ldexpl_no_libm" >&6; }

    if test $gl_cv_func_ldexpl_no_libm = no; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexpl() can be used with libm" >&5
$as_echo_n "checking whether ldexpl() can be used with libm... " >&6; }
if ${gl_cv_func_ldexpl_in_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

          save_LIBS="$LIBS"
          LIBS="$LIBS -lm"
          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
                 long double x;
int
main ()
{
return ldexpl (x, -1) > 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_ldexpl_in_libm=yes
else
  gl_cv_func_ldexpl_in_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
          LIBS="$save_LIBS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_in_libm" >&5
$as_echo "$gl_cv_func_ldexpl_in_libm" >&6; }
      if test $gl_cv_func_ldexpl_in_libm = yes; then
        LDEXPL_LIBM=-lm
      fi
    fi
    if test $gl_cv_func_ldexpl_no_libm = yes \
       || test $gl_cv_func_ldexpl_in_libm = yes; then
      save_LIBS="$LIBS"
      LIBS="$LIBS $LDEXPL_LIBM"


     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexpl works" >&5
$as_echo_n "checking whether ldexpl works... " >&6; }
if ${gl_cv_func_ldexpl_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
           aix | aix[3-6]*) gl_cv_func_ldexpl_works="guessing no" ;;
                            # Guess yes on native Windows.
           mingw*)          gl_cv_func_ldexpl_works="guessing yes" ;;
           *)               gl_cv_func_ldexpl_works="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <math.h>
extern
#ifdef __cplusplus
"C"
#endif
long double ldexpl (long double, int);
int main()
{
  int result = 0;
  {
    volatile long double x = 1.0;
    volatile long double y = ldexpl (x, -1);
    if (y != 0.5L)
      result |= 1;
  }
  {
    volatile long double x = 1.73205L;
    volatile long double y = ldexpl (x, 0);
    if (y != x)
      result |= 2;
  }
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_ldexpl_works=yes
else
  gl_cv_func_ldexpl_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_works" >&5
$as_echo "$gl_cv_func_ldexpl_works" >&6; }

      LIBS="$save_LIBS"
      case "$gl_cv_func_ldexpl_works" in
        *yes) gl_func_ldexpl=yes ;;
        *)    gl_func_ldexpl=no; REPLACE_LDEXPL=1 ;;
      esac
    else
      gl_func_ldexpl=no
    fi
    if test $gl_func_ldexpl = yes; then

$as_echo "#define HAVE_LDEXPL 1" >>confdefs.h

    fi
  fi
  if test $HAVE_DECL_LDEXPL = 0 || test $gl_func_ldexpl = no; then
        if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then

      LDEXPL_LIBM="$LDEXP_LIBM"
    else
      LDEXPL_LIBM="$ISNANL_LIBM"
    fi
  fi


  if test $HAVE_DECL_LDEXPL = 0 || test $gl_func_ldexpl = no; then








  gl_LIBOBJS="$gl_LIBOBJS ldexpl.$ac_objext"

  fi





          GNULIB_LDEXPL=1





$as_echo "#define GNULIB_TEST_LDEXPL 1" >>confdefs.h
















    use_additional=yes

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"

    eval additional_includedir=\"$includedir\"
    eval additional_libdir=\"$libdir\"
    eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
    eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"

  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"


# Check whether --with-libtextstyle-prefix was given.
if test "${with_libtextstyle_prefix+set}" = set; then :
  withval=$with_libtextstyle_prefix;
    if test "X$withval" = "Xno"; then
      use_additional=no
    else
      if test "X$withval" = "X"; then

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"

          eval additional_includedir=\"$includedir\"
          eval additional_libdir=\"$libdir\"
          eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
          eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"

  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

      else
        additional_includedir="$withval/include"
        additional_libdir="$withval/$acl_libdirstem"
        additional_libdir2="$withval/$acl_libdirstem2"
        additional_libdir3="$withval/$acl_libdirstem3"
      fi
    fi

fi

  if test "X$additional_libdir2" = "X$additional_libdir"; then
    additional_libdir2=
  fi
  if test "X$additional_libdir3" = "X$additional_libdir"; then
    additional_libdir3=
  fi
      LIBTEXTSTYLE=
  LTLIBTEXTSTYLE=
  INCTEXTSTYLE=
  LIBTEXTSTYLE_PREFIX=
      HAVE_LIBTEXTSTYLE=
  rpathdirs=
  ltrpathdirs=
  names_already_handled=
  names_next_round='textstyle '
  while test -n "$names_next_round"; do
    names_this_round="$names_next_round"
    names_next_round=
    for name in $names_this_round; do
      already_handled=
      for n in $names_already_handled; do
        if test "$n" = "$name"; then
          already_handled=yes
          break
        fi
      done
      if test -z "$already_handled"; then
        names_already_handled="$names_already_handled $name"
                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
        eval value=\"\$HAVE_LIB$uppername\"
        if test -n "$value"; then
          if test "$value" = yes; then
            eval value=\"\$LIB$uppername\"
            test -z "$value" || LIBTEXTSTYLE="${LIBTEXTSTYLE}${LIBTEXTSTYLE:+ }$value"
            eval value=\"\$LTLIB$uppername\"
            test -z "$value" || LTLIBTEXTSTYLE="${LTLIBTEXTSTYLE}${LTLIBTEXTSTYLE:+ }$value"
          else
                                    :
          fi
        else
                              found_dir=
          found_la=
          found_so=
          found_a=
          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
          if test -n "$acl_shlibext"; then
            shrext=".$acl_shlibext"             # typically: shrext=.so
          else
            shrext=
          fi
          if test $use_additional = yes; then
            for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
              if test "X$found_dir" = "X"; then
                eval dir=\$$additional_libdir_variable
                if test -n "$dir"; then
                                                      if test -n "$acl_shlibext"; then
                    if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
                      found_dir="$dir"
                      found_so="$dir/$libname$shrext"
                    else
                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
                        ver=`(cd "$dir" && \
                              for f in "$libname$shrext".*; do echo "$f"; done \
                              | sed -e "s,^$libname$shrext\\\\.,," \
                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
                              | sed 1q ) 2>/dev/null`
                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
                          found_dir="$dir"
                          found_so="$dir/$libname$shrext.$ver"
                        fi
                      else
                        eval library_names=\"$acl_library_names_spec\"
                        for f in $library_names; do
                          if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
                            found_dir="$dir"
                            found_so="$dir/$f"
                            break
                          fi
                        done
                      fi
                    fi
                  fi
                                    if test "X$found_dir" = "X"; then
                    if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
                      found_dir="$dir"
                      found_a="$dir/$libname.$acl_libext"
                    fi
                  fi
                  if test "X$found_dir" != "X"; then
                    if test -f "$dir/$libname.la"; then
                      found_la="$dir/$libname.la"
                    fi
                  fi
                fi
              fi
            done
          fi
          if test "X$found_dir" = "X"; then
            for x in $LDFLAGS $LTLIBTEXTSTYLE; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

              case "$x" in
                -L*)
                  dir=`echo "X$x" | sed -e 's/^X-L//'`
                                    if test -n "$acl_shlibext"; then
                    if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
                      found_dir="$dir"
                      found_so="$dir/$libname$shrext"
                    else
                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
                        ver=`(cd "$dir" && \
                              for f in "$libname$shrext".*; do echo "$f"; done \
                              | sed -e "s,^$libname$shrext\\\\.,," \
                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
                              | sed 1q ) 2>/dev/null`
                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
                          found_dir="$dir"
                          found_so="$dir/$libname$shrext.$ver"
                        fi
                      else
                        eval library_names=\"$acl_library_names_spec\"
                        for f in $library_names; do
                          if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
                            found_dir="$dir"
                            found_so="$dir/$f"
                            break
                          fi
                        done
                      fi
                    fi
                  fi
                                    if test "X$found_dir" = "X"; then
                    if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
                      found_dir="$dir"
                      found_a="$dir/$libname.$acl_libext"
                    fi
                  fi
                  if test "X$found_dir" != "X"; then
                    if test -f "$dir/$libname.la"; then
                      found_la="$dir/$libname.la"
                    fi
                  fi
                  ;;
              esac
              if test "X$found_dir" != "X"; then
                break
              fi
            done
          fi
          if test "X$found_dir" != "X"; then
                        LTLIBTEXTSTYLE="${LTLIBTEXTSTYLE}${LTLIBTEXTSTYLE:+ }-L$found_dir -l$name"
            if test "X$found_so" != "X"; then
                                                        if test "$enable_rpath" = no \
                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
                 || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
                 || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
                                LIBTEXTSTYLE="${LIBTEXTSTYLE}${LIBTEXTSTYLE:+ }$found_so"
              else
                                                                                haveit=
                for x in $ltrpathdirs; do
                  if test "X$x" = "X$found_dir"; then
                    haveit=yes
                    break
                  fi
                done
                if test -z "$haveit"; then
                  ltrpathdirs="$ltrpathdirs $found_dir"
                fi
                                if test "$acl_hardcode_direct" = yes; then
                                                      LIBTEXTSTYLE="${LIBTEXTSTYLE}${LIBTEXTSTYLE:+ }$found_so"
                else
                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
                                                            LIBTEXTSTYLE="${LIBTEXTSTYLE}${LIBTEXTSTYLE:+ }$found_so"
                                                            haveit=
                    for x in $rpathdirs; do
                      if test "X$x" = "X$found_dir"; then
                        haveit=yes
                        break
                      fi
                    done
                    if test -z "$haveit"; then
                      rpathdirs="$rpathdirs $found_dir"
                    fi
                  else
                                                                                haveit=
                    for x in $LDFLAGS $LIBTEXTSTYLE; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                      if test "X$x" = "X-L$found_dir"; then
                        haveit=yes
                        break
                      fi
                    done
                    if test -z "$haveit"; then
                      LIBTEXTSTYLE="${LIBTEXTSTYLE}${LIBTEXTSTYLE:+ }-L$found_dir"
                    fi
                    if test "$acl_hardcode_minus_L" != no; then
                                                                                        LIBTEXTSTYLE="${LIBTEXTSTYLE}${LIBTEXTSTYLE:+ }$found_so"
                    else
                                                                                                                                                                                LIBTEXTSTYLE="${LIBTEXTSTYLE}${LIBTEXTSTYLE:+ }-l$name"
                    fi
                  fi
                fi
              fi
            else
              if test "X$found_a" != "X"; then
                                LIBTEXTSTYLE="${LIBTEXTSTYLE}${LIBTEXTSTYLE:+ }$found_a"
              else
                                                LIBTEXTSTYLE="${LIBTEXTSTYLE}${LIBTEXTSTYLE:+ }-L$found_dir -l$name"
              fi
            fi
                        additional_includedir=
            case "$found_dir" in
              */$acl_libdirstem | */$acl_libdirstem/)
                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
                if test "$name" = 'textstyle'; then
                  LIBTEXTSTYLE_PREFIX="$basedir"
                fi
                additional_includedir="$basedir/include"
                ;;
              */$acl_libdirstem2 | */$acl_libdirstem2/)
                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
                if test "$name" = 'textstyle'; then
                  LIBTEXTSTYLE_PREFIX="$basedir"
                fi
                additional_includedir="$basedir/include"
                ;;
              */$acl_libdirstem3 | */$acl_libdirstem3/)
                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
                if test "$name" = 'textstyle'; then
                  LIBTEXTSTYLE_PREFIX="$basedir"
                fi
                additional_includedir="$basedir/include"
                ;;
            esac
            if test "X$additional_includedir" != "X"; then
                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
                haveit=
                if test "X$additional_includedir" = "X/usr/local/include"; then
                  if test -n "$GCC"; then
                    case $host_os in
                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
                    esac
                  fi
                fi
                if test -z "$haveit"; then
                  for x in $CPPFLAGS $INCTEXTSTYLE; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                    if test "X$x" = "X-I$additional_includedir"; then
                      haveit=yes
                      break
                    fi
                  done
                  if test -z "$haveit"; then
                    if test -d "$additional_includedir"; then
                                            INCTEXTSTYLE="${INCTEXTSTYLE}${INCTEXTSTYLE:+ }-I$additional_includedir"
                    fi
                  fi
                fi
              fi
            fi
                        if test -n "$found_la"; then
                                                        save_libdir="$libdir"
              case "$found_la" in
                */* | *\\*) . "$found_la" ;;
                *) . "./$found_la" ;;
              esac
              libdir="$save_libdir"
                            for dep in $dependency_libs; do
                case "$dep" in
                  -L*)
                    dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
                                                                                                                                                                if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \
                       && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
                       && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
                      haveit=
                      if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
                         || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
                         || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
                        if test -n "$GCC"; then
                          case $host_os in
                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
                          esac
                        fi
                      fi
                      if test -z "$haveit"; then
                        haveit=
                        for x in $LDFLAGS $LIBTEXTSTYLE; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                          if test "X$x" = "X-L$dependency_libdir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          if test -d "$dependency_libdir"; then
                                                        LIBTEXTSTYLE="${LIBTEXTSTYLE}${LIBTEXTSTYLE:+ }-L$dependency_libdir"
                          fi
                        fi
                        haveit=
                        for x in $LDFLAGS $LTLIBTEXTSTYLE; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                          if test "X$x" = "X-L$dependency_libdir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          if test -d "$dependency_libdir"; then
                                                        LTLIBTEXTSTYLE="${LTLIBTEXTSTYLE}${LTLIBTEXTSTYLE:+ }-L$dependency_libdir"
                          fi
                        fi
                      fi
                    fi
                    ;;
                  -R*)
                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
                    if test "$enable_rpath" != no; then
                                                                  haveit=
                      for x in $rpathdirs; do
                        if test "X$x" = "X$dir"; then
                          haveit=yes
                          break
                        fi
                      done
                      if test -z "$haveit"; then
                        rpathdirs="$rpathdirs $dir"
                      fi
                                                                  haveit=
                      for x in $ltrpathdirs; do
                        if test "X$x" = "X$dir"; then
                          haveit=yes
                          break
                        fi
                      done
                      if test -z "$haveit"; then
                        ltrpathdirs="$ltrpathdirs $dir"
                      fi
                    fi
                    ;;
                  -l*)
                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
                    ;;
                  *.la)
                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
                    ;;
                  *)
                                        LIBTEXTSTYLE="${LIBTEXTSTYLE}${LIBTEXTSTYLE:+ }$dep"
                    LTLIBTEXTSTYLE="${LTLIBTEXTSTYLE}${LTLIBTEXTSTYLE:+ }$dep"
                    ;;
                esac
              done
            fi
          else
                                                            LIBTEXTSTYLE="${LIBTEXTSTYLE}${LIBTEXTSTYLE:+ }-l$name"
            LTLIBTEXTSTYLE="${LTLIBTEXTSTYLE}${LTLIBTEXTSTYLE:+ }-l$name"
          fi
        fi
      fi
    done
  done
  if test "X$rpathdirs" != "X"; then
    if test -n "$acl_hardcode_libdir_separator"; then
                        alldirs=
      for found_dir in $rpathdirs; do
        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
      done
            acl_save_libdir="$libdir"
      libdir="$alldirs"
      eval flag=\"$acl_hardcode_libdir_flag_spec\"
      libdir="$acl_save_libdir"
      LIBTEXTSTYLE="${LIBTEXTSTYLE}${LIBTEXTSTYLE:+ }$flag"
    else
            for found_dir in $rpathdirs; do
        acl_save_libdir="$libdir"
        libdir="$found_dir"
        eval flag=\"$acl_hardcode_libdir_flag_spec\"
        libdir="$acl_save_libdir"
        LIBTEXTSTYLE="${LIBTEXTSTYLE}${LIBTEXTSTYLE:+ }$flag"
      done
    fi
  fi
  if test "X$ltrpathdirs" != "X"; then
            for found_dir in $ltrpathdirs; do
      LTLIBTEXTSTYLE="${LTLIBTEXTSTYLE}${LTLIBTEXTSTYLE:+ }-R$found_dir"
    done
  fi






        ac_save_CPPFLAGS="$CPPFLAGS"

  for element in $INCTEXTSTYLE; do
    haveit=
    for x in $CPPFLAGS; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

      if test "X$x" = "X$element"; then
        haveit=yes
        break
      fi
    done
    if test -z "$haveit"; then
      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
    fi
  done


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libtextstyle" >&5
$as_echo_n "checking for libtextstyle... " >&6; }
if ${ac_cv_libtextstyle+:} false; then :
  $as_echo_n "(cached) " >&6
else

    ac_save_LIBS="$LIBS"
                                case " $LIBTEXTSTYLE" in
      *" -l"*) LIBS="$LIBS $LIBTEXTSTYLE" ;;
      *)       LIBS="$LIBTEXTSTYLE $LIBS" ;;
    esac
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <textstyle.h>
int
main ()
{
term_styled_ostream_create(1,"",TTYCTL_AUTO,"");
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_libtextstyle=yes
else
  ac_cv_libtextstyle='no'
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    LIBS="$ac_save_LIBS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libtextstyle" >&5
$as_echo "$ac_cv_libtextstyle" >&6; }
  if test "$ac_cv_libtextstyle" = yes; then
    HAVE_LIBTEXTSTYLE=yes

$as_echo "#define HAVE_LIBTEXTSTYLE 1" >>confdefs.h

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libtextstyle" >&5
$as_echo_n "checking how to link with libtextstyle... " >&6; }
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBTEXTSTYLE" >&5
$as_echo "$LIBTEXTSTYLE" >&6; }
  else
    HAVE_LIBTEXTSTYLE=no
            CPPFLAGS="$ac_save_CPPFLAGS"
    LIBTEXTSTYLE=
    LTLIBTEXTSTYLE=
    LIBTEXTSTYLE_PREFIX=
  fi










  if test $HAVE_LIBTEXTSTYLE = yes; then
    TEXTSTYLE_H=
  else
    TEXTSTYLE_H=textstyle.h


  fi

   if test -n "$TEXTSTYLE_H"; then
  GL_GENERATE_TEXTSTYLE_H_TRUE=
  GL_GENERATE_TEXTSTYLE_H_FALSE='#'
else
  GL_GENERATE_TEXTSTYLE_H_TRUE='#'
  GL_GENERATE_TEXTSTYLE_H_FALSE=
fi






    LOCALCHARSET_TESTS_ENVIRONMENT=



  if test "$gl_threads_api" = posix; then
    # OSF/1 4.0 and Mac OS X 10.1 lack the pthread_rwlock_t type and the
    # pthread_rwlock_* functions.
    has_rwlock=false
    ac_fn_c_check_type "$LINENO" "pthread_rwlock_t" "ac_cv_type_pthread_rwlock_t" "#include <pthread.h>
"
if test "x$ac_cv_type_pthread_rwlock_t" = xyes; then :
  has_rwlock=true

$as_echo "#define HAVE_PTHREAD_RWLOCK 1" >>confdefs.h

fi

    if $has_rwlock; then


     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthread_rwlock_rdlock prefers a writer to a reader" >&5
$as_echo_n "checking whether pthread_rwlock_rdlock prefers a writer to a reader... " >&6; }
if ${gl_cv_pthread_rwlock_rdlock_prefer_writer+:} false; then :
  $as_echo_n "(cached) " >&6
else
  save_LIBS="$LIBS"
     LIBS="$LIBS $LIBMULTITHREAD"
     if test "$cross_compiling" = yes; then :
  case "$host_os" in
                         # Guess no on glibc systems.
          *-gnu* | gnu*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;;
                         # Guess no on musl systems.
          *-musl*)       gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;;
                         # Guess no on bionic systems.
          *-android*)    gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;;
                         # Guess yes on native Windows with the mingw-w64 winpthreads library.
                         # Guess no on native Windows with the gnulib windows-rwlock module.
          mingw*)        if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
                           gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing yes"
                         else
                           gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no"
                         fi
                         ;;
                         # If we don't know, obey --enable-cross-guesses.
          *)             gl_cv_pthread_rwlock_rdlock_prefer_writer="$gl_cross_guess_normal" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <errno.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

#define SUCCEED() exit (0)
#define FAILURE() exit (1)
#define UNEXPECTED(n) (exit (10 + (n)))

/* The main thread creates the waiting writer and the requesting reader threads
   in the default way; this guarantees that they have the same priority.
   We can reuse the main thread as first reader thread.  */

static pthread_rwlock_t lock;
static pthread_t reader1;
static pthread_t writer;
static pthread_t reader2;
static pthread_t timer;
/* Used to pass control from writer to reader2 and from reader2 to timer,
   as in a relay race.
   Passing control from one running thread to another running thread
   is most likely faster than to create the second thread.  */
static pthread_mutex_t baton;

static void *
timer_func (void *ignored)
{
  /* Step 13 (can be before or after step 12):
     The timer thread takes the baton, then waits a moment to make sure
     it can tell whether the second reader thread is blocked at step 12.  */
  if (pthread_mutex_lock (&baton))
    UNEXPECTED (13);
  usleep (100000);
  /* By the time we get here, it's clear that the second reader thread is
     blocked at step 12.  This is the desired behaviour.  */
  SUCCEED ();
}

static void *
reader2_func (void *ignored)
{
  int err;

  /* Step 8 (can be before or after step 7):
     The second reader thread takes the baton, then waits a moment to make sure
     the writer thread has reached step 7.  */
  if (pthread_mutex_lock (&baton))
    UNEXPECTED (8);
  usleep (100000);
  /* Step 9: The second reader thread requests the lock.  */
  err = pthread_rwlock_tryrdlock (&lock);
  if (err == 0)
    FAILURE ();
  else if (err != EBUSY)
    UNEXPECTED (9);
  /* Step 10: Launch a timer, to test whether the next call blocks.  */
  if (pthread_create (&timer, NULL, timer_func, NULL))
    UNEXPECTED (10);
  /* Step 11: Release the baton.  */
  if (pthread_mutex_unlock (&baton))
    UNEXPECTED (11);
  /* Step 12: The second reader thread requests the lock.  */
  err = pthread_rwlock_rdlock (&lock);
  if (err == 0)
    FAILURE ();
  else
    UNEXPECTED (12);
}

static void *
writer_func (void *ignored)
{
  /* Step 4: Take the baton, so that the second reader thread does not go ahead
     too early.  */
  if (pthread_mutex_lock (&baton))
    UNEXPECTED (4);
  /* Step 5: Create the second reader thread.  */
  if (pthread_create (&reader2, NULL, reader2_func, NULL))
    UNEXPECTED (5);
  /* Step 6: Release the baton.  */
  if (pthread_mutex_unlock (&baton))
    UNEXPECTED (6);
  /* Step 7: The writer thread requests the lock.  */
  if (pthread_rwlock_wrlock (&lock))
    UNEXPECTED (7);
  return NULL;
}

int
main ()
{
  reader1 = pthread_self ();

  /* Step 1: The main thread initializes the lock and the baton.  */
  if (pthread_rwlock_init (&lock, NULL))
    UNEXPECTED (1);
  if (pthread_mutex_init (&baton, NULL))
    UNEXPECTED (1);
  /* Step 2: The main thread acquires the lock as a reader.  */
  if (pthread_rwlock_rdlock (&lock))
    UNEXPECTED (2);
  /* Step 3: Create the writer thread.  */
  if (pthread_create (&writer, NULL, writer_func, NULL))
    UNEXPECTED (3);
  /* Job done.  Go to sleep.  */
  for (;;)
    {
      sleep (1);
    }
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_pthread_rwlock_rdlock_prefer_writer=yes
else
  gl_cv_pthread_rwlock_rdlock_prefer_writer=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

     LIBS="$save_LIBS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_pthread_rwlock_rdlock_prefer_writer" >&5
$as_echo "$gl_cv_pthread_rwlock_rdlock_prefer_writer" >&6; }
  case "$gl_cv_pthread_rwlock_rdlock_prefer_writer" in
    *yes)

$as_echo "#define HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER 1" >>confdefs.h

      ;;
  esac

    fi
    # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro.
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

      #include <pthread.h>
int
main ()
{

#if __FreeBSD__ == 4
error "No, in FreeBSD 4.0 recursive mutexes actually don't work."
#elif (defined __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ \
       && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)
error "No, in Mac OS X < 10.7 recursive mutexes actually don't work."
#else
int x = (int)PTHREAD_MUTEX_RECURSIVE;
return !x;
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

$as_echo "#define HAVE_PTHREAD_MUTEX_RECURSIVE 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  fi
  :



cat >>confdefs.h <<_ACEOF
#define GNULIB_LOCK 1
_ACEOF








      for ac_header in stdlib.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
if test "x$ac_cv_header_stdlib_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STDLIB_H 1
_ACEOF

fi

done

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5
$as_echo_n "checking for GNU libc compatible malloc... " >&6; }
if ${ac_cv_func_malloc_0_nonnull+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  case "$host_os" in
          # Guess yes on platforms where we know the result.
          *-gnu* | gnu* | *-musl* | freebsd* | netbsd* | openbsd* \
          | hpux* | solaris* | cygwin* | mingw*)
            ac_cv_func_malloc_0_nonnull="guessing yes" ;;
          # If we don't know, obey --enable-cross-guesses.
          *) ac_cv_func_malloc_0_nonnull="$gl_cross_guess_normal" ;;
        esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if defined STDC_HEADERS || defined HAVE_STDLIB_H
            # include <stdlib.h>
            #else
            char *malloc ();
            #endif

int
main ()
{
char *p = malloc (0);
            int result = !p;
            free (p);
            return result;
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_func_malloc_0_nonnull=yes
else
  ac_cv_func_malloc_0_nonnull=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5
$as_echo "$ac_cv_func_malloc_0_nonnull" >&6; }
  case "$ac_cv_func_malloc_0_nonnull" in
    *yes)

$as_echo "#define HAVE_MALLOC_GNU 1" >>confdefs.h

      ;;
    *)
      $as_echo "#define HAVE_MALLOC_GNU 0" >>confdefs.h

     REPLACE_MALLOC=1

      ;;
  esac


  if test $REPLACE_MALLOC = 1; then








  gl_LIBOBJS="$gl_LIBOBJS malloc.$ac_objext"

  fi


cat >>confdefs.h <<_ACEOF
#define GNULIB_MALLOC_GNU 1
_ACEOF





  if test $gl_cv_func_malloc_posix = yes; then

$as_echo "#define HAVE_MALLOC_POSIX 1" >>confdefs.h

  else
    REPLACE_MALLOC=1
  fi

  if test $REPLACE_MALLOC = 1; then








  gl_LIBOBJS="$gl_LIBOBJS malloc.$ac_objext"

  fi





          GNULIB_MALLOC_POSIX=1





$as_echo "#define GNULIB_TEST_MALLOC_POSIX 1" >>confdefs.h














     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_math_h='<'math.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <math.h>" >&5
$as_echo_n "checking absolute name of <math.h>... " >&6; }
if ${gl_cv_next_math_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_math_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'math.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_math_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_math_h
           gl_cv_next_math_h='"'$gl_header'"'
          else
               gl_cv_next_math_h='<'math.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_math_h" >&5
$as_echo "$gl_cv_next_math_h" >&6; }
     fi
     NEXT_MATH_H=$gl_cv_next_math_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'math.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_math_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_MATH_H=$gl_next_as_first_directive





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NAN macro works" >&5
$as_echo_n "checking whether NAN macro works... " >&6; }
if ${gl_cv_header_math_nan_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
/* Solaris 10 has a broken definition of NAN.  Other platforms
        fail to provide NAN, or provide it only in C99 mode; this
        test only needs to fail when NAN is provided but wrong.  */
         float f = 1.0f;
#ifdef NAN
         f = NAN;
#endif
         return f == 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_header_math_nan_works=yes
else
  gl_cv_header_math_nan_works=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_math_nan_works" >&5
$as_echo "$gl_cv_header_math_nan_works" >&6; }
  if test $gl_cv_header_math_nan_works = no; then
    REPLACE_NAN=1
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether HUGE_VAL works" >&5
$as_echo_n "checking whether HUGE_VAL works... " >&6; }
if ${gl_cv_header_math_huge_val_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
/* Solaris 10 has a broken definition of HUGE_VAL.  */
         double d = HUGE_VAL;
         return d == 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_header_math_huge_val_works=yes
else
  gl_cv_header_math_huge_val_works=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_math_huge_val_works" >&5
$as_echo "$gl_cv_header_math_huge_val_works" >&6; }
  if test $gl_cv_header_math_huge_val_works = no; then
    REPLACE_HUGE_VAL=1
  fi










  :











  if test $ac_cv_func_mbsinit = yes && test $ac_cv_func_mbrtowc = yes; then




     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5
$as_echo_n "checking whether mbrtowc handles incomplete characters... " >&6; }
if ${gl_cv_func_mbrtowc_incomplete_state+:} false; then :
  $as_echo_n "(cached) " >&6
else

                  case "$host_os" in
                     # Guess no on AIX and OSF/1.
        aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;;
                     # Guess yes otherwise.
        *)           gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;;
      esac
      if test $LOCALE_JA != none; then
        if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
#include <string.h>
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
int main ()
{
  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
    {
      const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
      mbstate_t state;
      wchar_t wc;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
        if (mbsinit (&state))
          return 2;
    }
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mbrtowc_incomplete_state=yes
else
  gl_cv_func_mbrtowc_incomplete_state=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      else
        if test $LOCALE_FR_UTF8 != none; then
          if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
#include <string.h>
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
int main ()
{
  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
    {
      const char input[] = "B\303\274\303\237er"; /* "Büßer" */
      mbstate_t state;
      wchar_t wc;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
        if (mbsinit (&state))
          return 2;
    }
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mbrtowc_incomplete_state=yes
else
  gl_cv_func_mbrtowc_incomplete_state=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

        fi
      fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5
$as_echo "$gl_cv_func_mbrtowc_incomplete_state" >&6; }




     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5
$as_echo_n "checking whether mbrtowc works as well as mbtowc... " >&6; }
if ${gl_cv_func_mbrtowc_sanitycheck+:} false; then :
  $as_echo_n "(cached) " >&6
else

                  case "$host_os" in
                    # Guess no on Solaris 8.
        solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;;
                    # Guess yes otherwise.
        *)          gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;;
      esac
      if test $LOCALE_ZH_CN != none; then
        if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
#include <stdlib.h>
#include <string.h>
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
int main ()
{
  /* This fails on Solaris 8:
     mbrtowc returns 2, and sets wc to 0x00F0.
     mbtowc returns 4 (correct) and sets wc to 0x5EDC.  */
  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
    {
      char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
      mbstate_t state;
      wchar_t wc;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, input + 3, 6, &state) != 4
          && mbtowc (&wc, input + 3, 6) == 4)
        return 2;
    }
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mbrtowc_sanitycheck=yes
else
  gl_cv_func_mbrtowc_sanitycheck=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5
$as_echo "$gl_cv_func_mbrtowc_sanitycheck" >&6; }

    REPLACE_MBSTATE_T=0
    case "$gl_cv_func_mbrtowc_incomplete_state" in
      *yes) ;;
      *) REPLACE_MBSTATE_T=1 ;;
    esac
    case "$gl_cv_func_mbrtowc_sanitycheck" in
      *yes) ;;
      *) REPLACE_MBSTATE_T=1 ;;
    esac
  else
    REPLACE_MBSTATE_T=1
  fi



  if test $ac_cv_func_mbrtowc = no; then
    HAVE_MBRTOWC=0
    ac_fn_c_check_decl "$LINENO" "mbrtowc" "ac_cv_have_decl_mbrtowc" "
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>

"
if test "x$ac_cv_have_decl_mbrtowc" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_MBRTOWC $ac_have_decl
_ACEOF

    if test $ac_cv_have_decl_mbrtowc = yes; then
                        REPLACE_MBRTOWC=1
    fi
  else
    if test $REPLACE_MBSTATE_T = 1; then
      REPLACE_MBRTOWC=1
    else



     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles a NULL pwc argument" >&5
$as_echo_n "checking whether mbrtowc handles a NULL pwc argument... " >&6; }
if ${gl_cv_func_mbrtowc_null_arg1+:} false; then :
  $as_echo_n "(cached) " >&6
else

                  case "$host_os" in
                  # Guess no on Solaris.
        solaris*) gl_cv_func_mbrtowc_null_arg1="guessing no" ;;
                  # Guess yes otherwise.
        *)        gl_cv_func_mbrtowc_null_arg1="guessing yes" ;;
      esac
      if test $LOCALE_FR_UTF8 != none; then
        if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
#include <stdlib.h>
#include <string.h>
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
int main ()
{
  int result = 0;

  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
    {
      char input[] = "\303\237er";
      mbstate_t state;
      wchar_t wc;
      size_t ret;

      memset (&state, '\0', sizeof (mbstate_t));
      wc = (wchar_t) 0xBADFACE;
      ret = mbrtowc (&wc, input, 5, &state);
      if (ret != 2)
        result |= 1;
      if (!mbsinit (&state))
        result |= 2;

      memset (&state, '\0', sizeof (mbstate_t));
      ret = mbrtowc (NULL, input, 5, &state);
      if (ret != 2) /* Solaris 7 fails here: ret is -1.  */
        result |= 4;
      if (!mbsinit (&state))
        result |= 8;
    }
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mbrtowc_null_arg1=yes
else
  gl_cv_func_mbrtowc_null_arg1=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_null_arg1" >&5
$as_echo "$gl_cv_func_mbrtowc_null_arg1" >&6; }




     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles a NULL string argument" >&5
$as_echo_n "checking whether mbrtowc handles a NULL string argument... " >&6; }
if ${gl_cv_func_mbrtowc_null_arg2+:} false; then :
  $as_echo_n "(cached) " >&6
else

                  case "$host_os" in
              # Guess no on OSF/1.
        osf*) gl_cv_func_mbrtowc_null_arg2="guessing no" ;;
              # Guess yes otherwise.
        *)    gl_cv_func_mbrtowc_null_arg2="guessing yes" ;;
      esac
      if test $LOCALE_FR_UTF8 != none; then
        if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
#include <string.h>
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
int main ()
{
  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
    {
      mbstate_t state;
      wchar_t wc;
      int ret;

      memset (&state, '\0', sizeof (mbstate_t));
      wc = (wchar_t) 0xBADFACE;
      mbrtowc (&wc, NULL, 5, &state);
      /* Check that wc was not modified.  */
      if (wc != (wchar_t) 0xBADFACE)
        return 2;
    }
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mbrtowc_null_arg2=yes
else
  gl_cv_func_mbrtowc_null_arg2=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_null_arg2" >&5
$as_echo "$gl_cv_func_mbrtowc_null_arg2" >&6; }






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc has a correct return value" >&5
$as_echo_n "checking whether mbrtowc has a correct return value... " >&6; }
if ${gl_cv_func_mbrtowc_retval+:} false; then :
  $as_echo_n "(cached) " >&6
else

                  case "$host_os" in
                                   # Guess no on HP-UX, Solaris, native Windows.
        hpux* | solaris* | mingw*) gl_cv_func_mbrtowc_retval="guessing no" ;;
                                   # Guess yes otherwise.
        *)                         gl_cv_func_mbrtowc_retval="guessing yes" ;;
      esac
      if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none \
         || { case "$host_os" in mingw*) true;; *) false;; esac; }; then
        if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
#include <string.h>
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
int main ()
{
  int result = 0;
  int found_some_locale = 0;
  /* This fails on Solaris.  */
  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
    {
      char input[] = "B\303\274\303\237er"; /* "Büßer" */
      mbstate_t state;
      wchar_t wc;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
        {
          input[1] = '\0';
          if (mbrtowc (&wc, input + 2, 5, &state) != 1)
            result |= 1;
        }
      found_some_locale = 1;
    }
  /* This fails on HP-UX 11.11.  */
  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
    {
      char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
      mbstate_t state;
      wchar_t wc;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
        {
          input[1] = '\0';
          if (mbrtowc (&wc, input + 2, 5, &state) != 2)
            result |= 2;
        }
      found_some_locale = 1;
    }
  /* This fails on native Windows.  */
  if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL)
    {
      char input[] = "<\223\372\226\173\214\352>"; /* "<日本語>" */
      mbstate_t state;
      wchar_t wc;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
        {
          input[3] = '\0';
          if (mbrtowc (&wc, input + 4, 4, &state) != 1)
            result |= 4;
        }
      found_some_locale = 1;
    }
  if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL)
    {
      char input[] = "<\244\351\245\273\273\171>"; /* "<日本語>" */
      mbstate_t state;
      wchar_t wc;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
        {
          input[3] = '\0';
          if (mbrtowc (&wc, input + 4, 4, &state) != 1)
            result |= 8;
        }
      found_some_locale = 1;
    }
  if (setlocale (LC_ALL, "Chinese_China.936") != NULL)
    {
      char input[] = "<\310\325\261\276\325\132>"; /* "<日本語>" */
      mbstate_t state;
      wchar_t wc;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
        {
          input[3] = '\0';
          if (mbrtowc (&wc, input + 4, 4, &state) != 1)
            result |= 16;
        }
      found_some_locale = 1;
    }
  return (found_some_locale ? result : 77);
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mbrtowc_retval=yes
else
  if test $? != 77; then
             gl_cv_func_mbrtowc_retval=no
           fi

fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_retval" >&5
$as_echo "$gl_cv_func_mbrtowc_retval" >&6; }




     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc returns 0 when parsing a NUL character" >&5
$as_echo_n "checking whether mbrtowc returns 0 when parsing a NUL character... " >&6; }
if ${gl_cv_func_mbrtowc_nul_retval+:} false; then :
  $as_echo_n "(cached) " >&6
else

                  case "$host_os" in
                       # Guess no on Solaris 8 and 9.
        solaris2.[89]) gl_cv_func_mbrtowc_nul_retval="guessing no" ;;
                       # Guess yes otherwise.
        *)             gl_cv_func_mbrtowc_nul_retval="guessing yes" ;;
      esac
      if test $LOCALE_ZH_CN != none; then
        if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
#include <string.h>
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
int main ()
{
  /* This fails on Solaris 8 and 9.  */
  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
    {
      mbstate_t state;
      wchar_t wc;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, "", 1, &state) != 0)
        return 2;
    }
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mbrtowc_nul_retval=yes
else
  gl_cv_func_mbrtowc_nul_retval=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_nul_retval" >&5
$as_echo "$gl_cv_func_mbrtowc_nul_retval" >&6; }



     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works on empty input" >&5
$as_echo_n "checking whether mbrtowc works on empty input... " >&6; }
if ${gl_cv_func_mbrtowc_empty_input+:} false; then :
  $as_echo_n "(cached) " >&6
else

                  case "$host_os" in
                              # Guess no on AIX and glibc systems.
        aix* | *-gnu* | gnu*) gl_cv_func_mbrtowc_empty_input="guessing no" ;;
                              # Guess yes on native Windows.
        mingw*)               gl_cv_func_mbrtowc_empty_input="guessing yes" ;;
        *)                    gl_cv_func_mbrtowc_empty_input="guessing yes" ;;
      esac
      if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

           #include <wchar.h>
           static wchar_t wc;
           static mbstate_t mbs;
           int
           main (void)
           {
             return mbrtowc (&wc, "", 0, &mbs) != (size_t) -2;
           }
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mbrtowc_empty_input=yes
else
  gl_cv_func_mbrtowc_empty_input=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_empty_input" >&5
$as_echo "$gl_cv_func_mbrtowc_empty_input" >&6; }


     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C locale is free of encoding errors" >&5
$as_echo_n "checking whether the C locale is free of encoding errors... " >&6; }
if ${gl_cv_C_locale_sans_EILSEQ+:} false; then :
  $as_echo_n "(cached) " >&6
else

               gl_cv_C_locale_sans_EILSEQ="$gl_cross_guess_normal"

     if test "$cross_compiling" = yes; then :
  case "$host_os" in
                 # Guess yes on native Windows.
         mingw*) gl_cv_C_locale_sans_EILSEQ="guessing yes" ;;
       esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>
            #include <locale.h>
            #include <wchar.h>

int
main ()
{

            int i;
            char *locale = setlocale (LC_ALL, "C");
            if (! locale)
              return 2;
            for (i = CHAR_MIN; i <= CHAR_MAX; i++)
              {
                char c = i;
                wchar_t wc;
                mbstate_t mbs = { 0, };
                size_t ss = mbrtowc (&wc, &c, 1, &mbs);
                if (1 < ss)
                  return 3;
              }
            return 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_C_locale_sans_EILSEQ=yes
else
  gl_cv_C_locale_sans_EILSEQ=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_C_locale_sans_EILSEQ" >&5
$as_echo "$gl_cv_C_locale_sans_EILSEQ" >&6; }

      case "$gl_cv_func_mbrtowc_null_arg1" in
        *yes) ;;
        *)
$as_echo "#define MBRTOWC_NULL_ARG1_BUG 1" >>confdefs.h

           REPLACE_MBRTOWC=1
           ;;
      esac
      case "$gl_cv_func_mbrtowc_null_arg2" in
        *yes) ;;
        *)
$as_echo "#define MBRTOWC_NULL_ARG2_BUG 1" >>confdefs.h

           REPLACE_MBRTOWC=1
           ;;
      esac
      case "$gl_cv_func_mbrtowc_retval" in
        *yes) ;;
        *)
$as_echo "#define MBRTOWC_RETVAL_BUG 1" >>confdefs.h

           REPLACE_MBRTOWC=1
           ;;
      esac
      case "$gl_cv_func_mbrtowc_nul_retval" in
        *yes) ;;
        *)
$as_echo "#define MBRTOWC_NUL_RETVAL_BUG 1" >>confdefs.h

           REPLACE_MBRTOWC=1
           ;;
      esac
      case "$gl_cv_func_mbrtowc_empty_input" in
        *yes) ;;
        *)
$as_echo "#define MBRTOWC_EMPTY_INPUT_BUG 1" >>confdefs.h

           REPLACE_MBRTOWC=1
           ;;
      esac
      case $gl_cv_C_locale_sans_EILSEQ in
        *yes) ;;
        *)
$as_echo "#define C_LOCALE_MAYBE_EILSEQ 1" >>confdefs.h

           REPLACE_MBRTOWC=1
           ;;
      esac
    fi
  fi

  if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then








  gl_LIBOBJS="$gl_LIBOBJS mbrtowc.$ac_objext"



  :

  fi





          GNULIB_MBRTOWC=1





$as_echo "#define GNULIB_TEST_MBRTOWC 1" >>confdefs.h














  if test $ac_cv_func_mbsinit = yes && test $ac_cv_func_mbrtowc = yes; then




     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5
$as_echo_n "checking whether mbrtowc handles incomplete characters... " >&6; }
if ${gl_cv_func_mbrtowc_incomplete_state+:} false; then :
  $as_echo_n "(cached) " >&6
else

                  case "$host_os" in
                     # Guess no on AIX and OSF/1.
        aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;;
                     # Guess yes otherwise.
        *)           gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;;
      esac
      if test $LOCALE_JA != none; then
        if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
#include <string.h>
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
int main ()
{
  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
    {
      const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
      mbstate_t state;
      wchar_t wc;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
        if (mbsinit (&state))
          return 2;
    }
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mbrtowc_incomplete_state=yes
else
  gl_cv_func_mbrtowc_incomplete_state=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      else
        if test $LOCALE_FR_UTF8 != none; then
          if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
#include <string.h>
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
int main ()
{
  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
    {
      const char input[] = "B\303\274\303\237er"; /* "Büßer" */
      mbstate_t state;
      wchar_t wc;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
        if (mbsinit (&state))
          return 2;
    }
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mbrtowc_incomplete_state=yes
else
  gl_cv_func_mbrtowc_incomplete_state=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

        fi
      fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5
$as_echo "$gl_cv_func_mbrtowc_incomplete_state" >&6; }




     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5
$as_echo_n "checking whether mbrtowc works as well as mbtowc... " >&6; }
if ${gl_cv_func_mbrtowc_sanitycheck+:} false; then :
  $as_echo_n "(cached) " >&6
else

                  case "$host_os" in
                    # Guess no on Solaris 8.
        solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;;
                    # Guess yes otherwise.
        *)          gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;;
      esac
      if test $LOCALE_ZH_CN != none; then
        if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
#include <stdlib.h>
#include <string.h>
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
int main ()
{
  /* This fails on Solaris 8:
     mbrtowc returns 2, and sets wc to 0x00F0.
     mbtowc returns 4 (correct) and sets wc to 0x5EDC.  */
  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
    {
      char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
      mbstate_t state;
      wchar_t wc;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, input + 3, 6, &state) != 4
          && mbtowc (&wc, input + 3, 6) == 4)
        return 2;
    }
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mbrtowc_sanitycheck=yes
else
  gl_cv_func_mbrtowc_sanitycheck=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5
$as_echo "$gl_cv_func_mbrtowc_sanitycheck" >&6; }

    REPLACE_MBSTATE_T=0
    case "$gl_cv_func_mbrtowc_incomplete_state" in
      *yes) ;;
      *) REPLACE_MBSTATE_T=1 ;;
    esac
    case "$gl_cv_func_mbrtowc_sanitycheck" in
      *yes) ;;
      *) REPLACE_MBSTATE_T=1 ;;
    esac
  else
    REPLACE_MBSTATE_T=1
  fi



  if test $ac_cv_func_mbsinit = no; then
    HAVE_MBSINIT=0
    ac_fn_c_check_decl "$LINENO" "mbsinit" "ac_cv_have_decl_mbsinit" "
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>

"
if test "x$ac_cv_have_decl_mbsinit" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_MBSINIT $ac_have_decl
_ACEOF

    if test $ac_cv_have_decl_mbsinit = yes; then
                        REPLACE_MBSINIT=1
    fi
  else
    if test $REPLACE_MBSTATE_T = 1; then
      REPLACE_MBSINIT=1
    else
                        case "$host_os" in
        mingw*) REPLACE_MBSINIT=1 ;;
      esac
    fi
  fi

  if test $HAVE_MBSINIT = 0 || test $REPLACE_MBSINIT = 1; then








  gl_LIBOBJS="$gl_LIBOBJS mbsinit.$ac_objext"


  :

  fi





          GNULIB_MBSINIT=1





$as_echo "#define GNULIB_TEST_MBSINIT 1" >>confdefs.h







      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbswidth is declared in <wchar.h>" >&5
$as_echo_n "checking whether mbswidth is declared in <wchar.h>... " >&6; }
if ${ac_cv_have_decl_mbswidth+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
   before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>

int
main ()
{

  char *p = (char *) mbswidth;
  return !p;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_have_decl_mbswidth=yes
else
  ac_cv_have_decl_mbswidth=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_mbswidth" >&5
$as_echo "$ac_cv_have_decl_mbswidth" >&6; }
  if test $ac_cv_have_decl_mbswidth = yes; then
    ac_val=1
  else
    ac_val=0
  fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_MBSWIDTH_IN_WCHAR_H $ac_val
_ACEOF




   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mbstate_t" >&5
$as_echo_n "checking for mbstate_t... " >&6; }
if ${ac_cv_type_mbstate_t+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
   included before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
int
main ()
{
mbstate_t x; return sizeof x;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_type_mbstate_t=yes
else
  ac_cv_type_mbstate_t=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_mbstate_t" >&5
$as_echo "$ac_cv_type_mbstate_t" >&6; }
   if test $ac_cv_type_mbstate_t = yes; then

$as_echo "#define HAVE_MBSTATE_T 1" >>confdefs.h

   else

$as_echo "#define mbstate_t int" >>confdefs.h

   fi



  if test $HAVE_MEMCHR = 0 || test $REPLACE_MEMCHR = 1; then








  gl_LIBOBJS="$gl_LIBOBJS memchr.$ac_objext"


  for ac_header in bp-sym.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "bp-sym.h" "ac_cv_header_bp_sym_h" "$ac_includes_default"
if test "x$ac_cv_header_bp_sym_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_BP_SYM_H 1
_ACEOF

fi

done


  fi





          GNULIB_MEMCHR=1





$as_echo "#define GNULIB_TEST_MEMCHR 1" >>confdefs.h







  if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then








  gl_LIBOBJS="$gl_LIBOBJS msvc-inval.$ac_objext"

  fi

  if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then








  gl_LIBOBJS="$gl_LIBOBJS msvc-nothrow.$ac_objext"

  fi


cat >>confdefs.h <<_ACEOF
#define GNULIB_MSVC_NOTHROW 1
_ACEOF
















   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for obstacks that work with any size object" >&5
$as_echo_n "checking for obstacks that work with any size object... " >&6; }
if ${ac_cv_func_obstack+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include "obstack.h"
             void *obstack_chunk_alloc (size_t n) { return 0; }
             void obstack_chunk_free (void *p) { }
             /* Check that an internal function returns size_t, not int.  */
             size_t _obstack_memory_used (struct obstack *);

int
main ()
{
struct obstack mem;
             obstack_init (&mem);
             obstack_free (&mem, 0);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_func_obstack=yes
else
  ac_cv_func_obstack=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_obstack" >&5
$as_echo "$ac_cv_func_obstack" >&6; }
   if test "$ac_cv_func_obstack" = yes; then

$as_echo "#define HAVE_OBSTACK 1" >>confdefs.h

   else








  gl_LIBOBJS="$gl_LIBOBJS obstack.$ac_objext"

   fi






  if test $ac_cv_func_obstack_printf = no ; then


  if test $ac_cv_func_obstack_printf = yes; then
    REPLACE_OBSTACK_PRINTF=1
  fi

  fi



  if test $ac_cv_have_decl_obstack_printf = no; then
    HAVE_DECL_OBSTACK_PRINTF=0
  fi


  if test $ac_cv_func_obstack_printf = no || test $REPLACE_OBSTACK_PRINTF = 1; then








  gl_LIBOBJS="$gl_LIBOBJS obstack_printf.$ac_objext"

  fi





          GNULIB_OBSTACK_PRINTF=1





$as_echo "#define GNULIB_TEST_OBSTACK_PRINTF 1" >>confdefs.h






  case "$host_os" in
    mingw* | pw*)
      REPLACE_OPEN=1
      ;;
    *)

      if test "$gl_cv_macro_O_CLOEXEC" != yes; then
        REPLACE_OPEN=1
      fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether open recognizes a trailing slash" >&5
$as_echo_n "checking whether open recognizes a trailing slash... " >&6; }
if ${gl_cv_func_open_slash+:} false; then :
  $as_echo_n "(cached) " >&6
else
  # Assume that if we have lstat, we can also check symlinks.
     if test $ac_cv_func_lstat = yes; then
       touch conftest.tmp
       ln -s conftest.tmp conftest.lnk
     fi
     if test "$cross_compiling" = yes; then :

        case "$host_os" in
          freebsd* | aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*)
            gl_cv_func_open_slash="guessing no" ;;
          *)
            gl_cv_func_open_slash="guessing yes" ;;
        esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <fcntl.h>
#if HAVE_UNISTD_H
# include <unistd.h>
#endif
int main ()
{
  int result = 0;
#if HAVE_LSTAT
  if (open ("conftest.lnk/", O_RDONLY) != -1)
    result |= 1;
#endif
  if (open ("conftest.sl/", O_CREAT, 0600) >= 0)
    result |= 2;
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_open_slash=yes
else
  gl_cv_func_open_slash=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

     rm -f conftest.sl conftest.tmp conftest.lnk

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_open_slash" >&5
$as_echo "$gl_cv_func_open_slash" >&6; }
  case "$gl_cv_func_open_slash" in
    *no)

$as_echo "#define OPEN_TRAILING_SLASH_BUG 1" >>confdefs.h

      ;;
  esac

      case "$gl_cv_func_open_slash" in
        *no)
          REPLACE_OPEN=1
          ;;
      esac
      ;;
  esac



  if test $REPLACE_OPEN = 1; then








  gl_LIBOBJS="$gl_LIBOBJS open.$ac_objext"



  :

  fi





          GNULIB_OPEN=1





$as_echo "#define GNULIB_TEST_OPEN 1" >>confdefs.h











             if test "$ERRNO_H:$REPLACE_STRERROR_0" != :0; then
            REPLACE_PERROR=1
  fi
  case ${gl_cv_func_strerror_r_works-unset} in
    unset|*yes)
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether perror matches strerror" >&5
$as_echo_n "checking whether perror matches strerror... " >&6; }
if ${gl_cv_func_perror_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  case "$host_os" in
                       # Guess yes on musl systems.
              *-musl*) gl_cv_func_perror_works="guessing yes" ;;
                       # Guess yes on native Windows.
              mingw*)  gl_cv_func_perror_works="guessing yes" ;;
                       # Otherwise obey --enable-cross-guesses.
              *)       gl_cv_func_perror_works="$gl_cross_guess_normal" ;;
            esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
                #include <stdio.h>
                #include <stdlib.h>
                #include <string.h>

int
main ()
{
char *str = strerror (-1);
                if (!getenv("CONFTEST_OUTPUT")) return 0;
                if (!str) str = "";
                puts (str);
                errno = -1;
                perror ("");
                return 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  if CONFTEST_OUTPUT=1 ./conftest$EXEEXT >conftest.txt1 2>conftest.txt2 \
               && cmp conftest.txt1 conftest.txt2 >/dev/null; then
              gl_cv_func_perror_works=yes
            else
              gl_cv_func_perror_works=no
            fi
            rm -rf conftest.txt1 conftest.txt2
else
  gl_cv_func_perror_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_perror_works" >&5
$as_echo "$gl_cv_func_perror_works" >&6; }
      case "$gl_cv_func_perror_works" in
        *yes) ;;
        *) REPLACE_PERROR=1 ;;
      esac
      ;;
    *)
                  REPLACE_PERROR=1
      ;;
  esac

  if test $REPLACE_PERROR = 1; then








  gl_LIBOBJS="$gl_LIBOBJS perror.$ac_objext"

  fi





          GNULIB_PERROR=1





$as_echo "#define GNULIB_TEST_PERROR 1" >>confdefs.h









  if test $ac_cv_func_pipe2 != yes; then
    HAVE_PIPE2=0
  fi






          GNULIB_PIPE2=1





$as_echo "#define GNULIB_TEST_PIPE2 1" >>confdefs.h





cat >>confdefs.h <<_ACEOF
#define GNULIB_PIPE2_SAFER 1
_ACEOF








  if test $REPLACE_POSIX_SPAWN = 1; then
    REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=1
  else
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn_file_actions_addclose works" >&5
$as_echo_n "checking whether posix_spawn_file_actions_addclose works... " >&6; }
if ${gl_cv_func_posix_spawn_file_actions_addclose_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  # Guess no on musl libc and Solaris, yes otherwise.
          case "$host_os" in
            *-musl*)  gl_cv_func_posix_spawn_file_actions_addclose_works="guessing no" ;;
            solaris*) gl_cv_func_posix_spawn_file_actions_addclose_works="guessing no" ;;
                      # Guess no on native Windows.
            mingw*)   gl_cv_func_posix_spawn_file_actions_addclose_works="guessing no" ;;
            *)        gl_cv_func_posix_spawn_file_actions_addclose_works="guessing yes" ;;
          esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <spawn.h>
int main ()
{
  posix_spawn_file_actions_t actions;
  if (posix_spawn_file_actions_init (&actions) != 0)
    return 1;
  if (posix_spawn_file_actions_addclose (&actions, 10000000) == 0)
    return 2;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_posix_spawn_file_actions_addclose_works=yes
else
  gl_cv_func_posix_spawn_file_actions_addclose_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_file_actions_addclose_works" >&5
$as_echo "$gl_cv_func_posix_spawn_file_actions_addclose_works" >&6; }
    case "$gl_cv_func_posix_spawn_file_actions_addclose_works" in
      *yes) ;;
      *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=1 ;;
    esac
  fi

  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = 1; then








  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_addclose.$ac_objext"

  fi





          GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=1





$as_echo "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE 1" >>confdefs.h









  if test $REPLACE_POSIX_SPAWN = 1; then
    REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1
  else
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn_file_actions_adddup2 works" >&5
$as_echo_n "checking whether posix_spawn_file_actions_adddup2 works... " >&6; }
if ${gl_cv_func_posix_spawn_file_actions_adddup2_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  # Guess no on musl libc and Solaris, yes otherwise.
          case "$host_os" in
            *-musl*)  gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no";;
            solaris*) gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no";;
                      # Guess no on native Windows.
            mingw*)   gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no" ;;
            *)        gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing yes";;
          esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <spawn.h>
int main ()
{
  posix_spawn_file_actions_t actions;
  if (posix_spawn_file_actions_init (&actions) != 0)
    return 1;
  if (posix_spawn_file_actions_adddup2 (&actions, 10000000, 2) == 0)
    return 2;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_posix_spawn_file_actions_adddup2_works=yes
else
  gl_cv_func_posix_spawn_file_actions_adddup2_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_file_actions_adddup2_works" >&5
$as_echo "$gl_cv_func_posix_spawn_file_actions_adddup2_works" >&6; }
    case "$gl_cv_func_posix_spawn_file_actions_adddup2_works" in
      *yes) ;;
      *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1 ;;
    esac
  fi

  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = 1; then








  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_adddup2.$ac_objext"

  fi





          GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1





$as_echo "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 1" >>confdefs.h









  if test $REPLACE_POSIX_SPAWN = 1; then
    REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=1
  else
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn_file_actions_addopen works" >&5
$as_echo_n "checking whether posix_spawn_file_actions_addopen works... " >&6; }
if ${gl_cv_func_posix_spawn_file_actions_addopen_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  # Guess no on musl libc and Solaris, yes otherwise.
          case "$host_os" in
            *-musl*)  gl_cv_func_posix_spawn_file_actions_addopen_works="guessing no";;
            solaris*) gl_cv_func_posix_spawn_file_actions_addopen_works="guessing no";;
                      # Guess no on native Windows.
            mingw*)   gl_cv_func_posix_spawn_file_actions_addopen_works="guessing no" ;;
            *)        gl_cv_func_posix_spawn_file_actions_addopen_works="guessing yes";;
          esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <spawn.h>
#include <fcntl.h>
int main ()
{
  posix_spawn_file_actions_t actions;
  if (posix_spawn_file_actions_init (&actions) != 0)
    return 1;
  if (posix_spawn_file_actions_addopen (&actions, 10000000, "foo", 0, O_RDONLY)
      == 0)
    return 2;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_posix_spawn_file_actions_addopen_works=yes
else
  gl_cv_func_posix_spawn_file_actions_addopen_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_file_actions_addopen_works" >&5
$as_echo "$gl_cv_func_posix_spawn_file_actions_addopen_works" >&6; }
    case "$gl_cv_func_posix_spawn_file_actions_addopen_works" in
      *yes) ;;
      *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=1 ;;
    esac
  fi

  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = 1; then








  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_addopen.$ac_objext"

  fi





          GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=1





$as_echo "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN 1" >>confdefs.h






  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then








  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_destroy.$ac_objext"

  fi





          GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY=1





$as_echo "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_DESTROY 1" >>confdefs.h






  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then








  gl_LIBOBJS="$gl_LIBOBJS spawn_faction_init.$ac_objext"

  fi





          GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT=1





$as_echo "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_INIT 1" >>confdefs.h






  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then








  gl_LIBOBJS="$gl_LIBOBJS spawnattr_destroy.$ac_objext"

  fi





          GNULIB_POSIX_SPAWNATTR_DESTROY=1





$as_echo "#define GNULIB_TEST_POSIX_SPAWNATTR_DESTROY 1" >>confdefs.h






  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then








  gl_LIBOBJS="$gl_LIBOBJS spawnattr_init.$ac_objext"

  fi





          GNULIB_POSIX_SPAWNATTR_INIT=1





$as_echo "#define GNULIB_TEST_POSIX_SPAWNATTR_INIT 1" >>confdefs.h






  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then








  gl_LIBOBJS="$gl_LIBOBJS spawnattr_setflags.$ac_objext"

  fi





          GNULIB_POSIX_SPAWNATTR_SETFLAGS=1





$as_echo "#define GNULIB_TEST_POSIX_SPAWNATTR_SETFLAGS 1" >>confdefs.h






  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then








  gl_LIBOBJS="$gl_LIBOBJS spawnattr_setsigmask.$ac_objext"

  fi





          GNULIB_POSIX_SPAWNATTR_SETSIGMASK=1





$as_echo "#define GNULIB_TEST_POSIX_SPAWNATTR_SETSIGMASK 1" >>confdefs.h






  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then








  gl_LIBOBJS="$gl_LIBOBJS spawnp.$ac_objext"

  fi





          GNULIB_POSIX_SPAWNP=1





$as_echo "#define GNULIB_TEST_POSIX_SPAWNP 1" >>confdefs.h





  if test $gl_cv_func_frexp_no_libm = yes; then



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexp works" >&5
$as_echo_n "checking whether frexp works... " >&6; }
if ${gl_cv_func_frexp_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
           netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;;
           mingw*) # Guess yes with MSVC, no with mingw.
             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef _MSC_VER
 Good
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Good" >/dev/null 2>&1; then :
  gl_cv_func_frexp_works="guessing yes"
else
  gl_cv_func_frexp_works="guessing no"
fi
rm -f conftest*

             ;;
           *) gl_cv_func_frexp_works="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <float.h>
#include <math.h>
#include <string.h>
#if HAVE_DECL_ALARM
# include <signal.h>
# include <unistd.h>
#endif
/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
   ICC 10.0 has a bug when optimizing the expression -zero.
   The expression -DBL_MIN * DBL_MIN does not work when cross-compiling
   to PowerPC on Mac OS X 10.5.  */
#if defined __hpux || defined __sgi || defined __ICC
static double
compute_minus_zero (void)
{
  return -DBL_MIN * DBL_MIN;
}
# define minus_zero compute_minus_zero ()
#else
double minus_zero = -0.0;
#endif
int main()
{
  int result = 0;
  int i;
  volatile double x;
  double zero = 0.0;
#if HAVE_DECL_ALARM
  /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite
     number.  Let the test fail in this case.  */
  signal (SIGALRM, SIG_DFL);
  alarm (5);
#endif
  /* Test on denormalized numbers.  */
  for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
    ;
  if (x > 0.0)
    {
      int exp;
      double y = frexp (x, &exp);
      /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022.
         On NetBSD: y = 0.75. Correct: y = 0.5.  */
      if (y != 0.5)
        result |= 1;
    }
  /* Test on infinite numbers.  */
  x = 1.0 / zero;
  {
    int exp;
    double y = frexp (x, &exp);
    if (y != x)
      result |= 2;
  }
  /* Test on negative zero.  */
  x = minus_zero;
  {
    int exp;
    double y = frexp (x, &exp);
    if (memcmp (&y, &x, sizeof x))
      result |= 4;
  }
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_frexp_works=yes
else
  gl_cv_func_frexp_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexp_works" >&5
$as_echo "$gl_cv_func_frexp_works" >&6; }

    case "$gl_cv_func_frexp_works" in
      *yes)

$as_echo "#define HAVE_FREXP_IN_LIBC 1" >>confdefs.h

        ;;
    esac
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexp can be used without linking with libm" >&5
$as_echo_n "checking whether ldexp can be used without linking with libm... " >&6; }
if ${gl_cv_func_ldexp_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             double x;
             int y;
int
main ()
{
return ldexp (x, y) < 1;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_ldexp_no_libm=yes
else
  gl_cv_func_ldexp_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_no_libm" >&5
$as_echo "$gl_cv_func_ldexp_no_libm" >&6; }
  if test $gl_cv_func_ldexp_no_libm = yes; then

$as_echo "#define HAVE_LDEXP_IN_LIBC 1" >>confdefs.h

  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl() can be used without linking with libm" >&5
$as_echo_n "checking whether frexpl() can be used without linking with libm... " >&6; }
if ${gl_cv_func_frexpl_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             long double x;
int
main ()
{
int e; return frexpl (x, &e) > 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_frexpl_no_libm=yes
else
  gl_cv_func_frexpl_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_no_libm" >&5
$as_echo "$gl_cv_func_frexpl_no_libm" >&6; }

  if test $gl_cv_func_frexpl_no_libm = yes; then


     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl works" >&5
$as_echo_n "checking whether frexpl works... " >&6; }
if ${gl_cv_func_frexpl_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
           aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*)
              gl_cv_func_frexpl_works="guessing no";;
           *) gl_cv_func_frexpl_works="guessing yes";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <float.h>
#include <math.h>
/* Override the values of <float.h>, like done in float.in.h.  */
#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
# undef LDBL_MIN_EXP
# define LDBL_MIN_EXP    (-16381)
#endif
#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
# undef LDBL_MIN_EXP
# define LDBL_MIN_EXP    (-16381)
#endif
#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
# undef LDBL_MIN_EXP
# define LDBL_MIN_EXP DBL_MIN_EXP
#endif
#if defined __sgi && (LDBL_MANT_DIG >= 106)
# if defined __GNUC__
#  undef LDBL_MIN_EXP
#  define LDBL_MIN_EXP DBL_MIN_EXP
# endif
#endif
extern
#ifdef __cplusplus
"C"
#endif
long double frexpl (long double, int *);
int main()
{
  int result = 0;
  volatile long double x;
  /* Test on finite numbers that fails on AIX 5.1.  */
  x = 16.0L;
  {
    int exp = -9999;
    frexpl (x, &exp);
    if (exp != 5)
      result |= 1;
  }
  /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
     function returns an invalid (incorrectly normalized) value: it returns
               y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
     but the correct result is
          0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 }  */
  x = 1.01L;
  {
    int exp = -9999;
    long double y = frexpl (x, &exp);
    if (!(exp == 1 && y == 0.505L))
      result |= 2;
  }
  /* Test on large finite numbers.  This fails on BeOS at i = 16322, while
     LDBL_MAX_EXP = 16384.
     In the loop end test, we test x against Infinity, rather than comparing
     i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP.  */
  {
    int i;
    for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
      {
        int exp = -9999;
        frexpl (x, &exp);
        if (exp != i)
          {
            result |= 4;
            break;
          }
      }
  }
  /* Test on denormalized numbers.  */
  {
    int i;
    for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
      ;
    if (x > 0.0L)
      {
        int exp;
        long double y = frexpl (x, &exp);
        /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
           exp = -16382, y = 0.5.  On Mac OS X 10.5: exp = -16384, y = 0.5.  */
        if (exp != LDBL_MIN_EXP - 1)
          result |= 8;
      }
  }
  /* Test on infinite numbers.  */
  x = 1.0L / 0.0L;
  {
    int exp;
    long double y = frexpl (x, &exp);
    if (y != x)
      result |= 16;
  }
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_frexpl_works=yes
else
  gl_cv_func_frexpl_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_frexpl_works" >&5
$as_echo "$gl_cv_func_frexpl_works" >&6; }

    case "$gl_cv_func_frexpl_works" in
      *yes) gl_func_frexpl_no_libm=yes ;;
      *)    gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
    esac
  else
    gl_func_frexpl_no_libm=no
        REPLACE_FREXPL=1
  fi
  if test $gl_func_frexpl_no_libm = yes; then

$as_echo "#define HAVE_FREXPL_IN_LIBC 1" >>confdefs.h

            ac_fn_c_check_decl "$LINENO" "frexpl" "ac_cv_have_decl_frexpl" "#include <math.h>
"
if test "x$ac_cv_have_decl_frexpl" = xyes; then :

else
  HAVE_DECL_FREXPL=0
fi

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexpl() can be used without linking with libm" >&5
$as_echo_n "checking whether ldexpl() can be used without linking with libm... " >&6; }
if ${gl_cv_func_ldexpl_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             long double x;
int
main ()
{
return ldexpl (x, -1) > 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_ldexpl_no_libm=yes
else
  gl_cv_func_ldexpl_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_no_libm" >&5
$as_echo "$gl_cv_func_ldexpl_no_libm" >&6; }

  if test $gl_cv_func_ldexpl_no_libm = yes; then


     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexpl works" >&5
$as_echo_n "checking whether ldexpl works... " >&6; }
if ${gl_cv_func_ldexpl_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
           aix | aix[3-6]*) gl_cv_func_ldexpl_works="guessing no" ;;
                            # Guess yes on native Windows.
           mingw*)          gl_cv_func_ldexpl_works="guessing yes" ;;
           *)               gl_cv_func_ldexpl_works="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <math.h>
extern
#ifdef __cplusplus
"C"
#endif
long double ldexpl (long double, int);
int main()
{
  int result = 0;
  {
    volatile long double x = 1.0;
    volatile long double y = ldexpl (x, -1);
    if (y != 0.5L)
      result |= 1;
  }
  {
    volatile long double x = 1.73205L;
    volatile long double y = ldexpl (x, 0);
    if (y != x)
      result |= 2;
  }
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_ldexpl_works=yes
else
  gl_cv_func_ldexpl_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexpl_works" >&5
$as_echo "$gl_cv_func_ldexpl_works" >&6; }

    case "$gl_cv_func_ldexpl_works" in
      *yes)

$as_echo "#define HAVE_LDEXPL_IN_LIBC 1" >>confdefs.h

                        ac_fn_c_check_decl "$LINENO" "ldexpl" "ac_cv_have_decl_ldexpl" "#include <math.h>
"
if test "x$ac_cv_have_decl_ldexpl" = xyes; then :

else
  HAVE_DECL_LDEXPL=0
fi

        ;;
    esac
  fi



  if test $gl_cv_func_vfprintf_posix = no; then











  gl_LIBOBJS="$gl_LIBOBJS printf.$ac_objext"

  REPLACE_PRINTF=1

$as_echo "#define REPLACE_PRINTF_POSIX 1" >>confdefs.h

  :

  fi






          GNULIB_PRINTF_POSIX=1





$as_echo "#define GNULIB_TEST_PRINTF_POSIX 1" >>confdefs.h




  ac_fn_c_check_decl "$LINENO" "program_invocation_name" "ac_cv_have_decl_program_invocation_name" "#include <errno.h>
"
if test "x$ac_cv_have_decl_program_invocation_name" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_PROGRAM_INVOCATION_NAME $ac_have_decl
_ACEOF

  ac_fn_c_check_decl "$LINENO" "program_invocation_short_name" "ac_cv_have_decl_program_invocation_short_name" "#include <errno.h>
"
if test "x$ac_cv_have_decl_program_invocation_short_name" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME $ac_have_decl
_ACEOF


      :


  :




  for ac_func in raise
do :
  ac_fn_c_check_func "$LINENO" "raise" "ac_cv_func_raise"
if test "x$ac_cv_func_raise" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_RAISE 1
_ACEOF

fi
done

  if test $ac_cv_func_raise = no; then
    HAVE_RAISE=0
  else


      if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
        REPLACE_RAISE=1
      fi





  if test $gl_cv_type_sigset_t = yes; then
    ac_fn_c_check_func "$LINENO" "sigprocmask" "ac_cv_func_sigprocmask"
if test "x$ac_cv_func_sigprocmask" = xyes; then :
  gl_cv_func_sigprocmask=1
fi

  fi
  if test -z "$gl_cv_func_sigprocmask"; then
    HAVE_POSIX_SIGNALBLOCKING=0
  fi

      if test $HAVE_POSIX_SIGNALBLOCKING = 0; then
        :
      fi

  fi

  if test $HAVE_RAISE = 0 || test $REPLACE_RAISE = 1; then








  gl_LIBOBJS="$gl_LIBOBJS raise.$ac_objext"

    :
  fi





          GNULIB_RAISE=1





$as_echo "#define GNULIB_TEST_RAISE 1" >>confdefs.h






  if test $ac_cv_func_readlink = no; then
    HAVE_READLINK=0
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether readlink signature is correct" >&5
$as_echo_n "checking whether readlink signature is correct... " >&6; }
if ${gl_cv_decl_readlink_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
      /* Cause compilation failure if original declaration has wrong type.  */
      ssize_t readlink (const char *, char *, size_t);
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_decl_readlink_works=yes
else
  gl_cv_decl_readlink_works=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_readlink_works" >&5
$as_echo "$gl_cv_decl_readlink_works" >&6; }
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether readlink handles trailing slash correctly" >&5
$as_echo_n "checking whether readlink handles trailing slash correctly... " >&6; }
if ${gl_cv_func_readlink_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  # We have readlink, so assume ln -s works.
       ln -s conftest.no-such conftest.link
       ln -s conftest.link conftest.lnk2
       if test "$cross_compiling" = yes; then :
  case "$host_os" in
                             # Guess yes on Linux systems.
            linux-* | linux) gl_cv_func_readlink_works="guessing yes" ;;
                             # Guess yes on glibc systems.
            *-gnu* | gnu*)   gl_cv_func_readlink_works="guessing yes" ;;
                             # If we don't know, obey --enable-cross-guesses.
            *)               gl_cv_func_readlink_works="$gl_cross_guess_normal" ;;
          esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>

int
main ()
{
char buf[20];
      return readlink ("conftest.lnk2/", buf, sizeof buf) != -1;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_readlink_works=yes
else
  gl_cv_func_readlink_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      rm -f conftest.link conftest.lnk2
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_readlink_works" >&5
$as_echo "$gl_cv_func_readlink_works" >&6; }
    case "$gl_cv_func_readlink_works" in
      *yes)
        if test "$gl_cv_decl_readlink_works" != yes; then
          REPLACE_READLINK=1
        fi
        ;;
      *)

$as_echo "#define READLINK_TRAILING_SLASH_BUG 1" >>confdefs.h

        REPLACE_READLINK=1
        ;;
    esac
  fi

  if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then








  gl_LIBOBJS="$gl_LIBOBJS readlink.$ac_objext"


  :

  fi





          GNULIB_READLINK=1





$as_echo "#define GNULIB_TEST_READLINK 1" >>confdefs.h






  if test $gl_cv_func_malloc_posix = yes; then

$as_echo "#define HAVE_REALLOC_POSIX 1" >>confdefs.h

  else
    REPLACE_REALLOC=1
  fi

  if test $REPLACE_REALLOC = 1; then








  gl_LIBOBJS="$gl_LIBOBJS realloc.$ac_objext"

  fi





          GNULIB_REALLOC_POSIX=1





$as_echo "#define GNULIB_TEST_REALLOC_POSIX 1" >>confdefs.h








  : ${RELOCATABLE_CONFIG_H_DIR='$(top_builddir)'}
  RELOCATABLE_SRC_DIR="\$(top_srcdir)/$gl_source_base"
  RELOCATABLE_BUILD_DIR="\$(top_builddir)/$gl_source_base"

  if test $RELOCATABLE = yes; then








  gl_LIBOBJS="$gl_LIBOBJS progreloc.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS relocatable.$ac_objext"

  fi



  :



















  if test $ac_cv_have_decl_setenv = no; then
    HAVE_DECL_SETENV=0
  fi





  for ac_header in search.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "search.h" "ac_cv_header_search_h" "$ac_includes_default"
if test "x$ac_cv_header_search_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SEARCH_H 1
_ACEOF

fi

done

  for ac_func in tsearch
do :
  ac_fn_c_check_func "$LINENO" "tsearch" "ac_cv_func_tsearch"
if test "x$ac_cv_func_tsearch" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_TSEARCH 1
_ACEOF

fi
done




  relocatable_sh=$ac_aux_dir/relocatable.sh.in






                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rename honors trailing slash on destination" >&5
$as_echo_n "checking whether rename honors trailing slash on destination... " >&6; }
if ${gl_cv_func_rename_slash_dst_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  rm -rf conftest.f conftest.f1 conftest.f2 conftest.d1 conftest.d2 conftest.lnk
    touch conftest.f && touch conftest.f1 && mkdir conftest.d1 ||
      as_fn_error $? "cannot create temporary files" "$LINENO" 5
    # Assume that if we have lstat, we can also check symlinks.
    if test $ac_cv_func_lstat = yes; then
      ln -s conftest.f conftest.lnk
    fi
    if test "$cross_compiling" = yes; then :
        case "$host_os" in
                          # Guess yes on Linux systems.
         linux-* | linux) gl_cv_func_rename_slash_dst_works="guessing yes" ;;
                          # Guess yes on glibc systems.
         *-gnu*)          gl_cv_func_rename_slash_dst_works="guessing yes" ;;
                          # Guess no on native Windows.
         mingw*)          gl_cv_func_rename_slash_dst_works="guessing no" ;;
                          # If we don't know, obey --enable-cross-guesses.
         *)               gl_cv_func_rename_slash_dst_works="$gl_cross_guess_normal" ;;
       esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#        include <stdio.h>
#        include <stdlib.h>

int
main ()
{
int result = 0;
           if (rename ("conftest.f1", "conftest.f2/") == 0)
             result |= 1;
           if (rename ("conftest.d1", "conftest.d2/") != 0)
             result |= 2;
#if HAVE_LSTAT
           if (rename ("conftest.f", "conftest.lnk/") == 0)
             result |= 4;
#endif
           return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_rename_slash_dst_works=yes
else
  gl_cv_func_rename_slash_dst_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

    rm -rf conftest.f conftest.f1 conftest.f2 conftest.d1 conftest.d2 conftest.lnk

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_slash_dst_works" >&5
$as_echo "$gl_cv_func_rename_slash_dst_works" >&6; }
  case "$gl_cv_func_rename_slash_dst_works" in
    *yes) ;;
    *)
      REPLACE_RENAME=1

$as_echo "#define RENAME_TRAILING_SLASH_DEST_BUG 1" >>confdefs.h

      ;;
  esac

            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rename honors trailing slash on source" >&5
$as_echo_n "checking whether rename honors trailing slash on source... " >&6; }
if ${gl_cv_func_rename_slash_src_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk
    touch conftest.f && touch conftest.f1 && mkdir conftest.d1 ||
      as_fn_error $? "cannot create temporary files" "$LINENO" 5
    # Assume that if we have lstat, we can also check symlinks.
    if test $ac_cv_func_lstat = yes; then
      ln -s conftest.f conftest.lnk
    fi
    if test "$cross_compiling" = yes; then :
        case "$host_os" in
                          # Guess yes on Linux systems.
         linux-* | linux) gl_cv_func_rename_slash_src_works="guessing yes" ;;
                          # Guess yes on glibc systems.
         *-gnu*)          gl_cv_func_rename_slash_src_works="guessing yes" ;;
                          # Guess yes on native Windows.
         mingw*)          gl_cv_func_rename_slash_src_works="guessing yes" ;;
                          # If we don't know, obey --enable-cross-guesses.
         *)               gl_cv_func_rename_slash_src_works="$gl_cross_guess_normal" ;;
       esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#        include <stdio.h>
#        include <stdlib.h>

int
main ()
{
int result = 0;
           if (rename ("conftest.f1/", "conftest.d3") == 0)
             result |= 1;
           if (rename ("conftest.d1/", "conftest.d2") != 0)
             result |= 2;
#if HAVE_LSTAT
           if (rename ("conftest.lnk/", "conftest.f") == 0)
             result |= 4;
#endif
           return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_rename_slash_src_works=yes
else
  gl_cv_func_rename_slash_src_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

    rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_slash_src_works" >&5
$as_echo "$gl_cv_func_rename_slash_src_works" >&6; }
  case "$gl_cv_func_rename_slash_src_works" in
    *yes) ;;
    *)
      REPLACE_RENAME=1

$as_echo "#define RENAME_TRAILING_SLASH_SOURCE_BUG 1" >>confdefs.h

      ;;
  esac


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rename manages hard links correctly" >&5
$as_echo_n "checking whether rename manages hard links correctly... " >&6; }
if ${gl_cv_func_rename_link_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test $ac_cv_func_link = yes; then
       if test $cross_compiling != yes; then
         rm -rf conftest.f conftest.f1 conftest.f2
         if touch conftest.f conftest.f2 && ln conftest.f conftest.f1 &&
             set x `ls -i conftest.f conftest.f1` && test "" = ""; then
           if test "$cross_compiling" = yes; then :
                :

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#               include <errno.h>
#               include <stdio.h>
#               include <stdlib.h>
#               include <unistd.h>

int
main ()
{
int result = 0;
                  if (rename ("conftest.f", "conftest.f1"))
                    result |= 1;
                  if (unlink ("conftest.f1"))
                    result |= 2;

                  /* Allow either the POSIX-required behavior, where the
                     previous rename kept conftest.f, or the (better) NetBSD
                     behavior, where it removed conftest.f.  */
                  if (rename ("conftest.f", "conftest.f") != 0
                      && errno != ENOENT)
                    result |= 4;

                  if (rename ("conftest.f1", "conftest.f1") == 0)
                    result |= 8;
                  if (rename ("conftest.f2", "conftest.f2") != 0)
                    result |= 16;
                  return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_rename_link_works=yes
else
  gl_cv_func_rename_link_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

         else
           gl_cv_func_rename_link_works="guessing no"
         fi
         rm -rf conftest.f conftest.f1 conftest.f2
       else
                  case "$host_os" in
                            # Guess yes on Linux systems.
           linux-* | linux) gl_cv_func_rename_link_works="guessing yes" ;;
                            # Guess yes on glibc systems.
           *-gnu*)          gl_cv_func_rename_link_works="guessing yes" ;;
                            # Guess yes on native Windows.
           mingw*)          gl_cv_func_rename_link_works="guessing yes" ;;
                            # If we don't know, obey --enable-cross-guesses.
           *)               gl_cv_func_rename_link_works="$gl_cross_guess_normal" ;;
         esac
       fi
     else
       gl_cv_func_rename_link_works=yes
     fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_link_works" >&5
$as_echo "$gl_cv_func_rename_link_works" >&6; }
  case "$gl_cv_func_rename_link_works" in
    *yes) ;;
    *)
      REPLACE_RENAME=1

$as_echo "#define RENAME_HARD_LINK_BUG 1" >>confdefs.h

      ;;
  esac

          { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rename manages existing destinations correctly" >&5
$as_echo_n "checking whether rename manages existing destinations correctly... " >&6; }
if ${gl_cv_func_rename_dest_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  rm -rf conftest.f conftest.d1 conftest.d2
    touch conftest.f && mkdir conftest.d1 conftest.d2 ||
      as_fn_error $? "cannot create temporary files" "$LINENO" 5
    if test "$cross_compiling" = yes; then :
        case "$host_os" in
                          # Guess yes on Linux systems.
         linux-* | linux) gl_cv_func_rename_dest_works="guessing yes" ;;
                          # Guess yes on glibc systems.
         *-gnu*)          gl_cv_func_rename_dest_works="guessing yes" ;;
                          # Guess no on native Windows.
         mingw*)          gl_cv_func_rename_dest_works="guessing no" ;;
                          # If we don't know, obey --enable-cross-guesses.
         *)               gl_cv_func_rename_dest_works="$gl_cross_guess_normal" ;;
       esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#        include <stdio.h>
#        include <stdlib.h>

int
main ()
{
int result = 0;
           if (rename ("conftest.d1", "conftest.d2") != 0)
             result |= 1;
           if (rename ("conftest.d2", "conftest.f") == 0)
             result |= 2;
           return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_rename_dest_works=yes
else
  gl_cv_func_rename_dest_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

    rm -rf conftest.f conftest.d1 conftest.d2

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rename_dest_works" >&5
$as_echo "$gl_cv_func_rename_dest_works" >&6; }
  case "$gl_cv_func_rename_dest_works" in
    *yes) ;;
    *)
      REPLACE_RENAME=1

$as_echo "#define RENAME_DEST_EXISTS_BUG 1" >>confdefs.h

      ;;
  esac

  if test $REPLACE_RENAME = 1; then








  gl_LIBOBJS="$gl_LIBOBJS rename.$ac_objext"

  fi





          GNULIB_RENAME=1





$as_echo "#define GNULIB_TEST_RENAME 1" >>confdefs.h









  for ac_header in sched.h
do :
  ac_fn_c_check_header_compile "$LINENO" "sched.h" "ac_cv_header_sched_h" "#if HAVE_SYS_CDEFS_H
       #include <sys/cdefs.h>
      #endif

"
if test "x$ac_cv_header_sched_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SCHED_H 1
_ACEOF

fi

done









     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_sched_h='<'sched.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sched.h>" >&5
$as_echo_n "checking absolute name of <sched.h>... " >&6; }
if ${gl_cv_next_sched_h+:} false; then :
  $as_echo_n "(cached) " >&6
else



  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sched.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'sched.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_sched_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_sched_h
           gl_cv_next_sched_h='"'$gl_header'"'


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sched_h" >&5
$as_echo "$gl_cv_next_sched_h" >&6; }
     fi
     NEXT_SCHED_H=$gl_cv_next_sched_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'sched.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_sched_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_SCHED_H=$gl_next_as_first_directive





  if test "$ac_cv_header_sched_h" = yes; then
    HAVE_SCHED_H=1
  else
    HAVE_SCHED_H=0
  fi


  if test "$HAVE_SCHED_H" = 1; then
    ac_fn_c_check_type "$LINENO" "struct sched_param" "ac_cv_type_struct_sched_param" "#if HAVE_SYS_CDEFS_H
         #include <sys/cdefs.h>
        #endif
        #include <sched.h>

"
if test "x$ac_cv_type_struct_sched_param" = xyes; then :
  HAVE_STRUCT_SCHED_PARAM=1
else
  HAVE_STRUCT_SCHED_PARAM=0
fi

  else
    HAVE_STRUCT_SCHED_PARAM=0
    case "$host_os" in
      os2*)
                ac_fn_c_check_type "$LINENO" "struct sched_param" "ac_cv_type_struct_sched_param" "#include <spawn.h>
"
if test "x$ac_cv_type_struct_sched_param" = xyes; then :
  HAVE_STRUCT_SCHED_PARAM=1
fi

        ;;
      vms)
                ac_fn_c_check_type "$LINENO" "struct sched_param" "ac_cv_type_struct_sched_param" "#include <pthread.h>
"
if test "x$ac_cv_type_struct_sched_param" = xyes; then :
  HAVE_STRUCT_SCHED_PARAM=1
fi

        ;;
    esac
  fi


  if test "$ac_cv_header_sys_cdefs_h" = yes; then
    HAVE_SYS_CDEFS_H=1
  else
    HAVE_SYS_CDEFS_H=0
  fi











  if test $ac_cv_func_sigaction = yes; then
    ac_fn_c_check_member "$LINENO" "struct sigaction" "sa_sigaction" "ac_cv_member_struct_sigaction_sa_sigaction" "#include <signal.h>
"
if test "x$ac_cv_member_struct_sigaction_sa_sigaction" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_SIGACTION_SA_SIGACTION 1
_ACEOF


fi

    if test $ac_cv_member_struct_sigaction_sa_sigaction = no; then
      HAVE_STRUCT_SIGACTION_SA_SIGACTION=0
    fi
  else
    HAVE_SIGACTION=0
  fi

  if test $HAVE_SIGACTION = 0; then








  gl_LIBOBJS="$gl_LIBOBJS sigaction.$ac_objext"







  ac_fn_c_check_type "$LINENO" "siginfo_t" "ac_cv_type_siginfo_t" "
#include <signal.h>

"
if test "x$ac_cv_type_siginfo_t" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_SIGINFO_T 1
_ACEOF


fi

  if test $ac_cv_type_siginfo_t = no; then
    HAVE_SIGINFO_T=0
  fi

  fi





          GNULIB_SIGACTION=1





$as_echo "#define GNULIB_TEST_SIGACTION 1" >>confdefs.h














     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_signal_h='<'signal.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <signal.h>" >&5
$as_echo_n "checking absolute name of <signal.h>... " >&6; }
if ${gl_cv_next_signal_h+:} false; then :
  $as_echo_n "(cached) " >&6
else



  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <signal.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'signal.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_signal_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_signal_h
           gl_cv_next_signal_h='"'$gl_header'"'


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_signal_h" >&5
$as_echo "$gl_cv_next_signal_h" >&6; }
     fi
     NEXT_SIGNAL_H=$gl_cv_next_signal_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'signal.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_signal_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H=$gl_next_as_first_directive





# AIX declares sig_atomic_t to already include volatile, and C89 compilers
# then choke on 'volatile sig_atomic_t'.  C99 requires that it compile.
  ac_fn_c_check_type "$LINENO" "volatile sig_atomic_t" "ac_cv_type_volatile_sig_atomic_t" "
#include <signal.h>

"
if test "x$ac_cv_type_volatile_sig_atomic_t" = xyes; then :

else
  HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=0
fi







  ac_fn_c_check_type "$LINENO" "sighandler_t" "ac_cv_type_sighandler_t" "
#include <signal.h>

"
if test "x$ac_cv_type_sighandler_t" = xyes; then :

else
  HAVE_SIGHANDLER_T=0
fi









  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signbit macro" >&5
$as_echo_n "checking for signbit macro... " >&6; }
if ${gl_cv_func_signbit+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
                          # Guess yes on glibc systems.
           *-gnu* | gnu*) gl_cv_func_signbit="guessing yes" ;;
                          # Guess yes on musl systems.
           *-musl*)       gl_cv_func_signbit="guessing yes" ;;
                          # Guess yes on native Windows.
           mingw*)        gl_cv_func_signbit="guessing yes" ;;
                          # If we don't know, obey --enable-cross-guesses.
           *)             gl_cv_func_signbit="$gl_cross_guess_normal" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <math.h>
/* If signbit is defined as a function, don't use it, since calling it for
   'float' or 'long double' arguments would involve conversions.
   If signbit is not declared at all but exists as a library function, don't
   use it, since the prototype may not match.
   If signbit is not declared at all but exists as a compiler built-in, don't
   use it, since it's preferable to use __builtin_signbit* (no warnings,
   no conversions).  */
#ifndef signbit
# error "signbit should be a macro"
#endif
#include <string.h>

/* Global variables.
   Needed because GCC 4 constant-folds __builtin_signbitl (literal)
   but cannot constant-fold            __builtin_signbitl (variable).  */
float vf;
double vd;
long double vl;
int main ()
{
/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
   So we use -p0f and -p0d instead.  */
float p0f = 0.0f;
float m0f = -p0f;
double p0d = 0.0;
double m0d = -p0d;
/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
   So we use another constant expression instead.
   But that expression does not work on other platforms, such as when
   cross-compiling to PowerPC on Mac OS X 10.5.  */
long double p0l = 0.0L;
#if defined __hpux || defined __sgi
long double m0l = -LDBL_MIN * LDBL_MIN;
#else
long double m0l = -p0l;
#endif
  int result = 0;
  if (signbit (vf)) /* link check */
    vf++;
  {
    float plus_inf = 1.0f / p0f;
    float minus_inf = -1.0f / p0f;
    if (!(!signbit (255.0f)
          && signbit (-255.0f)
          && !signbit (p0f)
          && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f))
          && !signbit (plus_inf)
          && signbit (minus_inf)))
      result |= 1;
  }
  if (signbit (vd)) /* link check */
    vd++;
  {
    double plus_inf = 1.0 / p0d;
    double minus_inf = -1.0 / p0d;
    if (!(!signbit (255.0)
          && signbit (-255.0)
          && !signbit (p0d)
          && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d))
          && !signbit (plus_inf)
          && signbit (minus_inf)))
      result |= 2;
  }
  if (signbit (vl)) /* link check */
    vl++;
  {
    long double plus_inf = 1.0L / p0l;
    long double minus_inf = -1.0L / p0l;
    if (signbit (255.0L))
      result |= 4;
    if (!signbit (-255.0L))
      result |= 4;
    if (signbit (p0l))
      result |= 8;
    if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l)))
      result |= 16;
    if (signbit (plus_inf))
      result |= 32;
    if (!signbit (minus_inf))
      result |= 64;
  }
  return result;
}


_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_signbit=yes
else
  gl_cv_func_signbit=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_signbit" >&5
$as_echo "$gl_cv_func_signbit" >&6; }
          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signbit compiler built-ins" >&5
$as_echo_n "checking for signbit compiler built-ins... " >&6; }
if ${gl_cv_func_signbit_gcc+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
                          # Guess yes on glibc systems.
           *-gnu* | gnu*) gl_cv_func_signbit_gcc="guessing yes" ;;
                          # Guess yes on musl systems.
           *-musl*)       gl_cv_func_signbit_gcc="guessing yes" ;;
                          # Guess yes on mingw, no on MSVC.
           mingw*)        if test -n "$GCC"; then
                            gl_cv_func_signbit_gcc="guessing yes"
                          else
                            gl_cv_func_signbit_gcc="guessing no"
                          fi
                          ;;
                          # If we don't know, obey --enable-cross-guesses.
           *)             gl_cv_func_signbit_gcc="$gl_cross_guess_normal" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#if __GNUC__ >= 4
# define signbit(x) \
   (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
    sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
    __builtin_signbitf (x))
#else
# error "signbit should be three compiler built-ins"
#endif
#include <string.h>

/* Global variables.
   Needed because GCC 4 constant-folds __builtin_signbitl (literal)
   but cannot constant-fold            __builtin_signbitl (variable).  */
float vf;
double vd;
long double vl;
int main ()
{
/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
   So we use -p0f and -p0d instead.  */
float p0f = 0.0f;
float m0f = -p0f;
double p0d = 0.0;
double m0d = -p0d;
/* On HP-UX 10.20, negating 0.0L does not yield -0.0L.
   So we use another constant expression instead.
   But that expression does not work on other platforms, such as when
   cross-compiling to PowerPC on Mac OS X 10.5.  */
long double p0l = 0.0L;
#if defined __hpux || defined __sgi
long double m0l = -LDBL_MIN * LDBL_MIN;
#else
long double m0l = -p0l;
#endif
  int result = 0;
  if (signbit (vf)) /* link check */
    vf++;
  {
    float plus_inf = 1.0f / p0f;
    float minus_inf = -1.0f / p0f;
    if (!(!signbit (255.0f)
          && signbit (-255.0f)
          && !signbit (p0f)
          && (memcmp (&m0f, &p0f, sizeof (float)) == 0 || signbit (m0f))
          && !signbit (plus_inf)
          && signbit (minus_inf)))
      result |= 1;
  }
  if (signbit (vd)) /* link check */
    vd++;
  {
    double plus_inf = 1.0 / p0d;
    double minus_inf = -1.0 / p0d;
    if (!(!signbit (255.0)
          && signbit (-255.0)
          && !signbit (p0d)
          && (memcmp (&m0d, &p0d, sizeof (double)) == 0 || signbit (m0d))
          && !signbit (plus_inf)
          && signbit (minus_inf)))
      result |= 2;
  }
  if (signbit (vl)) /* link check */
    vl++;
  {
    long double plus_inf = 1.0L / p0l;
    long double minus_inf = -1.0L / p0l;
    if (signbit (255.0L))
      result |= 4;
    if (!signbit (-255.0L))
      result |= 4;
    if (signbit (p0l))
      result |= 8;
    if (!(memcmp (&m0l, &p0l, sizeof (long double)) == 0 || signbit (m0l)))
      result |= 16;
    if (signbit (plus_inf))
      result |= 32;
    if (!signbit (minus_inf))
      result |= 64;
  }
  return result;
}


_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_signbit_gcc=yes
else
  gl_cv_func_signbit_gcc=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_signbit_gcc" >&5
$as_echo "$gl_cv_func_signbit_gcc" >&6; }
      case "$gl_cv_func_signbit_gcc" in
    *yes)
      REPLACE_SIGNBIT_USING_GCC=1
      ;;
    *)
      case "$gl_cv_func_signbit" in
        *yes) ;;
        *)
                    REPLACE_SIGNBIT=1
          ;;
      esac
      ;;
  esac
          case "$host_os" in
    solaris*)
      REPLACE_SIGNBIT=1
      ;;
  esac
  if test $REPLACE_SIGNBIT = 1; then


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'float'" >&5
$as_echo_n "checking where to find the sign bit in a 'float'... " >&6; }
if ${gl_cv_cc_float_signbit+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

                              gl_cv_cc_float_signbit="unknown"

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stddef.h>
#include <stdio.h>
#define NWORDS \
  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { float value; unsigned int word[NWORDS]; }
        memory_float;
static memory_float plus = { 1.0f };
static memory_float minus = { -1.0f };
int main ()
{
  size_t j, k, i;
  unsigned int m;
  FILE *fp = fopen ("conftest.out", "w");
  if (fp == NULL)
    return 1;
  /* Find the different bit.  */
  k = 0; m = 0;
  for (j = 0; j < NWORDS; j++)
    {
      unsigned int x = plus.word[j] ^ minus.word[j];
      if ((x & (x - 1)) || (x && m))
        {
          /* More than one bit difference.  */
          fprintf (fp, "unknown");
          fclose (fp);
          return 2;
        }
      if (x)
        {
          k = j;
          m = x;
        }
    }
  if (m == 0)
    {
      /* No difference.  */
      fprintf (fp, "unknown");
      fclose (fp);
      return 3;
    }
  /* Now m = plus.word[k] ^ ~minus.word[k].  */
  if (plus.word[k] & ~minus.word[k])
    {
      /* Oh? The sign bit is set in the positive and cleared in the negative
         numbers?  */
      fprintf (fp, "unknown");
      fclose (fp);
      return 4;
    }
  for (i = 0; ; i++)
    if ((m >> i) & 1)
      break;
  fprintf (fp, "word %d bit %d", (int) k, (int) i);
  if (fclose (fp) != 0)
    return 5;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_cc_float_signbit=`cat conftest.out`
else
  gl_cv_cc_float_signbit="unknown"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      rm -f conftest.out

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_signbit" >&5
$as_echo "$gl_cv_cc_float_signbit" >&6; }
  case "$gl_cv_cc_float_signbit" in
    word*bit*)
      word=`echo "$gl_cv_cc_float_signbit" | sed -e 's/word //' -e 's/ bit.*//'`
      bit=`echo "$gl_cv_cc_float_signbit" | sed -e 's/word.*bit //'`

cat >>confdefs.h <<_ACEOF
#define FLT_SIGNBIT_WORD $word
_ACEOF


cat >>confdefs.h <<_ACEOF
#define FLT_SIGNBIT_BIT $bit
_ACEOF

      ;;
  esac




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'double'" >&5
$as_echo_n "checking where to find the sign bit in a 'double'... " >&6; }
if ${gl_cv_cc_double_signbit+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

                              gl_cv_cc_double_signbit="unknown"

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stddef.h>
#include <stdio.h>
#define NWORDS \
  ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { double value; unsigned int word[NWORDS]; }
        memory_float;
static memory_float plus = { 1.0 };
static memory_float minus = { -1.0 };
int main ()
{
  size_t j, k, i;
  unsigned int m;
  FILE *fp = fopen ("conftest.out", "w");
  if (fp == NULL)
    return 1;
  /* Find the different bit.  */
  k = 0; m = 0;
  for (j = 0; j < NWORDS; j++)
    {
      unsigned int x = plus.word[j] ^ minus.word[j];
      if ((x & (x - 1)) || (x && m))
        {
          /* More than one bit difference.  */
          fprintf (fp, "unknown");
          fclose (fp);
          return 2;
        }
      if (x)
        {
          k = j;
          m = x;
        }
    }
  if (m == 0)
    {
      /* No difference.  */
      fprintf (fp, "unknown");
      fclose (fp);
      return 3;
    }
  /* Now m = plus.word[k] ^ ~minus.word[k].  */
  if (plus.word[k] & ~minus.word[k])
    {
      /* Oh? The sign bit is set in the positive and cleared in the negative
         numbers?  */
      fprintf (fp, "unknown");
      fclose (fp);
      return 4;
    }
  for (i = 0; ; i++)
    if ((m >> i) & 1)
      break;
  fprintf (fp, "word %d bit %d", (int) k, (int) i);
  if (fclose (fp) != 0)
    return 5;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_cc_double_signbit=`cat conftest.out`
else
  gl_cv_cc_double_signbit="unknown"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      rm -f conftest.out

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_signbit" >&5
$as_echo "$gl_cv_cc_double_signbit" >&6; }
  case "$gl_cv_cc_double_signbit" in
    word*bit*)
      word=`echo "$gl_cv_cc_double_signbit" | sed -e 's/word //' -e 's/ bit.*//'`
      bit=`echo "$gl_cv_cc_double_signbit" | sed -e 's/word.*bit //'`

cat >>confdefs.h <<_ACEOF
#define DBL_SIGNBIT_WORD $word
_ACEOF


cat >>confdefs.h <<_ACEOF
#define DBL_SIGNBIT_BIT $bit
_ACEOF

      ;;
  esac




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the sign bit in a 'long double'" >&5
$as_echo_n "checking where to find the sign bit in a 'long double'... " >&6; }
if ${gl_cv_cc_long_double_signbit+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

                              gl_cv_cc_long_double_signbit="unknown"

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stddef.h>
#include <stdio.h>
#define NWORDS \
  ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { long double value; unsigned int word[NWORDS]; }
        memory_float;
static memory_float plus = { 1.0L };
static memory_float minus = { -1.0L };
int main ()
{
  size_t j, k, i;
  unsigned int m;
  FILE *fp = fopen ("conftest.out", "w");
  if (fp == NULL)
    return 1;
  /* Find the different bit.  */
  k = 0; m = 0;
  for (j = 0; j < NWORDS; j++)
    {
      unsigned int x = plus.word[j] ^ minus.word[j];
      if ((x & (x - 1)) || (x && m))
        {
          /* More than one bit difference.  */
          fprintf (fp, "unknown");
          fclose (fp);
          return 2;
        }
      if (x)
        {
          k = j;
          m = x;
        }
    }
  if (m == 0)
    {
      /* No difference.  */
      fprintf (fp, "unknown");
      fclose (fp);
      return 3;
    }
  /* Now m = plus.word[k] ^ ~minus.word[k].  */
  if (plus.word[k] & ~minus.word[k])
    {
      /* Oh? The sign bit is set in the positive and cleared in the negative
         numbers?  */
      fprintf (fp, "unknown");
      fclose (fp);
      return 4;
    }
  for (i = 0; ; i++)
    if ((m >> i) & 1)
      break;
  fprintf (fp, "word %d bit %d", (int) k, (int) i);
  if (fclose (fp) != 0)
    return 5;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_cc_long_double_signbit=`cat conftest.out`
else
  gl_cv_cc_long_double_signbit="unknown"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      rm -f conftest.out

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_long_double_signbit" >&5
$as_echo "$gl_cv_cc_long_double_signbit" >&6; }
  case "$gl_cv_cc_long_double_signbit" in
    word*bit*)
      word=`echo "$gl_cv_cc_long_double_signbit" | sed -e 's/word //' -e 's/ bit.*//'`
      bit=`echo "$gl_cv_cc_long_double_signbit" | sed -e 's/word.*bit //'`

cat >>confdefs.h <<_ACEOF
#define LDBL_SIGNBIT_WORD $word
_ACEOF


cat >>confdefs.h <<_ACEOF
#define LDBL_SIGNBIT_BIT $bit
_ACEOF

      ;;
  esac


    if test "$gl_cv_cc_float_signbit" = unknown; then
            ac_fn_c_check_decl "$LINENO" "copysignf" "ac_cv_have_decl_copysignf" "#include <math.h>
"
if test "x$ac_cv_have_decl_copysignf" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_COPYSIGNF $ac_have_decl
_ACEOF

      if test "$ac_cv_have_decl_copysignf" = yes; then
                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether copysignf can be used without linking with libm" >&5
$as_echo_n "checking whether copysignf can be used without linking with libm... " >&6; }
if ${gl_cv_func_copysignf_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
                   float x, y;
int
main ()
{
return copysignf (x, y) < 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_copysignf_no_libm=yes
else
  gl_cv_func_copysignf_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysignf_no_libm" >&5
$as_echo "$gl_cv_func_copysignf_no_libm" >&6; }
        if test $gl_cv_func_copysignf_no_libm = yes; then

$as_echo "#define HAVE_COPYSIGNF_IN_LIBC 1" >>confdefs.h

        fi
      fi
    fi
    if test "$gl_cv_cc_double_signbit" = unknown; then
            ac_fn_c_check_decl "$LINENO" "copysign" "ac_cv_have_decl_copysign" "#include <math.h>
"
if test "x$ac_cv_have_decl_copysign" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_COPYSIGN $ac_have_decl
_ACEOF

      if test "$ac_cv_have_decl_copysign" = yes; then
                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether copysign can be used without linking with libm" >&5
$as_echo_n "checking whether copysign can be used without linking with libm... " >&6; }
if ${gl_cv_func_copysign_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
                   double x, y;
int
main ()
{
return copysign (x, y) < 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_copysign_no_libm=yes
else
  gl_cv_func_copysign_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysign_no_libm" >&5
$as_echo "$gl_cv_func_copysign_no_libm" >&6; }
        if test $gl_cv_func_copysign_no_libm = yes; then

$as_echo "#define HAVE_COPYSIGN_IN_LIBC 1" >>confdefs.h

        fi
      fi
    fi
    if test "$gl_cv_cc_long_double_signbit" = unknown; then
            ac_fn_c_check_decl "$LINENO" "copysignl" "ac_cv_have_decl_copysignl" "#include <math.h>
"
if test "x$ac_cv_have_decl_copysignl" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_COPYSIGNL $ac_have_decl
_ACEOF

      if test "$ac_cv_have_decl_copysignl" = yes; then
                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether copysignl can be used without linking with libm" >&5
$as_echo_n "checking whether copysignl can be used without linking with libm... " >&6; }
if ${gl_cv_func_copysignl_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
                   long double x, y;
int
main ()
{
return copysignl (x, y) < 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_copysignl_no_libm=yes
else
  gl_cv_func_copysignl_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_copysignl_no_libm" >&5
$as_echo "$gl_cv_func_copysignl_no_libm" >&6; }
        if test $gl_cv_func_copysignl_no_libm = yes; then

$as_echo "#define HAVE_COPYSIGNL_IN_LIBC 1" >>confdefs.h

        fi
      fi
    fi
  fi

  if test $REPLACE_SIGNBIT = 1; then








  gl_LIBOBJS="$gl_LIBOBJS signbitf.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS signbitd.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS signbitl.$ac_objext"

  fi





          GNULIB_SIGNBIT=1





$as_echo "#define GNULIB_TEST_SIGNBIT 1" >>confdefs.h






  if test $gl_cv_type_sigset_t = yes; then
    ac_fn_c_check_func "$LINENO" "sigprocmask" "ac_cv_func_sigprocmask"
if test "x$ac_cv_func_sigprocmask" = xyes; then :
  gl_cv_func_sigprocmask=1
fi

  fi
  if test -z "$gl_cv_func_sigprocmask"; then
    HAVE_POSIX_SIGNALBLOCKING=0
  fi

  if test $HAVE_POSIX_SIGNALBLOCKING = 0; then








  gl_LIBOBJS="$gl_LIBOBJS sigprocmask.$ac_objext"

    :
  fi





          GNULIB_SIGPROCMASK=1





$as_echo "#define GNULIB_TEST_SIGPROCMASK 1" >>confdefs.h




  for ac_header in stdint.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default"
if test "x$ac_cv_header_stdint_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STDINT_H 1
_ACEOF

fi

done

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SIZE_MAX" >&5
$as_echo_n "checking for SIZE_MAX... " >&6; }
if ${gl_cv_size_max+:} false; then :
  $as_echo_n "(cached) " >&6
else

    gl_cv_size_max=
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <limits.h>
#if HAVE_STDINT_H
#include <stdint.h>
#endif
#ifdef SIZE_MAX
Found it
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Found it" >/dev/null 2>&1; then :
  gl_cv_size_max=yes
fi
rm -f conftest*

    if test -z "$gl_cv_size_max"; then
                        if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) * CHAR_BIT - 1" "size_t_bits_minus_1"        "#include <stddef.h>
#include <limits.h>"; then :

else
  size_t_bits_minus_1=
fi

      if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) <= sizeof (unsigned int)" "fits_in_uint"        "#include <stddef.h>"; then :

else
  fits_in_uint=
fi

      if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then
        if test $fits_in_uint = 1; then
                              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stddef.h>
                 extern size_t foo;
                 extern unsigned long foo;

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  fits_in_uint=0
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
        fi
                                if test $fits_in_uint = 1; then
          gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)"
        else
          gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)"
        fi
      else
                gl_cv_size_max='((size_t)~(size_t)0)'
      fi
    fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_size_max" >&5
$as_echo "$gl_cv_size_max" >&6; }
  if test "$gl_cv_size_max" != yes; then

cat >>confdefs.h <<_ACEOF
#define SIZE_MAX $gl_cv_size_max
_ACEOF

  fi




  gl_cv_func_snprintf_usable=no
  for ac_func in snprintf
do :
  ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf"
if test "x$ac_cv_func_snprintf" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SNPRINTF 1
_ACEOF

fi
done

  if test $ac_cv_func_snprintf = yes; then



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
$as_echo_n "checking whether snprintf respects a size of 1... " >&6; }
if ${gl_cv_func_snprintf_size1+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
                            # Guess yes on Android.
           linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
                            # Guess yes on native Windows.
           mingw*)          gl_cv_func_snprintf_size1="guessing yes" ;;
           *)               gl_cv_func_snprintf_size1="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#if HAVE_SNPRINTF
# define my_snprintf snprintf
#else
# include <stdarg.h>
static int my_snprintf (char *buf, int size, const char *format, ...)
{
  va_list args;
  int ret;
  va_start (args, format);
  ret = vsnprintf (buf, size, format, args);
  va_end (args);
  return ret;
}
#endif
int main()
{
  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
  my_snprintf (buf, 1, "%d", 12345);
  return buf[1] != 'E';
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_snprintf_size1=yes
else
  gl_cv_func_snprintf_size1=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
$as_echo "$gl_cv_func_snprintf_size1" >&6; }

    case "$gl_cv_func_snprintf_size1" in
      *yes)

        case "$gl_cv_func_snprintf_retval_c99" in
          *yes)


     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5
$as_echo_n "checking whether printf supports POSIX/XSI format strings with positions... " >&6; }
if ${gl_cv_func_printf_positions+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
           netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
                            gl_cv_func_printf_positions="guessing no";;
           beos*)           gl_cv_func_printf_positions="guessing no";;
                            # Guess yes on Android.
           linux*-android*) gl_cv_func_printf_positions="guessing yes";;
                            # Guess no on native Windows.
           mingw* | pw*)    gl_cv_func_printf_positions="guessing no";;
           *)               gl_cv_func_printf_positions="guessing yes";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
/* The string "%2$d %1$d", with dollar characters protected from the shell's
   dollar expansion (possibly an autoconf bug).  */
static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
static char buf[100];
int main ()
{
  sprintf (buf, format, 33, 55);
  return (strcmp (buf, "55 33") != 0);
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_printf_positions=yes
else
  gl_cv_func_printf_positions=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5
$as_echo "$gl_cv_func_printf_positions" >&6; }

            case "$gl_cv_func_printf_positions" in
              *yes)
                gl_cv_func_snprintf_usable=yes
                ;;
            esac
            ;;
        esac
        ;;
    esac
  fi
  if test $gl_cv_func_snprintf_usable = no; then










  gl_LIBOBJS="$gl_LIBOBJS snprintf.$ac_objext"

  if test $ac_cv_func_snprintf = yes; then
    REPLACE_SNPRINTF=1
  else

    if test $ac_cv_have_decl_snprintf = yes; then
                        REPLACE_SNPRINTF=1
    fi
  fi
  :

  fi

  if test $ac_cv_have_decl_snprintf = no; then
    HAVE_DECL_SNPRINTF=0
  fi






          GNULIB_SNPRINTF=1





$as_echo "#define GNULIB_TEST_SNPRINTF 1" >>confdefs.h





cat >>confdefs.h <<_ACEOF
#define GNULIB_SNPRINTF 1
_ACEOF

















  gl_cv_func_snprintf_posix=no
  for ac_func in snprintf
do :
  ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf"
if test "x$ac_cv_func_snprintf" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SNPRINTF 1
_ACEOF

fi
done

  if test $ac_cv_func_snprintf = yes; then



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf truncates the result as in C99" >&5
$as_echo_n "checking whether snprintf truncates the result as in C99... " >&6; }
if ${gl_cv_func_snprintf_truncation_c99+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
                                 # Guess yes on glibc systems.
           *-gnu* | gnu*)        gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on musl systems.
           *-musl*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on FreeBSD >= 5.
           freebsd[1-4].*)       gl_cv_func_snprintf_truncation_c99="guessing no";;
           freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on Mac OS X >= 10.3.
           darwin[1-6].*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
           darwin*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on OpenBSD >= 3.9.
           openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
           openbsd*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on Solaris >= 2.6.
           solaris2.[0-5] | solaris2.[0-5].*)
                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
           solaris*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on AIX >= 4.
           aix[1-3]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
           aix*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on HP-UX >= 11.
           hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
           hpux*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on IRIX >= 6.5.
           irix6.5)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on OSF/1 >= 5.
           osf[3-4]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
           osf*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on NetBSD >= 3.
           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
           netbsd*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on BeOS.
           beos*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on Android.
           linux*-android*)      gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess no on native Windows.
           mingw*)               gl_cv_func_snprintf_truncation_c99="guessing no";;
                                 # If we don't know, obey --enable-cross-guesses.
           *)                    gl_cv_func_snprintf_truncation_c99="$gl_cross_guess_normal";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
#if HAVE_SNPRINTF
# define my_snprintf snprintf
#else
# include <stdarg.h>
static int my_snprintf (char *buf, int size, const char *format, ...)
{
  va_list args;
  int ret;
  va_start (args, format);
  ret = vsnprintf (buf, size, format, args);
  va_end (args);
  return ret;
}
#endif
static char buf[100];
int main ()
{
  strcpy (buf, "ABCDEF");
  my_snprintf (buf, 3, "%d %d", 4567, 89);
  if (memcmp (buf, "45\0DEF", 6) != 0)
    return 1;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_snprintf_truncation_c99=yes
else
  gl_cv_func_snprintf_truncation_c99=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_truncation_c99" >&5
$as_echo "$gl_cv_func_snprintf_truncation_c99" >&6; }





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf fully supports the 'n' directive" >&5
$as_echo_n "checking whether snprintf fully supports the 'n' directive... " >&6; }
if ${gl_cv_func_snprintf_directive_n+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
                                 # Guess yes on glibc systems.
           *-gnu* | gnu*)        gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on musl systems.
           *-musl*)              gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on FreeBSD >= 5.
           freebsd[1-4].*)       gl_cv_func_snprintf_directive_n="guessing no";;
           freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on Mac OS X >= 10.3.
           darwin[1-6].*)        gl_cv_func_snprintf_directive_n="guessing no";;
           darwin*)              gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on Solaris >= 2.6.
           solaris2.[0-5] | solaris2.[0-5].*)
                                 gl_cv_func_snprintf_directive_n="guessing no";;
           solaris*)             gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on AIX >= 4.
           aix[1-3]*)            gl_cv_func_snprintf_directive_n="guessing no";;
           aix*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on IRIX >= 6.5.
           irix6.5)              gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on OSF/1 >= 5.
           osf[3-4]*)            gl_cv_func_snprintf_directive_n="guessing no";;
           osf*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on NetBSD >= 3.
           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
                                 gl_cv_func_snprintf_directive_n="guessing no";;
           netbsd*)              gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on BeOS.
           beos*)                gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess no on Android.
           linux*-android*)      gl_cv_func_snprintf_directive_n="guessing no";;
                                 # Guess no on native Windows.
           mingw*)               gl_cv_func_snprintf_directive_n="guessing no";;
                                 # If we don't know, obey --enable-cross-guesses.
           *)                    gl_cv_func_snprintf_directive_n="$gl_cross_guess_normal";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
#if HAVE_SNPRINTF
# define my_snprintf snprintf
#else
# include <stdarg.h>
static int my_snprintf (char *buf, int size, const char *format, ...)
{
  va_list args;
  int ret;
  va_start (args, format);
  ret = vsnprintf (buf, size, format, args);
  va_end (args);
  return ret;
}
#endif
static char fmtstring[10];
static char buf[100];
int main ()
{
  int count = -1;
  /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
     support %n in format strings in read-only memory but not in writable
     memory.  */
  strcpy (fmtstring, "%d %n");
  my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
  if (count != 6)
    return 1;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_snprintf_directive_n=yes
else
  gl_cv_func_snprintf_directive_n=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_directive_n" >&5
$as_echo "$gl_cv_func_snprintf_directive_n" >&6; }




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
$as_echo_n "checking whether snprintf respects a size of 1... " >&6; }
if ${gl_cv_func_snprintf_size1+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
                            # Guess yes on Android.
           linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
                            # Guess yes on native Windows.
           mingw*)          gl_cv_func_snprintf_size1="guessing yes" ;;
           *)               gl_cv_func_snprintf_size1="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#if HAVE_SNPRINTF
# define my_snprintf snprintf
#else
# include <stdarg.h>
static int my_snprintf (char *buf, int size, const char *format, ...)
{
  va_list args;
  int ret;
  va_start (args, format);
  ret = vsnprintf (buf, size, format, args);
  va_end (args);
  return ret;
}
#endif
int main()
{
  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
  my_snprintf (buf, 1, "%d", 12345);
  return buf[1] != 'E';
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_snprintf_size1=yes
else
  gl_cv_func_snprintf_size1=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
$as_echo "$gl_cv_func_snprintf_size1" >&6; }



     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vsnprintf respects a zero size as in C99" >&5
$as_echo_n "checking whether vsnprintf respects a zero size as in C99... " >&6; }
if ${gl_cv_func_vsnprintf_zerosize_c99+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
                                 # Guess yes on glibc systems.
           *-gnu* | gnu*)        gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on musl systems.
           *-musl*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on FreeBSD >= 5.
           freebsd[1-4].*)       gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
           freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on Mac OS X >= 10.3.
           darwin[1-6].*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
           darwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on Cygwin.
           cygwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on Solaris >= 2.6.
           solaris2.[0-5] | solaris2.[0-5].*)
                                 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
           solaris*)             gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on AIX >= 4.
           aix[1-3]*)            gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
           aix*)                 gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on IRIX >= 6.5.
           irix6.5)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on NetBSD >= 3.
           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
                                 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
           netbsd*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on BeOS.
           beos*)                gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on Android.
           linux*-android*)      gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on native Windows.
           mingw* | pw*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # If we don't know, obey --enable-cross-guesses.
           *)                    gl_cv_func_vsnprintf_zerosize_c99="$gl_cross_guess_normal";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdarg.h>
#include <stdio.h>
static int my_snprintf (char *buf, int size, const char *format, ...)
{
  va_list args;
  int ret;
  va_start (args, format);
  ret = vsnprintf (buf, size, format, args);
  va_end (args);
  return ret;
}
int main()
{
  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
  my_snprintf (buf, 0, "%d", 12345);
  return buf[0] != 'D';
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_vsnprintf_zerosize_c99=yes
else
  gl_cv_func_vsnprintf_zerosize_c99=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_vsnprintf_zerosize_c99" >&5
$as_echo "$gl_cv_func_vsnprintf_zerosize_c99" >&6; }

    case "$gl_cv_func_printf_sizes_c99" in
      *yes)
        case "$gl_cv_func_printf_long_double" in
          *yes)
            case "$gl_cv_func_printf_infinite" in
              *yes)
                case "$gl_cv_func_printf_infinite_long_double" in
                  *yes)
                    case "$gl_cv_func_printf_directive_a" in
                      *yes)
                        case "$gl_cv_func_printf_directive_f" in
                          *yes)
                            case "$gl_cv_func_printf_directive_n" in
                              *yes)
                                case "$gl_cv_func_printf_directive_ls" in
                                  *yes)
                                    case "$gl_cv_func_printf_positions" in
                                      *yes)
                                        case "$gl_cv_func_printf_flag_grouping" in
                                          *yes)
                                            case "$gl_cv_func_printf_flag_leftadjust" in
                                              *yes)
                                                case "$gl_cv_func_printf_flag_zero" in
                                                  *yes)
                                                    case "$gl_cv_func_printf_precision" in
                                                      *yes)
                                                        case "$gl_cv_func_printf_enomem" in
                                                          *yes)
                                                            case "$gl_cv_func_snprintf_truncation_c99" in
                                                              *yes)
                                                                case "$gl_cv_func_snprintf_retval_c99" in
                                                                  *yes)
                                                                    case "$gl_cv_func_snprintf_directive_n" in
                                                                      *yes)
                                                                        case "$gl_cv_func_snprintf_size1" in
                                                                          *yes)
                                                                            case "$gl_cv_func_vsnprintf_zerosize_c99" in
                                                                              *yes)
                                                                                # snprintf exists and is
                                                                                # already POSIX compliant.
                                                                                gl_cv_func_snprintf_posix=yes
                                                                                ;;
                                                                            esac
                                                                            ;;
                                                                        esac
                                                                        ;;
                                                                    esac
                                                                    ;;
                                                                esac
                                                                ;;
                                                            esac
                                                            ;;
                                                        esac
                                                        ;;
                                                    esac
                                                    ;;
                                                esac
                                                ;;
                                            esac
                                            ;;
                                        esac
                                        ;;
                                    esac
                                    ;;
                                esac
                                ;;
                            esac
                            ;;
                        esac
                        ;;
                    esac
                    ;;
                esac
                ;;
            esac
            ;;
        esac
        ;;
    esac
  fi
  if test $gl_cv_func_snprintf_posix = no; then



  case "$gl_cv_func_printf_infinite" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h

      ;;
  esac




  case "$gl_cv_func_printf_long_double" in
    *yes)
      case "$gl_cv_func_printf_infinite_long_double" in
        *yes)
          ;;
        *)

$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h

          ;;
      esac
      ;;
  esac



  case "$gl_cv_func_printf_directive_a" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h

      for ac_func in nl_langinfo
do :
  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
if test "x$ac_cv_func_nl_langinfo" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_NL_LANGINFO 1
_ACEOF

fi
done

      ;;
  esac



  case "$gl_cv_func_printf_directive_f" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_directive_ls" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_grouping" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_leftadjust" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_zero" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_precision" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_enomem" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac











  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"

  if test $ac_cv_func_vasnprintf = yes; then

$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h

  fi











  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
if test "x$ac_cv_type_ptrdiff_t" = xyes; then :

else

$as_echo "#define ptrdiff_t long" >>confdefs.h


fi

















  gl_LIBOBJS="$gl_LIBOBJS snprintf.$ac_objext"

  if test $ac_cv_func_snprintf = yes; then
    REPLACE_SNPRINTF=1
  else

    if test $ac_cv_have_decl_snprintf = yes; then
                        REPLACE_SNPRINTF=1
    fi
  fi
  :

  fi













     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_spawn_h='<'spawn.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <spawn.h>" >&5
$as_echo_n "checking absolute name of <spawn.h>... " >&6; }
if ${gl_cv_next_spawn_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_spawn_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <spawn.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'spawn.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_spawn_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_spawn_h
           gl_cv_next_spawn_h='"'$gl_header'"'
          else
               gl_cv_next_spawn_h='<'spawn.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_spawn_h" >&5
$as_echo "$gl_cv_next_spawn_h" >&6; }
     fi
     NEXT_SPAWN_H=$gl_cv_next_spawn_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'spawn.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_spawn_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_SPAWN_H=$gl_next_as_first_directive





  if test $ac_cv_header_spawn_h = yes; then
    HAVE_SPAWN_H=1
    ac_fn_c_check_type "$LINENO" "posix_spawnattr_t" "ac_cv_type_posix_spawnattr_t" "
#include <spawn.h>

"
if test "x$ac_cv_type_posix_spawnattr_t" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_POSIX_SPAWNATTR_T 1
_ACEOF


else
  HAVE_POSIX_SPAWNATTR_T=0
fi

    ac_fn_c_check_type "$LINENO" "posix_spawn_file_actions_t" "ac_cv_type_posix_spawn_file_actions_t" "
#include <spawn.h>

"
if test "x$ac_cv_type_posix_spawn_file_actions_t" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_POSIX_SPAWN_FILE_ACTIONS_T 1
_ACEOF


else
  HAVE_POSIX_SPAWN_FILE_ACTIONS_T=0
fi

  else
    HAVE_SPAWN_H=0
    HAVE_POSIX_SPAWNATTR_T=0
    HAVE_POSIX_SPAWN_FILE_ACTIONS_T=0
  fi
































  gl_cv_func_sprintf_posix=no
  case "$gl_cv_func_printf_sizes_c99" in
    *yes)
      case "$gl_cv_func_printf_long_double" in
        *yes)
          case "$gl_cv_func_printf_infinite" in
            *yes)
              case "$gl_cv_func_printf_infinite_long_double" in
                *yes)
                  case "$gl_cv_func_printf_directive_a" in
                    *yes)
                      case "$gl_cv_func_printf_directive_f" in
                        *yes)
                          case "$gl_cv_func_printf_directive_n" in
                            *yes)
                              case "$gl_cv_func_printf_directive_ls" in
                                *yes)
                                  case "$gl_cv_func_printf_positions" in
                                    *yes)
                                      case "$gl_cv_func_printf_flag_grouping" in
                                        *yes)
                                          case "$gl_cv_func_printf_flag_leftadjust" in
                                            *yes)
                                              case "$gl_cv_func_printf_flag_zero" in
                                                *yes)
                                                  case "$gl_cv_func_printf_precision" in
                                                    *yes)
                                                      case "$gl_cv_func_printf_enomem" in
                                                        *yes)
                                                          # sprintf exists and is
                                                          # already POSIX compliant.
                                                          gl_cv_func_sprintf_posix=yes
                                                          ;;
                                                      esac
                                                      ;;
                                                  esac
                                                  ;;
                                              esac
                                              ;;
                                          esac
                                          ;;
                                      esac
                                      ;;
                                  esac
                                  ;;
                              esac
                              ;;
                          esac
                          ;;
                      esac
                      ;;
                  esac
                  ;;
              esac
              ;;
          esac
          ;;
      esac
      ;;
  esac
  if test $gl_cv_func_sprintf_posix = no; then



  case "$gl_cv_func_printf_infinite" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h

      ;;
  esac




  case "$gl_cv_func_printf_long_double" in
    *yes)
      case "$gl_cv_func_printf_infinite_long_double" in
        *yes)
          ;;
        *)

$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h

          ;;
      esac
      ;;
  esac



  case "$gl_cv_func_printf_directive_a" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h

      for ac_func in nl_langinfo
do :
  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
if test "x$ac_cv_func_nl_langinfo" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_NL_LANGINFO 1
_ACEOF

fi
done

      ;;
  esac



  case "$gl_cv_func_printf_directive_f" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_directive_ls" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_grouping" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_leftadjust" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_zero" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_precision" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_enomem" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac











  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"

  if test $ac_cv_func_vasnprintf = yes; then

$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h

  fi











  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
if test "x$ac_cv_type_ptrdiff_t" = xyes; then :

else

$as_echo "#define ptrdiff_t long" >>confdefs.h


fi

















  gl_LIBOBJS="$gl_LIBOBJS sprintf.$ac_objext"

  REPLACE_SPRINTF=1
  :

  fi






          GNULIB_SPRINTF_POSIX=1





$as_echo "#define GNULIB_TEST_SPRINTF_POSIX 1" >>confdefs.h




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ssize_t" >&5
$as_echo_n "checking for ssize_t... " >&6; }
if ${gt_cv_ssize_t+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
int
main ()
{
int x = sizeof (ssize_t *) + sizeof (ssize_t);
            return !x;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gt_cv_ssize_t=yes
else
  gt_cv_ssize_t=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_ssize_t" >&5
$as_echo "$gt_cv_ssize_t" >&6; }
  if test $gt_cv_ssize_t = no; then

$as_echo "#define ssize_t int" >>confdefs.h

  fi




  # Define two additional variables used in the Makefile substitution.

  if test "$ac_cv_header_stdbool_h" = yes; then
    STDBOOL_H=''
  else
    STDBOOL_H='stdbool.h'
  fi

   if test -n "$STDBOOL_H"; then
  GL_GENERATE_STDBOOL_H_TRUE=
  GL_GENERATE_STDBOOL_H_FALSE='#'
else
  GL_GENERATE_STDBOOL_H_TRUE='#'
  GL_GENERATE_STDBOOL_H_FALSE=
fi


  if test "$ac_cv_type__Bool" = yes; then
    HAVE__BOOL=1
  else
    HAVE__BOOL=0
  fi





  STDDEF_H=

      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for good max_align_t" >&5
$as_echo_n "checking for good max_align_t... " >&6; }
if ${gl_cv_type_max_align_t+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stddef.h>
            unsigned int s = sizeof (max_align_t);
            #if defined __GNUC__ || defined __IBM__ALIGNOF__
            int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1];
            int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1];
            #endif

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_type_max_align_t=yes
else
  gl_cv_type_max_align_t=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_max_align_t" >&5
$as_echo "$gl_cv_type_max_align_t" >&6; }
  if test $gl_cv_type_max_align_t = no; then
    HAVE_MAX_ALIGN_T=0
    STDDEF_H=stddef.h
  fi

  if test $gt_cv_c_wchar_t = no; then
    HAVE_WCHAR_T=0
    STDDEF_H=stddef.h
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NULL can be used in arbitrary expressions" >&5
$as_echo_n "checking whether NULL can be used in arbitrary expressions... " >&6; }
if ${gl_cv_decl_null_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stddef.h>
      int test[2 * (sizeof NULL == sizeof (void *)) -1];

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_decl_null_works=yes
else
  gl_cv_decl_null_works=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_null_works" >&5
$as_echo "$gl_cv_decl_null_works" >&6; }
  if test $gl_cv_decl_null_works = no; then
    REPLACE_NULL=1
    STDDEF_H=stddef.h
  fi


   if test -n "$STDDEF_H"; then
  GL_GENERATE_STDDEF_H_TRUE=
  GL_GENERATE_STDDEF_H_FALSE='#'
else
  GL_GENERATE_STDDEF_H_TRUE='#'
  GL_GENERATE_STDDEF_H_FALSE=
fi

  if test -n "$STDDEF_H"; then








     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_stddef_h='<'stddef.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <stddef.h>" >&5
$as_echo_n "checking absolute name of <stddef.h>... " >&6; }
if ${gl_cv_next_stddef_h+:} false; then :
  $as_echo_n "(cached) " >&6
else



  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stddef.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'stddef.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_stddef_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_stddef_h
           gl_cv_next_stddef_h='"'$gl_header'"'


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stddef_h" >&5
$as_echo "$gl_cv_next_stddef_h" >&6; }
     fi
     NEXT_STDDEF_H=$gl_cv_next_stddef_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'stddef.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_stddef_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_STDDEF_H=$gl_next_as_first_directive




  fi




  $as_echo "#define __USE_MINGW_ANSI_STDIO 1" >>confdefs.h










     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_stdio_h='<'stdio.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdio.h>" >&5
$as_echo_n "checking absolute name of <stdio.h>... " >&6; }
if ${gl_cv_next_stdio_h+:} false; then :
  $as_echo_n "(cached) " >&6
else



  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdio.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'stdio.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_stdio_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_stdio_h
           gl_cv_next_stdio_h='"'$gl_header'"'


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdio_h" >&5
$as_echo "$gl_cv_next_stdio_h" >&6; }
     fi
     NEXT_STDIO_H=$gl_cv_next_stdio_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'stdio.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_stdio_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_STDIO_H=$gl_next_as_first_directive





        { $as_echo "$as_me:${as_lineno-$LINENO}: checking which flavor of printf attribute matches inttypes macros" >&5
$as_echo_n "checking which flavor of printf attribute matches inttypes macros... " >&6; }
if ${gl_cv_func_printf_attribute_flavor+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

       #define __STDC_FORMAT_MACROS 1
       #include <stdio.h>
       #include <inttypes.h>
       /* For non-mingw systems, compilation will trivially succeed.
          For mingw, compilation will succeed for older mingw (system
          printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */
       #if (defined _WIN32 && ! defined __CYGWIN__) && \
         (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
       extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1];
       #endif

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_func_printf_attribute_flavor=system
else
  gl_cv_func_printf_attribute_flavor=gnu
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_attribute_flavor" >&5
$as_echo "$gl_cv_func_printf_attribute_flavor" >&6; }
  if test "$gl_cv_func_printf_attribute_flavor" = gnu; then

$as_echo "#define GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU 1" >>confdefs.h

  fi

      GNULIB_FSCANF=1


cat >>confdefs.h <<_ACEOF
#define GNULIB_FSCANF 1
_ACEOF


  GNULIB_SCANF=1


cat >>confdefs.h <<_ACEOF
#define GNULIB_SCANF 1
_ACEOF


  GNULIB_FGETC=1
  GNULIB_GETC=1
  GNULIB_GETCHAR=1
  GNULIB_FGETS=1
  GNULIB_FREAD=1


      GNULIB_FPRINTF=1
  GNULIB_PRINTF=1
  GNULIB_VFPRINTF=1
  GNULIB_VPRINTF=1
  GNULIB_FPUTC=1
  GNULIB_PUTC=1
  GNULIB_PUTCHAR=1
  GNULIB_FPUTS=1
  GNULIB_PUTS=1
  GNULIB_FWRITE=1

















     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_stdlib_h='<'stdlib.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdlib.h>" >&5
$as_echo_n "checking absolute name of <stdlib.h>... " >&6; }
if ${gl_cv_next_stdlib_h+:} false; then :
  $as_echo_n "(cached) " >&6
else



  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'stdlib.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_stdlib_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_stdlib_h
           gl_cv_next_stdlib_h='"'$gl_header'"'


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdlib_h" >&5
$as_echo "$gl_cv_next_stdlib_h" >&6; }
     fi
     NEXT_STDLIB_H=$gl_cv_next_stdlib_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'stdlib.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_stdlib_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_STDLIB_H=$gl_next_as_first_directive















  for ac_func in stpcpy
do :
  ac_fn_c_check_func "$LINENO" "stpcpy" "ac_cv_func_stpcpy"
if test "x$ac_cv_func_stpcpy" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STPCPY 1
_ACEOF

fi
done

  if test $ac_cv_func_stpcpy = no; then
    HAVE_STPCPY=0
  fi

  if test $HAVE_STPCPY = 0; then








  gl_LIBOBJS="$gl_LIBOBJS stpcpy.$ac_objext"


  :

  fi





          GNULIB_STPCPY=1





$as_echo "#define GNULIB_TEST_STPCPY 1" >>confdefs.h







  if test $ac_cv_func_strdup = yes; then
    if test $gl_cv_func_malloc_posix != yes; then
      REPLACE_STRDUP=1
    fi
  fi

  if test $ac_cv_have_decl_strdup = no; then
    HAVE_DECL_STRDUP=0
  fi

  if test $ac_cv_func_strdup = no || test $REPLACE_STRDUP = 1; then








  gl_LIBOBJS="$gl_LIBOBJS strdup.$ac_objext"

    :
  fi





          GNULIB_STRDUP=1





$as_echo "#define GNULIB_TEST_STRDUP 1" >>confdefs.h










  if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strerror function" >&5
$as_echo_n "checking for working strerror function... " >&6; }
if ${gl_cv_func_working_strerror+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  case "$host_os" in
                          # Guess yes on glibc systems.
           *-gnu* | gnu*) gl_cv_func_working_strerror="guessing yes" ;;
                          # Guess yes on musl systems.
           *-musl*)       gl_cv_func_working_strerror="guessing yes" ;;
                          # If we don't know, obey --enable-cross-guesses.
           *)             gl_cv_func_working_strerror="$gl_cross_guess_normal" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <string.h>

int
main ()
{
if (!*strerror (-2)) return 1;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_working_strerror=yes
else
  gl_cv_func_working_strerror=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_strerror" >&5
$as_echo "$gl_cv_func_working_strerror" >&6; }
    case "$gl_cv_func_working_strerror" in
      *yes) ;;
      *)
                        REPLACE_STRERROR=1
        ;;
    esac

                  case "$gl_cv_func_strerror_r_works" in
        *no) REPLACE_STRERROR=1 ;;
      esac

  else
            REPLACE_STRERROR=1
  fi

  if test $REPLACE_STRERROR = 1; then








  gl_LIBOBJS="$gl_LIBOBJS strerror.$ac_objext"

  fi


cat >>confdefs.h <<_ACEOF
#define GNULIB_STRERROR 1
_ACEOF







          GNULIB_STRERROR=1





$as_echo "#define GNULIB_TEST_STRERROR 1" >>confdefs.h












  if test $ac_cv_have_decl_strndup = no; then
    HAVE_DECL_STRNDUP=0
  fi

  if test $ac_cv_func_strndup = yes; then
    HAVE_STRNDUP=1
    # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'.
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strndup" >&5
$as_echo_n "checking for working strndup... " >&6; }
if ${gl_cv_func_strndup_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :

          case $host_os in
            aix | aix[3-6]*) gl_cv_func_strndup_works="guessing no";;
            *)               gl_cv_func_strndup_works="guessing yes";;
          esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

         #include <string.h>
                           #include <stdlib.h>
int
main ()
{

#if !HAVE_DECL_STRNDUP
  extern
  #ifdef __cplusplus
  "C"
  #endif
  char *strndup (const char *, size_t);
#endif
  int result;
  char *s;
  s = strndup ("some longer string", 15);
  free (s);
  s = strndup ("shorter string", 13);
  result = s[13] != '\0';
  free (s);
  return result;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_strndup_works=yes
else
  gl_cv_func_strndup_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strndup_works" >&5
$as_echo "$gl_cv_func_strndup_works" >&6; }
    case $gl_cv_func_strndup_works in
      *no) REPLACE_STRNDUP=1 ;;
    esac
  else
    HAVE_STRNDUP=0
  fi

  if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then








  gl_LIBOBJS="$gl_LIBOBJS strndup.$ac_objext"

  fi





          GNULIB_STRNDUP=1





$as_echo "#define GNULIB_TEST_STRNDUP 1" >>confdefs.h







  for ac_func in strverscmp
do :
  ac_fn_c_check_func "$LINENO" "strverscmp" "ac_cv_func_strverscmp"
if test "x$ac_cv_func_strverscmp" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRVERSCMP 1
_ACEOF

fi
done

  if test $ac_cv_func_strverscmp = no; then
    HAVE_STRVERSCMP=0
  fi

  if test $HAVE_STRVERSCMP = 0; then








  gl_LIBOBJS="$gl_LIBOBJS strverscmp.$ac_objext"


  :

  fi





          GNULIB_STRVERSCMP=1





$as_echo "#define GNULIB_TEST_STRVERSCMP 1" >>confdefs.h














     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_sys_resource_h='<'sys/resource.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/resource.h>" >&5
$as_echo_n "checking absolute name of <sys/resource.h>... " >&6; }
if ${gl_cv_next_sys_resource_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_sys_resource_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/resource.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'sys/resource.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_sys_resource_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_sys_resource_h
           gl_cv_next_sys_resource_h='"'$gl_header'"'
          else
               gl_cv_next_sys_resource_h='<'sys/resource.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_resource_h" >&5
$as_echo "$gl_cv_next_sys_resource_h" >&6; }
     fi
     NEXT_SYS_RESOURCE_H=$gl_cv_next_sys_resource_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'sys/resource.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_sys_resource_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_SYS_RESOURCE_H=$gl_next_as_first_directive




  if test $ac_cv_header_sys_resource_h = yes; then
    HAVE_SYS_RESOURCE_H=1
  else
    HAVE_SYS_RESOURCE_H=0
  fi























     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_sys_times_h='<'sys/times.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/times.h>" >&5
$as_echo_n "checking absolute name of <sys/times.h>... " >&6; }
if ${gl_cv_next_sys_times_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_sys_times_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/times.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'sys/times.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_sys_times_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_sys_times_h
           gl_cv_next_sys_times_h='"'$gl_header'"'
          else
               gl_cv_next_sys_times_h='<'sys/times.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_times_h" >&5
$as_echo "$gl_cv_next_sys_times_h" >&6; }
     fi
     NEXT_SYS_TIMES_H=$gl_cv_next_sys_times_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'sys/times.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_sys_times_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_SYS_TIMES_H=$gl_next_as_first_directive




  if test $ac_cv_header_sys_times_h = yes; then
    HAVE_SYS_TIMES_H=1
    ac_fn_c_check_type "$LINENO" "struct tms" "ac_cv_type_struct_tms" "
#include <sys/times.h>

"
if test "x$ac_cv_type_struct_tms" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_TMS 1
_ACEOF


else
  HAVE_STRUCT_TMS=0
fi

  else
    HAVE_SYS_TIMES_H=0
    HAVE_STRUCT_TMS=0
  fi





















     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_sys_wait_h='<'sys/wait.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/wait.h>" >&5
$as_echo_n "checking absolute name of <sys/wait.h>... " >&6; }
if ${gl_cv_next_sys_wait_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_sys_wait_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/wait.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'sys/wait.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_sys_wait_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_sys_wait_h
           gl_cv_next_sys_wait_h='"'$gl_header'"'
          else
               gl_cv_next_sys_wait_h='<'sys/wait.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_wait_h" >&5
$as_echo "$gl_cv_next_sys_wait_h" >&6; }
     fi
     NEXT_SYS_WAIT_H=$gl_cv_next_sys_wait_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'sys/wait.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_sys_wait_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H=$gl_next_as_first_directive
















  :















     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_unistd_h='<'unistd.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <unistd.h>" >&5
$as_echo_n "checking absolute name of <unistd.h>... " >&6; }
if ${gl_cv_next_unistd_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_unistd_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'unistd.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_unistd_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_unistd_h
           gl_cv_next_unistd_h='"'$gl_header'"'
          else
               gl_cv_next_unistd_h='<'unistd.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_unistd_h" >&5
$as_echo "$gl_cv_next_unistd_h" >&6; }
     fi
     NEXT_UNISTD_H=$gl_cv_next_unistd_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'unistd.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_unistd_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_UNISTD_H=$gl_next_as_first_directive




  if test $ac_cv_header_unistd_h = yes; then
    HAVE_UNISTD_H=1
  else
    HAVE_UNISTD_H=0
  fi















      if  { test "$HAVE_LIBUNISTRING" != yes \
    || {



            test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
            || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
                 && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
                      || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
                           && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4
                         }
                    }
               }




       }
  }; then
    LIBUNISTRING_UNITYPES_H='unitypes.h'
  else
    LIBUNISTRING_UNITYPES_H=
  fi




      if  { test "$HAVE_LIBUNISTRING" != yes \
    || {



            test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
            || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
                 && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
                      || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
                           && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4
                         }
                    }
               }




       }
  }; then
    LIBUNISTRING_UNIWIDTH_H='uniwidth.h'
  else
    LIBUNISTRING_UNIWIDTH_H=
  fi




       if  { test "$HAVE_LIBUNISTRING" != yes \
    || {



            test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
            || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
                 && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
                      || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
                           && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8
                         }
                    }
               }




       }
  }; then
  LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE=
  LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE='#'
else
  LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE='#'
  LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE=
fi







    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether unlink honors trailing slashes" >&5
$as_echo_n "checking whether unlink honors trailing slashes... " >&6; }
if ${gl_cv_func_unlink_honors_slashes+:} false; then :
  $as_echo_n "(cached) " >&6
else
  touch conftest.file
     # Assume that if we have lstat, we can also check symlinks.
     if test $ac_cv_func_lstat = yes; then
       ln -s conftest.file conftest.lnk
     fi
     if test "$cross_compiling" = yes; then :
  case "$host_os" in
                          # Guess yes on Linux systems.
         linux-* | linux) gl_cv_func_unlink_honors_slashes="guessing yes" ;;
                          # Guess yes on glibc systems.
         *-gnu*)          gl_cv_func_unlink_honors_slashes="guessing yes" ;;
                          # Guess no on native Windows.
         mingw*)          gl_cv_func_unlink_honors_slashes="guessing no" ;;
                          # If we don't know, obey --enable-cross-guesses.
         *)               gl_cv_func_unlink_honors_slashes="$gl_cross_guess_normal" ;;
       esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if HAVE_UNISTD_H
           # include <unistd.h>
           #else /* on Windows with MSVC */
           # include <io.h>
           #endif
           #include <errno.h>

int
main ()
{
int result = 0;
           if (!unlink ("conftest.file/"))
             result |= 1;
           else if (errno != ENOTDIR)
             result |= 2;
#if HAVE_LSTAT
           if (!unlink ("conftest.lnk/"))
             result |= 4;
           else if (errno != ENOTDIR)
             result |= 8;
#endif
           return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_unlink_honors_slashes=yes
else
  gl_cv_func_unlink_honors_slashes=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

     rm -f conftest.file conftest.lnk
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unlink_honors_slashes" >&5
$as_echo "$gl_cv_func_unlink_honors_slashes" >&6; }
  case "$gl_cv_func_unlink_honors_slashes" in
    *no)
      REPLACE_UNLINK=1
      ;;
  esac

      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether unlink of a parent directory fails as it should" >&5
$as_echo_n "checking whether unlink of a parent directory fails as it should... " >&6; }
if ${gl_cv_func_unlink_parent_fails+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case "$host_os" in
       darwin*)
                                                      if {
              # Use the mktemp program if available. If not available, hide the error
              # message.
              tmp=`(umask 077 && mktemp -d /tmp/gtXXXXXX) 2>/dev/null` &&
              test -n "$tmp" && test -d "$tmp"
            } ||
            {
              # Use a simple mkdir command. It is guaranteed to fail if the directory
              # already exists.  $RANDOM is bash specific and expands to empty in shells
              # other than bash, ksh and zsh.  Its use does not increase security;
              # rather, it minimizes the probability of failure in a very cluttered /tmp
              # directory.
              tmp=/tmp/gt$$-$RANDOM
              (umask 077 && mkdir "$tmp")
            }; then
           mkdir "$tmp/subdir"
           GL_SUBDIR_FOR_UNLINK="$tmp/subdir"
           export GL_SUBDIR_FOR_UNLINK
           if test "$cross_compiling" = yes; then :
  # If we don't know, obey --enable-cross-guesses.
              gl_cv_func_unlink_parent_fails="$gl_cross_guess_normal"

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

                #include <stdlib.h>
                #if HAVE_UNISTD_H
                # include <unistd.h>
                #else /* on Windows with MSVC */
                # include <direct.h>
                # include <io.h>
                #endif
                int main ()
                {
                  int result = 0;
                  if (chdir (getenv ("GL_SUBDIR_FOR_UNLINK")) != 0)
                    result |= 1;
                  else if (unlink ("..") == 0)
                    result |= 2;
                  return result;
                }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_unlink_parent_fails=yes
else
  gl_cv_func_unlink_parent_fails=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

           unset GL_SUBDIR_FOR_UNLINK
           rm -rf "$tmp"
         else
           gl_cv_func_unlink_parent_fails="guessing no"
         fi
         ;;
       *)
         gl_cv_func_unlink_parent_fails="guessing yes"
         ;;
     esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unlink_parent_fails" >&5
$as_echo "$gl_cv_func_unlink_parent_fails" >&6; }
  case "$gl_cv_func_unlink_parent_fails" in
    *no)
      REPLACE_UNLINK=1

$as_echo "#define UNLINK_PARENT_BUG 1" >>confdefs.h

      ;;
  esac

  if test $REPLACE_UNLINK = 1; then








  gl_LIBOBJS="$gl_LIBOBJS unlink.$ac_objext"

  fi





          GNULIB_UNLINK=1





$as_echo "#define GNULIB_TEST_UNLINK 1" >>confdefs.h





$as_echo "#define USE_UNLOCKED_IO 1" >>confdefs.h





















  if test $ac_cv_have_decl_unsetenv = no; then
    HAVE_DECL_UNSETENV=0
  fi
  for ac_func in unsetenv
do :
  ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv"
if test "x$ac_cv_func_unsetenv" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_UNSETENV 1
_ACEOF

fi
done

  if test $ac_cv_func_unsetenv = no; then
    HAVE_UNSETENV=0
  else
    HAVE_UNSETENV=1
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsetenv() return type" >&5
$as_echo_n "checking for unsetenv() return type... " >&6; }
if ${gt_cv_func_unsetenv_ret+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#undef _BSD
#define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 <stdlib.h> */
#include <stdlib.h>
extern
#ifdef __cplusplus
"C"
#endif
int unsetenv (const char *name);

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gt_cv_func_unsetenv_ret='int'
else
  gt_cv_func_unsetenv_ret='void'
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_unsetenv_ret" >&5
$as_echo "$gt_cv_func_unsetenv_ret" >&6; }
    if test $gt_cv_func_unsetenv_ret = 'void'; then

$as_echo "#define VOID_UNSETENV 1" >>confdefs.h

      REPLACE_UNSETENV=1
    fi

                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether unsetenv obeys POSIX" >&5
$as_echo_n "checking whether unsetenv obeys POSIX... " >&6; }
if ${gl_cv_func_unsetenv_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  case "$host_os" in
                 # Guess yes on glibc systems.
         *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;;
                 # If we don't know, obey --enable-cross-guesses.
         *)      gl_cv_func_unsetenv_works="$gl_cross_guess_normal" ;;
       esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

       #include <stdlib.h>
       #include <errno.h>
       extern char **environ;

int
main ()
{

       char entry1[] = "a=1";
       char entry2[] = "b=2";
       char *env[] = { entry1, entry2, NULL };
       if (putenv ((char *) "a=1")) return 1;
       if (putenv (entry2)) return 2;
       entry2[0] = 'a';
       unsetenv ("a");
       if (getenv ("a")) return 3;
       if (!unsetenv ("") || errno != EINVAL) return 4;
       entry2[0] = 'b';
       environ = env;
       if (!getenv ("a")) return 5;
       entry2[0] = 'a';
       unsetenv ("a");
       if (getenv ("a")) return 6;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_unsetenv_works=yes
else
  gl_cv_func_unsetenv_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unsetenv_works" >&5
$as_echo "$gl_cv_func_unsetenv_works" >&6; }
    case "$gl_cv_func_unsetenv_works" in
      *yes) ;;
      *)
        REPLACE_UNSETENV=1
        ;;
    esac
  fi

  if test $HAVE_UNSETENV = 0 || test $REPLACE_UNSETENV = 1; then








  gl_LIBOBJS="$gl_LIBOBJS unsetenv.$ac_objext"





  fi





          GNULIB_UNSETENV=1





$as_echo "#define GNULIB_TEST_UNSETENV 1" >>confdefs.h





  if test $ac_cv_func_vasnprintf = no; then










  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"

  if test $ac_cv_func_vasnprintf = yes; then

$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h

  fi











  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
if test "x$ac_cv_type_ptrdiff_t" = xyes; then :

else

$as_echo "#define ptrdiff_t long" >>confdefs.h


fi







  fi


  for ac_func in vasprintf
do :
  ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf"
if test "x$ac_cv_func_vasprintf" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_VASPRINTF 1
_ACEOF

fi
done

  if test $ac_cv_func_vasprintf = no; then









  gl_LIBOBJS="$gl_LIBOBJS vasprintf.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS asprintf.$ac_objext"


  if test $ac_cv_func_vasprintf = yes; then
    REPLACE_VASPRINTF=1
  else
    HAVE_VASPRINTF=0
  fi








  fi






          GNULIB_VASPRINTF=1





$as_echo "#define GNULIB_TEST_VASPRINTF 1" >>confdefs.h





  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=asprintf:2:c-format"



  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=vasprintf:2:c-format"
















  gl_cv_func_vasprintf_posix=no
  for ac_func in vasprintf
do :
  ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf"
if test "x$ac_cv_func_vasprintf" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_VASPRINTF 1
_ACEOF

fi
done

  case "$gl_cv_func_printf_sizes_c99" in
    *yes)
      case "$gl_cv_func_printf_long_double" in
        *yes)
          case "$gl_cv_func_printf_infinite" in
            *yes)
              case "$gl_cv_func_printf_infinite_long_double" in
                *yes)
                  case "$gl_cv_func_printf_directive_a" in
                    *yes)
                      case "$gl_cv_func_printf_directive_f" in
                        *yes)
                          case "$gl_cv_func_printf_directive_n" in
                            *yes)
                              case "$gl_cv_func_printf_directive_ls" in
                                *yes)
                                  case "$gl_cv_func_printf_positions" in
                                    *yes)
                                      case "$gl_cv_func_printf_flag_grouping" in
                                        *yes)
                                          case "$gl_cv_func_printf_flag_leftadjust" in
                                            *yes)
                                              case "$gl_cv_func_printf_flag_zero" in
                                                *yes)
                                                  case "$gl_cv_func_printf_precision" in
                                                    *yes)
                                                      case "$gl_cv_func_printf_enomem" in
                                                        *yes)
                                                          if test $ac_cv_func_vasprintf = yes; then
                                                            # vasprintf exists and is
                                                            # already POSIX compliant.
                                                            gl_cv_func_vasprintf_posix=yes
                                                          fi
                                                          ;;
                                                      esac
                                                      ;;
                                                  esac
                                                  ;;
                                              esac
                                              ;;
                                          esac
                                          ;;
                                      esac
                                      ;;
                                  esac
                                  ;;
                              esac
                              ;;
                          esac
                          ;;
                      esac
                      ;;
                  esac
                  ;;
              esac
              ;;
          esac
          ;;
      esac
      ;;
  esac
  if test $gl_cv_func_vasprintf_posix = no; then



  case "$gl_cv_func_printf_infinite" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h

      ;;
  esac




  case "$gl_cv_func_printf_long_double" in
    *yes)
      case "$gl_cv_func_printf_infinite_long_double" in
        *yes)
          ;;
        *)

$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h

          ;;
      esac
      ;;
  esac



  case "$gl_cv_func_printf_directive_a" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h

      for ac_func in nl_langinfo
do :
  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
if test "x$ac_cv_func_nl_langinfo" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_NL_LANGINFO 1
_ACEOF

fi
done

      ;;
  esac



  case "$gl_cv_func_printf_directive_f" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_directive_ls" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_grouping" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_leftadjust" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_zero" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_precision" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_enomem" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac











  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"

  if test $ac_cv_func_vasnprintf = yes; then

$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h

  fi











  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
if test "x$ac_cv_type_ptrdiff_t" = xyes; then :

else

$as_echo "#define ptrdiff_t long" >>confdefs.h


fi
















  gl_LIBOBJS="$gl_LIBOBJS vasprintf.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS asprintf.$ac_objext"


  if test $ac_cv_func_vasprintf = yes; then
    REPLACE_VASPRINTF=1
  else
    HAVE_VASPRINTF=0
  fi








  fi



  gl_cv_func_vsnprintf_usable=no
  for ac_func in vsnprintf
do :
  ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf"
if test "x$ac_cv_func_vsnprintf" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_VSNPRINTF 1
_ACEOF

fi
done

  if test $ac_cv_func_vsnprintf = yes; then



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
$as_echo_n "checking whether snprintf respects a size of 1... " >&6; }
if ${gl_cv_func_snprintf_size1+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
                            # Guess yes on Android.
           linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
                            # Guess yes on native Windows.
           mingw*)          gl_cv_func_snprintf_size1="guessing yes" ;;
           *)               gl_cv_func_snprintf_size1="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#if HAVE_SNPRINTF
# define my_snprintf snprintf
#else
# include <stdarg.h>
static int my_snprintf (char *buf, int size, const char *format, ...)
{
  va_list args;
  int ret;
  va_start (args, format);
  ret = vsnprintf (buf, size, format, args);
  va_end (args);
  return ret;
}
#endif
int main()
{
  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
  my_snprintf (buf, 1, "%d", 12345);
  return buf[1] != 'E';
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_snprintf_size1=yes
else
  gl_cv_func_snprintf_size1=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
$as_echo "$gl_cv_func_snprintf_size1" >&6; }

    case "$gl_cv_func_snprintf_size1" in
      *yes)

        case "$gl_cv_func_snprintf_retval_c99" in
          *yes)


     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5
$as_echo_n "checking whether printf supports POSIX/XSI format strings with positions... " >&6; }
if ${gl_cv_func_printf_positions+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
           netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
                            gl_cv_func_printf_positions="guessing no";;
           beos*)           gl_cv_func_printf_positions="guessing no";;
                            # Guess yes on Android.
           linux*-android*) gl_cv_func_printf_positions="guessing yes";;
                            # Guess no on native Windows.
           mingw* | pw*)    gl_cv_func_printf_positions="guessing no";;
           *)               gl_cv_func_printf_positions="guessing yes";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
/* The string "%2$d %1$d", with dollar characters protected from the shell's
   dollar expansion (possibly an autoconf bug).  */
static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
static char buf[100];
int main ()
{
  sprintf (buf, format, 33, 55);
  return (strcmp (buf, "55 33") != 0);
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_printf_positions=yes
else
  gl_cv_func_printf_positions=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5
$as_echo "$gl_cv_func_printf_positions" >&6; }

            case "$gl_cv_func_printf_positions" in
              *yes)
                gl_cv_func_vsnprintf_usable=yes
                ;;
            esac
            ;;
        esac
        ;;
    esac
  fi
  if test $gl_cv_func_vsnprintf_usable = no; then










  gl_LIBOBJS="$gl_LIBOBJS vsnprintf.$ac_objext"

  if test $ac_cv_func_vsnprintf = yes; then
    REPLACE_VSNPRINTF=1
  else

    if test $ac_cv_have_decl_vsnprintf = yes; then
                        REPLACE_VSNPRINTF=1
    fi
  fi
  :

  fi

  if test $ac_cv_have_decl_vsnprintf = no; then
    HAVE_DECL_VSNPRINTF=0
  fi






          GNULIB_VSNPRINTF=1





$as_echo "#define GNULIB_TEST_VSNPRINTF 1" >>confdefs.h


















  gl_cv_func_vsnprintf_posix=no
  for ac_func in vsnprintf
do :
  ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf"
if test "x$ac_cv_func_vsnprintf" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_VSNPRINTF 1
_ACEOF

fi
done

  if test $ac_cv_func_vsnprintf = yes; then



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf truncates the result as in C99" >&5
$as_echo_n "checking whether snprintf truncates the result as in C99... " >&6; }
if ${gl_cv_func_snprintf_truncation_c99+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
                                 # Guess yes on glibc systems.
           *-gnu* | gnu*)        gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on musl systems.
           *-musl*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on FreeBSD >= 5.
           freebsd[1-4].*)       gl_cv_func_snprintf_truncation_c99="guessing no";;
           freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on Mac OS X >= 10.3.
           darwin[1-6].*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
           darwin*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on OpenBSD >= 3.9.
           openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
           openbsd*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on Solaris >= 2.6.
           solaris2.[0-5] | solaris2.[0-5].*)
                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
           solaris*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on AIX >= 4.
           aix[1-3]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
           aix*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on HP-UX >= 11.
           hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
           hpux*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on IRIX >= 6.5.
           irix6.5)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on OSF/1 >= 5.
           osf[3-4]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
           osf*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on NetBSD >= 3.
           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
           netbsd*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on BeOS.
           beos*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess yes on Android.
           linux*-android*)      gl_cv_func_snprintf_truncation_c99="guessing yes";;
                                 # Guess no on native Windows.
           mingw*)               gl_cv_func_snprintf_truncation_c99="guessing no";;
                                 # If we don't know, obey --enable-cross-guesses.
           *)                    gl_cv_func_snprintf_truncation_c99="$gl_cross_guess_normal";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
#if HAVE_SNPRINTF
# define my_snprintf snprintf
#else
# include <stdarg.h>
static int my_snprintf (char *buf, int size, const char *format, ...)
{
  va_list args;
  int ret;
  va_start (args, format);
  ret = vsnprintf (buf, size, format, args);
  va_end (args);
  return ret;
}
#endif
static char buf[100];
int main ()
{
  strcpy (buf, "ABCDEF");
  my_snprintf (buf, 3, "%d %d", 4567, 89);
  if (memcmp (buf, "45\0DEF", 6) != 0)
    return 1;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_snprintf_truncation_c99=yes
else
  gl_cv_func_snprintf_truncation_c99=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_truncation_c99" >&5
$as_echo "$gl_cv_func_snprintf_truncation_c99" >&6; }





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf fully supports the 'n' directive" >&5
$as_echo_n "checking whether snprintf fully supports the 'n' directive... " >&6; }
if ${gl_cv_func_snprintf_directive_n+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
                                 # Guess yes on glibc systems.
           *-gnu* | gnu*)        gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on musl systems.
           *-musl*)              gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on FreeBSD >= 5.
           freebsd[1-4].*)       gl_cv_func_snprintf_directive_n="guessing no";;
           freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on Mac OS X >= 10.3.
           darwin[1-6].*)        gl_cv_func_snprintf_directive_n="guessing no";;
           darwin*)              gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on Solaris >= 2.6.
           solaris2.[0-5] | solaris2.[0-5].*)
                                 gl_cv_func_snprintf_directive_n="guessing no";;
           solaris*)             gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on AIX >= 4.
           aix[1-3]*)            gl_cv_func_snprintf_directive_n="guessing no";;
           aix*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on IRIX >= 6.5.
           irix6.5)              gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on OSF/1 >= 5.
           osf[3-4]*)            gl_cv_func_snprintf_directive_n="guessing no";;
           osf*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on NetBSD >= 3.
           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
                                 gl_cv_func_snprintf_directive_n="guessing no";;
           netbsd*)              gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess yes on BeOS.
           beos*)                gl_cv_func_snprintf_directive_n="guessing yes";;
                                 # Guess no on Android.
           linux*-android*)      gl_cv_func_snprintf_directive_n="guessing no";;
                                 # Guess no on native Windows.
           mingw*)               gl_cv_func_snprintf_directive_n="guessing no";;
                                 # If we don't know, obey --enable-cross-guesses.
           *)                    gl_cv_func_snprintf_directive_n="$gl_cross_guess_normal";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <string.h>
#if HAVE_SNPRINTF
# define my_snprintf snprintf
#else
# include <stdarg.h>
static int my_snprintf (char *buf, int size, const char *format, ...)
{
  va_list args;
  int ret;
  va_start (args, format);
  ret = vsnprintf (buf, size, format, args);
  va_end (args);
  return ret;
}
#endif
static char fmtstring[10];
static char buf[100];
int main ()
{
  int count = -1;
  /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
     support %n in format strings in read-only memory but not in writable
     memory.  */
  strcpy (fmtstring, "%d %n");
  my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
  if (count != 6)
    return 1;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_snprintf_directive_n=yes
else
  gl_cv_func_snprintf_directive_n=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_directive_n" >&5
$as_echo "$gl_cv_func_snprintf_directive_n" >&6; }




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
$as_echo_n "checking whether snprintf respects a size of 1... " >&6; }
if ${gl_cv_func_snprintf_size1+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
                            # Guess yes on Android.
           linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
                            # Guess yes on native Windows.
           mingw*)          gl_cv_func_snprintf_size1="guessing yes" ;;
           *)               gl_cv_func_snprintf_size1="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#if HAVE_SNPRINTF
# define my_snprintf snprintf
#else
# include <stdarg.h>
static int my_snprintf (char *buf, int size, const char *format, ...)
{
  va_list args;
  int ret;
  va_start (args, format);
  ret = vsnprintf (buf, size, format, args);
  va_end (args);
  return ret;
}
#endif
int main()
{
  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
  my_snprintf (buf, 1, "%d", 12345);
  return buf[1] != 'E';
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_snprintf_size1=yes
else
  gl_cv_func_snprintf_size1=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
$as_echo "$gl_cv_func_snprintf_size1" >&6; }



     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vsnprintf respects a zero size as in C99" >&5
$as_echo_n "checking whether vsnprintf respects a zero size as in C99... " >&6; }
if ${gl_cv_func_vsnprintf_zerosize_c99+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :

         case "$host_os" in
                                 # Guess yes on glibc systems.
           *-gnu* | gnu*)        gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on musl systems.
           *-musl*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on FreeBSD >= 5.
           freebsd[1-4].*)       gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
           freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on Mac OS X >= 10.3.
           darwin[1-6].*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
           darwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on Cygwin.
           cygwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on Solaris >= 2.6.
           solaris2.[0-5] | solaris2.[0-5].*)
                                 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
           solaris*)             gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on AIX >= 4.
           aix[1-3]*)            gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
           aix*)                 gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on IRIX >= 6.5.
           irix6.5)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on NetBSD >= 3.
           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
                                 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
           netbsd*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on BeOS.
           beos*)                gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on Android.
           linux*-android*)      gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # Guess yes on native Windows.
           mingw* | pw*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
                                 # If we don't know, obey --enable-cross-guesses.
           *)                    gl_cv_func_vsnprintf_zerosize_c99="$gl_cross_guess_normal";;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdarg.h>
#include <stdio.h>
static int my_snprintf (char *buf, int size, const char *format, ...)
{
  va_list args;
  int ret;
  va_start (args, format);
  ret = vsnprintf (buf, size, format, args);
  va_end (args);
  return ret;
}
int main()
{
  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
  my_snprintf (buf, 0, "%d", 12345);
  return buf[0] != 'D';
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_vsnprintf_zerosize_c99=yes
else
  gl_cv_func_vsnprintf_zerosize_c99=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_vsnprintf_zerosize_c99" >&5
$as_echo "$gl_cv_func_vsnprintf_zerosize_c99" >&6; }

    case "$gl_cv_func_printf_sizes_c99" in
      *yes)
        case "$gl_cv_func_printf_long_double" in
          *yes)
            case "$gl_cv_func_printf_infinite" in
              *yes)
                case "$gl_cv_func_printf_infinite_long_double" in
                  *yes)
                    case "$gl_cv_func_printf_directive_a" in
                      *yes)
                        case "$gl_cv_func_printf_directive_f" in
                          *yes)
                            case "$gl_cv_func_printf_directive_n" in
                              *yes)
                                case "$gl_cv_func_printf_directive_ls" in
                                  *yes)
                                    case "$gl_cv_func_printf_positions" in
                                      *yes)
                                        case "$gl_cv_func_printf_flag_grouping" in
                                          *yes)
                                            case "$gl_cv_func_printf_flag_leftadjust" in
                                              *yes)
                                                case "$gl_cv_func_printf_flag_zero" in
                                                  *yes)
                                                    case "$gl_cv_func_printf_precision" in
                                                      *yes)
                                                        case "$gl_cv_func_printf_enomem" in
                                                          *yes)
                                                            case "$gl_cv_func_snprintf_truncation_c99" in
                                                              *yes)
                                                                case "$gl_cv_func_snprintf_retval_c99" in
                                                                  *yes)
                                                                    case "$gl_cv_func_snprintf_directive_n" in
                                                                      *yes)
                                                                        case "$gl_cv_func_snprintf_size1" in
                                                                          *yes)
                                                                            case "$gl_cv_func_vsnprintf_zerosize_c99" in
                                                                              *yes)
                                                                                # vsnprintf exists and is
                                                                                # already POSIX compliant.
                                                                                gl_cv_func_vsnprintf_posix=yes
                                                                                ;;
                                                                            esac
                                                                            ;;
                                                                        esac
                                                                        ;;
                                                                    esac
                                                                    ;;
                                                                esac
                                                                ;;
                                                            esac
                                                            ;;
                                                        esac
                                                        ;;
                                                    esac
                                                    ;;
                                                esac
                                                ;;
                                            esac
                                            ;;
                                        esac
                                        ;;
                                    esac
                                    ;;
                                esac
                                ;;
                            esac
                            ;;
                        esac
                        ;;
                    esac
                    ;;
                esac
                ;;
            esac
            ;;
        esac
        ;;
    esac
  fi
  if test $gl_cv_func_vsnprintf_posix = no; then



  case "$gl_cv_func_printf_infinite" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h

      ;;
  esac




  case "$gl_cv_func_printf_long_double" in
    *yes)
      case "$gl_cv_func_printf_infinite_long_double" in
        *yes)
          ;;
        *)

$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h

          ;;
      esac
      ;;
  esac



  case "$gl_cv_func_printf_directive_a" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h

      for ac_func in nl_langinfo
do :
  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
if test "x$ac_cv_func_nl_langinfo" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_NL_LANGINFO 1
_ACEOF

fi
done

      ;;
  esac



  case "$gl_cv_func_printf_directive_f" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_directive_ls" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_grouping" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_leftadjust" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_zero" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_precision" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_enomem" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac











  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"

  if test $ac_cv_func_vasnprintf = yes; then

$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h

  fi











  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
if test "x$ac_cv_type_ptrdiff_t" = xyes; then :

else

$as_echo "#define ptrdiff_t long" >>confdefs.h


fi

















  gl_LIBOBJS="$gl_LIBOBJS vsnprintf.$ac_objext"

  if test $ac_cv_func_vsnprintf = yes; then
    REPLACE_VSNPRINTF=1
  else

    if test $ac_cv_have_decl_vsnprintf = yes; then
                        REPLACE_VSNPRINTF=1
    fi
  fi
  :

  fi
















  gl_cv_func_vsprintf_posix=no
  case "$gl_cv_func_printf_sizes_c99" in
    *yes)
      case "$gl_cv_func_printf_long_double" in
        *yes)
          case "$gl_cv_func_printf_infinite" in
            *yes)
              case "$gl_cv_func_printf_infinite_long_double" in
                *yes)
                  case "$gl_cv_func_printf_directive_a" in
                    *yes)
                      case "$gl_cv_func_printf_directive_f" in
                        *yes)
                          case "$gl_cv_func_printf_directive_n" in
                            *yes)
                              case "$gl_cv_func_printf_directive_ls" in
                                *yes)
                                  case "$gl_cv_func_printf_positions" in
                                    *yes)
                                      case "$gl_cv_func_printf_flag_grouping" in
                                        *yes)
                                          case "$gl_cv_func_printf_flag_leftadjust" in
                                            *yes)
                                              case "$gl_cv_func_printf_flag_zero" in
                                                *yes)
                                                  case "$gl_cv_func_printf_precision" in
                                                    *yes)
                                                      case "$gl_cv_func_printf_enomem" in
                                                        *yes)
                                                          # vsprintf exists and is
                                                          # already POSIX compliant.
                                                          gl_cv_func_vsprintf_posix=yes
                                                          ;;
                                                      esac
                                                      ;;
                                                  esac
                                                  ;;
                                              esac
                                              ;;
                                          esac
                                          ;;
                                      esac
                                      ;;
                                  esac
                                  ;;
                              esac
                              ;;
                          esac
                          ;;
                      esac
                      ;;
                  esac
                  ;;
              esac
              ;;
          esac
          ;;
      esac
      ;;
  esac
  if test $gl_cv_func_vsprintf_posix = no; then



  case "$gl_cv_func_printf_infinite" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h

      ;;
  esac




  case "$gl_cv_func_printf_long_double" in
    *yes)
      case "$gl_cv_func_printf_infinite_long_double" in
        *yes)
          ;;
        *)

$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h

          ;;
      esac
      ;;
  esac



  case "$gl_cv_func_printf_directive_a" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h

      for ac_func in nl_langinfo
do :
  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
if test "x$ac_cv_func_nl_langinfo" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_NL_LANGINFO 1
_ACEOF

fi
done

      ;;
  esac



  case "$gl_cv_func_printf_directive_f" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_directive_ls" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_grouping" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_leftadjust" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_zero" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_precision" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_enomem" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac











  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"

  if test $ac_cv_func_vasnprintf = yes; then

$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h

  fi











  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
if test "x$ac_cv_type_ptrdiff_t" = xyes; then :

else

$as_echo "#define ptrdiff_t long" >>confdefs.h


fi

















  gl_LIBOBJS="$gl_LIBOBJS vsprintf.$ac_objext"

  REPLACE_VSPRINTF=1
  :

  fi






          GNULIB_VSPRINTF_POSIX=1





$as_echo "#define GNULIB_TEST_VSPRINTF_POSIX 1" >>confdefs.h





  for ac_func in waitid
do :
  ac_fn_c_check_func "$LINENO" "waitid" "ac_cv_func_waitid"
if test "x$ac_cv_func_waitid" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_WAITID 1
_ACEOF

fi
done




  HAVE_WAITPID=1
  case $host_os in
    mingw*) HAVE_WAITPID=0 ;;
  esac

  if test $HAVE_WAITPID = 0; then








  gl_LIBOBJS="$gl_LIBOBJS waitpid.$ac_objext"

  fi





          GNULIB_WAITPID=1





$as_echo "#define GNULIB_TEST_WAITPID 1" >>confdefs.h















     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_wchar_h='<'wchar.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <wchar.h>" >&5
$as_echo_n "checking absolute name of <wchar.h>... " >&6; }
if ${gl_cv_next_wchar_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_wchar_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wchar.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'wchar.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_wchar_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_wchar_h
           gl_cv_next_wchar_h='"'$gl_header'"'
          else
               gl_cv_next_wchar_h='<'wchar.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wchar_h" >&5
$as_echo "$gl_cv_next_wchar_h" >&6; }
     fi
     NEXT_WCHAR_H=$gl_cv_next_wchar_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'wchar.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_wchar_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_WCHAR_H=$gl_next_as_first_directive




  if test $ac_cv_header_wchar_h = yes; then
    HAVE_WCHAR_H=1
  else
    HAVE_WCHAR_H=0
  fi





  if test $gt_cv_c_wint_t = yes; then
    HAVE_WINT_T=1
  else
    HAVE_WINT_T=0
  fi













  if test $ac_cv_func_iswcntrl = yes; then
    HAVE_ISWCNTRL=1
  else
    HAVE_ISWCNTRL=0
  fi



  if test $gt_cv_c_wint_t = yes; then
    HAVE_WINT_T=1
  else
    HAVE_WINT_T=0
  fi













     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_wctype_h='<'wctype.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <wctype.h>" >&5
$as_echo_n "checking absolute name of <wctype.h>... " >&6; }
if ${gl_cv_next_wctype_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_wctype_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wctype.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'wctype.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_wctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_wctype_h
           gl_cv_next_wctype_h='"'$gl_header'"'
          else
               gl_cv_next_wctype_h='<'wctype.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wctype_h" >&5
$as_echo "$gl_cv_next_wctype_h" >&6; }
     fi
     NEXT_WCTYPE_H=$gl_cv_next_wctype_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'wctype.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_wctype_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H=$gl_next_as_first_directive




  if test $ac_cv_header_wctype_h = yes; then
    if test $ac_cv_func_iswcntrl = yes; then
                  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iswcntrl works" >&5
$as_echo_n "checking whether iswcntrl works... " >&6; }
if ${gl_cv_func_iswcntrl_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

          if test "$cross_compiling" = yes; then :
               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
                          #if __GNU_LIBRARY__ == 1
                          Linux libc5 i18n is broken.
                          #endif
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_func_iswcntrl_works="guessing yes"
else
  gl_cv_func_iswcntrl_works="guessing no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

               /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
                  included before <wchar.h>.
                  BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
                  must be included before <wchar.h>.  */
               #include <stddef.h>
               #include <stdio.h>
               #include <time.h>
               #include <wchar.h>
               #include <wctype.h>
               int main () { return iswprint ('x') == 0; }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_iswcntrl_works=yes
else
  gl_cv_func_iswcntrl_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswcntrl_works" >&5
$as_echo "$gl_cv_func_iswcntrl_works" >&6; }
    fi
    HAVE_WCTYPE_H=1
  else
    HAVE_WCTYPE_H=0
  fi


  if test $GNULIB_OVERRIDES_WINT_T = 1; then
    REPLACE_ISWCNTRL=1
  else
    case "$gl_cv_func_iswcntrl_works" in
      *yes) REPLACE_ISWCNTRL=0 ;;
      *)    REPLACE_ISWCNTRL=1 ;;
    esac
  fi


  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
        :
  fi

  if test $REPLACE_ISWCNTRL = 1; then
    REPLACE_TOWLOWER=1
  else
    for ac_func in towlower
do :
  ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower"
if test "x$ac_cv_func_towlower" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_TOWLOWER 1
_ACEOF

fi
done

    if test $ac_cv_func_towlower = yes; then
      REPLACE_TOWLOWER=0
    else
      ac_fn_c_check_decl "$LINENO" "towlower" "ac_cv_have_decl_towlower" "/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
             included before <wchar.h>.
             BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
             must be included before <wchar.h>.  */
          #include <stddef.h>
          #include <stdio.h>
          #include <time.h>
          #include <wchar.h>
          #if HAVE_WCTYPE_H
          # include <wctype.h>
          #endif

"
if test "x$ac_cv_have_decl_towlower" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_TOWLOWER $ac_have_decl
_ACEOF

      if test $ac_cv_have_decl_towlower = yes; then
                                REPLACE_TOWLOWER=1
      else
        REPLACE_TOWLOWER=0
      fi
    fi
  fi


  if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then
        :
  fi

          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wctype_t" >&5
$as_echo_n "checking for wctype_t... " >&6; }
if ${gl_cv_type_wctype_t+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
               included before <wchar.h>.
               BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
               must be included before <wchar.h>.  */
            #include <stddef.h>
            #include <stdio.h>
            #include <time.h>
            #include <wchar.h>
            #if HAVE_WCTYPE_H
            # include <wctype.h>
            #endif
            wctype_t a;

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_type_wctype_t=yes
else
  gl_cv_type_wctype_t=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctype_t" >&5
$as_echo "$gl_cv_type_wctype_t" >&6; }
  if test $gl_cv_type_wctype_t = no; then
    HAVE_WCTYPE_T=0
  fi

      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wctrans_t" >&5
$as_echo_n "checking for wctrans_t... " >&6; }
if ${gl_cv_type_wctrans_t+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be
               included before <wchar.h>.
               BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h>
               must be included before <wchar.h>.  */
            #include <stddef.h>
            #include <stdio.h>
            #include <time.h>
            #include <wchar.h>
            #include <wctype.h>
            wctrans_t a;

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_type_wctrans_t=yes
else
  gl_cv_type_wctrans_t=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctrans_t" >&5
$as_echo "$gl_cv_type_wctrans_t" >&6; }
  if test $gl_cv_type_wctrans_t = no; then
    HAVE_WCTRANS_T=0
  fi
















  ac_fn_c_check_decl "$LINENO" "wcwidth" "ac_cv_have_decl_wcwidth" "
/* AIX 3.2.5 declares wcwidth in <string.h>. */
#include <string.h>
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
   before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>

"
if test "x$ac_cv_have_decl_wcwidth" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_WCWIDTH $ac_have_decl
_ACEOF

  if test $ac_cv_have_decl_wcwidth != yes; then
    HAVE_DECL_WCWIDTH=0
  fi

  if test $ac_cv_func_wcwidth != yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wcwidth is a macro" >&5
$as_echo_n "checking whether wcwidth is a macro... " >&6; }
if ${gl_cv_func_wcwidth_macro+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <wchar.h>
#ifdef wcwidth
 wchar_header_defines_wcwidth
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "wchar_header_defines_wcwidth" >/dev/null 2>&1; then :
  gl_cv_func_wcwidth_macro=yes
else
  gl_cv_func_wcwidth_macro=no
fi
rm -f conftest*


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_macro" >&5
$as_echo "$gl_cv_func_wcwidth_macro" >&6; }
  fi

  if test $ac_cv_func_wcwidth = yes || test $gl_cv_func_wcwidth_macro = yes; then
    HAVE_WCWIDTH=1
                                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wcwidth works reasonably in UTF-8 locales" >&5
$as_echo_n "checking whether wcwidth works reasonably in UTF-8 locales... " >&6; }
if ${gl_cv_func_wcwidth_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

        if test "$cross_compiling" = yes; then :

           case "$host_os" in
                            # Guess yes on glibc systems.
             *-gnu* | gnu*) gl_cv_func_wcwidth_works="guessing yes";;
                            # Guess yes on musl systems.
             *-musl*)       gl_cv_func_wcwidth_works="guessing yes";;
                            # Guess yes on AIX 7 systems.
             aix[7-9]*)     gl_cv_func_wcwidth_works="guessing yes";;
             *)             gl_cv_func_wcwidth_works="$gl_cross_guess_normal";;
           esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
/* AIX 3.2.5 declares wcwidth in <string.h>. */
#include <string.h>
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
   <wchar.h>.
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
   before <wchar.h>.  */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
#if !HAVE_DECL_WCWIDTH
extern
# ifdef __cplusplus
"C"
# endif
int wcwidth (int);
#endif
int main ()
{
  int result = 0;
  if (setlocale (LC_ALL, "en_US.UTF-8") != NULL)
    {
      if (wcwidth (0x0301) > 0)
        result |= 1;
      if (wcwidth (0x05B0) > 0)
        result |= 2;
      if (wcwidth (0x200B) > 0)
        result |= 4;
      if (wcwidth (0xFF1A) == 0)
        result |= 8;
      if (wcwidth (0x2202) > 1)
        result |= 16;
    }
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_wcwidth_works=yes
else
  gl_cv_func_wcwidth_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_works" >&5
$as_echo "$gl_cv_func_wcwidth_works" >&6; }
    case "$gl_cv_func_wcwidth_works" in
      *yes) ;;
      *no) REPLACE_WCWIDTH=1 ;;
    esac
  else
    HAVE_WCWIDTH=0
  fi

  if test $HAVE_WCWIDTH = 0 || test $REPLACE_WCWIDTH = 1; then








  gl_LIBOBJS="$gl_LIBOBJS wcwidth.$ac_objext"



  :

  fi





          GNULIB_WCWIDTH=1





$as_echo "#define GNULIB_TEST_WCWIDTH 1" >>confdefs.h




 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether use of TIOCGWINSZ requires sys/ioctl.h" >&5
$as_echo_n "checking whether use of TIOCGWINSZ requires sys/ioctl.h... " >&6; }
if ${gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h=no

   if test $gl_cv_sys_tiocgwinsz_needs_termios_h = no; then
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
#        include <sys/ioctl.h>
#        ifdef TIOCGWINSZ
           yes
#        endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h=yes
fi
rm -f conftest*

   fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h" >&5
$as_echo "$gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h" >&6; }
  if test $gl_cv_sys_tiocgwinsz_needs_sys_ioctl_h = yes; then

$as_echo "#define GWINSZ_IN_SYS_IOCTL 1" >>confdefs.h

  fi


 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether use of TIOCGWINSZ requires termios.h" >&5
$as_echo_n "checking whether use of TIOCGWINSZ requires termios.h... " >&6; }
if ${gl_cv_sys_tiocgwinsz_needs_termios_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_cv_sys_tiocgwinsz_needs_termios_h=no

   if test $ac_cv_sys_posix_termios = yes; then
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
#      include <termios.h>
#      ifdef TIOCGWINSZ
         yes
#      endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  gl_cv_sys_tiocgwinsz_needs_termios_h=yes
fi
rm -f conftest*

   fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_tiocgwinsz_needs_termios_h" >&5
$as_echo "$gl_cv_sys_tiocgwinsz_needs_termios_h" >&6; }



   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether use of struct winsize requires sys/ptem.h" >&5
$as_echo_n "checking whether use of struct winsize requires sys/ptem.h... " >&6; }
if ${gl_cv_sys_struct_winsize_needs_sys_ptem_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_cv_sys_struct_winsize_needs_sys_ptem_h=yes
      if test $ac_cv_sys_posix_termios = yes; then
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <termios.h>
int
main ()
{
struct winsize x;
            if (sizeof x > 0) return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_sys_struct_winsize_needs_sys_ptem_h=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      fi
      if test $gl_cv_sys_struct_winsize_needs_sys_ptem_h = yes; then
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/ptem.h>
int
main ()
{
struct winsize x;
            if (sizeof x > 0) return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

else
  gl_cv_sys_struct_winsize_needs_sys_ptem_h=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_winsize_needs_sys_ptem_h" >&5
$as_echo "$gl_cv_sys_struct_winsize_needs_sys_ptem_h" >&6; }
   if test $gl_cv_sys_struct_winsize_needs_sys_ptem_h = yes; then

$as_echo "#define WINSIZE_IN_PTEM 1" >>confdefs.h

   fi

  :








  gl_LIBOBJS="$gl_LIBOBJS xmemdup0.$ac_objext"



  for ac_header in stdint.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default"
if test "x$ac_cv_header_stdint_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STDINT_H 1
_ACEOF

fi

done




  :


  gl_gnulib_enabled_chdir=false
  gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239=false
  gl_gnulib_enabled_fseterr=false
  gl_gnulib_enabled_fstat=false
  gl_gnulib_enabled_getdtablesize=false
  gl_gnulib_enabled_30838f5439487421042f2225bed3af76=false
  gl_gnulib_enabled_3f0e593033d1fc2c127581960f641b66=false
  gl_gnulib_enabled_ldexp=false
  gl_gnulib_enabled_21ee726a3540c09237a8e70c0baf7467=false
  gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9=false
  gl_gnulib_enabled_lstat=false
  gl_gnulib_enabled_malloca=false
  gl_gnulib_enabled_332607f759618fb73dfc3076748afea7=false
  gl_gnulib_enabled_rawmemchr=false
  gl_gnulib_enabled_rmdir=false
  gl_gnulib_enabled_9bc5f216d57e231e4834049d67d0db62=false
  gl_gnulib_enabled_cdeb0f2aaf9d280baa6526bfa1b07f70=false
  gl_gnulib_enabled_stat=false
  gl_gnulib_enabled_0137e3d3638b33e5819d132d0b23165c=false
  gl_gnulib_enabled_strchrnul=false
  gl_gnulib_enabled_dbb57f49352be8fb86869629a254fb72=false
  gl_gnulib_enabled_1f32594a85e6221ba15f884daeee8c2a=false
  gl_gnulib_enabled_strnlen=false
  gl_gnulib_enabled_sys_stat=false
  gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b=false
  gl_gnulib_enabled_503a4cb75d69c787103d0aa2ab7d8440=false
  gl_gnulib_enabled_68a4501daeca58988392c7e60b4917ab=false
  gl_gnulib_enabled_f0efff84a70f4afba30902bb8ffe9354=false
  gl_gnulib_enabled_8bb827fe37eaccf1b97feb0c87bc92ef=false
  gl_gnulib_enabled_48b2271240803e4879464b755748a89d=false
  func_gl_gnulib_m4code_chdir ()
  {
    if ! $gl_gnulib_enabled_chdir; then





          GNULIB_CHDIR=1





$as_echo "#define GNULIB_TEST_CHDIR 1" >>confdefs.h



      gl_gnulib_enabled_chdir=true
    fi
  }
  func_gl_gnulib_m4code_43fe87a341d9b4b93c47c3ad819a5239 ()
  {
    if ! $gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239; then
      gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239=true
    fi
  }
  func_gl_gnulib_m4code_fseterr ()
  {
    if ! $gl_gnulib_enabled_fseterr; then



      if test $ac_cv_func___fseterr = no; then








  gl_LIBOBJS="$gl_LIBOBJS fseterr.$ac_objext"

      fi
      gl_gnulib_enabled_fseterr=true
    fi
  }
  func_gl_gnulib_m4code_fstat ()
  {
    if ! $gl_gnulib_enabled_fstat; then




  case "$host_os" in
    mingw* | solaris*)
                        REPLACE_FSTAT=1
      ;;
  esac



      if test $REPLACE_FSTAT = 1; then








  gl_LIBOBJS="$gl_LIBOBJS fstat.$ac_objext"

        case "$host_os" in
          mingw*)








  gl_LIBOBJS="$gl_LIBOBJS stat-w32.$ac_objext"

            ;;
        esac


  :

      fi





          GNULIB_FSTAT=1





$as_echo "#define GNULIB_TEST_FSTAT 1" >>confdefs.h



      gl_gnulib_enabled_fstat=true
      if test $REPLACE_FSTAT = 1; then
        func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c
      fi
      func_gl_gnulib_m4code_sys_stat
    fi
  }
  func_gl_gnulib_m4code_getdtablesize ()
  {
    if ! $gl_gnulib_enabled_getdtablesize; then





  if test $ac_cv_func_getdtablesize = yes &&
     test $ac_cv_have_decl_getdtablesize = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getdtablesize works" >&5
$as_echo_n "checking whether getdtablesize works... " >&6; }
if ${gl_cv_func_getdtablesize_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
                                                   case "$host_os" in
         vms*) gl_cv_func_getdtablesize_works="no (limitation)" ;;
         *)
                                                       if test "$cross_compiling" = yes; then :
  case "$host_os" in
                cygwin*) # on cygwin 1.5.25, getdtablesize() automatically grows
                  gl_cv_func_getdtablesize_works="guessing no" ;;
                *) gl_cv_func_getdtablesize_works="guessing yes" ;;
              esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

             #include <unistd.h>
int
main ()
{
int size = getdtablesize();
                if (dup2 (0, getdtablesize()) != -1)
                  return 1;
                if (size != getdtablesize())
                  return 2;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_getdtablesize_works=yes
else
  gl_cv_func_getdtablesize_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

           ;;
       esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getdtablesize_works" >&5
$as_echo "$gl_cv_func_getdtablesize_works" >&6; }
    case "$gl_cv_func_getdtablesize_works" in
      *yes | "no (limitation)") ;;
      *) REPLACE_GETDTABLESIZE=1 ;;
    esac
  else
    HAVE_GETDTABLESIZE=0
  fi

      if test $HAVE_GETDTABLESIZE = 0 || test $REPLACE_GETDTABLESIZE = 1; then








  gl_LIBOBJS="$gl_LIBOBJS getdtablesize.$ac_objext"

        :
      fi





          GNULIB_GETDTABLESIZE=1





$as_echo "#define GNULIB_TEST_GETDTABLESIZE 1" >>confdefs.h



      gl_gnulib_enabled_getdtablesize=true
    fi
  }
  func_gl_gnulib_m4code_30838f5439487421042f2225bed3af76 ()
  {
    if ! $gl_gnulib_enabled_30838f5439487421042f2225bed3af76; then
      gl_gnulib_enabled_30838f5439487421042f2225bed3af76=true
    fi
  }
  func_gl_gnulib_m4code_3f0e593033d1fc2c127581960f641b66 ()
  {
    if ! $gl_gnulib_enabled_3f0e593033d1fc2c127581960f641b66; then


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) can be used without linking with libm" >&5
$as_echo_n "checking whether isnan(float) can be used without linking with libm... " >&6; }
if ${gl_cv_func_isnanf_no_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
             #if __GNUC__ >= 4
             # undef isnanf
             # define isnanf(x) __builtin_isnanf ((float)(x))
             #elif defined isnan
             # undef isnanf
             # define isnanf(x) isnan ((float)(x))
             #endif
             float x;
int
main ()
{
return isnanf (x);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_isnanf_no_libm=yes
else
  gl_cv_func_isnanf_no_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_no_libm" >&5
$as_echo "$gl_cv_func_isnanf_no_libm" >&6; }

  if test $gl_cv_func_isnanf_no_libm = yes; then



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether isnan(float) works" >&5
$as_echo_n "checking whether isnan(float) works... " >&6; }
if ${gl_cv_func_isnanf_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  case "$host_os" in
           irix* | solaris*) gl_cv_func_isnanf_works="guessing no" ;;
           mingw*) # Guess yes on mingw, no on MSVC.
             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef __MINGW32__
 Known
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Known" >/dev/null 2>&1; then :
  gl_cv_func_isnanf_works="guessing yes"
else
  gl_cv_func_isnanf_works="guessing no"
fi
rm -f conftest*

             ;;
           *) gl_cv_func_isnanf_works="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <math.h>
#if __GNUC__ >= 4
# undef isnanf
# define isnanf(x) __builtin_isnanf ((float)(x))
#elif defined isnan
# undef isnanf
# define isnanf(x) isnan ((float)(x))
#endif
/* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0.  */
#ifdef __DECC
static float
NaN ()
{
  static float zero = 0.0f;
  return zero / zero;
}
#else
# define NaN() (0.0f / 0.0f)
#endif
#define NWORDS \
  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { unsigned int word[NWORDS]; float value; } memory_float;
int main()
{
  int result = 0;

  if (isnanf (1.0f / 0.0f))
    result |= 1;

  if (!isnanf (NaN ()))
    result |= 2;

#if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
  /* The isnanf function should be immune against changes in the sign bit and
     in the mantissa bits.  The xor operation twiddles a bit that can only be
     a sign bit or a mantissa bit.  */
  if (FLT_EXPBIT0_WORD == 0 && FLT_EXPBIT0_BIT > 0)
    {
      memory_float m;

      m.value = NaN ();
      /* Set the bits below the exponent to 01111...111.  */
      m.word[0] &= -1U << FLT_EXPBIT0_BIT;
      m.word[0] |= 1U << (FLT_EXPBIT0_BIT - 1) - 1;
      if (!isnanf (m.value))
        result |= 4;
    }
#endif

  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_isnanf_works=yes
else
  gl_cv_func_isnanf_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_isnanf_works" >&5
$as_echo "$gl_cv_func_isnanf_works" >&6; }

  fi
  if test $gl_cv_func_isnanf_no_libm = yes \
     && { case "$gl_cv_func_isnanf_works" in
            *yes) true;;
            *) false;;
          esac
        }; then
    gl_func_isnanf_no_libm=yes

$as_echo "#define HAVE_ISNANF_IN_LIBC 1" >>confdefs.h

  else
    gl_func_isnanf_no_libm=no
  fi

      if test $gl_func_isnanf_no_libm != yes; then








  gl_LIBOBJS="$gl_LIBOBJS isnanf.$ac_objext"



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'float'" >&5
$as_echo_n "checking where to find the exponent in a 'float'... " >&6; }
if ${gl_cv_cc_float_expbit0+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  gl_cv_cc_float_expbit0="word 0 bit 23"
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <float.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#define NWORDS \
  ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
typedef union { float value; unsigned int word[NWORDS]; } memory_float;
static unsigned int ored_words[NWORDS];
static unsigned int anded_words[NWORDS];
static void add_to_ored_words (float x)
{
  memory_float m;
  size_t i;
  /* Clear it first, in case
     sizeof (float) < sizeof (memory_float).  */
  memset (&m, 0, sizeof (memory_float));
  m.value = x;
  for (i = 0; i < NWORDS; i++)
    {
      ored_words[i] |= m.word[i];
      anded_words[i] &= m.word[i];
    }
}
int main ()
{
  size_t j;
  FILE *fp = fopen ("conftest.out", "w");
  if (fp == NULL)
    return 1;
  for (j = 0; j < NWORDS; j++)
    anded_words[j] = ~ (unsigned int) 0;
  add_to_ored_words (0.25f);
  add_to_ored_words (0.5f);
  add_to_ored_words (1.0f);
  add_to_ored_words (2.0f);
  add_to_ored_words (4.0f);
  /* Remove bits that are common (e.g. if representation of the first mantissa
     bit is explicit).  */
  for (j = 0; j < NWORDS; j++)
    ored_words[j] &= ~anded_words[j];
  /* Now find the nonzero word.  */
  for (j = 0; j < NWORDS; j++)
    if (ored_words[j] != 0)
      break;
  if (j < NWORDS)
    {
      size_t i;
      for (i = j + 1; i < NWORDS; i++)
        if (ored_words[i] != 0)
          {
            fprintf (fp, "unknown");
            return (fclose (fp) != 0);
          }
      for (i = 0; ; i++)
        if ((ored_words[j] >> i) & 1)
          {
            fprintf (fp, "word %d bit %d", (int) j, (int) i);
            return (fclose (fp) != 0);
          }
    }
  fprintf (fp, "unknown");
  return (fclose (fp) != 0);
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_cc_float_expbit0=`cat conftest.out`
else
  gl_cv_cc_float_expbit0="unknown"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      rm -f conftest.out

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_float_expbit0" >&5
$as_echo "$gl_cv_cc_float_expbit0" >&6; }
  case "$gl_cv_cc_float_expbit0" in
    word*bit*)
      word=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
      bit=`echo "$gl_cv_cc_float_expbit0" | sed -e 's/word.*bit //'`

cat >>confdefs.h <<_ACEOF
#define FLT_EXPBIT0_WORD $word
_ACEOF


cat >>confdefs.h <<_ACEOF
#define FLT_EXPBIT0_BIT $bit
_ACEOF

      ;;
  esac


      fi
      gl_gnulib_enabled_3f0e593033d1fc2c127581960f641b66=true
    fi
  }
  func_gl_gnulib_m4code_ldexp ()
  {
    if ! $gl_gnulib_enabled_ldexp; then


  LDEXP_LIBM=
  if test $gl_cv_func_ldexp_no_libm = no; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ldexp() can be used with libm" >&5
$as_echo_n "checking whether ldexp() can be used with libm... " >&6; }
if ${gl_cv_func_ldexp_in_libm+:} false; then :
  $as_echo_n "(cached) " >&6
else

        save_LIBS="$LIBS"
        LIBS="$LIBS -lm"
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __NO_MATH_INLINES
                             # define __NO_MATH_INLINES 1 /* for glibc */
                             #endif
                             #include <math.h>
                             double (*funcptr) (double, int) = ldexp;
                             double x;
int
main ()
{
return ldexp (x, -1) > 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_ldexp_in_libm=yes
else
  gl_cv_func_ldexp_in_libm=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
        LIBS="$save_LIBS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ldexp_in_libm" >&5
$as_echo "$gl_cv_func_ldexp_in_libm" >&6; }
    if test $gl_cv_func_ldexp_in_libm = yes; then
      LDEXP_LIBM=-lm
    fi
  fi


      gl_gnulib_enabled_ldexp=true
    fi
  }
  func_gl_gnulib_m4code_21ee726a3540c09237a8e70c0baf7467 ()
  {
    if ! $gl_gnulib_enabled_21ee726a3540c09237a8e70c0baf7467; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the __inline keyword" >&5
$as_echo_n "checking whether the compiler supports the __inline keyword... " >&6; }
if ${gl_cv_c___inline+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
typedef int foo_t;
           static __inline foo_t foo (void) { return 0; }
int
main ()
{
return foo ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_c___inline=yes
else
  gl_cv_c___inline=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c___inline" >&5
$as_echo "$gl_cv_c___inline" >&6; }
  if test $gl_cv_c___inline = yes; then

$as_echo "#define HAVE___INLINE 1" >>confdefs.h

  fi

      gl_gnulib_enabled_21ee726a3540c09237a8e70c0baf7467=true
    fi
  }
  func_gl_gnulib_m4code_2049e887c7e5308faad27b3f894bb8c9 ()
  {
    if ! $gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9; then









  gl_LIBOBJS="$gl_LIBOBJS localtime-buffer.$ac_objext"

      gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9=true
    fi
  }
  func_gl_gnulib_m4code_lstat ()
  {
    if ! $gl_gnulib_enabled_lstat; then




  if test $ac_cv_func_lstat = yes; then

    case $host_os,$gl_cv_func_lstat_dereferences_slashed_symlink in
      solaris* | *no)
        REPLACE_LSTAT=1
        ;;
    esac
  else
    HAVE_LSTAT=0
  fi

      if test $REPLACE_LSTAT = 1; then








  gl_LIBOBJS="$gl_LIBOBJS lstat.$ac_objext"

        :
      fi





          GNULIB_LSTAT=1





$as_echo "#define GNULIB_TEST_LSTAT 1" >>confdefs.h



      gl_gnulib_enabled_lstat=true
      if test $REPLACE_LSTAT = 1; then
        func_gl_gnulib_m4code_stat
      fi
      if test $REPLACE_LSTAT = 1; then
        func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c
      fi
      func_gl_gnulib_m4code_sys_stat
    fi
  }
  func_gl_gnulib_m4code_malloca ()
  {
    if ! $gl_gnulib_enabled_malloca; then




      gl_gnulib_enabled_malloca=true
    fi
  }
  func_gl_gnulib_m4code_332607f759618fb73dfc3076748afea7 ()
  {
    if ! $gl_gnulib_enabled_332607f759618fb73dfc3076748afea7; then



      if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then








  gl_LIBOBJS="$gl_LIBOBJS spawni.$ac_objext"


  for ac_header in paths.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "paths.h" "ac_cv_header_paths_h" "$ac_includes_default"
if test "x$ac_cv_header_paths_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_PATHS_H 1
_ACEOF

fi

done

  for ac_func in confstr sched_setparam sched_setscheduler setegid seteuid vfork
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done


      fi
      gl_gnulib_enabled_332607f759618fb73dfc3076748afea7=true
      func_gl_gnulib_m4code_cdeb0f2aaf9d280baa6526bfa1b07f70
      func_gl_gnulib_m4code_strchrnul
    fi
  }
  func_gl_gnulib_m4code_rawmemchr ()
  {
    if ! $gl_gnulib_enabled_rawmemchr; then




  for ac_func in rawmemchr
do :
  ac_fn_c_check_func "$LINENO" "rawmemchr" "ac_cv_func_rawmemchr"
if test "x$ac_cv_func_rawmemchr" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_RAWMEMCHR 1
_ACEOF

fi
done

  if test $ac_cv_func_rawmemchr = no; then
    HAVE_RAWMEMCHR=0
  fi

      if test $HAVE_RAWMEMCHR = 0; then








  gl_LIBOBJS="$gl_LIBOBJS rawmemchr.$ac_objext"

        :
      fi





          GNULIB_RAWMEMCHR=1





$as_echo "#define GNULIB_TEST_RAWMEMCHR 1" >>confdefs.h



      gl_gnulib_enabled_rawmemchr=true
    fi
  }
  func_gl_gnulib_m4code_rmdir ()
  {
    if ! $gl_gnulib_enabled_rmdir; then



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether rmdir works" >&5
$as_echo_n "checking whether rmdir works... " >&6; }
if ${gl_cv_func_rmdir_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  mkdir conftest.dir
     touch conftest.file
     if test "$cross_compiling" = yes; then :
  case "$host_os" in
                           # Guess yes on Linux systems.
          linux-* | linux) gl_cv_func_rmdir_works="guessing yes" ;;
                           # Guess yes on glibc systems.
          *-gnu* | gnu*)   gl_cv_func_rmdir_works="guessing yes" ;;
                           # Guess no on native Windows.
          mingw*)          gl_cv_func_rmdir_works="guessing no" ;;
                           # If we don't know, obey --enable-cross-guesses.
          *)               gl_cv_func_rmdir_works="$gl_cross_guess_normal" ;;
        esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdio.h>
           #include <errno.h>
           #if HAVE_UNISTD_H
           # include <unistd.h>
           #else /* on Windows with MSVC */
           # include <direct.h>
           #endif

int
main ()
{
int result = 0;
      if (!rmdir ("conftest.file/"))
        result |= 1;
      else if (errno != ENOTDIR)
        result |= 2;
      if (!rmdir ("conftest.dir/./"))
        result |= 4;
      return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_rmdir_works=yes
else
  gl_cv_func_rmdir_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

     rm -rf conftest.dir conftest.file
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_rmdir_works" >&5
$as_echo "$gl_cv_func_rmdir_works" >&6; }
  case "$gl_cv_func_rmdir_works" in
    *yes) ;;
    *)
      REPLACE_RMDIR=1
      ;;
  esac

      if test $REPLACE_RMDIR = 1; then








  gl_LIBOBJS="$gl_LIBOBJS rmdir.$ac_objext"

      fi





          GNULIB_RMDIR=1





$as_echo "#define GNULIB_TEST_RMDIR 1" >>confdefs.h



      gl_gnulib_enabled_rmdir=true
      if test $REPLACE_RMDIR = 1; then
        func_gl_gnulib_m4code_sys_stat
      fi
    fi
  }
  func_gl_gnulib_m4code_9bc5f216d57e231e4834049d67d0db62 ()
  {
    if ! $gl_gnulib_enabled_9bc5f216d57e231e4834049d67d0db62; then
      gl_gnulib_enabled_9bc5f216d57e231e4834049d67d0db62=true
    fi
  }
  func_gl_gnulib_m4code_cdeb0f2aaf9d280baa6526bfa1b07f70 ()
  {
    if ! $gl_gnulib_enabled_cdeb0f2aaf9d280baa6526bfa1b07f70; then



      gl_gnulib_enabled_cdeb0f2aaf9d280baa6526bfa1b07f70=true
    fi
  }
  func_gl_gnulib_m4code_stat ()
  {
    if ! $gl_gnulib_enabled_stat; then




  case "$host_os" in
    mingw*)
                  REPLACE_STAT=1
      ;;
    *)
                        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat handles trailing slashes on files" >&5
$as_echo_n "checking whether stat handles trailing slashes on files... " >&6; }
if ${gl_cv_func_stat_file_slash+:} false; then :
  $as_echo_n "(cached) " >&6
else
  touch conftest.tmp
         # Assume that if we have lstat, we can also check symlinks.
         if test $ac_cv_func_lstat = yes; then
           ln -s conftest.tmp conftest.lnk
         fi
         if test "$cross_compiling" = yes; then :
  case "$host_os" in
                               # Guess yes on Linux systems.
              linux-* | linux) gl_cv_func_stat_file_slash="guessing yes" ;;
                               # Guess yes on glibc systems.
              *-gnu* | gnu*)   gl_cv_func_stat_file_slash="guessing yes" ;;
                               # If we don't know, obey --enable-cross-guesses.
              *)               gl_cv_func_stat_file_slash="$gl_cross_guess_normal" ;;
            esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/stat.h>

int
main ()
{
int result = 0;
               struct stat st;
               if (!stat ("conftest.tmp/", &st))
                 result |= 1;
#if HAVE_LSTAT
               if (!stat ("conftest.lnk/", &st))
                 result |= 2;
#endif
               return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_stat_file_slash=yes
else
  gl_cv_func_stat_file_slash=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

         rm -f conftest.tmp conftest.lnk
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_stat_file_slash" >&5
$as_echo "$gl_cv_func_stat_file_slash" >&6; }
      case $gl_cv_func_stat_file_slash in
        *no)
          REPLACE_STAT=1

$as_echo "#define REPLACE_FUNC_STAT_FILE 1" >>confdefs.h
;;
      esac
      case $host_os in
                solaris*)
          REPLACE_FSTAT=1 ;;
      esac
      ;;
  esac

      if test $REPLACE_STAT = 1; then








  gl_LIBOBJS="$gl_LIBOBJS stat.$ac_objext"

        case "$host_os" in
          mingw*)








  gl_LIBOBJS="$gl_LIBOBJS stat-w32.$ac_objext"

            ;;
        esac


  :

      fi





          GNULIB_STAT=1





$as_echo "#define GNULIB_TEST_STAT 1" >>confdefs.h



      gl_gnulib_enabled_stat=true
      if test $REPLACE_STAT = 1; then
        func_gl_gnulib_m4code_malloca
      fi
      if test $REPLACE_STAT = 1; then
        func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c
      fi
      func_gl_gnulib_m4code_sys_stat
    fi
  }
  func_gl_gnulib_m4code_0137e3d3638b33e5819d132d0b23165c ()
  {
    if ! $gl_gnulib_enabled_0137e3d3638b33e5819d132d0b23165c; then




  ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.tv_nsec" "ac_cv_member_struct_stat_st_atim_tv_nsec" "#include <sys/types.h>
     #include <sys/stat.h>
"
if test "x$ac_cv_member_struct_stat_st_atim_tv_nsec" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC 1
_ACEOF

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct stat.st_atim is of type struct timespec" >&5
$as_echo_n "checking whether struct stat.st_atim is of type struct timespec... " >&6; }
if ${ac_cv_typeof_struct_stat_st_atim_is_struct_timespec+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

            #include <sys/types.h>
            #include <sys/stat.h>
            #if HAVE_SYS_TIME_H
            # include <sys/time.h>
            #endif
            #include <time.h>
            struct timespec ts;
            struct stat st;

int
main ()
{

            st.st_atim = ts;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=yes
else
  ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec" >&5
$as_echo "$ac_cv_typeof_struct_stat_st_atim_is_struct_timespec" >&6; }
     if test $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec = yes; then

$as_echo "#define TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC 1" >>confdefs.h

     fi
else
  ac_fn_c_check_member "$LINENO" "struct stat" "st_atimespec.tv_nsec" "ac_cv_member_struct_stat_st_atimespec_tv_nsec" "#include <sys/types.h>
        #include <sys/stat.h>
"
if test "x$ac_cv_member_struct_stat_st_atimespec_tv_nsec" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC 1
_ACEOF


else
  ac_fn_c_check_member "$LINENO" "struct stat" "st_atimensec" "ac_cv_member_struct_stat_st_atimensec" "#include <sys/types.h>
           #include <sys/stat.h>
"
if test "x$ac_cv_member_struct_stat_st_atimensec" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_ATIMENSEC 1
_ACEOF


else
  ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.st__tim.tv_nsec" "ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec" "#include <sys/types.h>
              #include <sys/stat.h>
"
if test "x$ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC 1
_ACEOF


fi

fi

fi

fi





  ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimespec.tv_nsec" "ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" "#include <sys/types.h>
     #include <sys/stat.h>
"
if test "x$ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC 1
_ACEOF


else
  ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimensec" "ac_cv_member_struct_stat_st_birthtimensec" "#include <sys/types.h>
        #include <sys/stat.h>
"
if test "x$ac_cv_member_struct_stat_st_birthtimensec" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC 1
_ACEOF


else
  ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtim.tv_nsec" "ac_cv_member_struct_stat_st_birthtim_tv_nsec" "#include <sys/types.h>
          #include <sys/stat.h>
"
if test "x$ac_cv_member_struct_stat_st_birthtim_tv_nsec" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC 1
_ACEOF


fi

fi

fi


      gl_gnulib_enabled_0137e3d3638b33e5819d132d0b23165c=true
    fi
  }
  func_gl_gnulib_m4code_strchrnul ()
  {
    if ! $gl_gnulib_enabled_strchrnul; then




  for ac_func in strchrnul
do :
  ac_fn_c_check_func "$LINENO" "strchrnul" "ac_cv_func_strchrnul"
if test "x$ac_cv_func_strchrnul" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRCHRNUL 1
_ACEOF

fi
done

  if test $ac_cv_func_strchrnul = no; then
    HAVE_STRCHRNUL=0
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strchrnul works" >&5
$as_echo_n "checking whether strchrnul works... " >&6; }
if ${gl_cv_func_strchrnul_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#if defined __CYGWIN__
 #include <cygwin/version.h>
 #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 9)
  Lucky user
 #endif
#else
  Lucky user
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Lucky user" >/dev/null 2>&1; then :
  gl_cv_func_strchrnul_works="guessing yes"
else
  gl_cv_func_strchrnul_works="guessing no"
fi
rm -f conftest*


else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <string.h> /* for strchrnul */

int
main ()
{
const char *buf = "a";
      return strchrnul (buf, 'b') != buf + 1;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_strchrnul_works=yes
else
  gl_cv_func_strchrnul_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strchrnul_works" >&5
$as_echo "$gl_cv_func_strchrnul_works" >&6; }
    case "$gl_cv_func_strchrnul_works" in
      *yes) ;;
      *) REPLACE_STRCHRNUL=1 ;;
    esac
  fi

      if test $HAVE_STRCHRNUL = 0 || test $REPLACE_STRCHRNUL = 1; then








  gl_LIBOBJS="$gl_LIBOBJS strchrnul.$ac_objext"

        :
      fi





          GNULIB_STRCHRNUL=1





$as_echo "#define GNULIB_TEST_STRCHRNUL 1" >>confdefs.h



      gl_gnulib_enabled_strchrnul=true
      if test $HAVE_STRCHRNUL = 0 || test $REPLACE_STRCHRNUL = 1; then
        func_gl_gnulib_m4code_rawmemchr
      fi
    fi
  }
  func_gl_gnulib_m4code_dbb57f49352be8fb86869629a254fb72 ()
  {
    if ! $gl_gnulib_enabled_dbb57f49352be8fb86869629a254fb72; then


      if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then








  gl_LIBOBJS="$gl_LIBOBJS strerror-override.$ac_objext"





  if test $ac_cv_header_sys_socket_h != yes; then
                    for ac_header in winsock2.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
if test "x$ac_cv_header_winsock2_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_WINSOCK2_H 1
_ACEOF

fi

done

  fi
  if test "$ac_cv_header_winsock2_h" = yes; then
    HAVE_WINSOCK2_H=1
    UNISTD_H_HAVE_WINSOCK2_H=1
    SYS_IOCTL_H_HAVE_WINSOCK2_H=1
  else
    HAVE_WINSOCK2_H=0
  fi


      fi
      gl_gnulib_enabled_dbb57f49352be8fb86869629a254fb72=true
    fi
  }
  func_gl_gnulib_m4code_1f32594a85e6221ba15f884daeee8c2a ()
  {
    if ! $gl_gnulib_enabled_1f32594a85e6221ba15f884daeee8c2a; then







  if test $ac_cv_have_decl_strerror_r = no; then
    HAVE_DECL_STRERROR_R=0
  fi

  if test $ac_cv_func_strerror_r = yes; then
    if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
      if test $gl_cv_func_strerror_r_posix_signature = yes; then
        case "$gl_cv_func_strerror_r_works" in
                    *no) REPLACE_STRERROR_R=1 ;;
        esac
      else
                REPLACE_STRERROR_R=1
      fi
    else
                  REPLACE_STRERROR_R=1
    fi
  fi

      if test $HAVE_DECL_STRERROR_R = 0 || test $REPLACE_STRERROR_R = 1; then








  gl_LIBOBJS="$gl_LIBOBJS strerror_r.$ac_objext"






      fi





          GNULIB_STRERROR_R=1





$as_echo "#define GNULIB_TEST_STRERROR_R 1" >>confdefs.h





cat >>confdefs.h <<_ACEOF
#define GNULIB_STRERROR_R_POSIX 1
_ACEOF


      gl_gnulib_enabled_1f32594a85e6221ba15f884daeee8c2a=true
      if test $HAVE_DECL_STRERROR_R = 0 || test $REPLACE_STRERROR_R = 1; then
        func_gl_gnulib_m4code_dbb57f49352be8fb86869629a254fb72
      fi
    fi
  }
  func_gl_gnulib_m4code_strnlen ()
  {
    if ! $gl_gnulib_enabled_strnlen; then






  if test $ac_cv_have_decl_strnlen = no; then
    HAVE_DECL_STRNLEN=0
  else

         { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strnlen" >&5
$as_echo_n "checking for working strnlen... " >&6; }
if ${ac_cv_func_strnlen_working+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  # Guess no on AIX systems, yes otherwise.
		case "$host_os" in
		  aix*) ac_cv_func_strnlen_working=no;;
		  *)    ac_cv_func_strnlen_working=yes;;
		esac
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
int
main ()
{

#define S "foobar"
#define S_LEN (sizeof S - 1)

  /* At least one implementation is buggy: that of AIX 4.3 would
     give strnlen (S, 1) == 3.  */

  int i;
  for (i = 0; i < S_LEN + 1; ++i)
    {
      int expected = i <= S_LEN ? i : S_LEN;
      if (strnlen (S, i) != expected)
	return 1;
    }
  return 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_func_strnlen_working=yes
else
  ac_cv_func_strnlen_working=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strnlen_working" >&5
$as_echo "$ac_cv_func_strnlen_working" >&6; }
test $ac_cv_func_strnlen_working = no && :


    if test $ac_cv_func_strnlen_working = no; then
      REPLACE_STRNLEN=1
    fi
  fi

      if test $HAVE_DECL_STRNLEN = 0 || test $REPLACE_STRNLEN = 1; then








  gl_LIBOBJS="$gl_LIBOBJS strnlen.$ac_objext"

        :
      fi





          GNULIB_STRNLEN=1





$as_echo "#define GNULIB_TEST_STRNLEN 1" >>confdefs.h



      gl_gnulib_enabled_strnlen=true
    fi
  }
  func_gl_gnulib_m4code_sys_stat ()
  {
    if ! $gl_gnulib_enabled_sys_stat; then














     if test $gl_cv_have_include_next = yes; then
       gl_cv_next_sys_stat_h='<'sys/stat.h'>'
     else
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/stat.h>" >&5
$as_echo_n "checking absolute name of <sys/stat.h>... " >&6; }
if ${gl_cv_next_sys_stat_h+:} false; then :
  $as_echo_n "(cached) " >&6
else

             if test $ac_cv_header_sys_stat_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/stat.h>
_ACEOF
                case "$host_os" in
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
    *)    gl_absname_cpp="$ac_cpp" ;;
  esac

  case "$host_os" in
    mingw*)
                                          gl_dirsep_regex='[/\\]'
      ;;
    *)
      gl_dirsep_regex='\/'
      ;;
  esac
      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
  gl_header_literal_regex=`echo 'sys/stat.h' \
                           | sed -e "$gl_make_literal_regex_sed"`
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
      s|^/[^/]|//&|
      p
      q
    }'

        gl_cv_absolute_sys_stat_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

           gl_header=$gl_cv_absolute_sys_stat_h
           gl_cv_next_sys_stat_h='"'$gl_header'"'
          else
               gl_cv_next_sys_stat_h='<'sys/stat.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_stat_h" >&5
$as_echo "$gl_cv_next_sys_stat_h" >&6; }
     fi
     NEXT_SYS_STAT_H=$gl_cv_next_sys_stat_h

     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
       gl_next_as_first_directive='<'sys/stat.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_sys_stat_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H=$gl_next_as_first_directive








    WINDOWS_STAT_TIMESPEC=0








      ac_fn_c_check_type "$LINENO" "nlink_t" "ac_cv_type_nlink_t" "#include <sys/types.h>
     #include <sys/stat.h>
"
if test "x$ac_cv_type_nlink_t" = xyes; then :

else

$as_echo "#define nlink_t int" >>confdefs.h

fi







      gl_gnulib_enabled_sys_stat=true
    fi
  }
  func_gl_gnulib_m4code_ed5616be3593d355b981ffab56b9f37b ()
  {
    if ! $gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b; then















  gl_cv_func_vfprintf_posix=no
  case "$gl_cv_func_printf_sizes_c99" in
    *yes)
      case "$gl_cv_func_printf_long_double" in
        *yes)
          case "$gl_cv_func_printf_infinite" in
            *yes)
              case "$gl_cv_func_printf_infinite_long_double" in
                *yes)
                  case "$gl_cv_func_printf_directive_a" in
                    *yes)
                      case "$gl_cv_func_printf_directive_f" in
                        *yes)
                          case "$gl_cv_func_printf_directive_n" in
                            *yes)
                              case "$gl_cv_func_printf_directive_ls" in
                                *yes)
                                  case "$gl_cv_func_printf_positions" in
                                    *yes)
                                      case "$gl_cv_func_printf_flag_grouping" in
                                        *yes)
                                          case "$gl_cv_func_printf_flag_leftadjust" in
                                            *yes)
                                              case "$gl_cv_func_printf_flag_zero" in
                                                *yes)
                                                  case "$gl_cv_func_printf_precision" in
                                                    *yes)
                                                      case "$gl_cv_func_printf_enomem" in
                                                        *yes)
                                                          # vfprintf exists and is
                                                          # already POSIX compliant.
                                                          gl_cv_func_vfprintf_posix=yes
                                                          ;;
                                                      esac
                                                      ;;
                                                  esac
                                                  ;;
                                              esac
                                              ;;
                                          esac
                                          ;;
                                      esac
                                      ;;
                                  esac
                                  ;;
                              esac
                              ;;
                          esac
                          ;;
                      esac
                      ;;
                  esac
                  ;;
              esac
              ;;
          esac
          ;;
      esac
      ;;
  esac
  if test $gl_cv_func_vfprintf_posix = no; then



  case "$gl_cv_func_printf_infinite" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_INFINITE_DOUBLE 1" >>confdefs.h

      ;;
  esac




  case "$gl_cv_func_printf_long_double" in
    *yes)
      case "$gl_cv_func_printf_infinite_long_double" in
        *yes)
          ;;
        *)

$as_echo "#define NEED_PRINTF_INFINITE_LONG_DOUBLE 1" >>confdefs.h

          ;;
      esac
      ;;
  esac



  case "$gl_cv_func_printf_directive_a" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_A 1" >>confdefs.h

      for ac_func in nl_langinfo
do :
  ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
if test "x$ac_cv_func_nl_langinfo" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_NL_LANGINFO 1
_ACEOF

fi
done

      ;;
  esac



  case "$gl_cv_func_printf_directive_f" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_F 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_directive_ls" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_DIRECTIVE_LS 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_grouping" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_GROUPING 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_leftadjust" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_LEFTADJUST 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_flag_zero" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_FLAG_ZERO 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_precision" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_UNBOUNDED_PRECISION 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac



  case "$gl_cv_func_printf_enomem" in
    *yes)
      ;;
    *)

$as_echo "#define NEED_PRINTF_ENOMEM 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_DOUBLE 1" >>confdefs.h


$as_echo "#define NEED_PRINTF_LONG_DOUBLE 1" >>confdefs.h

      ;;
  esac











  gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"

  if test $ac_cv_func_vasnprintf = yes; then

$as_echo "#define REPLACE_VASNPRINTF 1" >>confdefs.h

  fi











  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
if test "x$ac_cv_type_ptrdiff_t" = xyes; then :

else

$as_echo "#define ptrdiff_t long" >>confdefs.h


fi

















  gl_LIBOBJS="$gl_LIBOBJS vfprintf.$ac_objext"

  REPLACE_VFPRINTF=1

$as_echo "#define REPLACE_VFPRINTF_POSIX 1" >>confdefs.h

  :

  fi






          GNULIB_VFPRINTF_POSIX=1





$as_echo "#define GNULIB_TEST_VFPRINTF_POSIX 1" >>confdefs.h



      gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b=true
      if test $REPLACE_VFPRINTF = 1; then
        func_gl_gnulib_m4code_fseterr
      fi
    fi
  }
  func_gl_gnulib_m4code_503a4cb75d69c787103d0aa2ab7d8440 ()
  {
    if ! $gl_gnulib_enabled_503a4cb75d69c787103d0aa2ab7d8440; then

      case "$host_os" in
        mingw*)








  gl_LIBOBJS="$gl_LIBOBJS windows-mutex.$ac_objext"

          ;;
      esac
      gl_gnulib_enabled_503a4cb75d69c787103d0aa2ab7d8440=true
    fi
  }
  func_gl_gnulib_m4code_68a4501daeca58988392c7e60b4917ab ()
  {
    if ! $gl_gnulib_enabled_68a4501daeca58988392c7e60b4917ab; then

      case "$host_os" in
        mingw*)








  gl_LIBOBJS="$gl_LIBOBJS windows-once.$ac_objext"

          ;;
      esac
      gl_gnulib_enabled_68a4501daeca58988392c7e60b4917ab=true
    fi
  }
  func_gl_gnulib_m4code_f0efff84a70f4afba30902bb8ffe9354 ()
  {
    if ! $gl_gnulib_enabled_f0efff84a70f4afba30902bb8ffe9354; then

      case "$host_os" in
        mingw*)








  gl_LIBOBJS="$gl_LIBOBJS windows-recmutex.$ac_objext"

          ;;
      esac
      gl_gnulib_enabled_f0efff84a70f4afba30902bb8ffe9354=true
    fi
  }
  func_gl_gnulib_m4code_8bb827fe37eaccf1b97feb0c87bc92ef ()
  {
    if ! $gl_gnulib_enabled_8bb827fe37eaccf1b97feb0c87bc92ef; then

      case "$host_os" in
        mingw*)








  gl_LIBOBJS="$gl_LIBOBJS windows-rwlock.$ac_objext"

          ;;
      esac
      gl_gnulib_enabled_8bb827fe37eaccf1b97feb0c87bc92ef=true
    fi
  }
  func_gl_gnulib_m4code_48b2271240803e4879464b755748a89d ()
  {
    if ! $gl_gnulib_enabled_48b2271240803e4879464b755748a89d; then

      case "$host_os" in
        mingw*)








  gl_LIBOBJS="$gl_LIBOBJS windows-tls.$ac_objext"

          ;;
      esac
      gl_gnulib_enabled_48b2271240803e4879464b755748a89d=true
      func_gl_gnulib_m4code_68a4501daeca58988392c7e60b4917ab
    fi
  }
  if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
    func_gl_gnulib_m4code_lstat
  fi
  if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
    func_gl_gnulib_m4code_malloca
  fi
  if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
    func_gl_gnulib_m4code_sys_stat
  fi
  if test $REPLACE_CLOSE = 1; then
    func_gl_gnulib_m4code_43fe87a341d9b4b93c47c3ad819a5239
  fi
  if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then
    func_gl_gnulib_m4code_getdtablesize
  fi
  if test $REPLACE_FOPEN = 1; then
    func_gl_gnulib_m4code_fstat
  fi
  if test $REPLACE_FPRINTF = 1; then
    func_gl_gnulib_m4code_fseterr
  fi
  if test $NEED_LOCALTIME_BUFFER = 1; then
    func_gl_gnulib_m4code_2049e887c7e5308faad27b3f894bb8c9
  fi
  if { test $HAVE_DECL_LDEXPL = 0 || test $gl_func_ldexpl = no; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
    func_gl_gnulib_m4code_ldexp
  fi
  if test $gl_threads_api = windows; then
    func_gl_gnulib_m4code_503a4cb75d69c787103d0aa2ab7d8440
  fi
  if test $gl_threads_api = windows; then
    func_gl_gnulib_m4code_68a4501daeca58988392c7e60b4917ab
  fi
  if test $gl_threads_api = windows; then
    func_gl_gnulib_m4code_f0efff84a70f4afba30902bb8ffe9354
  fi
  if test $gl_threads_api = windows; then
    func_gl_gnulib_m4code_8bb827fe37eaccf1b97feb0c87bc92ef
  fi
  if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then
    func_gl_gnulib_m4code_30838f5439487421042f2225bed3af76
  fi
  if test $REPLACE_OPEN = 1; then
    func_gl_gnulib_m4code_fstat
  fi
  if test $REPLACE_OPEN = 1; then
    func_gl_gnulib_m4code_stat
  fi
  if test $REPLACE_PERROR = 1; then
    func_gl_gnulib_m4code_dbb57f49352be8fb86869629a254fb72
  fi
  if test $REPLACE_PERROR = 1; then
    func_gl_gnulib_m4code_1f32594a85e6221ba15f884daeee8c2a
  fi
  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = 1; then
    func_gl_gnulib_m4code_getdtablesize
  fi
  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = 1; then
    func_gl_gnulib_m4code_getdtablesize
  fi
  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = 1; then
    func_gl_gnulib_m4code_getdtablesize
  fi
  if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
    func_gl_gnulib_m4code_332607f759618fb73dfc3076748afea7
  fi
  if test $REPLACE_PRINTF = 1; then
    func_gl_gnulib_m4code_ed5616be3593d355b981ffab56b9f37b
  fi
  if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then
    func_gl_gnulib_m4code_stat
  fi
  if test $REPLACE_RENAME = 1; then
    func_gl_gnulib_m4code_chdir
  fi
  if test $REPLACE_RENAME = 1; then
    func_gl_gnulib_m4code_lstat
  fi
  if test $REPLACE_RENAME = 1; then
    func_gl_gnulib_m4code_rmdir
  fi
  if test $REPLACE_RENAME = 1; then
    func_gl_gnulib_m4code_9bc5f216d57e231e4834049d67d0db62
  fi
  if test $REPLACE_SIGNBIT = 1; then
    func_gl_gnulib_m4code_3f0e593033d1fc2c127581960f641b66
  fi
  if test $REPLACE_STRERROR = 1; then
    func_gl_gnulib_m4code_dbb57f49352be8fb86869629a254fb72
  fi
  if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then
    func_gl_gnulib_m4code_strnlen
  fi
  if test $HAVE_STRVERSCMP = 0; then
    func_gl_gnulib_m4code_21ee726a3540c09237a8e70c0baf7467
  fi
  if test $gl_threads_api = windows; then
    func_gl_gnulib_m4code_48b2271240803e4879464b755748a89d
  fi
  if test $REPLACE_UNLINK = 1; then
    func_gl_gnulib_m4code_lstat
  fi

   if $gl_gnulib_enabled_chdir; then
  gl_GNULIB_ENABLED_chdir_TRUE=
  gl_GNULIB_ENABLED_chdir_FALSE='#'
else
  gl_GNULIB_ENABLED_chdir_TRUE='#'
  gl_GNULIB_ENABLED_chdir_FALSE=
fi

   if $gl_gnulib_enabled_43fe87a341d9b4b93c47c3ad819a5239; then
  gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_TRUE=
  gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_FALSE='#'
else
  gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_TRUE='#'
  gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_FALSE=
fi

   if $gl_gnulib_enabled_fseterr; then
  gl_GNULIB_ENABLED_fseterr_TRUE=
  gl_GNULIB_ENABLED_fseterr_FALSE='#'
else
  gl_GNULIB_ENABLED_fseterr_TRUE='#'
  gl_GNULIB_ENABLED_fseterr_FALSE=
fi

   if $gl_gnulib_enabled_fstat; then
  gl_GNULIB_ENABLED_fstat_TRUE=
  gl_GNULIB_ENABLED_fstat_FALSE='#'
else
  gl_GNULIB_ENABLED_fstat_TRUE='#'
  gl_GNULIB_ENABLED_fstat_FALSE=
fi

   if $gl_gnulib_enabled_getdtablesize; then
  gl_GNULIB_ENABLED_getdtablesize_TRUE=
  gl_GNULIB_ENABLED_getdtablesize_FALSE='#'
else
  gl_GNULIB_ENABLED_getdtablesize_TRUE='#'
  gl_GNULIB_ENABLED_getdtablesize_FALSE=
fi

   if $gl_gnulib_enabled_30838f5439487421042f2225bed3af76; then
  gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_TRUE=
  gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_FALSE='#'
else
  gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_TRUE='#'
  gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_FALSE=
fi

   if $gl_gnulib_enabled_3f0e593033d1fc2c127581960f641b66; then
  gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_TRUE=
  gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_FALSE='#'
else
  gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_TRUE='#'
  gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_FALSE=
fi

   if $gl_gnulib_enabled_ldexp; then
  gl_GNULIB_ENABLED_ldexp_TRUE=
  gl_GNULIB_ENABLED_ldexp_FALSE='#'
else
  gl_GNULIB_ENABLED_ldexp_TRUE='#'
  gl_GNULIB_ENABLED_ldexp_FALSE=
fi

   if $gl_gnulib_enabled_21ee726a3540c09237a8e70c0baf7467; then
  gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_TRUE=
  gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_FALSE='#'
else
  gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_TRUE='#'
  gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_FALSE=
fi

   if $gl_gnulib_enabled_2049e887c7e5308faad27b3f894bb8c9; then
  gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_TRUE=
  gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_FALSE='#'
else
  gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_TRUE='#'
  gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_FALSE=
fi

   if $gl_gnulib_enabled_lstat; then
  gl_GNULIB_ENABLED_lstat_TRUE=
  gl_GNULIB_ENABLED_lstat_FALSE='#'
else
  gl_GNULIB_ENABLED_lstat_TRUE='#'
  gl_GNULIB_ENABLED_lstat_FALSE=
fi

   if $gl_gnulib_enabled_malloca; then
  gl_GNULIB_ENABLED_malloca_TRUE=
  gl_GNULIB_ENABLED_malloca_FALSE='#'
else
  gl_GNULIB_ENABLED_malloca_TRUE='#'
  gl_GNULIB_ENABLED_malloca_FALSE=
fi

   if $gl_gnulib_enabled_332607f759618fb73dfc3076748afea7; then
  gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_TRUE=
  gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_FALSE='#'
else
  gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_TRUE='#'
  gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_FALSE=
fi

   if $gl_gnulib_enabled_rawmemchr; then
  gl_GNULIB_ENABLED_rawmemchr_TRUE=
  gl_GNULIB_ENABLED_rawmemchr_FALSE='#'
else
  gl_GNULIB_ENABLED_rawmemchr_TRUE='#'
  gl_GNULIB_ENABLED_rawmemchr_FALSE=
fi

   if $gl_gnulib_enabled_rmdir; then
  gl_GNULIB_ENABLED_rmdir_TRUE=
  gl_GNULIB_ENABLED_rmdir_FALSE='#'
else
  gl_GNULIB_ENABLED_rmdir_TRUE='#'
  gl_GNULIB_ENABLED_rmdir_FALSE=
fi

   if $gl_gnulib_enabled_9bc5f216d57e231e4834049d67d0db62; then
  gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_TRUE=
  gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_FALSE='#'
else
  gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_TRUE='#'
  gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_FALSE=
fi

   if $gl_gnulib_enabled_cdeb0f2aaf9d280baa6526bfa1b07f70; then
  gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_TRUE=
  gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_FALSE='#'
else
  gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_TRUE='#'
  gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_FALSE=
fi

   if $gl_gnulib_enabled_stat; then
  gl_GNULIB_ENABLED_stat_TRUE=
  gl_GNULIB_ENABLED_stat_FALSE='#'
else
  gl_GNULIB_ENABLED_stat_TRUE='#'
  gl_GNULIB_ENABLED_stat_FALSE=
fi

   if $gl_gnulib_enabled_0137e3d3638b33e5819d132d0b23165c; then
  gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_TRUE=
  gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_FALSE='#'
else
  gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_TRUE='#'
  gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_FALSE=
fi

   if $gl_gnulib_enabled_strchrnul; then
  gl_GNULIB_ENABLED_strchrnul_TRUE=
  gl_GNULIB_ENABLED_strchrnul_FALSE='#'
else
  gl_GNULIB_ENABLED_strchrnul_TRUE='#'
  gl_GNULIB_ENABLED_strchrnul_FALSE=
fi

   if $gl_gnulib_enabled_dbb57f49352be8fb86869629a254fb72; then
  gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_TRUE=
  gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_FALSE='#'
else
  gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_TRUE='#'
  gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_FALSE=
fi

   if $gl_gnulib_enabled_1f32594a85e6221ba15f884daeee8c2a; then
  gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_TRUE=
  gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_FALSE='#'
else
  gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_TRUE='#'
  gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_FALSE=
fi

   if $gl_gnulib_enabled_strnlen; then
  gl_GNULIB_ENABLED_strnlen_TRUE=
  gl_GNULIB_ENABLED_strnlen_FALSE='#'
else
  gl_GNULIB_ENABLED_strnlen_TRUE='#'
  gl_GNULIB_ENABLED_strnlen_FALSE=
fi

   if $gl_gnulib_enabled_sys_stat; then
  gl_GNULIB_ENABLED_sys_stat_TRUE=
  gl_GNULIB_ENABLED_sys_stat_FALSE='#'
else
  gl_GNULIB_ENABLED_sys_stat_TRUE='#'
  gl_GNULIB_ENABLED_sys_stat_FALSE=
fi

   if $gl_gnulib_enabled_ed5616be3593d355b981ffab56b9f37b; then
  gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_TRUE=
  gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_FALSE='#'
else
  gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_TRUE='#'
  gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_FALSE=
fi

   if $gl_gnulib_enabled_503a4cb75d69c787103d0aa2ab7d8440; then
  gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_TRUE=
  gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_FALSE='#'
else
  gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_TRUE='#'
  gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_FALSE=
fi

   if $gl_gnulib_enabled_68a4501daeca58988392c7e60b4917ab; then
  gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_TRUE=
  gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_FALSE='#'
else
  gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_TRUE='#'
  gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_FALSE=
fi

   if $gl_gnulib_enabled_f0efff84a70f4afba30902bb8ffe9354; then
  gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_TRUE=
  gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_FALSE='#'
else
  gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_TRUE='#'
  gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_FALSE=
fi

   if $gl_gnulib_enabled_8bb827fe37eaccf1b97feb0c87bc92ef; then
  gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_TRUE=
  gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_FALSE='#'
else
  gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_TRUE='#'
  gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_FALSE=
fi

   if $gl_gnulib_enabled_48b2271240803e4879464b755748a89d; then
  gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_TRUE=
  gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_FALSE='#'
else
  gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_TRUE='#'
  gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_FALSE=
fi

  # End of code from modules









  gltests_libdeps=
  gltests_ltlibdeps=









  gl_source_base='tests'
  gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS

  gl_module_indicator_condition=$gltests_WITNESS










  LIBBISON_LIBDEPS="$gl_libdeps"

  LIBBISON_LTLIBDEPS="$gl_ltlibdeps"



# Checks for library functions.




# Gettext.
# We use gnulib, which is only guaranteed to work properly with the
# latest Gettext.

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5
$as_echo_n "checking whether NLS is requested... " >&6; }
    # Check whether --enable-nls was given.
if test "${enable_nls+set}" = set; then :
  enableval=$enable_nls; USE_NLS=$enableval
else
  USE_NLS=yes
fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
$as_echo "$USE_NLS" >&6; }




      GETTEXT_MACRO_VERSION=0.19




# Prepare PATH_SEPARATOR.
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
  # contains only /bin. Note that ksh looks also at the FPATH variable,
  # so we have to set that as well for the test.
  PATH_SEPARATOR=:
  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
           || PATH_SEPARATOR=';'
       }
fi

# Find out how to test for executable files. Don't use a zero-byte file,
# as systems may use methods other than mode bits to determine executability.
cat >conf$$.file <<_ASEOF
#! /bin/sh
exit 0
_ASEOF
chmod +x conf$$.file
if test -x conf$$.file >/dev/null 2>&1; then
  ac_executable_p="test -x"
else
  ac_executable_p="test -f"
fi
rm -f conf$$.file

# Extract the first word of "msgfmt", so it can be a program name with args.
set dummy msgfmt; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_MSGFMT+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case "$MSGFMT" in
  [\\/]* | ?:[\\/]*)
    ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
    ;;
  *)
    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
    for ac_dir in $PATH; do
      IFS="$ac_save_IFS"
      test -z "$ac_dir" && ac_dir=.
      for ac_exec_ext in '' $ac_executable_extensions; do
        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
          echo "$as_me: trying $ac_dir/$ac_word..." >&5
          if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 &&
     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
            ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
            break 2
          fi
        fi
      done
    done
    IFS="$ac_save_IFS"
  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
    ;;
esac
fi
MSGFMT="$ac_cv_path_MSGFMT"
if test "$MSGFMT" != ":"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
$as_echo "$MSGFMT" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  # Extract the first word of "gmsgfmt", so it can be a program name with args.
set dummy gmsgfmt; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_GMSGFMT+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $GMSGFMT in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
  ;;
esac
fi
GMSGFMT=$ac_cv_path_GMSGFMT
if test -n "$GMSGFMT"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
$as_echo "$GMSGFMT" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi



    case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
    *) MSGFMT_015=$MSGFMT ;;
  esac

  case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
    *) GMSGFMT_015=$GMSGFMT ;;
  esac



# Prepare PATH_SEPARATOR.
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
  # contains only /bin. Note that ksh looks also at the FPATH variable,
  # so we have to set that as well for the test.
  PATH_SEPARATOR=:
  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
           || PATH_SEPARATOR=';'
       }
fi

# Find out how to test for executable files. Don't use a zero-byte file,
# as systems may use methods other than mode bits to determine executability.
cat >conf$$.file <<_ASEOF
#! /bin/sh
exit 0
_ASEOF
chmod +x conf$$.file
if test -x conf$$.file >/dev/null 2>&1; then
  ac_executable_p="test -x"
else
  ac_executable_p="test -f"
fi
rm -f conf$$.file

# Extract the first word of "xgettext", so it can be a program name with args.
set dummy xgettext; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_XGETTEXT+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case "$XGETTEXT" in
  [\\/]* | ?:[\\/]*)
    ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
    ;;
  *)
    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
    for ac_dir in $PATH; do
      IFS="$ac_save_IFS"
      test -z "$ac_dir" && ac_dir=.
      for ac_exec_ext in '' $ac_executable_extensions; do
        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
          echo "$as_me: trying $ac_dir/$ac_word..." >&5
          if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 &&
     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
            ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
            break 2
          fi
        fi
      done
    done
    IFS="$ac_save_IFS"
  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
    ;;
esac
fi
XGETTEXT="$ac_cv_path_XGETTEXT"
if test "$XGETTEXT" != ":"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
$as_echo "$XGETTEXT" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

    rm -f messages.po

    case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
    *) XGETTEXT_015=$XGETTEXT ;;
  esac



# Prepare PATH_SEPARATOR.
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
  # contains only /bin. Note that ksh looks also at the FPATH variable,
  # so we have to set that as well for the test.
  PATH_SEPARATOR=:
  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
           || PATH_SEPARATOR=';'
       }
fi

# Find out how to test for executable files. Don't use a zero-byte file,
# as systems may use methods other than mode bits to determine executability.
cat >conf$$.file <<_ASEOF
#! /bin/sh
exit 0
_ASEOF
chmod +x conf$$.file
if test -x conf$$.file >/dev/null 2>&1; then
  ac_executable_p="test -x"
else
  ac_executable_p="test -f"
fi
rm -f conf$$.file

# Extract the first word of "msgmerge", so it can be a program name with args.
set dummy msgmerge; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_MSGMERGE+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case "$MSGMERGE" in
  [\\/]* | ?:[\\/]*)
    ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
    ;;
  *)
    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
    for ac_dir in $PATH; do
      IFS="$ac_save_IFS"
      test -z "$ac_dir" && ac_dir=.
      for ac_exec_ext in '' $ac_executable_extensions; do
        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
          echo "$as_me: trying $ac_dir/$ac_word..." >&5
          if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then
            ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
            break 2
          fi
        fi
      done
    done
    IFS="$ac_save_IFS"
  test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
    ;;
esac
fi
MSGMERGE="$ac_cv_path_MSGMERGE"
if test "$MSGMERGE" != ":"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
$as_echo "$MSGMERGE" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


        test -n "$localedir" || localedir='${datadir}/locale'


    test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=


  ac_config_commands="$ac_config_commands po-directories"












    use_additional=yes

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"

    eval additional_includedir=\"$includedir\"
    eval additional_libdir=\"$libdir\"
    eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
    eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"

  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"


# Check whether --with-libiconv-prefix was given.
if test "${with_libiconv_prefix+set}" = set; then :
  withval=$with_libiconv_prefix;
    if test "X$withval" = "Xno"; then
      use_additional=no
    else
      if test "X$withval" = "X"; then

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"

          eval additional_includedir=\"$includedir\"
          eval additional_libdir=\"$libdir\"
          eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
          eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"

  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

      else
        additional_includedir="$withval/include"
        additional_libdir="$withval/$acl_libdirstem"
        additional_libdir2="$withval/$acl_libdirstem2"
        additional_libdir3="$withval/$acl_libdirstem3"
      fi
    fi

fi

  if test "X$additional_libdir2" = "X$additional_libdir"; then
    additional_libdir2=
  fi
  if test "X$additional_libdir3" = "X$additional_libdir"; then
    additional_libdir3=
  fi
      LIBICONV=
  LTLIBICONV=
  INCICONV=
  LIBICONV_PREFIX=
      HAVE_LIBICONV=
  rpathdirs=
  ltrpathdirs=
  names_already_handled=
  names_next_round='iconv '
  while test -n "$names_next_round"; do
    names_this_round="$names_next_round"
    names_next_round=
    for name in $names_this_round; do
      already_handled=
      for n in $names_already_handled; do
        if test "$n" = "$name"; then
          already_handled=yes
          break
        fi
      done
      if test -z "$already_handled"; then
        names_already_handled="$names_already_handled $name"
                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
        eval value=\"\$HAVE_LIB$uppername\"
        if test -n "$value"; then
          if test "$value" = yes; then
            eval value=\"\$LIB$uppername\"
            test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
            eval value=\"\$LTLIB$uppername\"
            test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
          else
                                    :
          fi
        else
                              found_dir=
          found_la=
          found_so=
          found_a=
          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
          if test -n "$acl_shlibext"; then
            shrext=".$acl_shlibext"             # typically: shrext=.so
          else
            shrext=
          fi
          if test $use_additional = yes; then
            for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
              if test "X$found_dir" = "X"; then
                eval dir=\$$additional_libdir_variable
                if test -n "$dir"; then
                                                      if test -n "$acl_shlibext"; then
                    if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
                      found_dir="$dir"
                      found_so="$dir/$libname$shrext"
                    else
                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
                        ver=`(cd "$dir" && \
                              for f in "$libname$shrext".*; do echo "$f"; done \
                              | sed -e "s,^$libname$shrext\\\\.,," \
                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
                              | sed 1q ) 2>/dev/null`
                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
                          found_dir="$dir"
                          found_so="$dir/$libname$shrext.$ver"
                        fi
                      else
                        eval library_names=\"$acl_library_names_spec\"
                        for f in $library_names; do
                          if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
                            found_dir="$dir"
                            found_so="$dir/$f"
                            break
                          fi
                        done
                      fi
                    fi
                  fi
                                    if test "X$found_dir" = "X"; then
                    if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
                      found_dir="$dir"
                      found_a="$dir/$libname.$acl_libext"
                    fi
                  fi
                  if test "X$found_dir" != "X"; then
                    if test -f "$dir/$libname.la"; then
                      found_la="$dir/$libname.la"
                    fi
                  fi
                fi
              fi
            done
          fi
          if test "X$found_dir" = "X"; then
            for x in $LDFLAGS $LTLIBICONV; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

              case "$x" in
                -L*)
                  dir=`echo "X$x" | sed -e 's/^X-L//'`
                                    if test -n "$acl_shlibext"; then
                    if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
                      found_dir="$dir"
                      found_so="$dir/$libname$shrext"
                    else
                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
                        ver=`(cd "$dir" && \
                              for f in "$libname$shrext".*; do echo "$f"; done \
                              | sed -e "s,^$libname$shrext\\\\.,," \
                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
                              | sed 1q ) 2>/dev/null`
                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
                          found_dir="$dir"
                          found_so="$dir/$libname$shrext.$ver"
                        fi
                      else
                        eval library_names=\"$acl_library_names_spec\"
                        for f in $library_names; do
                          if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
                            found_dir="$dir"
                            found_so="$dir/$f"
                            break
                          fi
                        done
                      fi
                    fi
                  fi
                                    if test "X$found_dir" = "X"; then
                    if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
                      found_dir="$dir"
                      found_a="$dir/$libname.$acl_libext"
                    fi
                  fi
                  if test "X$found_dir" != "X"; then
                    if test -f "$dir/$libname.la"; then
                      found_la="$dir/$libname.la"
                    fi
                  fi
                  ;;
              esac
              if test "X$found_dir" != "X"; then
                break
              fi
            done
          fi
          if test "X$found_dir" != "X"; then
                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
            if test "X$found_so" != "X"; then
                                                        if test "$enable_rpath" = no \
                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
                 || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
                 || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
              else
                                                                                haveit=
                for x in $ltrpathdirs; do
                  if test "X$x" = "X$found_dir"; then
                    haveit=yes
                    break
                  fi
                done
                if test -z "$haveit"; then
                  ltrpathdirs="$ltrpathdirs $found_dir"
                fi
                                if test "$acl_hardcode_direct" = yes; then
                                                      LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
                else
                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
                                                            haveit=
                    for x in $rpathdirs; do
                      if test "X$x" = "X$found_dir"; then
                        haveit=yes
                        break
                      fi
                    done
                    if test -z "$haveit"; then
                      rpathdirs="$rpathdirs $found_dir"
                    fi
                  else
                                                                                haveit=
                    for x in $LDFLAGS $LIBICONV; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                      if test "X$x" = "X-L$found_dir"; then
                        haveit=yes
                        break
                      fi
                    done
                    if test -z "$haveit"; then
                      LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
                    fi
                    if test "$acl_hardcode_minus_L" != no; then
                                                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
                    else
                                                                                                                                                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
                    fi
                  fi
                fi
              fi
            else
              if test "X$found_a" != "X"; then
                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
              else
                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
              fi
            fi
                        additional_includedir=
            case "$found_dir" in
              */$acl_libdirstem | */$acl_libdirstem/)
                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
                if test "$name" = 'iconv'; then
                  LIBICONV_PREFIX="$basedir"
                fi
                additional_includedir="$basedir/include"
                ;;
              */$acl_libdirstem2 | */$acl_libdirstem2/)
                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
                if test "$name" = 'iconv'; then
                  LIBICONV_PREFIX="$basedir"
                fi
                additional_includedir="$basedir/include"
                ;;
              */$acl_libdirstem3 | */$acl_libdirstem3/)
                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
                if test "$name" = 'iconv'; then
                  LIBICONV_PREFIX="$basedir"
                fi
                additional_includedir="$basedir/include"
                ;;
            esac
            if test "X$additional_includedir" != "X"; then
                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
                haveit=
                if test "X$additional_includedir" = "X/usr/local/include"; then
                  if test -n "$GCC"; then
                    case $host_os in
                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
                    esac
                  fi
                fi
                if test -z "$haveit"; then
                  for x in $CPPFLAGS $INCICONV; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                    if test "X$x" = "X-I$additional_includedir"; then
                      haveit=yes
                      break
                    fi
                  done
                  if test -z "$haveit"; then
                    if test -d "$additional_includedir"; then
                                            INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
                    fi
                  fi
                fi
              fi
            fi
                        if test -n "$found_la"; then
                                                        save_libdir="$libdir"
              case "$found_la" in
                */* | *\\*) . "$found_la" ;;
                *) . "./$found_la" ;;
              esac
              libdir="$save_libdir"
                            for dep in $dependency_libs; do
                case "$dep" in
                  -L*)
                    dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
                                                                                                                                                                if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \
                       && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
                       && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
                      haveit=
                      if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
                         || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
                         || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
                        if test -n "$GCC"; then
                          case $host_os in
                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
                          esac
                        fi
                      fi
                      if test -z "$haveit"; then
                        haveit=
                        for x in $LDFLAGS $LIBICONV; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                          if test "X$x" = "X-L$dependency_libdir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          if test -d "$dependency_libdir"; then
                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }-L$dependency_libdir"
                          fi
                        fi
                        haveit=
                        for x in $LDFLAGS $LTLIBICONV; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                          if test "X$x" = "X-L$dependency_libdir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          if test -d "$dependency_libdir"; then
                                                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$dependency_libdir"
                          fi
                        fi
                      fi
                    fi
                    ;;
                  -R*)
                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
                    if test "$enable_rpath" != no; then
                                                                  haveit=
                      for x in $rpathdirs; do
                        if test "X$x" = "X$dir"; then
                          haveit=yes
                          break
                        fi
                      done
                      if test -z "$haveit"; then
                        rpathdirs="$rpathdirs $dir"
                      fi
                                                                  haveit=
                      for x in $ltrpathdirs; do
                        if test "X$x" = "X$dir"; then
                          haveit=yes
                          break
                        fi
                      done
                      if test -z "$haveit"; then
                        ltrpathdirs="$ltrpathdirs $dir"
                      fi
                    fi
                    ;;
                  -l*)
                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
                    ;;
                  *.la)
                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
                    ;;
                  *)
                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
                    LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
                    ;;
                esac
              done
            fi
          else
                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
            LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
          fi
        fi
      fi
    done
  done
  if test "X$rpathdirs" != "X"; then
    if test -n "$acl_hardcode_libdir_separator"; then
                        alldirs=
      for found_dir in $rpathdirs; do
        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
      done
            acl_save_libdir="$libdir"
      libdir="$alldirs"
      eval flag=\"$acl_hardcode_libdir_flag_spec\"
      libdir="$acl_save_libdir"
      LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
    else
            for found_dir in $rpathdirs; do
        acl_save_libdir="$libdir"
        libdir="$found_dir"
        eval flag=\"$acl_hardcode_libdir_flag_spec\"
        libdir="$acl_save_libdir"
        LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
      done
    fi
  fi
  if test "X$ltrpathdirs" != "X"; then
            for found_dir in $ltrpathdirs; do
      LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
    done
  fi






























    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5
$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; }
if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gt_save_LIBS="$LIBS"
     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <CoreFoundation/CFPreferences.h>
int
main ()
{
CFPreferencesCopyAppValue(NULL, NULL)
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gt_cv_func_CFPreferencesCopyAppValue=yes
else
  gt_cv_func_CFPreferencesCopyAppValue=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
     LIBS="$gt_save_LIBS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5
$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; }
  if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then

$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h

  fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5
$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; }
if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gt_save_LIBS="$LIBS"
     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <CoreFoundation/CFLocale.h>
int
main ()
{
CFLocaleCopyCurrent();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gt_cv_func_CFLocaleCopyCurrent=yes
else
  gt_cv_func_CFLocaleCopyCurrent=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
     LIBS="$gt_save_LIBS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5
$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; }
  if test $gt_cv_func_CFLocaleCopyCurrent = yes; then

$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h

  fi
  INTL_MACOSX_LIBS=
  if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
    INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
  fi






  LIBINTL=
  LTLIBINTL=
  POSUB=

    case " $gt_needs " in
    *" need-formatstring-macros "*) gt_api_version=3 ;;
    *" need-ngettext "*) gt_api_version=2 ;;
    *) gt_api_version=1 ;;
  esac
  gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
  gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"

    if test "$USE_NLS" = "yes"; then
    gt_use_preinstalled_gnugettext=no


        if test $gt_api_version -ge 3; then
          gt_revision_test_code='
#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
#endif
typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
'
        else
          gt_revision_test_code=
        fi
        if test $gt_api_version -ge 2; then
          gt_expression_test_code=' + * ngettext ("", "", 0)'
        else
          gt_expression_test_code=
        fi

        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5
$as_echo_n "checking for GNU gettext in libc... " >&6; }
if eval \${$gt_func_gnugettext_libc+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <libintl.h>
$gt_revision_test_code
extern int _nl_msg_cat_cntr;
extern int *_nl_domain_bindings;

int
main ()
{

bindtextdomain ("", "");
return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  eval "$gt_func_gnugettext_libc=yes"
else
  eval "$gt_func_gnugettext_libc=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
eval ac_res=\$$gt_func_gnugettext_libc
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }

        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then





          am_save_CPPFLAGS="$CPPFLAGS"

  for element in $INCICONV; do
    haveit=
    for x in $CPPFLAGS; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

      if test "X$x" = "X$element"; then
        haveit=yes
        break
      fi
    done
    if test -z "$haveit"; then
      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
    fi
  done


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
$as_echo_n "checking for iconv... " >&6; }
if ${am_cv_func_iconv+:} false; then :
  $as_echo_n "(cached) " >&6
else

    am_cv_func_iconv="no, consider installing GNU libiconv"
    am_cv_lib_iconv=no
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdlib.h>
#include <iconv.h>

int
main ()
{
iconv_t cd = iconv_open("","");
           iconv(cd,NULL,NULL,NULL,NULL);
           iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    if test "$am_cv_func_iconv" != yes; then
      am_save_LIBS="$LIBS"
      LIBS="$LIBS $LIBICONV"
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdlib.h>
#include <iconv.h>

int
main ()
{
iconv_t cd = iconv_open("","");
             iconv(cd,NULL,NULL,NULL,NULL);
             iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  am_cv_lib_iconv=yes
        am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      LIBS="$am_save_LIBS"
    fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
$as_echo "$am_cv_func_iconv" >&6; }
  if test "$am_cv_func_iconv" = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
$as_echo_n "checking for working iconv... " >&6; }
if ${am_cv_func_iconv_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

                  am_save_LIBS="$LIBS"
      if test $am_cv_lib_iconv = yes; then
        LIBS="$LIBS $LIBICONV"
      fi
      if test "$cross_compiling" = yes; then :

         case "$host_os" in
           aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
           *)            am_cv_func_iconv_works="guessing yes" ;;
         esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <iconv.h>
#include <string.h>
int main ()
{
  int result = 0;
  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
     returns.  */
  {
    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
    if (cd_utf8_to_88591 != (iconv_t)(-1))
      {
        static const char input[] = "\342\202\254"; /* EURO SIGN */
        char buf[10];
        const char *inptr = input;
        size_t inbytesleft = strlen (input);
        char *outptr = buf;
        size_t outbytesleft = sizeof (buf);
        size_t res = iconv (cd_utf8_to_88591,
                            (char **) &inptr, &inbytesleft,
                            &outptr, &outbytesleft);
        if (res == 0)
          result |= 1;
        iconv_close (cd_utf8_to_88591);
      }
  }
  /* Test against Solaris 10 bug: Failures are not distinguishable from
     successful returns.  */
  {
    iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
    if (cd_ascii_to_88591 != (iconv_t)(-1))
      {
        static const char input[] = "\263";
        char buf[10];
        const char *inptr = input;
        size_t inbytesleft = strlen (input);
        char *outptr = buf;
        size_t outbytesleft = sizeof (buf);
        size_t res = iconv (cd_ascii_to_88591,
                            (char **) &inptr, &inbytesleft,
                            &outptr, &outbytesleft);
        if (res == 0)
          result |= 2;
        iconv_close (cd_ascii_to_88591);
      }
  }
  /* Test against AIX 6.1..7.1 bug: Buffer overrun.  */
  {
    iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
    if (cd_88591_to_utf8 != (iconv_t)(-1))
      {
        static const char input[] = "\304";
        static char buf[2] = { (char)0xDE, (char)0xAD };
        const char *inptr = input;
        size_t inbytesleft = 1;
        char *outptr = buf;
        size_t outbytesleft = 1;
        size_t res = iconv (cd_88591_to_utf8,
                            (char **) &inptr, &inbytesleft,
                            &outptr, &outbytesleft);
        if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
          result |= 4;
        iconv_close (cd_88591_to_utf8);
      }
  }
#if 0 /* This bug could be worked around by the caller.  */
  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
  {
    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
    if (cd_88591_to_utf8 != (iconv_t)(-1))
      {
        static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
        char buf[50];
        const char *inptr = input;
        size_t inbytesleft = strlen (input);
        char *outptr = buf;
        size_t outbytesleft = sizeof (buf);
        size_t res = iconv (cd_88591_to_utf8,
                            (char **) &inptr, &inbytesleft,
                            &outptr, &outbytesleft);
        if ((int)res > 0)
          result |= 8;
        iconv_close (cd_88591_to_utf8);
      }
  }
#endif
  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
     provided.  */
  if (/* Try standardized names.  */
      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
      /* Try IRIX, OSF/1 names.  */
      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
      /* Try AIX names.  */
      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
      /* Try HP-UX names.  */
      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
    result |= 16;
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  am_cv_func_iconv_works=yes
else
  am_cv_func_iconv_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      LIBS="$am_save_LIBS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
$as_echo "$am_cv_func_iconv_works" >&6; }
    case "$am_cv_func_iconv_works" in
      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
      *)   am_func_iconv=yes ;;
    esac
  else
    am_func_iconv=no am_cv_lib_iconv=no
  fi
  if test "$am_func_iconv" = yes; then

$as_echo "#define HAVE_ICONV 1" >>confdefs.h

  fi
  if test "$am_cv_lib_iconv" = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
$as_echo_n "checking how to link with libiconv... " >&6; }
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
$as_echo "$LIBICONV" >&6; }
  else
            CPPFLAGS="$am_save_CPPFLAGS"
    LIBICONV=
    LTLIBICONV=
  fi










    use_additional=yes

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"

    eval additional_includedir=\"$includedir\"
    eval additional_libdir=\"$libdir\"
    eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
    eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"

  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"


# Check whether --with-libintl-prefix was given.
if test "${with_libintl_prefix+set}" = set; then :
  withval=$with_libintl_prefix;
    if test "X$withval" = "Xno"; then
      use_additional=no
    else
      if test "X$withval" = "X"; then

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"

          eval additional_includedir=\"$includedir\"
          eval additional_libdir=\"$libdir\"
          eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
          eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"

  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

      else
        additional_includedir="$withval/include"
        additional_libdir="$withval/$acl_libdirstem"
        additional_libdir2="$withval/$acl_libdirstem2"
        additional_libdir3="$withval/$acl_libdirstem3"
      fi
    fi

fi

  if test "X$additional_libdir2" = "X$additional_libdir"; then
    additional_libdir2=
  fi
  if test "X$additional_libdir3" = "X$additional_libdir"; then
    additional_libdir3=
  fi
      LIBINTL=
  LTLIBINTL=
  INCINTL=
  LIBINTL_PREFIX=
      HAVE_LIBINTL=
  rpathdirs=
  ltrpathdirs=
  names_already_handled=
  names_next_round='intl '
  while test -n "$names_next_round"; do
    names_this_round="$names_next_round"
    names_next_round=
    for name in $names_this_round; do
      already_handled=
      for n in $names_already_handled; do
        if test "$n" = "$name"; then
          already_handled=yes
          break
        fi
      done
      if test -z "$already_handled"; then
        names_already_handled="$names_already_handled $name"
                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
        eval value=\"\$HAVE_LIB$uppername\"
        if test -n "$value"; then
          if test "$value" = yes; then
            eval value=\"\$LIB$uppername\"
            test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value"
            eval value=\"\$LTLIB$uppername\"
            test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value"
          else
                                    :
          fi
        else
                              found_dir=
          found_la=
          found_so=
          found_a=
          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
          if test -n "$acl_shlibext"; then
            shrext=".$acl_shlibext"             # typically: shrext=.so
          else
            shrext=
          fi
          if test $use_additional = yes; then
            for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
              if test "X$found_dir" = "X"; then
                eval dir=\$$additional_libdir_variable
                if test -n "$dir"; then
                                                      if test -n "$acl_shlibext"; then
                    if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
                      found_dir="$dir"
                      found_so="$dir/$libname$shrext"
                    else
                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
                        ver=`(cd "$dir" && \
                              for f in "$libname$shrext".*; do echo "$f"; done \
                              | sed -e "s,^$libname$shrext\\\\.,," \
                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
                              | sed 1q ) 2>/dev/null`
                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
                          found_dir="$dir"
                          found_so="$dir/$libname$shrext.$ver"
                        fi
                      else
                        eval library_names=\"$acl_library_names_spec\"
                        for f in $library_names; do
                          if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
                            found_dir="$dir"
                            found_so="$dir/$f"
                            break
                          fi
                        done
                      fi
                    fi
                  fi
                                    if test "X$found_dir" = "X"; then
                    if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
                      found_dir="$dir"
                      found_a="$dir/$libname.$acl_libext"
                    fi
                  fi
                  if test "X$found_dir" != "X"; then
                    if test -f "$dir/$libname.la"; then
                      found_la="$dir/$libname.la"
                    fi
                  fi
                fi
              fi
            done
          fi
          if test "X$found_dir" = "X"; then
            for x in $LDFLAGS $LTLIBINTL; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

              case "$x" in
                -L*)
                  dir=`echo "X$x" | sed -e 's/^X-L//'`
                                    if test -n "$acl_shlibext"; then
                    if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
                      found_dir="$dir"
                      found_so="$dir/$libname$shrext"
                    else
                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
                        ver=`(cd "$dir" && \
                              for f in "$libname$shrext".*; do echo "$f"; done \
                              | sed -e "s,^$libname$shrext\\\\.,," \
                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
                              | sed 1q ) 2>/dev/null`
                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
                          found_dir="$dir"
                          found_so="$dir/$libname$shrext.$ver"
                        fi
                      else
                        eval library_names=\"$acl_library_names_spec\"
                        for f in $library_names; do
                          if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
                            found_dir="$dir"
                            found_so="$dir/$f"
                            break
                          fi
                        done
                      fi
                    fi
                  fi
                                    if test "X$found_dir" = "X"; then
                    if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
                      found_dir="$dir"
                      found_a="$dir/$libname.$acl_libext"
                    fi
                  fi
                  if test "X$found_dir" != "X"; then
                    if test -f "$dir/$libname.la"; then
                      found_la="$dir/$libname.la"
                    fi
                  fi
                  ;;
              esac
              if test "X$found_dir" != "X"; then
                break
              fi
            done
          fi
          if test "X$found_dir" != "X"; then
                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name"
            if test "X$found_so" != "X"; then
                                                        if test "$enable_rpath" = no \
                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
                 || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
                 || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
              else
                                                                                haveit=
                for x in $ltrpathdirs; do
                  if test "X$x" = "X$found_dir"; then
                    haveit=yes
                    break
                  fi
                done
                if test -z "$haveit"; then
                  ltrpathdirs="$ltrpathdirs $found_dir"
                fi
                                if test "$acl_hardcode_direct" = yes; then
                                                      LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
                else
                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
                                                            haveit=
                    for x in $rpathdirs; do
                      if test "X$x" = "X$found_dir"; then
                        haveit=yes
                        break
                      fi
                    done
                    if test -z "$haveit"; then
                      rpathdirs="$rpathdirs $found_dir"
                    fi
                  else
                                                                                haveit=
                    for x in $LDFLAGS $LIBINTL; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                      if test "X$x" = "X-L$found_dir"; then
                        haveit=yes
                        break
                      fi
                    done
                    if test -z "$haveit"; then
                      LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir"
                    fi
                    if test "$acl_hardcode_minus_L" != no; then
                                                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
                    else
                                                                                                                                                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
                    fi
                  fi
                fi
              fi
            else
              if test "X$found_a" != "X"; then
                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a"
              else
                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name"
              fi
            fi
                        additional_includedir=
            case "$found_dir" in
              */$acl_libdirstem | */$acl_libdirstem/)
                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
                if test "$name" = 'intl'; then
                  LIBINTL_PREFIX="$basedir"
                fi
                additional_includedir="$basedir/include"
                ;;
              */$acl_libdirstem2 | */$acl_libdirstem2/)
                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
                if test "$name" = 'intl'; then
                  LIBINTL_PREFIX="$basedir"
                fi
                additional_includedir="$basedir/include"
                ;;
              */$acl_libdirstem3 | */$acl_libdirstem3/)
                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
                if test "$name" = 'intl'; then
                  LIBINTL_PREFIX="$basedir"
                fi
                additional_includedir="$basedir/include"
                ;;
            esac
            if test "X$additional_includedir" != "X"; then
                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
                haveit=
                if test "X$additional_includedir" = "X/usr/local/include"; then
                  if test -n "$GCC"; then
                    case $host_os in
                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
                    esac
                  fi
                fi
                if test -z "$haveit"; then
                  for x in $CPPFLAGS $INCINTL; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                    if test "X$x" = "X-I$additional_includedir"; then
                      haveit=yes
                      break
                    fi
                  done
                  if test -z "$haveit"; then
                    if test -d "$additional_includedir"; then
                                            INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir"
                    fi
                  fi
                fi
              fi
            fi
                        if test -n "$found_la"; then
                                                        save_libdir="$libdir"
              case "$found_la" in
                */* | *\\*) . "$found_la" ;;
                *) . "./$found_la" ;;
              esac
              libdir="$save_libdir"
                            for dep in $dependency_libs; do
                case "$dep" in
                  -L*)
                    dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
                                                                                                                                                                if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \
                       && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
                       && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
                      haveit=
                      if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
                         || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
                         || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
                        if test -n "$GCC"; then
                          case $host_os in
                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
                          esac
                        fi
                      fi
                      if test -z "$haveit"; then
                        haveit=
                        for x in $LDFLAGS $LIBINTL; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                          if test "X$x" = "X-L$dependency_libdir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          if test -d "$dependency_libdir"; then
                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }-L$dependency_libdir"
                          fi
                        fi
                        haveit=
                        for x in $LDFLAGS $LTLIBINTL; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                          if test "X$x" = "X-L$dependency_libdir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          if test -d "$dependency_libdir"; then
                                                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$dependency_libdir"
                          fi
                        fi
                      fi
                    fi
                    ;;
                  -R*)
                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
                    if test "$enable_rpath" != no; then
                                                                  haveit=
                      for x in $rpathdirs; do
                        if test "X$x" = "X$dir"; then
                          haveit=yes
                          break
                        fi
                      done
                      if test -z "$haveit"; then
                        rpathdirs="$rpathdirs $dir"
                      fi
                                                                  haveit=
                      for x in $ltrpathdirs; do
                        if test "X$x" = "X$dir"; then
                          haveit=yes
                          break
                        fi
                      done
                      if test -z "$haveit"; then
                        ltrpathdirs="$ltrpathdirs $dir"
                      fi
                    fi
                    ;;
                  -l*)
                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
                    ;;
                  *.la)
                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
                    ;;
                  *)
                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$dep"
                    LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep"
                    ;;
                esac
              done
            fi
          else
                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
            LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name"
          fi
        fi
      fi
    done
  done
  if test "X$rpathdirs" != "X"; then
    if test -n "$acl_hardcode_libdir_separator"; then
                        alldirs=
      for found_dir in $rpathdirs; do
        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
      done
            acl_save_libdir="$libdir"
      libdir="$alldirs"
      eval flag=\"$acl_hardcode_libdir_flag_spec\"
      libdir="$acl_save_libdir"
      LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
    else
            for found_dir in $rpathdirs; do
        acl_save_libdir="$libdir"
        libdir="$found_dir"
        eval flag=\"$acl_hardcode_libdir_flag_spec\"
        libdir="$acl_save_libdir"
        LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
      done
    fi
  fi
  if test "X$ltrpathdirs" != "X"; then
            for found_dir in $ltrpathdirs; do
      LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir"
    done
  fi





          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5
$as_echo_n "checking for GNU gettext in libintl... " >&6; }
if eval \${$gt_func_gnugettext_libintl+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gt_save_CPPFLAGS="$CPPFLAGS"
            CPPFLAGS="$CPPFLAGS $INCINTL"
            gt_save_LIBS="$LIBS"
            LIBS="$LIBS $LIBINTL"
                        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <libintl.h>
$gt_revision_test_code
extern int _nl_msg_cat_cntr;
extern
#ifdef __cplusplus
"C"
#endif
const char *_nl_expand_alias (const char *);

int
main ()
{

bindtextdomain ("", "");
return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  eval "$gt_func_gnugettext_libintl=yes"
else
  eval "$gt_func_gnugettext_libintl=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
                        if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
              LIBS="$LIBS $LIBICONV"
              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <libintl.h>
$gt_revision_test_code
extern int _nl_msg_cat_cntr;
extern
#ifdef __cplusplus
"C"
#endif
const char *_nl_expand_alias (const char *);

int
main ()
{

bindtextdomain ("", "");
return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  LIBINTL="$LIBINTL $LIBICONV"
                 LTLIBINTL="$LTLIBINTL $LTLIBICONV"
                 eval "$gt_func_gnugettext_libintl=yes"

fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
            fi
            CPPFLAGS="$gt_save_CPPFLAGS"
            LIBS="$gt_save_LIBS"
fi
eval ac_res=\$$gt_func_gnugettext_libintl
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
        fi

                                        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
           || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
                && test "$PACKAGE" != gettext-runtime \
                && test "$PACKAGE" != gettext-tools; }; then
          gt_use_preinstalled_gnugettext=yes
        else
                    LIBINTL=
          LTLIBINTL=
          INCINTL=
        fi



    if test -n "$INTL_MACOSX_LIBS"; then
      if test "$gt_use_preinstalled_gnugettext" = "yes" \
         || test "$nls_cv_use_gnu_gettext" = "yes"; then
                LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
        LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
      fi
    fi

    if test "$gt_use_preinstalled_gnugettext" = "yes" \
       || test "$nls_cv_use_gnu_gettext" = "yes"; then

$as_echo "#define ENABLE_NLS 1" >>confdefs.h

    else
      USE_NLS=no
    fi
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5
$as_echo_n "checking whether to use NLS... " >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
$as_echo "$USE_NLS" >&6; }
  if test "$USE_NLS" = "yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5
$as_echo_n "checking where the gettext function comes from... " >&6; }
    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
        gt_source="external libintl"
      else
        gt_source="libc"
      fi
    else
      gt_source="included intl directory"
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5
$as_echo "$gt_source" >&6; }
  fi

  if test "$USE_NLS" = "yes"; then

    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5
$as_echo_n "checking how to link with libintl... " >&6; }
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5
$as_echo "$LIBINTL" >&6; }

  for element in $INCINTL; do
    haveit=
    for x in $CPPFLAGS; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

      if test "X$x" = "X$element"; then
        haveit=yes
        break
      fi
    done
    if test -z "$haveit"; then
      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
    fi
  done

      fi


$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h


$as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h

    fi

        POSUB=po
  fi



    INTLLIBS="$LIBINTL"








  if test -z "$USE_NLS"; then
    echo "The BISON-I18N macro is used without being preceded by AM-GNU-GETTEXT." 1>&2
    exit 1
  fi
  BISON_LOCALEDIR=
  BISON_USE_NLS=no
  if test "$USE_NLS" = yes; then
                        if (${YACC-${BISON-:}} --print-localedir) >/dev/null 2>&1; then
      BISON_LOCALEDIR=`${YACC-${BISON-:}} --print-localedir`
    fi

    if test -n "$BISON_LOCALEDIR"; then
                              USER_LINGUAS="${LINGUAS-%UNSET%}"
      if test -n "$USER_LINGUAS"; then
        BISON_USE_NLS=yes
      fi
    fi
  fi
  if test $BISON_USE_NLS = yes; then

$as_echo "#define YYENABLE_NLS 1" >>confdefs.h

  fi

ac_config_files="$ac_config_files gnulib-po/Makefile.in"


# Internationalized parsers.
ac_config_files="$ac_config_files runtime-po/Makefile.in"

# Autoconf macros for packages using internationalized parsers.
aclocaldir='${datadir}/aclocal'


# Create the benchmark script.
ac_config_files="$ac_config_files etc/bench.pl"


# Initialize the test suite.
ac_config_commands="$ac_config_commands tests/atconfig"

ac_config_files="$ac_config_files tests/atlocal"

ac_config_files="$ac_config_files tests/bison"


for ac_prog in valgrind
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_VALGRIND+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$VALGRIND"; then
  ac_cv_prog_VALGRIND="$VALGRIND" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_VALGRIND="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
VALGRIND=$ac_cv_prog_VALGRIND
if test -n "$VALGRIND"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VALGRIND" >&5
$as_echo "$VALGRIND" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$VALGRIND" && break
done

# Use something simpler that $host_os to select our suppression file.
uname=`uname`
case $VALGRIND:$uname in
  '':*) ;;
  *:Darwin)
    # See README-hacking.md.
    VALGRIND=;;
  *:*)
    suppfile=build-aux/$uname.valgrind
    if test -f "$srcdir/$suppfile"; then
      VALGRIND_OPTS_SUPPRESSION="--suppressions=\$(abs_top_srcdir)/$suppfile"

    fi
    ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Valgrind suppression file" >&5
$as_echo_n "checking Valgrind suppression file... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $suppfile" >&5
$as_echo "$suppfile" >&6; }

# Whether we cannot run the compiled bison.
 if test "$cross_compiling" = yes; then
  CROSS_COMPILING_TRUE=
  CROSS_COMPILING_FALSE='#'
else
  CROSS_COMPILING_TRUE='#'
  CROSS_COMPILING_FALSE=
fi



AUTOM4TE=${AUTOM4TE-"${am_missing_run}autom4te"}

# Needed by tests/atlocal.in.


ac_config_files="$ac_config_files Makefile po/Makefile.in doc/yacc.1"


# Fix LIBOBJS to give the Makefile the right file names.  Otherwise
# compilation works, but with unexpected file names, so clean rules don't
# remove the actual files and distcheck fails.


cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs, see configure's option --config-cache.
# It is not useful on other systems.  If it contains results you don't
# want to keep, you may remove or edit it.
#
# config.status only pays attention to the cache file if you give it
# the --recheck option to rerun configure.
#
# `ac_cv_env_foo' variables (set or unset) will be overridden when
# loading this file, other *unset* `ac_cv_foo' will be assigned the
# following values.

_ACEOF

# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, we kill variables containing newlines.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(
  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
    eval ac_val=\$$ac_var
    case $ac_val in #(
    *${as_nl}*)
      case $ac_var in #(
      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
      esac
      case $ac_var in #(
      _ | IFS | as_nl) ;; #(
      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
      *) { eval $ac_var=; unset $ac_var;} ;;
      esac ;;
    esac
  done

  (set) 2>&1 |
    case $as_nl`(ac_space=' '; set) 2>&1` in #(
    *${as_nl}ac_space=\ *)
      # `set' does not quote correctly, so add quotes: double-quote
      # substitution turns \\\\ into \\, and sed turns \\ into \.
      sed -n \
	"s/'/'\\\\''/g;
	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
      ;; #(
    *)
      # `set' quotes correctly as required by POSIX, so do not add quotes.
      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
      ;;
    esac |
    sort
) |
  sed '
     /^ac_cv_env_/b end
     t clear
     :clear
     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
     t end
     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
     :end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
  if test -w "$cache_file"; then
    if test "x$cache_file" != "x/dev/null"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
$as_echo "$as_me: updating cache $cache_file" >&6;}
      if test ! -f "$cache_file" || test -h "$cache_file"; then
	cat confcache >"$cache_file"
      else
        case $cache_file in #(
        */* | ?:*)
	  mv -f confcache "$cache_file"$$ &&
	  mv -f "$cache_file"$$ "$cache_file" ;; #(
        *)
	  mv -f confcache "$cache_file" ;;
	esac
      fi
    fi
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
  fi
fi
rm -f confcache

test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

DEFS=-DHAVE_CONFIG_H

ac_libobjs=
ac_ltlibobjs=
U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
  # 1. Remove the extension, and $U if already installed.
  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
  #    will be set to the directory where LIBOBJS objects are built.
  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
done
LIBOBJS=$ac_libobjs

LTLIBOBJS=$ac_ltlibobjs


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
$as_echo_n "checking that generated files are newer than configure... " >&6; }
   if test -n "$am_sleep_pid"; then
     # Hide warnings about reused PIDs.
     wait $am_sleep_pid 2>/dev/null
   fi
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
$as_echo "done" >&6; }
 if test -n "$EXEEXT"; then
  am__EXEEXT_TRUE=
  am__EXEEXT_FALSE='#'
else
  am__EXEEXT_TRUE='#'
  am__EXEEXT_FALSE=
fi

if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
  as_fn_error $? "conditional \"AMDEP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_CXX11_TRUE}" && test -z "${ENABLE_CXX11_FALSE}"; then
  as_fn_error $? "conditional \"ENABLE_CXX11\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_CXX14_TRUE}" && test -z "${ENABLE_CXX14_FALSE}"; then
  as_fn_error $? "conditional \"ENABLE_CXX14\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_GCC_WARNINGS_TRUE}" && test -z "${ENABLE_GCC_WARNINGS_FALSE}"; then
  as_fn_error $? "conditional \"ENABLE_GCC_WARNINGS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_CXX_TRUE}" && test -z "${ENABLE_CXX_FALSE}"; then
  as_fn_error $? "conditional \"ENABLE_CXX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_D_TRUE}" && test -z "${ENABLE_D_FALSE}"; then
  as_fn_error $? "conditional \"ENABLE_D\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_JAVA_TRUE}" && test -z "${ENABLE_JAVA_FALSE}"; then
  as_fn_error $? "conditional \"ENABLE_JAVA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_YACC_TRUE}" && test -z "${ENABLE_YACC_FALSE}"; then
  as_fn_error $? "conditional \"ENABLE_YACC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${FLEX_WORKS_TRUE}" && test -z "${FLEX_WORKS_FALSE}"; then
  as_fn_error $? "conditional \"FLEX_WORKS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${FLEX_CXX_WORKS_TRUE}" && test -z "${FLEX_CXX_WORKS_FALSE}"; then
  as_fn_error $? "conditional \"FLEX_CXX_WORKS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GL_COND_LIBTOOL_TRUE}" && test -z "${GL_COND_LIBTOOL_FALSE}"; then
  as_fn_error $? "conditional \"GL_COND_LIBTOOL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GL_GENERATE_ALLOCA_H_TRUE}" && test -z "${GL_GENERATE_ALLOCA_H_FALSE}"; then
  as_fn_error $? "conditional \"GL_GENERATE_ALLOCA_H\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
test "X$DEFS" = X-DHAVE_CONFIG_H && DEFS=
if test -z "${GL_GENERATE_ERRNO_H_TRUE}" && test -z "${GL_GENERATE_ERRNO_H_FALSE}"; then
  as_fn_error $? "conditional \"GL_GENERATE_ERRNO_H\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GL_GENERATE_FLOAT_H_TRUE}" && test -z "${GL_GENERATE_FLOAT_H_FALSE}"; then
  as_fn_error $? "conditional \"GL_GENERATE_FLOAT_H\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi


if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then
  as_fn_error $? "conditional \"GL_GENERATE_LIMITS_H\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then
  as_fn_error $? "conditional \"GL_GENERATE_LIMITS_H\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GL_GENERATE_STDINT_H_TRUE}" && test -z "${GL_GENERATE_STDINT_H_FALSE}"; then
  as_fn_error $? "conditional \"GL_GENERATE_STDINT_H\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GL_GENERATE_TEXTSTYLE_H_TRUE}" && test -z "${GL_GENERATE_TEXTSTYLE_H_FALSE}"; then
  as_fn_error $? "conditional \"GL_GENERATE_TEXTSTYLE_H\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
CONFIG_INCLUDE=lib/config.h




  # Tell AC_LIBSOURCES where to find source files like alloca.c.


  # This hack originated in bison.  It is required when using non-recursive
  # automake rules to build from gnulib-provided lib/ sources.  Hence, LIB_DIR
  # is usually simply "lib".  Those rules use the list of names like "fchdir.o"
  # and "strstr.o" in gl_LIBOBJS.  With non-recursive make, we must prefix each
  # such file name with the "lib/" prefix.  See also build-aux/prefix-gnulib-mk.
  gl_LIBOBJS=`echo "$gl_LIBOBJS" | sed -e 's, , lib/,g'`

  # Listing the names of the variables to prefix is error-prone.
  # Rather, adjust each AC_SUBST'd variable whose name ends in '_H'
  # and whose value ends in '.h'.
  for ac_var in $ac_subst_vars
  do
    eval "ac_val=\$$ac_var"
    case $ac_var:$ac_val in
      *_H:*.h) eval "$ac_var=lib/\$$ac_var";;
    esac
  done


if test -z "${RELOCATABLE_VIA_LD_TRUE}" && test -z "${RELOCATABLE_VIA_LD_FALSE}"; then
  as_fn_error $? "conditional \"RELOCATABLE_VIA_LD\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${RELOCATABLE_VIA_WRAPPER_TRUE}" && test -z "${RELOCATABLE_VIA_WRAPPER_FALSE}"; then
  as_fn_error $? "conditional \"RELOCATABLE_VIA_WRAPPER\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GL_GENERATE_STDBOOL_H_TRUE}" && test -z "${GL_GENERATE_STDBOOL_H_FALSE}"; then
  as_fn_error $? "conditional \"GL_GENERATE_STDBOOL_H\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GL_GENERATE_STDDEF_H_TRUE}" && test -z "${GL_GENERATE_STDDEF_H_FALSE}"; then
  as_fn_error $? "conditional \"GL_GENERATE_STDDEF_H\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE}"; then
  as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_chdir_TRUE}" && test -z "${gl_GNULIB_ENABLED_chdir_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_chdir\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_TRUE}" && test -z "${gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_43fe87a341d9b4b93c47c3ad819a5239\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_fseterr_TRUE}" && test -z "${gl_GNULIB_ENABLED_fseterr_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_fseterr\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_fstat_TRUE}" && test -z "${gl_GNULIB_ENABLED_fstat_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_fstat\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_getdtablesize_TRUE}" && test -z "${gl_GNULIB_ENABLED_getdtablesize_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_getdtablesize\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_TRUE}" && test -z "${gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_30838f5439487421042f2225bed3af76\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_TRUE}" && test -z "${gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_3f0e593033d1fc2c127581960f641b66\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_ldexp_TRUE}" && test -z "${gl_GNULIB_ENABLED_ldexp_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_ldexp\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_TRUE}" && test -z "${gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_21ee726a3540c09237a8e70c0baf7467\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_TRUE}" && test -z "${gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_2049e887c7e5308faad27b3f894bb8c9\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_lstat_TRUE}" && test -z "${gl_GNULIB_ENABLED_lstat_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_lstat\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_malloca_TRUE}" && test -z "${gl_GNULIB_ENABLED_malloca_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_malloca\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_TRUE}" && test -z "${gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_332607f759618fb73dfc3076748afea7\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_rawmemchr_TRUE}" && test -z "${gl_GNULIB_ENABLED_rawmemchr_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_rawmemchr\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_rmdir_TRUE}" && test -z "${gl_GNULIB_ENABLED_rmdir_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_rmdir\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_TRUE}" && test -z "${gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_9bc5f216d57e231e4834049d67d0db62\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_TRUE}" && test -z "${gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_cdeb0f2aaf9d280baa6526bfa1b07f70\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_stat_TRUE}" && test -z "${gl_GNULIB_ENABLED_stat_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_stat\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_TRUE}" && test -z "${gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_0137e3d3638b33e5819d132d0b23165c\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_strchrnul_TRUE}" && test -z "${gl_GNULIB_ENABLED_strchrnul_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_strchrnul\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_TRUE}" && test -z "${gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_dbb57f49352be8fb86869629a254fb72\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_TRUE}" && test -z "${gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_1f32594a85e6221ba15f884daeee8c2a\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_strnlen_TRUE}" && test -z "${gl_GNULIB_ENABLED_strnlen_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_strnlen\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_sys_stat_TRUE}" && test -z "${gl_GNULIB_ENABLED_sys_stat_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_sys_stat\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_TRUE}" && test -z "${gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_ed5616be3593d355b981ffab56b9f37b\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_TRUE}" && test -z "${gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_503a4cb75d69c787103d0aa2ab7d8440\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_TRUE}" && test -z "${gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_68a4501daeca58988392c7e60b4917ab\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_TRUE}" && test -z "${gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_f0efff84a70f4afba30902bb8ffe9354\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_TRUE}" && test -z "${gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_8bb827fe37eaccf1b97feb0c87bc92ef\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_TRUE}" && test -z "${gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d_FALSE}"; then
  as_fn_error $? "conditional \"gl_GNULIB_ENABLED_48b2271240803e4879464b755748a89d\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi

    gl_libobjs=
    gl_ltlibobjs=
    if test -n "$gl_LIBOBJS"; then
      # Remove the extension.
      sed_drop_objext='s/\.o$//;s/\.obj$//'
      for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
        gl_libobjs="$gl_libobjs $i.$ac_objext"
        gl_ltlibobjs="$gl_ltlibobjs $i.lo"
      done
    fi
    gl_LIBOBJS=$gl_libobjs

    gl_LTLIBOBJS=$gl_ltlibobjs



    gltests_libobjs=
    gltests_ltlibobjs=
    if test -n "$gltests_LIBOBJS"; then
      # Remove the extension.
      sed_drop_objext='s/\.o$//;s/\.obj$//'
      for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
        gltests_libobjs="$gltests_libobjs $i.$ac_objext"
        gltests_ltlibobjs="$gltests_ltlibobjs $i.lo"
      done
    fi
    gltests_LIBOBJS=$gltests_libobjs

    gltests_LTLIBOBJS=$gltests_ltlibobjs


if test -z "${CROSS_COMPILING_TRUE}" && test -z "${CROSS_COMPILING_FALSE}"; then
  as_fn_error $? "conditional \"CROSS_COMPILING\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi

  case $am__api_version in
    1.14*|1.15*) gl_LIBOBJS=`echo "$gl_LIBOBJS" | sed -e 's, lib/, lib/lib_libbison_a-,g'`;;
    *)           gl_LIBOBJS=`echo "$gl_LIBOBJS" | sed -e 's, lib/, lib/libbison_a-,g'`;;
  esac


: "${CONFIG_STATUS=./config.status}"
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
# Generated by $as_me.
# Run this file to recreate the current configuration.
# Compiler output produced by configure, useful for debugging
# configure, is in config.log if it exists.

debug=false
ac_cs_recheck=false
ac_cs_silent=false

SHELL=\${CONFIG_SHELL-$SHELL}
export SHELL
_ASEOF
cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
## -------------------- ##
## M4sh Initialization. ##
## -------------------- ##

# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in #(
  *posix*) :
    set -o posix ;; #(
  *) :
     ;;
esac
fi


as_nl='
'
export as_nl
# Printing a long string crashes Solaris 7 /usr/bin/printf.
as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
# Prefer a ksh shell builtin over an external printf program on Solaris,
# but without wasting forks for bash or zsh.
if test -z "$BASH_VERSION$ZSH_VERSION" \
    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='print -r --'
  as_echo_n='print -rn --'
elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='printf %s\n'
  as_echo_n='printf %s'
else
  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
    as_echo_n='/usr/ucb/echo -n'
  else
    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
    as_echo_n_body='eval
      arg=$1;
      case $arg in #(
      *"$as_nl"*)
	expr "X$arg" : "X\\(.*\\)$as_nl";
	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
      esac;
      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
    '
    export as_echo_n_body
    as_echo_n='sh -c $as_echo_n_body as_echo'
  fi
  export as_echo_body
  as_echo='sh -c $as_echo_body as_echo'
fi

# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  PATH_SEPARATOR=:
  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
      PATH_SEPARATOR=';'
  }
fi


# IFS
# We need space, tab and new line, in precisely that order.  Quoting is
# there to prevent editors from complaining about space-tab.
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
# splitting by setting IFS to empty value.)
IFS=" ""	$as_nl"

# Find who we are.  Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
  *[\\/]* ) as_myself=$0 ;;
  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
  done
IFS=$as_save_IFS

     ;;
esac
# We did not find ourselves, most probably we were run as `sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
  as_myself=$0
fi
if test ! -f "$as_myself"; then
  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
  exit 1
fi

# Unset variables that we do not need and which cause bugs (e.g. in
# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
# suppresses any "Segmentation fault" message there.  '((' could
# trigger a bug in pdksh 5.2.14.
for as_var in BASH_ENV ENV MAIL MAILPATH
do eval test x\${$as_var+set} = xset \
  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done
PS1='$ '
PS2='> '
PS4='+ '

# NLS nuisances.
LC_ALL=C
export LC_ALL
LANGUAGE=C
export LANGUAGE

# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH


# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
# script with STATUS, using 1 if that was 0.
as_fn_error ()
{
  as_status=$1; test $as_status -eq 0 && as_status=1
  if test "$4"; then
    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
  fi
  $as_echo "$as_me: error: $2" >&2
  as_fn_exit $as_status
} # as_fn_error


# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
as_fn_set_status ()
{
  return $1
} # as_fn_set_status

# as_fn_exit STATUS
# -----------------
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
as_fn_exit ()
{
  set +e
  as_fn_set_status $1
  exit $1
} # as_fn_exit

# as_fn_unset VAR
# ---------------
# Portably unset VAR.
as_fn_unset ()
{
  { eval $1=; unset $1;}
}
as_unset=as_fn_unset
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
  eval 'as_fn_append ()
  {
    eval $1+=\$2
  }'
else
  as_fn_append ()
  {
    eval $1=\$$1\$2
  }
fi # as_fn_append

# as_fn_arith ARG...
# ------------------
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
  eval 'as_fn_arith ()
  {
    as_val=$(( $* ))
  }'
else
  as_fn_arith ()
  {
    as_val=`expr "$@" || test $? -eq 1`
  }
fi # as_fn_arith


if expr a : '\(a\)' >/dev/null 2>&1 &&
   test "X`expr 00001 : '.*\(...\)'`" = X001; then
  as_expr=expr
else
  as_expr=false
fi

if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
  as_basename=basename
else
  as_basename=false
fi

if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
  as_dirname=dirname
else
  as_dirname=false
fi

as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
	 X"$0" : 'X\(//\)$' \| \
	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X/"$0" |
    sed '/^.*\/\([^/][^/]*\)\/*$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`

# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits

ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
  case `echo 'xy\c'` in
  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
  xy)  ECHO_C='\c';;
  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
       ECHO_T='	';;
  esac;;
*)
  ECHO_N='-n';;
esac

rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
  rm -f conf$$.dir/conf$$.file
else
  rm -f conf$$.dir
  mkdir conf$$.dir 2>/dev/null
fi
if (echo >conf$$.file) 2>/dev/null; then
  if ln -s conf$$.file conf$$ 2>/dev/null; then
    as_ln_s='ln -s'
    # ... but there are two gotchas:
    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
    # In both cases, we have to default to `cp -pR'.
    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
      as_ln_s='cp -pR'
  elif ln conf$$.file conf$$ 2>/dev/null; then
    as_ln_s=ln
  else
    as_ln_s='cp -pR'
  fi
else
  as_ln_s='cp -pR'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null


# as_fn_mkdir_p
# -------------
# Create "$as_dir" as a directory, including parents if necessary.
as_fn_mkdir_p ()
{

  case $as_dir in #(
  -*) as_dir=./$as_dir;;
  esac
  test -d "$as_dir" || eval $as_mkdir_p || {
    as_dirs=
    while :; do
      case $as_dir in #(
      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
      *) as_qdir=$as_dir;;
      esac
      as_dirs="'$as_qdir' $as_dirs"
      as_dir=`$as_dirname -- "$as_dir" ||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$as_dir" : 'X\(//\)[^/]' \| \
	 X"$as_dir" : 'X\(//\)$' \| \
	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_dir" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
      test -d "$as_dir" && break
    done
    test -z "$as_dirs" || eval "mkdir $as_dirs"
  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"


} # as_fn_mkdir_p
if mkdir -p . 2>/dev/null; then
  as_mkdir_p='mkdir -p "$as_dir"'
else
  test -d ./-p && rmdir ./-p
  as_mkdir_p=false
fi


# as_fn_executable_p FILE
# -----------------------
# Test if FILE is an executable regular file.
as_fn_executable_p ()
{
  test -f "$1" && test -x "$1"
} # as_fn_executable_p
as_test_x='test -x'
as_executable_p=as_fn_executable_p

# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"

# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"


exec 6>&1
## ----------------------------------- ##
## Main body of $CONFIG_STATUS script. ##
## ----------------------------------- ##
_ASEOF
test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# Save the log message, to keep $0 and so on meaningful, and to
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by GNU Bison $as_me 3.5, which was
generated by GNU Autoconf 2.69.  Invocation command line was

  CONFIG_FILES    = $CONFIG_FILES
  CONFIG_HEADERS  = $CONFIG_HEADERS
  CONFIG_LINKS    = $CONFIG_LINKS
  CONFIG_COMMANDS = $CONFIG_COMMANDS
  $ $0 $@

on `(hostname || uname -n) 2>/dev/null | sed 1q`
"

_ACEOF

case $ac_config_files in *"
"*) set x $ac_config_files; shift; ac_config_files=$*;;
esac

case $ac_config_headers in *"
"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
esac


cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
# Files that config.status was made for.
config_files="$ac_config_files"
config_headers="$ac_config_headers"
config_links="$ac_config_links"
config_commands="$ac_config_commands"

_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
ac_cs_usage="\
\`$as_me' instantiates files and other configuration actions
from templates according to the current configuration.  Unless the files
and actions are specified as TAGs, all are instantiated by default.

Usage: $0 [OPTION]... [TAG]...

  -h, --help       print this help, then exit
  -V, --version    print version number and configuration settings, then exit
      --config     print configuration, then exit
  -q, --quiet, --silent
                   do not print progress messages
  -d, --debug      don't remove temporary files
      --recheck    update $as_me by reconfiguring in the same conditions
      --file=FILE[:TEMPLATE]
                   instantiate the configuration file FILE
      --header=FILE[:TEMPLATE]
                   instantiate the configuration header FILE

Configuration files:
$config_files

Configuration headers:
$config_headers

Configuration links:
$config_links

Configuration commands:
$config_commands

Report bugs to <bug-bison@gnu.org>.
GNU Bison home page: <http://www.gnu.org/software/bison/>.
General help using GNU software: <http://www.gnu.org/gethelp/>."

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
GNU Bison config.status 3.5
configured by $0, generated by GNU Autoconf 2.69,
  with options \\"\$ac_cs_config\\"

Copyright (C) 2012 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."

ac_pwd='$ac_pwd'
srcdir='$srcdir'
INSTALL='$INSTALL'
MKDIR_P='$MKDIR_P'
AWK='$AWK'
test -n "\$AWK" || AWK=awk
_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# The default lists apply if the user does not specify any file.
ac_need_defaults=:
while test $# != 0
do
  case $1 in
  --*=?*)
    ac_option=`expr "X$1" : 'X\([^=]*\)='`
    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
    ac_shift=:
    ;;
  --*=)
    ac_option=`expr "X$1" : 'X\([^=]*\)='`
    ac_optarg=
    ac_shift=:
    ;;
  *)
    ac_option=$1
    ac_optarg=$2
    ac_shift=shift
    ;;
  esac

  case $ac_option in
  # Handling of the options.
  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
    ac_cs_recheck=: ;;
  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
    $as_echo "$ac_cs_version"; exit ;;
  --config | --confi | --conf | --con | --co | --c )
    $as_echo "$ac_cs_config"; exit ;;
  --debug | --debu | --deb | --de | --d | -d )
    debug=: ;;
  --file | --fil | --fi | --f )
    $ac_shift
    case $ac_optarg in
    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
    '') as_fn_error $? "missing file argument" ;;
    esac
    as_fn_append CONFIG_FILES " '$ac_optarg'"
    ac_need_defaults=false;;
  --header | --heade | --head | --hea )
    $ac_shift
    case $ac_optarg in
    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
    esac
    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
    ac_need_defaults=false;;
  --he | --h)
    # Conflict between --help and --header
    as_fn_error $? "ambiguous option: \`$1'
Try \`$0 --help' for more information.";;
  --help | --hel | -h )
    $as_echo "$ac_cs_usage"; exit ;;
  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil | --si | --s)
    ac_cs_silent=: ;;

  # This is an error.
  -*) as_fn_error $? "unrecognized option: \`$1'
Try \`$0 --help' for more information." ;;

  *) as_fn_append ac_config_targets " $1"
     ac_need_defaults=false ;;

  esac
  shift
done

ac_configure_extra_args=

if $ac_cs_silent; then
  exec 6>/dev/null
  ac_configure_extra_args="$ac_configure_extra_args --silent"
fi

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
  shift
  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
  CONFIG_SHELL='$SHELL'
  export CONFIG_SHELL
  exec "\$@"
fi

_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
exec 5>>config.log
{
  echo
  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
  $as_echo "$ac_log"
} >&5

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
#
# INIT-COMMANDS
#
AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
GNUmakefile=$GNUmakefile
# Capture the value of obsolete ALL_LINGUAS because we need it to compute
    # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
    # from automake < 1.5.
    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
    # Capture the value of LINGUAS because we need it to compute CATALOGS.
    LINGUAS="${LINGUAS-%UNSET%}"



_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1

# Handling of arguments.
for ac_config_target in $ac_config_targets
do
  case $ac_config_target in
    "lib/config.h") CONFIG_HEADERS="$CONFIG_HEADERS lib/config.h:lib/config.in.h" ;;
    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
    "src/yacc") CONFIG_FILES="$CONFIG_FILES src/yacc" ;;
    "$GNUmakefile") CONFIG_LINKS="$CONFIG_LINKS $GNUmakefile:$GNUmakefile" ;;
    "javacomp.sh") CONFIG_FILES="$CONFIG_FILES javacomp.sh:build-aux/javacomp.sh.in" ;;
    "javaexec.sh") CONFIG_FILES="$CONFIG_FILES javaexec.sh:build-aux/javaexec.sh.in" ;;
    "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;;
    "gnulib-po/Makefile.in") CONFIG_FILES="$CONFIG_FILES gnulib-po/Makefile.in" ;;
    "runtime-po/Makefile.in") CONFIG_FILES="$CONFIG_FILES runtime-po/Makefile.in" ;;
    "etc/bench.pl") CONFIG_FILES="$CONFIG_FILES etc/bench.pl" ;;
    "tests/atconfig") CONFIG_COMMANDS="$CONFIG_COMMANDS tests/atconfig" ;;
    "tests/atlocal") CONFIG_FILES="$CONFIG_FILES tests/atlocal" ;;
    "tests/bison") CONFIG_FILES="$CONFIG_FILES tests/bison" ;;
    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
    "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
    "doc/yacc.1") CONFIG_FILES="$CONFIG_FILES doc/yacc.1" ;;

  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
  esac
done


# If the user did not use the arguments to specify the items to instantiate,
# then the envvar interface is used.  Set only those that are not.
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
  test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links
  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
fi

# Have a temporary directory for convenience.  Make it in the build tree
# simply because there is no reason against having it here, and in addition,
# creating and moving files from /tmp can sometimes cause problems.
# Hook for its removal unless debugging.
# Note that there is a small window in which the directory will not be cleaned:
# after its creation but before its name has been assigned to `$tmp'.
$debug ||
{
  tmp= ac_tmp=
  trap 'exit_status=$?
  : "${ac_tmp:=$tmp}"
  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
' 0
  trap 'as_fn_exit 1' 1 2 13 15
}
# Create a (secure) tmp directory for tmp files.

{
  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
  test -d "$tmp"
}  ||
{
  tmp=./conf$$-$RANDOM
  (umask 077 && mkdir "$tmp")
} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
ac_tmp=$tmp

# Set up the scripts for CONFIG_FILES section.
# No need to generate them if there are no CONFIG_FILES.
# This happens for instance with `./config.status config.h'.
if test -n "$CONFIG_FILES"; then

if $AWK 'BEGIN { getline <"/dev/null" }' </dev/null 2>/dev/null; then
  ac_cs_awk_getline=:
  ac_cs_awk_pipe_init=
  ac_cs_awk_read_file='
      while ((getline aline < (F[key])) > 0)
	print(aline)
      close(F[key])'
  ac_cs_awk_pipe_fini=
else
  ac_cs_awk_getline=false
  ac_cs_awk_pipe_init="print \"cat <<'|#_!!_#|' &&\""
  ac_cs_awk_read_file='
      print "|#_!!_#|"
      print "cat " F[key] " &&"
      '$ac_cs_awk_pipe_init
  # The final `:' finishes the AND list.
  ac_cs_awk_pipe_fini='END { print "|#_!!_#|"; print ":" }'
fi
ac_cr=`echo X | tr X '\015'`
# On cygwin, bash can eat \r inside `` if the user requested igncr.
# But we know of no other shell where ac_cr would be empty at this
# point, so we can use a bashism as a fallback.
if test "x$ac_cr" = x; then
  eval ac_cr=\$\'\\r\'
fi
ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
  ac_cs_awk_cr='\\r'
else
  ac_cs_awk_cr=$ac_cr
fi

echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
_ACEOF

# Create commands to substitute file output variables.
{
  echo "cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1" &&
  echo 'cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&' &&
  echo "$ac_subst_files" | sed 's/.*/F["&"]="$&"/' &&
  echo "_ACAWK" &&
  echo "_ACEOF"
} >conf$$files.sh &&
. ./conf$$files.sh ||
  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
rm -f conf$$files.sh

{
  echo "cat >conf$$subs.awk <<_ACEOF" &&
  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
  echo "_ACEOF"
} >conf$$subs.sh ||
  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
ac_delim='%!_!# '
for ac_last_try in false false false false false :; do
  . ./conf$$subs.sh ||
    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5

  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
  if test $ac_delim_n = $ac_delim_num; then
    break
  elif $ac_last_try; then
    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
  else
    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
  fi
done
rm -f conf$$subs.sh

cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
_ACEOF
sed -n '
h
s/^/S["/; s/!.*/"]=/
p
g
s/^[^!]*!//
:repl
t repl
s/'"$ac_delim"'$//
t delim
:nl
h
s/\(.\{148\}\)..*/\1/
t more1
s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
p
n
b repl
:more1
s/["\\]/\\&/g; s/^/"/; s/$/"\\/
p
g
s/.\{148\}//
t nl
:delim
h
s/\(.\{148\}\)..*/\1/
t more2
s/["\\]/\\&/g; s/^/"/; s/$/"/
p
b
:more2
s/["\\]/\\&/g; s/^/"/; s/$/"\\/
p
g
s/.\{148\}//
t delim
' <conf$$subs.awk | sed '
/^[^""]/{
  N
  s/\n//
}
' >>$CONFIG_STATUS || ac_write_fail=1
rm -f conf$$subs.awk
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACAWK
cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
  for (key in S) S_is_set[key] = 1
  FS = ""
  \$ac_cs_awk_pipe_init
}
{
  line = $ 0
  nfields = split(line, field, "@")
  substed = 0
  len = length(field[1])
  for (i = 2; i < nfields; i++) {
    key = field[i]
    keylen = length(key)
    if (S_is_set[key]) {
      value = S[key]
      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
      len += length(value) + length(field[++i])
      substed = 1
    } else
      len += 1 + keylen
  }
  if (nfields == 3 && !substed) {
    key = field[2]
    if (F[key] != "" && line ~ /^[	 ]*@.*@[	 ]*$/) {
      \$ac_cs_awk_read_file
      next
    }
  }
  print line
}
\$ac_cs_awk_pipe_fini
_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
else
  cat
fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
_ACEOF

# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
# trailing colons and then remove the whole line if VPATH becomes empty
# (actually we leave an empty line to preserve line numbers).
if test "x$srcdir" = x.; then
  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
h
s///
s/^/:/
s/[	 ]*$/:/
s/:\$(srcdir):/:/g
s/:\${srcdir}:/:/g
s/:@srcdir@:/:/g
s/^:*//
s/:*$//
x
s/\(=[	 ]*\).*/\1/
G
s/\n//
s/^[^=]*=[	 ]*$//
}'
fi

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
fi # test -n "$CONFIG_FILES"

# Set up the scripts for CONFIG_HEADERS section.
# No need to generate them if there are no CONFIG_HEADERS.
# This happens for instance with `./config.status Makefile'.
if test -n "$CONFIG_HEADERS"; then
cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
BEGIN {
_ACEOF

# Transform confdefs.h into an awk script `defines.awk', embedded as
# here-document in config.status, that substitutes the proper values into
# config.h.in to produce config.h.

# Create a delimiter string that does not exist in confdefs.h, to ease
# handling of long lines.
ac_delim='%!_!# '
for ac_last_try in false false :; do
  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
  if test -z "$ac_tt"; then
    break
  elif $ac_last_try; then
    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
  else
    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
  fi
done

# For the awk script, D is an array of macro values keyed by name,
# likewise P contains macro parameters if any.  Preserve backslash
# newline sequences.

ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
sed -n '
s/.\{148\}/&'"$ac_delim"'/g
t rset
:rset
s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
t def
d
:def
s/\\$//
t bsnl
s/["\\]/\\&/g
s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
D["\1"]=" \3"/p
s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
d
:bsnl
s/["\\]/\\&/g
s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
D["\1"]=" \3\\\\\\n"\\/p
t cont
s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
t cont
d
:cont
n
s/.\{148\}/&'"$ac_delim"'/g
t clear
:clear
s/\\$//
t bsnlc
s/["\\]/\\&/g; s/^/"/; s/$/"/p
d
:bsnlc
s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
b cont
' <confdefs.h | sed '
s/'"$ac_delim"'/"\\\
"/g' >>$CONFIG_STATUS || ac_write_fail=1

cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
  for (key in D) D_is_set[key] = 1
  FS = ""
}
/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
  line = \$ 0
  split(line, arg, " ")
  if (arg[1] == "#") {
    defundef = arg[2]
    mac1 = arg[3]
  } else {
    defundef = substr(arg[1], 2)
    mac1 = arg[2]
  }
  split(mac1, mac2, "(") #)
  macro = mac2[1]
  prefix = substr(line, 1, index(line, defundef) - 1)
  if (D_is_set[macro]) {
    # Preserve the white space surrounding the "#".
    print prefix "define", macro P[macro] D[macro]
    next
  } else {
    # Replace #undef with comments.  This is necessary, for example,
    # in the case of _POSIX_SOURCE, which is predefined and required
    # on some systems where configure will not decide to define it.
    if (defundef == "undef") {
      print "/*", prefix defundef, macro, "*/"
      next
    }
  }
}
{ print }
_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
fi # test -n "$CONFIG_HEADERS"


eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS  :L $CONFIG_LINKS  :C $CONFIG_COMMANDS"
shift
for ac_tag
do
  case $ac_tag in
  :[FHLC]) ac_mode=$ac_tag; continue;;
  esac
  case $ac_mode$ac_tag in
  :[FHL]*:*);;
  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
  :[FH]-) ac_tag=-:-;;
  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
  esac
  ac_save_IFS=$IFS
  IFS=:
  set x $ac_tag
  IFS=$ac_save_IFS
  shift
  ac_file=$1
  shift

  case $ac_mode in
  :L) ac_source=$1;;
  :[FH])
    ac_file_inputs=
    for ac_f
    do
      case $ac_f in
      -) ac_f="$ac_tmp/stdin";;
      *) # Look for the file first in the build tree, then in the source tree
	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
	 # because $ac_f cannot contain `:'.
	 test -f "$ac_f" ||
	   case $ac_f in
	   [\\/$]*) false;;
	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
	   esac ||
	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
      esac
      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
      as_fn_append ac_file_inputs " '$ac_f'"
    done

    # Let's still pretend it is `configure' which instantiates (i.e., don't
    # use $as_me), people would be surprised to read:
    #    /* config.h.  Generated by config.status.  */
    configure_input='Generated from '`
	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
	`' by configure.'
    if test x"$ac_file" != x-; then
      configure_input="$ac_file.  $configure_input"
      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
$as_echo "$as_me: creating $ac_file" >&6;}
    fi
    # Neutralize special characters interpreted by sed in replacement strings.
    case $configure_input in #(
    *\&* | *\|* | *\\* )
       ac_sed_conf_input=`$as_echo "$configure_input" |
       sed 's/[\\\\&|]/\\\\&/g'`;; #(
    *) ac_sed_conf_input=$configure_input;;
    esac

    case $ac_tag in
    *:-:* | *:-) cat >"$ac_tmp/stdin" \
      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
    esac
    ;;
  esac

  ac_dir=`$as_dirname -- "$ac_file" ||
$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$ac_file" : 'X\(//\)[^/]' \| \
	 X"$ac_file" : 'X\(//\)$' \| \
	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$ac_file" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
  as_dir="$ac_dir"; as_fn_mkdir_p
  ac_builddir=.

case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
  # A ".." for each directory in $ac_dir_suffix.
  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
  case $ac_top_builddir_sub in
  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
  esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix

case $srcdir in
  .)  # We are building in place.
    ac_srcdir=.
    ac_top_srcdir=$ac_top_builddir_sub
    ac_abs_top_srcdir=$ac_pwd ;;
  [\\/]* | ?:[\\/]* )  # Absolute name.
    ac_srcdir=$srcdir$ac_dir_suffix;
    ac_top_srcdir=$srcdir
    ac_abs_top_srcdir=$srcdir ;;
  *) # Relative name.
    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
    ac_top_srcdir=$ac_top_build_prefix$srcdir
    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix


  case $ac_mode in
  :F)
  #
  # CONFIG_FILE
  #

  case $INSTALL in
  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
  esac
  ac_MKDIR_P=$MKDIR_P
  case $MKDIR_P in
  [\\/$]* | ?:[\\/]* ) ;;
  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
  esac
_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# If the template does not know about datarootdir, expand it.
# FIXME: This hack should be removed a few years after 2.60.
ac_datarootdir_hack=; ac_datarootdir_seen=
ac_sed_dataroot='
/datarootdir/ {
  p
  q
}
/@datadir@/p
/@docdir@/p
/@infodir@/p
/@localedir@/p
/@mandir@/p'
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
  ac_datarootdir_hack='
  s&@datadir@&$datadir&g
  s&@docdir@&$docdir&g
  s&@infodir@&$infodir&g
  s&@localedir@&$localedir&g
  s&@mandir@&$mandir&g
  s&\\\${datarootdir}&$datarootdir&g' ;;
esac
_ACEOF

# Neutralize VPATH when `$srcdir' = `.'.
# Shell code in configure.ac might set extrasub.
# FIXME: do we really want to maintain this feature?
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_sed_extra="$ac_vpsub
$extrasub
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
:t
/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
s|@configure_input@|$ac_sed_conf_input|;t t
s&@top_builddir@&$ac_top_builddir_sub&;t t
s&@top_build_prefix@&$ac_top_build_prefix&;t t
s&@srcdir@&$ac_srcdir&;t t
s&@abs_srcdir@&$ac_abs_srcdir&;t t
s&@top_srcdir@&$ac_top_srcdir&;t t
s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
s&@builddir@&$ac_builddir&;t t
s&@abs_builddir@&$ac_abs_builddir&;t t
s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
s&@INSTALL@&$ac_INSTALL&;t t
s&@MKDIR_P@&$ac_MKDIR_P&;t t
$ac_datarootdir_hack
"
eval sed \"\$ac_sed_extra\" "$ac_file_inputs" |
if $ac_cs_awk_getline; then
  $AWK -f "$ac_tmp/subs.awk"
else
  $AWK -f "$ac_tmp/subs.awk" | $SHELL
fi \
  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5

test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
      "$ac_tmp/out"`; test -z "$ac_out"; } &&
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined.  Please make sure it is defined" >&5
$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined.  Please make sure it is defined" >&2;}

  rm -f "$ac_tmp/stdin"
  case $ac_file in
  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
  esac \
  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
 ;;
  :H)
  #
  # CONFIG_HEADER
  #
  if test x"$ac_file" != x-; then
    {
      $as_echo "/* $configure_input  */" \
      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
    } >"$ac_tmp/config.h" \
      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
$as_echo "$as_me: $ac_file is unchanged" >&6;}
    else
      rm -f "$ac_file"
      mv "$ac_tmp/config.h" "$ac_file" \
	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
    fi
  else
    $as_echo "/* $configure_input  */" \
      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
      || as_fn_error $? "could not create -" "$LINENO" 5
  fi
# Compute "$ac_file"'s index in $config_headers.
_am_arg="$ac_file"
_am_stamp_count=1
for _am_header in $config_headers :; do
  case $_am_header in
    $_am_arg | $_am_arg:* )
      break ;;
    * )
      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
  esac
done
echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$_am_arg" : 'X\(//\)[^/]' \| \
	 X"$_am_arg" : 'X\(//\)$' \| \
	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$_am_arg" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`/stamp-h$_am_stamp_count
 ;;
  :L)
  #
  # CONFIG_LINK
  #

  if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then
    :
  else
    # Prefer the file from the source tree if names are identical.
    if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then
      ac_source=$srcdir/$ac_source
    fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5
$as_echo "$as_me: linking $ac_source to $ac_file" >&6;}

    if test ! -r "$ac_source"; then
      as_fn_error $? "$ac_source: file not found" "$LINENO" 5
    fi
    rm -f "$ac_file"

    # Try a relative symlink, then a hard link, then a copy.
    case $ac_source in
    [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;;
	*) ac_rel_source=$ac_top_build_prefix$ac_source ;;
    esac
    ln -s "$ac_rel_source" "$ac_file" 2>/dev/null ||
      ln "$ac_source" "$ac_file" 2>/dev/null ||
      cp -p "$ac_source" "$ac_file" ||
      as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5
  fi
 ;;
  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
$as_echo "$as_me: executing $ac_file commands" >&6;}
 ;;
  esac


  case $ac_file$ac_mode in
    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
  # Older Autoconf quotes --file arguments for eval, but not when files
  # are listed without --file.  Let's play safe and only enable the eval
  # if we detect the quoting.
  # TODO: see whether this extra hack can be removed once we start
  # requiring Autoconf 2.70 or later.
  case $CONFIG_FILES in #(
  *\'*) :
    eval set x "$CONFIG_FILES" ;; #(
  *) :
    set x $CONFIG_FILES ;; #(
  *) :
     ;;
esac
  shift
  # Used to flag and report bootstrapping failures.
  am_rc=0
  for am_mf
  do
    # Strip MF so we end up with the name of the file.
    am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'`
    # Check whether this is an Automake generated Makefile which includes
    # dependency-tracking related rules and includes.
    # Grep'ing the whole file directly is not great: AIX grep has a line
    # limit of 2048, but all sed's we know have understand at least 4000.
    sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
      || continue
    am_dirpart=`$as_dirname -- "$am_mf" ||
$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$am_mf" : 'X\(//\)[^/]' \| \
	 X"$am_mf" : 'X\(//\)$' \| \
	 X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$am_mf" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
    am_filepart=`$as_basename -- "$am_mf" ||
$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
	 X"$am_mf" : 'X\(//\)$' \| \
	 X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X/"$am_mf" |
    sed '/^.*\/\([^/][^/]*\)\/*$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
    { echo "$as_me:$LINENO: cd "$am_dirpart" \
      && sed -e '/# am--include-marker/d' "$am_filepart" \
        | $MAKE -f - am--depfiles" >&5
   (cd "$am_dirpart" \
      && sed -e '/# am--include-marker/d' "$am_filepart" \
        | $MAKE -f - am--depfiles) >&5 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } || am_rc=$?
  done
  if test $am_rc -ne 0; then
    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "Something went wrong bootstrapping makefile fragments
    for automatic dependency tracking.  Try re-running configure with the
    '--disable-dependency-tracking' option to at least be able to build
    the package (albeit without support for automatic dependency tracking).
See \`config.log' for more details" "$LINENO" 5; }
  fi
  { am_dirpart=; unset am_dirpart;}
  { am_filepart=; unset am_filepart;}
  { am_mf=; unset am_mf;}
  { am_rc=; unset am_rc;}
  rm -f conftest-deps.mk
}
 ;;
    "src/yacc":F) chmod +x src/yacc ;;
    "po-directories":C)
    for ac_file in $CONFIG_FILES; do
      # Support "outfile[:infile[:infile...]]"
      case "$ac_file" in
        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
      esac
      # PO directories have a Makefile.in generated from Makefile.in.in.
      case "$ac_file" in */Makefile.in)
        # Adjust a relative srcdir.
        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
        ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
        # In autoconf-2.13 it is called $ac_given_srcdir.
        # In autoconf-2.50 it is called $srcdir.
        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
        case "$ac_given_srcdir" in
          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
          /*) top_srcdir="$ac_given_srcdir" ;;
          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
        esac
        # Treat a directory as a PO directory if and only if it has a
        # POTFILES.in file. This allows packages to have multiple PO
        # directories under different names or in different locations.
        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
          rm -f "$ac_dir/POTFILES"
          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
          gt_tab=`printf '\t'`
          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
          POMAKEFILEDEPS="POTFILES.in"
          # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
          # on $ac_dir but don't depend on user-specified configuration
          # parameters.
          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
            # The LINGUAS file contains the set of available languages.
            if test -n "$OBSOLETE_ALL_LINGUAS"; then
              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
            fi
            ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
            # Hide the ALL_LINGUAS assignment from automake < 1.5.
            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
          else
            # The set of available languages was given in configure.in.
            # Hide the ALL_LINGUAS assignment from automake < 1.5.
            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
          fi
          # Compute POFILES
          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
          # Compute UPDATEPOFILES
          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
          # Compute DUMMYPOFILES
          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
          # Compute GMOFILES
          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
          case "$ac_given_srcdir" in
            .) srcdirpre= ;;
            *) srcdirpre='$(srcdir)/' ;;
          esac
          POFILES=
          UPDATEPOFILES=
          DUMMYPOFILES=
          GMOFILES=
          for lang in $ALL_LINGUAS; do
            POFILES="$POFILES $srcdirpre$lang.po"
            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
          done
          # CATALOGS depends on both $ac_dir and the user's LINGUAS
          # environment variable.
          INST_LINGUAS=
          if test -n "$ALL_LINGUAS"; then
            for presentlang in $ALL_LINGUAS; do
              useit=no
              if test "%UNSET%" != "$LINGUAS"; then
                desiredlanguages="$LINGUAS"
              else
                desiredlanguages="$ALL_LINGUAS"
              fi
              for desiredlang in $desiredlanguages; do
                # Use the presentlang catalog if desiredlang is
                #   a. equal to presentlang, or
                #   b. a variant of presentlang (because in this case,
                #      presentlang can be used as a fallback for messages
                #      which are not translated in the desiredlang catalog).
                case "$desiredlang" in
                  "$presentlang"*) useit=yes;;
                esac
              done
              if test $useit = yes; then
                INST_LINGUAS="$INST_LINGUAS $presentlang"
              fi
            done
          fi
          CATALOGS=
          if test -n "$INST_LINGUAS"; then
            for lang in $INST_LINGUAS; do
              CATALOGS="$CATALOGS $lang.gmo"
            done
          fi
          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
            if test -f "$f"; then
              case "$f" in
                *.orig | *.bak | *~) ;;
                *) cat "$f" >> "$ac_dir/Makefile" ;;
              esac
            fi
          done
        fi
        ;;
      esac
    done ;;
    "etc/bench.pl":F) chmod +x etc/bench.pl ;;
    "tests/atconfig":C) cat >tests/atconfig <<ATEOF
# Configurable variable values for building test suites.
# Generated by $0.
# Copyright (C) 2012 Free Software Foundation, Inc.

# The test suite will define top_srcdir=$at_top_srcdir/../.. etc.
at_testdir='tests'
abs_builddir='$ac_abs_builddir'
at_srcdir='$ac_srcdir'
abs_srcdir='$ac_abs_srcdir'
at_top_srcdir='$ac_top_srcdir'
abs_top_srcdir='$ac_abs_top_srcdir'
at_top_build_prefix='$ac_top_build_prefix'
abs_top_builddir='$ac_abs_top_builddir'

# Backward compatibility with Autotest <= 2.59b:
at_top_builddir=\$at_top_build_prefix

AUTOTEST_PATH='tests'

SHELL=\${CONFIG_SHELL-'$SHELL'}
ATEOF
 ;;
    "tests/bison":F) chmod +x tests/bison ;;

  esac
done # for ac_tag


as_fn_exit 0
_ACEOF
ac_clean_files=$ac_clean_files_save

test $ac_write_fail = 0 ||
  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5


# configure is writing to config.log, and then calls config.status.
# config.status does its own redirection, appending to config.log.
# Unfortunately, on DOS this fails, as config.log is still kept open
# by configure, so config.status won't be able to write to it; its
# output is simply discarded.  So we exec the FD to /dev/null,
# effectively closing config.log, so it can be properly (re)opened and
# appended to by config.status.  When coming back to configure, we
# need to make the FD available again.
if test "$no_create" != yes; then
  ac_cs_success=:
  ac_config_status_args=
  test "$silent" = yes &&
    ac_config_status_args="$ac_config_status_args --quiet"
  exec 5>/dev/null
  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
  exec 5>>config.log
  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
  # would make configure fail if this is the last instruction.
  $ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi

