#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for libgnu UNUSED-VERSION.
#
#
# 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 about your system,
$0: including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do 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='libgnu'
PACKAGE_TARNAME='libgnu'
PACKAGE_VERSION='UNUSED-VERSION'
PACKAGE_STRING='libgnu UNUSED-VERSION'
PACKAGE_BUGREPORT=''
PACKAGE_URL=''

ac_unique_file="import/memmem.c"
ac_header_list=
# 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_config_libobj_dir=import
ac_func_list=
gl_fnmatch_required=POSIX
ac_subst_vars='am__EXEEXT_FALSE
am__EXEEXT_TRUE
gltests_LIBOBJDEPS
gltests_LTLIBOBJS
gltests_LIBOBJS
gl_LIBOBJDEPS
gl_LTLIBOBJS
gl_LIBOBJS
LTLIBOBJS
LIBOBJS
LN_S
AM_BACKSLASH
AM_DEFAULT_VERBOSITY
AM_DEFAULT_V
AM_V
am__fastdepCC_FALSE
am__fastdepCC_TRUE
CCDEPMODE
am__nodep
AMDEPBACKSLASH
AMDEP_FALSE
AMDEP_TRUE
am__quote
am__include
DEPDIR
am__untar
am__tar
AMTAR
am__leading_dot
SET_MAKE
AWK
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
LIBGNU_LTLIBDEPS
LIBGNU_LIBDEPS
GL_CFLAG_GNULIB_WARNINGS
GL_CFLAG_ALLOW_WARNINGS
gltests_WITNESS
GL_COND_OBJ_WMEMPCPY_FALSE
GL_COND_OBJ_WMEMPCPY_TRUE
GL_COND_OBJ_WMEMCHR_FALSE
GL_COND_OBJ_WMEMCHR_TRUE
GL_COND_OBJ_WINDOWS_RWLOCK_FALSE
GL_COND_OBJ_WINDOWS_RWLOCK_TRUE
GL_COND_OBJ_WINDOWS_RECMUTEX_FALSE
GL_COND_OBJ_WINDOWS_RECMUTEX_TRUE
GL_COND_OBJ_WINDOWS_ONCE_FALSE
GL_COND_OBJ_WINDOWS_ONCE_TRUE
GL_COND_OBJ_WINDOWS_MUTEX_FALSE
GL_COND_OBJ_WINDOWS_MUTEX_TRUE
GL_GNULIB_TOWCTRANS
GL_GNULIB_WCTRANS
GL_GNULIB_ISWCTYPE
GL_GNULIB_WCTYPE
GL_GNULIB_ISWXDIGIT
GL_GNULIB_ISWDIGIT
GL_GNULIB_ISWBLANK
REPLACE_TOWLOWER
REPLACE_ISWCNTRL
HAVE_WCTYPE_H
NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H
NEXT_WCTYPE_H
HAVE_ISWCNTRL
REPLACE_ISWXDIGIT
REPLACE_ISWDIGIT
REPLACE_ISWBLANK
HAVE_WCTRANS_T
HAVE_WCTYPE_T
HAVE_ISWBLANK
HAVE_CRTDEFS_H
HAVE_WINT_T
NEXT_AS_FIRST_DIRECTIVE_WCHAR_H
NEXT_WCHAR_H
GL_COND_OBJ_UNSETENV_FALSE
GL_COND_OBJ_UNSETENV_TRUE
HAVE_UNISTD_H
NEXT_AS_FIRST_DIRECTIVE_UNISTD_H
NEXT_UNISTD_H
GL_COND_OBJ_TIME_R_FALSE
GL_COND_OBJ_TIME_R_TRUE
GL_GNULIB_MDA_TZSET
GL_GNULIB_TZSET
GL_GNULIB_TIME_RZ
GL_GNULIB_TIME_R
GL_GNULIB_TIMESPEC_GETRES
GL_GNULIB_TIMESPEC_GET
GL_GNULIB_TIMEGM
GL_GNULIB_STRPTIME
GL_GNULIB_STRFTIME
GL_GNULIB_NANOSLEEP
GL_GNULIB_LOCALTIME
GL_GNULIB_MKTIME
GL_GNULIB_CTIME
TIME_H_DEFINES_TIME_UTC
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
REPLACE_LOCALTIME
REPLACE_GMTIME
GNULIB_GETTIMEOFDAY
REPLACE_TZSET
REPLACE_TIMEGM
REPLACE_STRFTIME
REPLACE_NANOSLEEP
REPLACE_MKTIME
REPLACE_LOCALTIME_R
REPLACE_CTIME
HAVE_TIMEZONE_T
HAVE_TIMESPEC_GETRES
HAVE_TIMESPEC_GET
HAVE_TIMEGM
HAVE_STRPTIME
HAVE_NANOSLEEP
HAVE_DECL_LOCALTIME_R
GL_GNULIB_WAITPID
NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H
NEXT_SYS_WAIT_H
HAVE_SYS_UIO_H
NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H
NEXT_SYS_UIO_H
WINDOWS_STAT_INODES
WINDOWS_64_BIT_OFF_T
NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H
NEXT_SYS_TYPES_H
HAVE_SYS_RANDOM_H
NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H
NEXT_SYS_RANDOM_H
GL_COND_OBJ_STRTOK_R_FALSE
GL_COND_OBJ_STRTOK_R_TRUE
GL_COND_OBJ_STRNLEN_FALSE
GL_COND_OBJ_STRNLEN_TRUE
HAVE_STRINGS_H
NEXT_AS_FIRST_DIRECTIVE_STRINGS_H
NEXT_STRINGS_H
NEXT_AS_FIRST_DIRECTIVE_STRING_H
NEXT_STRING_H
GL_COND_OBJ_STRERROR_OVERRIDE_FALSE
GL_COND_OBJ_STRERROR_OVERRIDE_TRUE
GL_COND_OBJ_STRERROR_FALSE
GL_COND_OBJ_STRERROR_TRUE
GL_COND_OBJ_STRDUP_FALSE
GL_COND_OBJ_STRDUP_TRUE
GL_COND_OBJ_STRCHRNUL_FALSE
GL_COND_OBJ_STRCHRNUL_TRUE
NEXT_AS_FIRST_DIRECTIVE_STDLIB_H
NEXT_STDLIB_H
GL_COND_OBJ_STDIO_WRITE_FALSE
GL_COND_OBJ_STDIO_WRITE_TRUE
GL_COND_OBJ_STDIO_READ_FALSE
GL_COND_OBJ_STDIO_READ_TRUE
NEXT_AS_FIRST_DIRECTIVE_STDIO_H
NEXT_STDIO_H
GL_GENERATE_STDINT_H_FALSE
GL_GENERATE_STDINT_H_TRUE
STDINT_H
GL_GENERATE_STDDEF_H_FALSE
GL_GENERATE_STDDEF_H_TRUE
STDDEF_H
GL_GENERATE_STDBOOL_H_FALSE
GL_GENERATE_STDBOOL_H_TRUE
STDBOOL_H
HAVE__BOOL
GL_GENERATE_STDALIGN_H_FALSE
GL_GENERATE_STDALIGN_H_TRUE
STDALIGN_H
GL_COND_OBJ_STAT_FALSE
GL_COND_OBJ_STAT_TRUE
GL_COND_OBJ_SOCKET_FALSE
GL_COND_OBJ_SOCKET_TRUE
GL_GNULIB_SIGACTION
GL_GNULIB_SIGPROCMASK
GL_GNULIB_SIGNAL_H_SIGPIPE
GL_GNULIB_RAISE
GL_GNULIB_PTHREAD_SIGMASK
NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H
NEXT_SIGNAL_H
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
GL_COND_OBJ_SETSOCKOPT_FALSE
GL_COND_OBJ_SETSOCKOPT_TRUE
GL_COND_OBJ_SETLOCALE_LOCK_FALSE
GL_COND_OBJ_SETLOCALE_LOCK_TRUE
GL_COND_OBJ_SETENV_FALSE
GL_COND_OBJ_SETENV_TRUE
GL_GNULIB_SELECT
GL_GNULIB_PSELECT
GL_COND_OBJ_SELECT_FALSE
GL_COND_OBJ_SELECT_TRUE
LIB_SELECT
LIBSOCKET
HAVE_SYS_SELECT_H
NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H
NEXT_SYS_SELECT_H
REPLACE_SELECT
REPLACE_PSELECT
HAVE_PSELECT
GL_COND_OBJ_RMDIR_FALSE
GL_COND_OBJ_RMDIR_TRUE
GL_COND_OBJ_REWINDDIR_FALSE
GL_COND_OBJ_REWINDDIR_TRUE
GL_COND_OBJ_RENAME_FALSE
GL_COND_OBJ_RENAME_TRUE
GL_COND_OBJ_READLINK_FALSE
GL_COND_OBJ_READLINK_TRUE
GL_COND_OBJ_READDIR_FALSE
GL_COND_OBJ_READDIR_TRUE
GL_COND_OBJ_RAWMEMCHR_FALSE
GL_COND_OBJ_RAWMEMCHR_TRUE
GL_COND_OBJ_PIPE_FALSE
GL_COND_OBJ_PIPE_TRUE
GL_COND_OBJ_OPENDIR_FALSE
GL_COND_OBJ_OPENDIR_TRUE
GL_COND_OBJ_OPENAT_FALSE
GL_COND_OBJ_OPENAT_TRUE
GL_COND_OBJ_OPEN_FALSE
GL_COND_OBJ_OPEN_TRUE
GL_GENERATE_NETINET_IN_H_FALSE
GL_GENERATE_NETINET_IN_H_TRUE
NETINET_IN_H
HAVE_NETINET_IN_H
NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H
NEXT_NETINET_IN_H
GL_GNULIB_GETADDRINFO
HAVE_NETDB_H
NEXT_AS_FIRST_DIRECTIVE_NETDB_H
NEXT_NETDB_H
REPLACE_GETADDRINFO
REPLACE_GAI_STRERROR
HAVE_DECL_GETNAMEINFO
HAVE_DECL_GETADDRINFO
HAVE_DECL_GAI_STRERROR
HAVE_DECL_FREEADDRINFO
HAVE_STRUCT_ADDRINFO
GL_COND_OBJ_MSVC_NOTHROW_FALSE
GL_COND_OBJ_MSVC_NOTHROW_TRUE
GL_COND_OBJ_MSVC_INVAL_FALSE
GL_COND_OBJ_MSVC_INVAL_TRUE
GL_COND_OBJ_MKOSTEMP_FALSE
GL_COND_OBJ_MKOSTEMP_TRUE
GL_COND_OBJ_MKDTEMP_FALSE
GL_COND_OBJ_MKDTEMP_TRUE
GL_COND_OBJ_MKDIR_FALSE
GL_COND_OBJ_MKDIR_TRUE
GL_COND_OBJ_MEMRCHR_FALSE
GL_COND_OBJ_MEMRCHR_TRUE
GL_COND_OBJ_MEMPCPY_FALSE
GL_COND_OBJ_MEMPCPY_TRUE
GL_GNULIB_MDA_STRDUP
GL_GNULIB_MDA_MEMCCPY
GL_GNULIB_STRVERSCMP
GL_GNULIB_STRSIGNAL
GL_GNULIB_SIGDESCR_NP
GL_GNULIB_SIGABBREV_NP
GL_GNULIB_STRERRORNAME_NP
GL_GNULIB_STRERROR_R
GL_GNULIB_STRERROR
GL_GNULIB_MBSTOK_R
GL_GNULIB_MBSSEP
GL_GNULIB_MBSSPN
GL_GNULIB_MBSPBRK
GL_GNULIB_MBSCSPN
GL_GNULIB_MBSCASESTR
GL_GNULIB_MBSPCASECMP
GL_GNULIB_MBSNCASECMP
GL_GNULIB_MBSCASECMP
GL_GNULIB_MBSSTR
GL_GNULIB_MBSRCHR
GL_GNULIB_MBSCHR
GL_GNULIB_MBSNLEN
GL_GNULIB_MBSLEN
GL_GNULIB_STRTOK_R
GL_GNULIB_STRCASESTR
GL_GNULIB_STRSTR
GL_GNULIB_STRSEP
GL_GNULIB_STRPBRK
GL_GNULIB_STRNLEN
GL_GNULIB_STRNDUP
GL_GNULIB_STRNCAT
GL_GNULIB_STRDUP
GL_GNULIB_STRCHRNUL
GL_GNULIB_STPNCPY
GL_GNULIB_STPCPY
GL_GNULIB_RAWMEMCHR
GL_GNULIB_MEMRCHR
GL_GNULIB_MEMPCPY
GL_GNULIB_MEMMEM
GL_GNULIB_MEMCHR
GL_GNULIB_FFSLL
GL_GNULIB_FFSL
GL_GNULIB_EXPLICIT_BZERO
GL_COND_OBJ_MEMCHR_FALSE
GL_COND_OBJ_MEMCHR_TRUE
UNDEFINE_STRTOK_R
REPLACE_STRSIGNAL
REPLACE_STRERRORNAME_NP
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
REPLACE_FFSLL
HAVE_STRVERSCMP
HAVE_DECL_STRSIGNAL
HAVE_SIGDESCR_NP
HAVE_SIGABBREV_NP
HAVE_STRERRORNAME_NP
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_FFSLL
HAVE_FFSL
HAVE_EXPLICIT_BZERO
HAVE_MBSLEN
GL_COND_OBJ_MBTOWC_FALSE
GL_COND_OBJ_MBTOWC_TRUE
GL_COND_OBJ_MBSRTOWCS_FALSE
GL_COND_OBJ_MBSRTOWCS_TRUE
GL_COND_OBJ_MBSINIT_FALSE
GL_COND_OBJ_MBSINIT_TRUE
HAVE_VISIBILITY
CFLAG_VISIBILITY
GL_COND_OBJ_MBRTOWC_FALSE
GL_COND_OBJ_MBRTOWC_TRUE
LIB_MBRTOWC
LOCALE_ZH_CN
LOCALE_FR_UTF8
LOCALE_JA
NEXT_AS_FIRST_DIRECTIVE_MATH_H
NEXT_MATH_H
GL_COND_OBJ_LSTAT_FALSE
GL_COND_OBJ_LSTAT_TRUE
LTLIBMULTITHREAD
LIBMULTITHREAD
LTLIBTHREAD
LIBTHREAD
LIBSTDTHREAD
GL_GNULIB_LOCALENAME
GL_GNULIB_DUPLOCALE
GL_GNULIB_SETLOCALE_NULL
GL_GNULIB_SETLOCALE
GL_GNULIB_LOCALECONV
NEXT_AS_FIRST_DIRECTIVE_LOCALE_H
NEXT_LOCALE_H
HAVE_XLOCALE_H
NEXT_AS_FIRST_DIRECTIVE_STDDEF_H
NEXT_STDDEF_H
HAVE_WCHAR_T
HAVE_MAX_ALIGN_T
REPLACE_NULL
LOCALENAME_ENHANCE_LOCALE_FUNCS
REPLACE_STRUCT_LCONV
REPLACE_FREELOCALE
REPLACE_DUPLOCALE
REPLACE_NEWLOCALE
REPLACE_SETLOCALE
REPLACE_LOCALECONV
HAVE_FREELOCALE
HAVE_DUPLOCALE
HAVE_NEWLOCALE
LOCALCHARSET_TESTS_ENVIRONMENT
GL_COND_OBJ_LISTEN_FALSE
GL_COND_OBJ_LISTEN_TRUE
GL_GENERATE_LIMITS_H_FALSE
GL_GENERATE_LIMITS_H_TRUE
LIMITS_H
GL_COND_OBJ_ISBLANK_FALSE
GL_COND_OBJ_ISBLANK_TRUE
GL_GNULIB_STRTOUMAX
GL_GNULIB_STRTOIMAX
GL_GNULIB_IMAXDIV
GL_GNULIB_IMAXABS
NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H
NEXT_INTTYPES_H
UINT64_MAX_EQ_ULONG_MAX
UINT32_MAX_LT_UINTMAX_MAX
PRIPTR_PREFIX
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
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
APPLE_UNIVERSAL_BUILD
HAVE_STDINT_H
NEXT_AS_FIRST_DIRECTIVE_STDINT_H
NEXT_STDINT_H
HAVE_SYS_TYPES_H
HAVE_INTTYPES_H
HAVE_WCHAR_H
GNULIBHEADERS_OVERRIDE_WINT_T
NEXT_AS_FIRST_DIRECTIVE_LIMITS_H
NEXT_LIMITS_H
GL_COND_OBJ_INET_NTOP_FALSE
GL_COND_OBJ_INET_NTOP_TRUE
INET_NTOP_LIB
LIB_HARD_LOCALE
LIB_SETLOCALE_NULL
LIB_SCHED_YIELD
LIBPMULTITHREAD
LIBPTHREAD
GL_COND_OBJ_GLOB_PATTERN_P_FALSE
GL_COND_OBJ_GLOB_PATTERN_P_TRUE
GL_COND_OBJ_GLOB_FALSE
GL_COND_OBJ_GLOB_TRUE
GL_GENERATE_GLOB_H_FALSE
GL_GENERATE_GLOB_H_TRUE
GLOB_H
GL_GNULIB_GLOB
HAVE_GLOB_H
NEXT_AS_FIRST_DIRECTIVE_GLOB_H
NEXT_GLOB_H
REPLACE_GLOB_PATTERN_P
REPLACE_GLOB
HAVE_GLOB_PATTERN_P
HAVE_GLOB
GL_GNULIB_GETTIMEOFDAY
GL_COND_OBJ_GETTIMEOFDAY_FALSE
GL_COND_OBJ_GETTIMEOFDAY_TRUE
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
LTLIBINTL
LIBINTL
GL_GNULIB_GETRANDOM
GL_COND_OBJ_GETRANDOM_FALSE
GL_COND_OBJ_GETRANDOM_TRUE
LIB_GETRANDOM
REPLACE_GETRANDOM
HAVE_GETRANDOM
LIB_GETLOGIN
GL_COND_OBJ_GETLOGIN_R_FALSE
GL_COND_OBJ_GETLOGIN_R_TRUE
GL_COND_OBJ_GETLINE_FALSE
GL_COND_OBJ_GETLINE_TRUE
GL_COND_OBJ_GETDTABLESIZE_FALSE
GL_COND_OBJ_GETDTABLESIZE_TRUE
GL_GNULIB_MDA_TEMPNAM
GL_GNULIB_MDA_PUTW
GL_GNULIB_MDA_GETW
GL_GNULIB_MDA_FILENO
GL_GNULIB_MDA_FDOPEN
GL_GNULIB_MDA_FCLOSEALL
GL_GNULIB_VSPRINTF_POSIX
GL_GNULIB_VSNPRINTF
GL_GNULIB_VPRINTF_POSIX
GL_GNULIB_VPRINTF
GL_GNULIB_VFPRINTF_POSIX
GL_GNULIB_VFPRINTF
GL_GNULIB_VDPRINTF
GL_GNULIB_VSCANF
GL_GNULIB_VFSCANF
GL_GNULIB_VASPRINTF
GL_GNULIB_TMPFILE
GL_GNULIB_STDIO_H_SIGPIPE
GL_GNULIB_STDIO_H_NONBLOCKING
GL_GNULIB_SPRINTF_POSIX
GL_GNULIB_SNPRINTF
GL_GNULIB_SCANF
GL_GNULIB_RENAMEAT
GL_GNULIB_RENAME
GL_GNULIB_REMOVE
GL_GNULIB_PUTS
GL_GNULIB_PUTCHAR
GL_GNULIB_PUTC
GL_GNULIB_PRINTF_POSIX
GL_GNULIB_PRINTF
GL_GNULIB_POPEN
GL_GNULIB_PERROR
GL_GNULIB_PCLOSE
GL_GNULIB_OBSTACK_PRINTF_POSIX
GL_GNULIB_OBSTACK_PRINTF
GL_GNULIB_GETLINE
GL_GNULIB_GETDELIM
GL_GNULIB_GETCHAR
GL_GNULIB_GETC
GL_GNULIB_FWRITE
GL_GNULIB_FTELLO
GL_GNULIB_FTELL
GL_GNULIB_FSEEKO
GL_GNULIB_FSEEK
GL_GNULIB_FSCANF
GL_GNULIB_FREOPEN
GL_GNULIB_FREAD
GL_GNULIB_FPUTS
GL_GNULIB_FPUTC
GL_GNULIB_FPURGE
GL_GNULIB_FPRINTF_POSIX
GL_GNULIB_FPRINTF
GL_GNULIB_FOPEN_GNU
GL_GNULIB_FOPEN
GL_GNULIB_FGETS
GL_GNULIB_FGETC
GL_GNULIB_FFLUSH
GL_GNULIB_FDOPEN
GL_GNULIB_FCLOSE
GL_GNULIB_DPRINTF
GL_COND_OBJ_GETDELIM_FALSE
GL_COND_OBJ_GETDELIM_TRUE
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_FOR_FOPEN_GNU
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
HAVE_DECL_FCLOSEALL
GL_COND_OBJ_GETCWD_LGPL_FALSE
GL_COND_OBJ_GETCWD_LGPL_TRUE
GL_COND_OBJ_GETCWD_FALSE
GL_COND_OBJ_GETCWD_TRUE
GL_COND_OBJ_FSTATAT_FALSE
GL_COND_OBJ_FSTATAT_TRUE
GL_GNULIB_MDA_UMASK
GL_GNULIB_MDA_MKDIR
GL_GNULIB_MDA_CHMOD
GL_GNULIB_OVERRIDES_STRUCT_STAT
GL_GNULIB_UTIMENSAT
GL_GNULIB_STAT
GL_GNULIB_MKNODAT
GL_GNULIB_MKNOD
GL_GNULIB_MKFIFOAT
GL_GNULIB_MKFIFO
GL_GNULIB_MKDIRAT
GL_GNULIB_MKDIR
GL_GNULIB_LSTAT
GL_GNULIB_LCHMOD
GL_GNULIB_GETUMASK
GL_GNULIB_FUTIMENS
GL_GNULIB_FSTATAT
GL_GNULIB_FSTAT
GL_GNULIB_FCHMODAT
WINDOWS_64_BIT_ST_SIZE
WINDOWS_STAT_TIMESPEC
NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H
NEXT_SYS_STAT_H
GL_COND_OBJ_FSTAT_FALSE
GL_COND_OBJ_FSTAT_TRUE
REPLACE_UTIMENSAT
REPLACE_STAT
REPLACE_MKNODAT
REPLACE_MKNOD
REPLACE_MKFIFOAT
REPLACE_MKFIFO
REPLACE_MKDIR
REPLACE_LSTAT
REPLACE_FUTIMENS
REPLACE_FSTATAT
REPLACE_FSTAT
REPLACE_FCHMODAT
HAVE_UTIMENSAT
HAVE_MKNODAT
HAVE_MKNOD
HAVE_MKFIFOAT
HAVE_MKFIFO
HAVE_MKDIRAT
HAVE_LSTAT
HAVE_LCHMOD
HAVE_GETUMASK
HAVE_FUTIMENS
HAVE_FSTATAT
HAVE_FCHMODAT
FREXPL_LIBM
HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
GL_GNULIB_MDA_YN
GL_GNULIB_MDA_Y1
GL_GNULIB_MDA_Y0
GL_GNULIB_MDA_JN
GL_GNULIB_MDA_J1
GL_GNULIB_MDA_J0
GL_GNULIB_TRUNCL
GL_GNULIB_TRUNCF
GL_GNULIB_TRUNC
GL_GNULIB_TANHF
GL_GNULIB_TANL
GL_GNULIB_TANF
GL_GNULIB_SQRTL
GL_GNULIB_SQRTF
GL_GNULIB_SINHF
GL_GNULIB_SINL
GL_GNULIB_SINF
GL_GNULIB_SIGNBIT
GL_GNULIB_ROUNDL
GL_GNULIB_ROUNDF
GL_GNULIB_ROUND
GL_GNULIB_RINTL
GL_GNULIB_RINTF
GL_GNULIB_RINT
GL_GNULIB_REMAINDERL
GL_GNULIB_REMAINDERF
GL_GNULIB_REMAINDER
GL_GNULIB_POWF
GL_GNULIB_MODFL
GL_GNULIB_MODFF
GL_GNULIB_MODF
GL_GNULIB_LOGBL
GL_GNULIB_LOGBF
GL_GNULIB_LOGB
GL_GNULIB_LOG2L
GL_GNULIB_LOG2F
GL_GNULIB_LOG2
GL_GNULIB_LOG1PL
GL_GNULIB_LOG1PF
GL_GNULIB_LOG1P
GL_GNULIB_LOG10L
GL_GNULIB_LOG10F
GL_GNULIB_LOG10
GL_GNULIB_LOGL
GL_GNULIB_LOGF
GL_GNULIB_LOG
GL_GNULIB_LDEXPL
GL_GNULIB_LDEXPF
GL_GNULIB_ISNANL
GL_GNULIB_ISNAND
GL_GNULIB_ISNANF
GL_GNULIB_ISNAN
GL_GNULIB_ISINF
GL_GNULIB_ISFINITE
GL_GNULIB_ILOGBL
GL_GNULIB_ILOGBF
GL_GNULIB_ILOGB
GL_GNULIB_HYPOTL
GL_GNULIB_HYPOTF
GL_GNULIB_HYPOT
GL_GNULIB_FREXPL
GL_GNULIB_FREXP
GL_GNULIB_FREXPF
GL_GNULIB_FMODL
GL_GNULIB_FMODF
GL_GNULIB_FMOD
GL_GNULIB_FMAL
GL_GNULIB_FMAF
GL_GNULIB_FMA
GL_GNULIB_FLOORL
GL_GNULIB_FLOORF
GL_GNULIB_FLOOR
GL_GNULIB_FABSL
GL_GNULIB_FABSF
GL_GNULIB_EXPM1L
GL_GNULIB_EXPM1F
GL_GNULIB_EXPM1
GL_GNULIB_EXP2L
GL_GNULIB_EXP2F
GL_GNULIB_EXP2
GL_GNULIB_EXPL
GL_GNULIB_EXPF
GL_GNULIB_COSHF
GL_GNULIB_COSL
GL_GNULIB_COSF
GL_GNULIB_COPYSIGNL
GL_GNULIB_COPYSIGNF
GL_GNULIB_COPYSIGN
GL_GNULIB_CEILL
GL_GNULIB_CEILF
GL_GNULIB_CEIL
GL_GNULIB_CBRTL
GL_GNULIB_CBRTF
GL_GNULIB_CBRT
GL_GNULIB_ATAN2F
GL_GNULIB_ATANL
GL_GNULIB_ATANF
GL_GNULIB_ASINL
GL_GNULIB_ASINF
GL_GNULIB_ACOSL
GL_GNULIB_ACOSF
FREXP_LIBM
REPLACE_TRUNCL
REPLACE_TRUNCF
REPLACE_TRUNC
REPLACE_TANHF
REPLACE_TANF
REPLACE_SQRTL
REPLACE_SQRTF
REPLACE_SINHF
REPLACE_SINF
REPLACE_SIGNBIT_USING_BUILTINS
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
GL_COND_OBJ_FREE_FALSE
GL_COND_OBJ_FREE_TRUE
GL_GENERATE_FNMATCH_H_FALSE
GL_GENERATE_FNMATCH_H_TRUE
FNMATCH_H
GL_GNULIB_FNMATCH
HAVE_FNMATCH_H
NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H
NEXT_FNMATCH_H
REPLACE_FNMATCH
HAVE_FNMATCH
GL_COND_OBJ_ITOLD_FALSE
GL_COND_OBJ_ITOLD_TRUE
GL_COND_OBJ_FLOAT_FALSE
GL_COND_OBJ_FLOAT_TRUE
GL_GENERATE_FLOAT_H_FALSE
GL_GENERATE_FLOAT_H_TRUE
FLOAT_H
REPLACE_ITOLD
NEXT_AS_FIRST_DIRECTIVE_FLOAT_H
NEXT_FLOAT_H
GL_GNULIB_FFS
GL_COND_OBJ_FFS_FALSE
GL_COND_OBJ_FFS_TRUE
HAVE_DECL_STRNCASECMP
HAVE_STRCASECMP
HAVE_FFS
GL_COND_OBJ_FDOPENDIR_FALSE
GL_COND_OBJ_FDOPENDIR_TRUE
NEXT_AS_FIRST_DIRECTIVE_FCNTL_H
NEXT_FCNTL_H
GL_GNULIB_MDA_OPEN
GL_GNULIB_MDA_CREAT
GL_GNULIB_OPENAT
GL_GNULIB_OPEN
GL_GNULIB_NONBLOCKING
GL_GNULIB_FCNTL
GL_GNULIB_CREAT
GL_COND_OBJ_FCNTL_FALSE
GL_COND_OBJ_FCNTL_TRUE
REPLACE_OPENAT
REPLACE_OPEN
REPLACE_FCNTL
REPLACE_CREAT
HAVE_OPENAT
HAVE_FCNTL
GL_COND_OBJ_FCHDIR_FALSE
GL_COND_OBJ_FCHDIR_TRUE
GL_COND_OBJ_ERROR_FALSE
GL_COND_OBJ_ERROR_TRUE
GL_GENERATE_ERRNO_H_FALSE
GL_GENERATE_ERRNO_H_TRUE
ERRNO_H
EOVERFLOW_VALUE
EOVERFLOW_HIDDEN
ENOLINK_VALUE
ENOLINK_HIDDEN
EMULTIHOP_VALUE
EMULTIHOP_HIDDEN
NEXT_AS_FIRST_DIRECTIVE_ERRNO_H
NEXT_ERRNO_H
GL_COND_OBJ_DUP2_FALSE
GL_COND_OBJ_DUP2_TRUE
GL_COND_OBJ_DUP_FALSE
GL_COND_OBJ_DUP_TRUE
GL_COND_OBJ_DIRFD_FALSE
GL_COND_OBJ_DIRFD_TRUE
HAVE_DIRENT_H
NEXT_AS_FIRST_DIRECTIVE_DIRENT_H
NEXT_DIRENT_H
GL_GNULIB_ISBLANK
NEXT_AS_FIRST_DIRECTIVE_CTYPE_H
NEXT_CTYPE_H
HAVE_ISBLANK
GL_COND_OBJ_CONNECT_FALSE
GL_COND_OBJ_CONNECT_TRUE
GL_GNULIB_ALPHASORT
GL_GNULIB_SCANDIR
GL_GNULIB_FDOPENDIR
GL_GNULIB_DIRFD
GL_GNULIB_CLOSEDIR
GL_GNULIB_REWINDDIR
GL_GNULIB_READDIR
GL_GNULIB_OPENDIR
GL_COND_OBJ_CLOSEDIR_FALSE
GL_COND_OBJ_CLOSEDIR_TRUE
REPLACE_FDOPENDIR
REPLACE_DIRFD
REPLACE_CLOSEDIR
REPLACE_OPENDIR
HAVE_ALPHASORT
HAVE_SCANDIR
HAVE_FDOPENDIR
HAVE_DECL_FDOPENDIR
HAVE_DECL_DIRFD
HAVE_CLOSEDIR
HAVE_REWINDDIR
HAVE_READDIR
HAVE_OPENDIR
GL_COND_OBJ_CLOSE_FALSE
GL_COND_OBJ_CLOSE_TRUE
HAVE_MSVC_INVALID_PARAMETER_HANDLER
LIB_CLOCK_GETTIME
GL_COND_OBJ_FCHOWN_STUB_FALSE
GL_COND_OBJ_FCHOWN_STUB_TRUE
GL_COND_OBJ_CHOWN_FALSE
GL_COND_OBJ_CHOWN_TRUE
GL_COND_OBJ_CHDIR_LONG_FALSE
GL_COND_OBJ_CHDIR_LONG_TRUE
GL_GNULIB_MDA_WRITE
GL_GNULIB_MDA_UNLINK
GL_GNULIB_MDA_SWAB
GL_GNULIB_MDA_RMDIR
GL_GNULIB_MDA_READ
GL_GNULIB_MDA_LSEEK
GL_GNULIB_MDA_ISATTY
GL_GNULIB_MDA_GETPID
GL_GNULIB_MDA_GETCWD
GL_GNULIB_MDA_EXECVPE
GL_GNULIB_MDA_EXECVP
GL_GNULIB_MDA_EXECVE
GL_GNULIB_MDA_EXECV
GL_GNULIB_MDA_EXECLP
GL_GNULIB_MDA_EXECLE
GL_GNULIB_MDA_EXECL
GL_GNULIB_MDA_DUP2
GL_GNULIB_MDA_DUP
GL_GNULIB_MDA_CLOSE
GL_GNULIB_MDA_CHDIR
GL_GNULIB_MDA_ACCESS
GL_GNULIB_WRITE
GL_GNULIB_USLEEP
GL_GNULIB_UNLINKAT
GL_GNULIB_UNLINK
GL_GNULIB_UNISTD_H_SIGPIPE
GL_GNULIB_UNISTD_H_NONBLOCKING
GL_GNULIB_UNISTD_H_GETOPT
GL_GNULIB_TTYNAME_R
GL_GNULIB_TRUNCATE
GL_GNULIB_SYMLINKAT
GL_GNULIB_SYMLINK
GL_GNULIB_SLEEP
GL_GNULIB_SETHOSTNAME
GL_GNULIB_RMDIR
GL_GNULIB_READLINKAT
GL_GNULIB_READLINK
GL_GNULIB_READ
GL_GNULIB_PWRITE
GL_GNULIB_PREAD
GL_GNULIB_PIPE2
GL_GNULIB_PIPE
GL_GNULIB_LSEEK
GL_GNULIB_LINKAT
GL_GNULIB_LINK
GL_GNULIB_LCHOWN
GL_GNULIB_ISATTY
GL_GNULIB_GROUP_MEMBER
GL_GNULIB_GETUSERSHELL
GL_GNULIB_GETPASS_GNU
GL_GNULIB_GETPASS
GL_GNULIB_GETPAGESIZE
GL_GNULIB_GETOPT_POSIX
GL_GNULIB_GETLOGIN_R
GL_GNULIB_GETLOGIN
GL_GNULIB_GETHOSTNAME
GL_GNULIB_GETGROUPS
GL_GNULIB_GETENTROPY
GL_GNULIB_GETDTABLESIZE
GL_GNULIB_GETDOMAINNAME
GL_GNULIB_GETCWD
GL_GNULIB_FTRUNCATE
GL_GNULIB_FSYNC
GL_GNULIB_FDATASYNC
GL_GNULIB_FCHOWNAT
GL_GNULIB_FCHDIR
GL_GNULIB_FACCESSAT
GL_GNULIB_EXECVPE
GL_GNULIB_EXECVP
GL_GNULIB_EXECVE
GL_GNULIB_EXECV
GL_GNULIB_EXECLP
GL_GNULIB_EXECLE
GL_GNULIB_EXECL
GL_GNULIB_EUIDACCESS
GL_GNULIB_ENVIRON
GL_GNULIB_DUP3
GL_GNULIB_DUP2
GL_GNULIB_DUP
GL_GNULIB_COPY_FILE_RANGE
GL_GNULIB_CLOSE
GL_GNULIB_CHOWN
GL_GNULIB_CHDIR
GL_GNULIB_ACCESS
GL_COND_OBJ_CANONICALIZE_LGPL_FALSE
GL_COND_OBJ_CANONICALIZE_LGPL_TRUE
REPLACE_WCTOMB
REPLACE_UNSETENV
REPLACE_STRTOULL
REPLACE_STRTOUL
REPLACE_STRTOLL
REPLACE_STRTOLD
REPLACE_STRTOL
REPLACE_STRTOD
REPLACE_SETSTATE
REPLACE_SETENV
REPLACE_REALPATH
REPLACE_REALLOCARRAY
REPLACE_REALLOC_FOR_REALLOC_POSIX
REPLACE_REALLOC_FOR_REALLOC_GNU
REPLACE_RANDOM_R
REPLACE_RANDOM
REPLACE_QSORT_R
REPLACE_PUTENV
REPLACE_PTSNAME_R
REPLACE_PTSNAME
REPLACE_POSIX_MEMALIGN
REPLACE_MKSTEMP
REPLACE_MBTOWC
REPLACE_MALLOC_FOR_MALLOC_POSIX
REPLACE_MALLOC_FOR_MALLOC_GNU
REPLACE_INITSTATE
REPLACE_FREE
REPLACE_CANONICALIZE_FILE_NAME
REPLACE_CALLOC_FOR_CALLOC_POSIX
REPLACE_CALLOC_FOR_CALLOC_GNU
REPLACE_ALIGNED_ALLOC
HAVE_DECL_UNSETENV
HAVE_UNLOCKPT
HAVE_SYS_LOADAVG_H
HAVE_STRUCT_RANDOM_DATA
HAVE_STRTOULL
HAVE_STRTOUL
HAVE_STRTOLL
HAVE_STRTOLD
HAVE_STRTOL
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_POSIX_MEMALIGN
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_DECL_GCVT
HAVE_DECL_FCVT
HAVE_DECL_ECVT
HAVE_CANONICALIZE_FILE_NAME
HAVE_ATOLL
HAVE_ALIGNED_ALLOC
HAVE__EXIT
GL_GNULIB_MDA_PUTENV
GL_GNULIB_MDA_MKTEMP
GL_GNULIB_MDA_GCVT
GL_GNULIB_MDA_FCVT
GL_GNULIB_MDA_ECVT
GL_GNULIB_WCTOMB
GL_GNULIB_UNSETENV
GL_GNULIB_UNLOCKPT
GL_GNULIB_SYSTEM_POSIX
GL_GNULIB_STRTOULL
GL_GNULIB_STRTOUL
GL_GNULIB_STRTOLL
GL_GNULIB_STRTOLD
GL_GNULIB_STRTOL
GL_GNULIB_STRTOD
GL_GNULIB_SETENV
GL_GNULIB_SECURE_GETENV
GL_GNULIB_RPMATCH
GL_GNULIB_REALPATH
GL_GNULIB_REALLOC_POSIX
GL_GNULIB_REALLOC_GNU
GL_GNULIB_REALLOCARRAY
GL_GNULIB_RANDOM_R
GL_GNULIB_RANDOM
GL_GNULIB_QSORT_R
GL_GNULIB_PUTENV
GL_GNULIB_PTSNAME_R
GL_GNULIB_PTSNAME
GL_GNULIB_POSIX_OPENPT
GL_GNULIB_POSIX_MEMALIGN
GL_GNULIB_MKSTEMPS
GL_GNULIB_MKSTEMP
GL_GNULIB_MKOSTEMPS
GL_GNULIB_MKOSTEMP
GL_GNULIB_MKDTEMP
GL_GNULIB_MBTOWC
GL_GNULIB_MALLOC_POSIX
GL_GNULIB_MALLOC_GNU
GL_GNULIB_GRANTPT
GL_GNULIB_GETSUBOPT
GL_GNULIB_GETLOADAVG
GL_GNULIB_FREE_POSIX
GL_GNULIB_CANONICALIZE_FILE_NAME
GL_GNULIB_CALLOC_POSIX
GL_GNULIB_CALLOC_GNU
GL_GNULIB_ATOLL
GL_GNULIB_ALIGNED_ALLOC
GL_GNULIB__EXIT
GL_GNULIB_MDA_WCSDUP
GL_GNULIB_WCSFTIME
GL_GNULIB_WCSWIDTH
GL_GNULIB_WCSTOK
GL_GNULIB_WCSSTR
GL_GNULIB_WCSPBRK
GL_GNULIB_WCSSPN
GL_GNULIB_WCSCSPN
GL_GNULIB_WCSRCHR
GL_GNULIB_WCSCHR
GL_GNULIB_WCSDUP
GL_GNULIB_WCSXFRM
GL_GNULIB_WCSCOLL
GL_GNULIB_WCSNCASECMP
GL_GNULIB_WCSCASECMP
GL_GNULIB_WCSNCMP
GL_GNULIB_WCSCMP
GL_GNULIB_WCSNCAT
GL_GNULIB_WCSCAT
GL_GNULIB_WCPNCPY
GL_GNULIB_WCSNCPY
GL_GNULIB_WCPCPY
GL_GNULIB_WCSCPY
GL_GNULIB_WCSNLEN
GL_GNULIB_WCSLEN
GL_GNULIB_WMEMSET
GL_GNULIB_WMEMPCPY
GL_GNULIB_WMEMMOVE
GL_GNULIB_WMEMCPY
GL_GNULIB_WMEMCMP
GL_GNULIB_WMEMCHR
GL_GNULIB_WCWIDTH
GL_GNULIB_WCSNRTOMBS
GL_GNULIB_WCSRTOMBS
GL_GNULIB_WCRTOMB
GL_GNULIB_MBSNRTOWCS
GL_GNULIB_MBSRTOWCS
GL_GNULIB_MBRLEN
GL_GNULIB_MBRTOWC
GL_GNULIB_MBSINIT
GL_GNULIB_WCTOB
GL_GNULIB_BTOWC
GL_COND_OBJ_BTOWC_FALSE
GL_COND_OBJ_BTOWC_TRUE
LOCALE_FR
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_WCSDUP
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_WMEMPCPY
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
GL_COND_OBJ_BIND_FALSE
GL_COND_OBJ_BIND_TRUE
GL_GNULIB_INET_PTON
GL_GNULIB_INET_NTOP
HAVE_FEATURES_H
NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H
NEXT_ARPA_INET_H
HAVE_ARPA_INET_H
REPLACE_INET_PTON
REPLACE_INET_NTOP
HAVE_DECL_INET_PTON
HAVE_DECL_INET_NTOP
MKDIR_P
GL_GENERATE_ALLOCA_H_FALSE
GL_GENERATE_ALLOCA_H_TRUE
ALLOCA_H
HAVE_ALLOCA_H
ALLOCA
GL_GNULIB_ACCEPT4
GL_GNULIB_SHUTDOWN
GL_GNULIB_SETSOCKOPT
GL_GNULIB_SENDTO
GL_GNULIB_RECVFROM
GL_GNULIB_SEND
GL_GNULIB_RECV
GL_GNULIB_LISTEN
GL_GNULIB_GETSOCKOPT
GL_GNULIB_GETSOCKNAME
GL_GNULIB_GETPEERNAME
GL_GNULIB_BIND
GL_GNULIB_ACCEPT
GL_GNULIB_CONNECT
GL_GNULIB_SOCKET
GL_COND_OBJ_ACCEPT_FALSE
GL_COND_OBJ_ACCEPT_TRUE
HAVE_WINSOCK2_H
UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS
UNISTD_H_HAVE_WINSOCK2_H
UNISTD_H_HAVE_SYS_RANDOM_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_FOR_GETPASS_GNU
REPLACE_GETPASS
REPLACE_GETPAGESIZE
REPLACE_GETGROUPS
REPLACE_GETLOGIN_R
REPLACE_GETDTABLESIZE
REPLACE_GETDOMAINNAME
REPLACE_GETCWD
REPLACE_FTRUNCATE
REPLACE_FCHOWNAT
REPLACE_FACCESSAT
REPLACE_EXECVPE
REPLACE_EXECVP
REPLACE_EXECVE
REPLACE_EXECV
REPLACE_EXECLP
REPLACE_EXECLE
REPLACE_EXECL
REPLACE_DUP2
REPLACE_DUP
REPLACE_COPY_FILE_RANGE
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_EXECVPE
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_GETENTROPY
HAVE_GETDTABLESIZE
HAVE_FTRUNCATE
HAVE_FSYNC
HAVE_FDATASYNC
HAVE_FCHOWNAT
HAVE_FCHDIR
HAVE_FACCESSAT
HAVE_EXECVPE
HAVE_EUIDACCESS
HAVE_DUP3
HAVE_COPY_FILE_RANGE
HAVE_CHOWN
HAVE_WS2TCPIP_H
HAVE_SYS_SOCKET_H
NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H
NEXT_SYS_SOCKET_H
PRAGMA_COLUMNS
PRAGMA_SYSTEM_HEADER
INCLUDE_NEXT_AS_FIRST_DIRECTIVE
INCLUDE_NEXT
HAVE_ACCEPT4
HAVE_SA_FAMILY_T
HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY
HAVE_STRUCT_SOCKADDR_STORAGE
GL_COND_LIBTOOL_FALSE
GL_COND_LIBTOOL_TRUE
RANLIB
ARFLAGS
AR
LARGEFILE_CPPFLAGS
target_os
target_vendor
target_cpu
target
host_os
host_vendor
host_cpu
host
build_os
build_vendor
build_cpu
build
EGREP
GREP
CPP
OBJEXT
EXEEXT
ac_ct_CC
CPPFLAGS
LDFLAGS
CFLAGS
CC
MAINT
MAINTAINER_MODE_FALSE
MAINTAINER_MODE_TRUE
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'
ac_subst_files=''
ac_user_opts='
enable_option_checking
enable_maintainer_mode
enable_plugins
enable_largefile
enable_year2038
enable_threads
enable_cross_guesses
enable_dependency_tracking
enable_silent_rules
'
      ac_precious_vars='build_alias
host_alias
target_alias
CC
CFLAGS
LDFLAGS
LIBS
CPPFLAGS
CPP'


# 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 libgnu UNUSED-VERSION 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/libgnu]
  --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]
  --target=TARGET   configure for building compilers for TARGET [HOST]
_ACEOF
fi

if test -n "$ac_init_help"; then
  case $ac_init_help in
     short | recursive ) echo "Configuration of libgnu UNUSED-VERSION:";;
   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-maintainer-mode
                          enable make rules and dependencies not useful (and
                          sometimes confusing) to the casual installer
  --enable-plugins        Enable support for plugins
  --disable-largefile     omit support for large files
  --disable-year2038      omit support for timestamps past the year 2038
  --enable-threads={isoc|posix|isoc+posix|windows}
                          specify multithreading API
  --disable-threads       build without multithread safety
  --enable-cross-guesses={conservative|risky}
                          specify policy for cross-compilation guesses
  --enable-dependency-tracking
                          do not reject slow dependency extractors
  --disable-dependency-tracking
                          speeds up one-time build
  --enable-silent-rules   less verbose build output (undo: "make V=1")
  --disable-silent-rules  verbose build output (undo: "make V=0")

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>
  CPP         C preprocessor

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 the package provider.
_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
libgnu configure UNUSED-VERSION
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_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_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_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_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_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_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;}
    ;;
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_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_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

# 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 ()
{
  ac_save_ac_compile="$ac_compile"
  if test -n "$ac_compile_for_check_decl"; then
    ac_compile="$ac_compile_for_check_decl"
  fi
  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_compile="$ac_save_ac_compile"

} # ac_fn_c_check_decl

# 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
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 libgnu $as_me UNUSED-VERSION, 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 " wchar.h"
as_fn_append ac_header_list " minix/config.h"
as_fn_append ac_header_list " sys/socket.h"
as_fn_append ac_header_list " arpa/inet.h"
as_fn_append ac_header_list " features.h"
as_fn_append ac_func_list " btowc"
as_fn_append ac_func_list " canonicalize_file_name"
as_fn_append ac_func_list " faccessat"
as_fn_append ac_func_list " realpath"
as_fn_append ac_func_list " lstat"
as_fn_append ac_header_list " sys/param.h"
as_fn_append ac_header_list " unistd.h"
as_fn_append ac_func_list " chown"
as_fn_append ac_func_list " fchown"
as_fn_append ac_func_list " _set_invalid_parameter_handler"
as_fn_append ac_func_list " fchdir"
as_fn_append ac_header_list " dirent.h"
as_fn_append ac_func_list " fcntl"
as_fn_append ac_func_list " symlink"
as_fn_append ac_func_list " fdopendir"
as_fn_append ac_func_list " mempcpy"
as_fn_append ac_header_list " fnmatch.h"
as_fn_append ac_func_list " fnmatch"
as_fn_append ac_func_list " mbsrtowcs"
gl_fnmatch_required=GNU
as_fn_append ac_header_list " sys/stat.h"
as_fn_append ac_func_list " fstatat"
as_fn_append ac_func_list " getdelim"
as_fn_append ac_func_list " getdtablesize"
as_fn_append ac_func_list " getlogin_r"
as_fn_append ac_func_list " getprogname"
as_fn_append ac_func_list " getexecname"
as_fn_append ac_func_list " getrandom"
as_fn_append ac_header_list " sys/time.h"
as_fn_append ac_func_list " gettimeofday"
as_fn_append ac_header_list " glob.h"
as_fn_append ac_func_list " glob"
as_fn_append ac_func_list " glob_pattern_p"
as_fn_append ac_func_list " getpwnam_r"
as_fn_append ac_header_list " threads.h"
as_fn_append ac_header_list " netdb.h"
as_fn_append ac_header_list " netinet/in.h"
as_fn_append ac_header_list " limits.h"
as_fn_append ac_header_list " inttypes.h"
as_fn_append ac_header_list " sys/types.h"
as_fn_append ac_header_list " stdint.h"
as_fn_append ac_func_list " isblank"
as_fn_append ac_header_list " xlocale.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_header_list " sys/mman.h"
as_fn_append ac_func_list " mprotect"
as_fn_append ac_func_list " mkostemp"
as_fn_append ac_func_list " openat"
as_fn_append ac_func_list " pipe"
as_fn_append ac_func_list " readlink"
as_fn_append ac_func_list " link"
as_fn_append ac_header_list " sys/select.h"
as_fn_append ac_func_list " setenv"
as_fn_append ac_func_list " strerror_r"
as_fn_append ac_func_list " __xpg_strerror_r"
as_fn_append ac_func_list " catgets"
as_fn_append ac_func_list " snprintf"
as_fn_append ac_header_list " strings.h"
as_fn_append ac_header_list " sys/random.h"
as_fn_append ac_header_list " sys/uio.h"
as_fn_append ac_header_list " sys/wait.h"
as_fn_append ac_func_list " localtime_r"
as_fn_append ac_header_list " crtdefs.h"
as_fn_append ac_func_list " iswcntrl"
as_fn_append ac_header_list " wctype.h"
as_fn_append ac_func_list " wmempcpy"
# 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






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




{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
    # Check whether --enable-maintainer-mode was given.
if test "${enable_maintainer_mode+set}" = set; then :
  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
else
  USE_MAINTAINER_MODE=no
fi

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

  MAINT=$MAINTAINER_MODE_TRUE



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


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

           #ifdef __clang__
           barfbarf
           #endif

int
main ()
{

  ;
  return 0;
}

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

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


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler option needed when checking for declarations" >&5
$as_echo_n "checking for compiler option needed when checking for declarations... " >&6; }
if ${gl_cv_compiler_check_decl_option+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test $gl_cv_compiler_clang = yes; then
                     save_ac_compile="$ac_compile"
       ac_compile="$ac_compile -Werror=implicit-function-declaration"
                     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration'
else
  gl_cv_compiler_check_decl_option=none
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
       ac_compile="$save_ac_compile"
     else
       gl_cv_compiler_check_decl_option=none
     fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_check_decl_option" >&5
$as_echo "$gl_cv_compiler_check_decl_option" >&6; }
  if test "x$gl_cv_compiler_check_decl_option" != xnone; then
    ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option"
  else
    ac_compile_for_check_decl="$ac_compile"
  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 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





  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









  { $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; }

  { $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
    if test $ac_cv_header_wchar_h = yes; then :
  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
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; }

  $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 _HPUX_ALT_XOPEN_SOCKET_API 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

  if test $ac_cv_header_minix_config_h = yes; then :
  MINIX=yes
    $as_echo "#define _MINIX 1" >>confdefs.h

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

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

else
  MINIX=
fi
  if test $ac_cv_safe_to_define___extensions__ = yes; then :
  $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h

fi
  if test $ac_cv_should_define__xopen_source = yes; then :
  $as_echo "#define _XOPEN_SOURCE 500" >>confdefs.h

fi

# Needs to run before gl_EARLY so it can override AC_SYS_LARGEFILE included
# there.
ac_aux_dir=
for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; 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 \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$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.


# 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


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

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


# The aliases save the names the user supplied, while $host etc.
# will get canonicalized.
test -n "$target_alias" &&
  test "$program_prefix$program_suffix$program_transform_name" = \
    NONENONEs,x,x, &&
  program_prefix=${target_alias}-

# The tests for host and target for $enable_largefile require
# canonical names.



# As the $enable_largefile decision depends on --enable-plugins we must set it
# even in directories otherwise not depending on the $plugins option.


  maybe_plugins=no
  for ac_header in dlfcn.h
do :
  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
"
if test "x$ac_cv_header_dlfcn_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_DLFCN_H 1
_ACEOF
 maybe_plugins=yes
fi

done

  for ac_header in windows.h
do :
  ac_fn_c_check_header_compile "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default
"
if test "x$ac_cv_header_windows_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_WINDOWS_H 1
_ACEOF
 maybe_plugins=yes
fi

done


  # Check whether --enable-plugins was given.
if test "${enable_plugins+set}" = set; then :
  enableval=$enable_plugins; case "${enableval}" in
      no) plugins=no ;;
      *) plugins=yes
         if test "$maybe_plugins" != "yes" ; then
	   as_fn_error $? "Building with plugin support requires a host that supports dlopen." "$LINENO" 5
	 fi ;;
     esac
else
  plugins=$maybe_plugins

fi

  if test "$plugins" = "yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlsym" >&5
$as_echo_n "checking for library containing dlsym... " >&6; }
if ${ac_cv_search_dlsym+:} 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 dlsym ();
int
main ()
{
return dlsym ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' dl; 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_dlsym=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if ${ac_cv_search_dlsym+:} false; then :
  break
fi
done
if ${ac_cv_search_dlsym+:} false; then :

else
  ac_cv_search_dlsym=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlsym" >&5
$as_echo "$ac_cv_search_dlsym" >&6; }
ac_res=$ac_cv_search_dlsym
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

fi

  fi


case "${host}" in
  sparc-*-solaris*|i?86-*-solaris*)
    # On native 32-bit Solaris/SPARC and x86, large-file and procfs support
    # were mutually exclusive until Solaris 11.3.  Without procfs support,
    # the bfd/ elf module cannot provide certain routines such as
    # elfcore_write_prpsinfo or elfcore_write_prstatus.  So unless the user
    # explicitly requested large-file support through the
    # --enable-largefile switch, disable large-file support in favor of
    # procfs support.
    #
    # Check if <sys/procfs.h> is incompatible with large-file support.
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#define _FILE_OFFSET_BITS 64
#define _STRUCTURED_PROC 1
#include <sys/procfs.h>
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  acx_cv_procfs_lfs=yes
else
  acx_cv_procfs_lfs=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    #
    # Forcefully disable large-file support only if necessary, gdb is in
    # tree and enabled.
    if test "${target}" = "${host}" -a "$acx_cv_procfs_lfs" = no \
         -a -d $srcdir/../gdb -a "$enable_gdb" != no; then
      : ${enable_largefile="no"}
      if test "$plugins" = yes; then
	{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
plugin support disabled; require large-file support which is incompatible with GDB." >&5
$as_echo "$as_me: WARNING:
plugin support disabled; require large-file support which is incompatible with GDB." >&2;}
	plugins=no
      fi
    fi
    #
    # Explicitly undef _FILE_OFFSET_BITS if enable_largefile=no for the
    # benefit of g++ 9+ which predefines it on Solaris.
    if test "$enable_largefile" = no; then
      LARGEFILE_CPPFLAGS="-U_FILE_OFFSET_BITS"

    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 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
  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 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
  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.  */
#undef _FILE_OFFSET_BITS
#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 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
  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*
  case $ac_cv_sys_file_offset_bits in #(
  unknown) :
    { $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 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
  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.  */
#undef _LARGE_FILES
#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 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
  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* ;; #(
  64) :

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

 if test "$enable_year2038" != no; then :

                            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for time_t past the year 2038" >&5
$as_echo_n "checking for time_t past the year 2038... " >&6; }
if ${gl_cv_type_time_t_y2038+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

  #include <time.h>
  /* Check that time_t can represent 2**32 - 1 correctly.  */
  #define LARGE_TIME_T \\
    ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30)))
  int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535
                           && LARGE_TIME_T % 65537 == 0)
                          ? 1 : -1];

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_type_time_t_y2038=yes
else
  gl_cv_type_time_t_y2038=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_time_t_y2038" >&5
$as_echo "$gl_cv_type_time_t_y2038" >&6; }
  if test "$gl_cv_type_time_t_y2038" = no; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit time_t with _TIME_BITS=64" >&5
$as_echo_n "checking for 64-bit time_t with _TIME_BITS=64... " >&6; }
if ${gl_cv_type_time_t_bits_macro+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#define _TIME_BITS 64
                           #define _FILE_OFFSET_BITS 64

  #include <time.h>
  /* Check that time_t can represent 2**32 - 1 correctly.  */
  #define LARGE_TIME_T \\
    ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30)))
  int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535
                           && LARGE_TIME_T % 65537 == 0)
                          ? 1 : -1];

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_type_time_t_bits_macro=yes
else
  gl_cv_type_time_t_bits_macro=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_time_t_bits_macro" >&5
$as_echo "$gl_cv_type_time_t_bits_macro" >&6; }
    if test "$gl_cv_type_time_t_bits_macro" = yes; then

$as_echo "#define _TIME_BITS 64" >>confdefs.h


$as_echo "#define _FILE_OFFSET_BITS 64" >>confdefs.h

      gl_cv_type_time_t_y2038=yes
    fi
  fi
  if test $gl_cv_type_time_t_y2038 = no; then
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef _USE_32BIT_TIME_T
             int ok;
           #else
             error fail
           #endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; 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 $? "The 'time_t' type stops working after January 2038.
          Remove _USE_32BIT_TIME_T from the compiler flags.
See \`config.log' for more details" "$LINENO" 5; }
else
  # If not cross-compiling and  says we should check,
       # and 'touch' works with a large timestamp, then evidently wider time_t
       # is desired and supported, so fail and ask the builder to fix the
       # problem.  Otherwise, just warn the builder.

       if test "$gl_warned_about_y2038" != yes; then
         { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The 'time_t' type stops working after January 2038,
            and this package needs a wider 'time_t' type
            if there is any way to access timestamps after that.
            Configure with 'CC=\"${CC} -m64\"' perhaps?" >&5
$as_echo "$as_me: WARNING: The 'time_t' type stops working after January 2038,
            and this package needs a wider 'time_t' type
            if there is any way to access timestamps after that.
            Configure with 'CC=\"${CC} -m64\"' perhaps?" >&2;}
         gl_warned_about_y2038=yes
       fi

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  fi
fi
 ;; #(
  *) :
     ;;
esac
fi






  case "$host_os" in
    openbsd*)

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

      ;;
  esac




  { $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





  # 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



  case "$host_os" in
    mingw*)

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

      ;;
  esac







  # 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 accept:
  # Code from module alloca:
  # Code from module alloca-opt:
  # Code from module arpa_inet:
  # Code from module assure:
  # Code from module at-internal:
  # Code from module attribute:
  # Code from module basename-lgpl:
  # Code from module bind:
  # Code from module btowc:
  # Code from module builtin-expect:
  # Code from module c-ctype:
  # Code from module c99:
  # Code from module canonicalize-lgpl:
  # Code from module chdir:
  # Code from module chdir-long:
  # Code from module chown:
  # Code from module clock-time:
  # Code from module cloexec:
  # Code from module close:
  # Code from module closedir:
  # Code from module connect:
  # Code from module count-one-bits:
  # Code from module ctype:
  # Code from module d-ino:
  # Code from module d-type:
  # Code from module dirent:
  # Code from module dirfd:
  # Code from module dirname-lgpl:
  # Code from module double-slash-root:
  # Code from module dup:
  # Code from module dup2:
  # Code from module eloop-threshold:
  # 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 fchdir:
  # Code from module fcntl:
  # Code from module fcntl-h:
  # Code from module fd-hook:
  # Code from module fd-safer-flag:
  # Code from module fdopendir:
  # Code from module ffs:
  # Code from module filename:
  # Code from module filenamecat-lgpl:
  # Code from module flexmember:
  # Code from module float:
  # Code from module fnmatch:
  # Code from module fnmatch-gnu:
  # Code from module fnmatch-h:
  # Code from module fpieee:

  # Code from module fpucw:
  # Code from module free-posix:
  # Code from module frexp:
  # Code from module frexpl:
  # Code from module fstat:
  # Code from module fstatat:
  # Code from module gen-header:
  # Code from module gendocs:
  # Code from module getcwd:
  # Code from module getcwd-lgpl:
  # Code from module getdelim:
  # Code from module getdtablesize:
  # Code from module getline:
  # Code from module getlogin_r:
  # Code from module getprogname:
  # Code from module getrandom:
  # Code from module gettext-h:
  # Code from module gettimeofday:
  # Code from module gitlog-to-changelog:
  # Code from module glob:
  # Code from module glob-h:
  # Code from module hard-locale:
  # Code from module idx:
  # Code from module include_next:
  # Code from module inet_ntop:
  # Code from module intprops:
  # Code from module inttypes:
  # Code from module inttypes-incomplete:
  # Code from module isblank:
  # Code from module isnand-nolibm:
  # Code from module isnanl-nolibm:
  # Code from module largefile:


  # Code from module libc-config:
  # Code from module limits-h:
  # Code from module listen:
  # Code from module localcharset:
  # Code from module locale:
  # Code from module lock:
  # Code from module lstat:
  # Code from module malloc-posix:
  # Code from module malloca:
  # Code from module math:
  # Code from module mbrtowc:
  # Code from module mbsinit:
  # Code from module mbsrtowcs:
  # Code from module mbtowc:
  # Code from module memchr:
  # Code from module memmem:
  # Code from module memmem-simple:
  # Code from module mempcpy:
  # Code from module memrchr:
  # Code from module minmax:
  # Code from module mkdir:
  # Code from module mkdtemp:
  # Code from module mkostemp:
  # Code from module msvc-inval:
  # Code from module msvc-nothrow:
  # Code from module multiarch:
  # Code from module netdb:
  # Code from module netinet_in:
  # Code from module nocrash:
  # Code from module open:
  # Code from module openat:
  # Code from module openat-die:
  # Code from module openat-h:
  # Code from module opendir:
  # Code from module pathmax:
  # Code from module pipe-posix:
  # Code from module rawmemchr:
  # Code from module readdir:
  # Code from module readlink:
  # Code from module realloc-posix:
  # Code from module rename:
  # Code from module rewinddir:
  # Code from module rmdir:
  # Code from module same-inode:
  # Code from module save-cwd:
  # Code from module scratch_buffer:
  # Code from module select:
  # Code from module setenv:
  # Code from module setlocale-null:
  # Code from module setsockopt:
  # Code from module signal-h:
  # 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 socket:
  # Code from module socketlib:
  # Code from module sockets:
  # Code from module socklen:
  # Code from module ssize_t:
  # Code from module stat:
  # Code from module stat-time:
  # Code from module std-gnu11:
  # Code from module stdalign:
  # Code from module stdbool:
  # Code from module stddef:
  # Code from module stdint:
  # Code from module stdio:
  # Code from module stdlib:
  # 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 strings:
  # Code from module strnlen:
  # Code from module strnlen1:
  # Code from module strstr:
  # Code from module strstr-simple:
  # Code from module strtok_r:
  # Code from module sys_random:
  # Code from module sys_select:
  # Code from module sys_socket:
  # Code from module sys_stat:
  # Code from module sys_time:
  # Code from module sys_types:
  # Code from module sys_uio:
  # Code from module sys_wait:
  # Code from module tempname:
  # Code from module threadlib:



  # Code from module time:
  # Code from module time_r:
  # Code from module unistd:
  # Code from module unistd-safer:
  # Code from module unsetenv:
  # Code from module update-copyright:
  # Code from module vararrays:
  # Code from module verify:
  # Code from module wchar:
  # Code from module wctype-h:
  # Code from module windows-mutex:
  # Code from module windows-once:
  # Code from module windows-recmutex:
  # Code from module windows-rwlock:
  # Code from module wmemchr:
  # Code from module wmempcpy:
  # Code from module xalloc-oversized:


ac_aux_dir=
for ac_dir in .. "$srcdir"/..; 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 .. \"$srcdir\"/.." "$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.













                        # 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_



  HAVE_STRUCT_SOCKADDR_STORAGE=1;
  HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=1;

  HAVE_SA_FAMILY_T=1;
  HAVE_ACCEPT4=1;




   if test $ac_cv_header_sys_socket_h = no; then
                         for ac_header in ws2tcpip.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "ws2tcpip.h" "ac_cv_header_ws2tcpip_h" "$ac_includes_default"
if test "x$ac_cv_header_ws2tcpip_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_WS2TCPIP_H 1
_ACEOF

fi

done

   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 source code line length is unlimited" >&5
$as_echo_n "checking whether source code line length is unlimited... " >&6; }
if ${gl_cv_source_line_length_unlimited+:} 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_source_line_length_unlimited=no
else
  gl_cv_source_line_length_unlimited=yes
fi
rm -f conftest*


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



    HAVE_CHOWN=1;
  HAVE_COPY_FILE_RANGE=1;
  HAVE_DUP3=1;
  HAVE_EUIDACCESS=1;
  HAVE_EXECVPE=1;
  HAVE_FACCESSAT=1;
  HAVE_FCHDIR=1;
  HAVE_FCHOWNAT=1;
  HAVE_FDATASYNC=1;
  HAVE_FSYNC=1;
  HAVE_FTRUNCATE=1;
  HAVE_GETDTABLESIZE=1;
  HAVE_GETENTROPY=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_EXECVPE=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_COPY_FILE_RANGE=0;
  REPLACE_DUP=0;
  REPLACE_DUP2=0;
  REPLACE_EXECL=0;
  REPLACE_EXECLE=0;
  REPLACE_EXECLP=0;
  REPLACE_EXECV=0;
  REPLACE_EXECVE=0;
  REPLACE_EXECVP=0;
  REPLACE_EXECVPE=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_GETPASS_FOR_GETPASS_GNU=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_SYS_RANDOM_H=0;
  UNISTD_H_HAVE_WINSOCK2_H=0;
  UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=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
   # Put '__restrict__' first, to avoid problems with glibc and non-GCC; see:
   # https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html
   # Put 'restrict' last, because C++ lacks it.
   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





        case "$host_os" in
    osf*)

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

      ;;
  esac

  GL_GENERATE_SYS_SOCKET_H=false
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <sys/socket.h> is self-contained" >&5
$as_echo_n "checking whether <sys/socket.h> is self-contained... " >&6; }
if ${gl_cv_header_sys_socket_h_selfcontained+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/socket.h>
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_header_sys_socket_h_selfcontained=yes
else
  gl_cv_header_sys_socket_h_selfcontained=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_sys_socket_h_selfcontained" >&5
$as_echo "$gl_cv_header_sys_socket_h_selfcontained" >&6; }
  if test $gl_cv_header_sys_socket_h_selfcontained = yes; then
            for ac_func in shutdown
do :
  ac_fn_c_check_func "$LINENO" "shutdown" "ac_cv_func_shutdown"
if test "x$ac_cv_func_shutdown" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SHUTDOWN 1
_ACEOF

fi
done

    if test $ac_cv_func_shutdown = yes; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <sys/socket.h> defines the SHUT_* macros" >&5
$as_echo_n "checking whether <sys/socket.h> defines the SHUT_* macros... " >&6; }
if ${gl_cv_header_sys_socket_h_shut+:} false; then :
  $as_echo_n "(cached) " >&6
else

          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/socket.h>
int
main ()
{
int a[] = { SHUT_RD, SHUT_WR, SHUT_RDWR };
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_header_sys_socket_h_shut=yes
else
  gl_cv_header_sys_socket_h_shut=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_sys_socket_h_shut" >&5
$as_echo "$gl_cv_header_sys_socket_h_shut" >&6; }
      if test $gl_cv_header_sys_socket_h_shut = no; then
        GL_GENERATE_SYS_SOCKET_H=true
      fi
    fi
  fi
  # We need to check for ws2tcpip.h now.











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

             if test $ac_cv_header_sys_socket_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/socket.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/socket.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_socket_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

          gl_header=$gl_cv_absolute_sys_socket_h
          gl_cv_next_sys_socket_h='"'$gl_header'"'
          else
               gl_cv_next_sys_socket_h='<'sys/socket.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_socket_h" >&5
$as_echo "$gl_cv_next_sys_socket_h" >&6; }
     fi
     NEXT_SYS_SOCKET_H=$gl_cv_next_sys_socket_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/socket.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_sys_socket_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H=$gl_next_as_first_directive




  if test $ac_cv_header_sys_socket_h = yes; then
    HAVE_SYS_SOCKET_H=1
  else
    HAVE_SYS_SOCKET_H=0
  fi



  if test $ac_cv_header_sys_socket_h = yes; then
    HAVE_WS2TCPIP_H=0
  else
    if test $ac_cv_header_ws2tcpip_h = yes; then
      HAVE_WS2TCPIP_H=1
    else
      HAVE_WS2TCPIP_H=0
    fi
  fi



  ac_fn_c_check_type "$LINENO" "struct sockaddr_storage" "ac_cv_type_struct_sockaddr_storage" "
  /* sys/types.h is not needed according to POSIX, but the
     sys/socket.h in i386-unknown-freebsd4.10 and
     powerpc-apple-darwin5.5 required it. */
#include <sys/types.h>
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef HAVE_WS2TCPIP_H
#include <ws2tcpip.h>
#endif

"
if test "x$ac_cv_type_struct_sockaddr_storage" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_SOCKADDR_STORAGE 1
_ACEOF


fi
ac_fn_c_check_type "$LINENO" "sa_family_t" "ac_cv_type_sa_family_t" "
  /* sys/types.h is not needed according to POSIX, but the
     sys/socket.h in i386-unknown-freebsd4.10 and
     powerpc-apple-darwin5.5 required it. */
#include <sys/types.h>
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef HAVE_WS2TCPIP_H
#include <ws2tcpip.h>
#endif

"
if test "x$ac_cv_type_sa_family_t" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_SA_FAMILY_T 1
_ACEOF


fi

  if test $ac_cv_type_struct_sockaddr_storage = no; then
    HAVE_STRUCT_SOCKADDR_STORAGE=0
  fi
  if test $ac_cv_type_sa_family_t = no; then
    HAVE_SA_FAMILY_T=0
  fi
  if test $ac_cv_type_struct_sockaddr_storage != no; then
    ac_fn_c_check_member "$LINENO" "struct sockaddr_storage" "ss_family" "ac_cv_member_struct_sockaddr_storage_ss_family" "#include <sys/types.h>
       #ifdef HAVE_SYS_SOCKET_H
       #include <sys/socket.h>
       #endif
       #ifdef HAVE_WS2TCPIP_H
       #include <ws2tcpip.h>
       #endif

"
if test "x$ac_cv_member_struct_sockaddr_storage_ss_family" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1
_ACEOF


else
  HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=0
fi

  fi
  if test $HAVE_STRUCT_SOCKADDR_STORAGE = 0 || test $HAVE_SA_FAMILY_T = 0 \
     || test $HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = 0; then
    GL_GENERATE_SYS_SOCKET_H=true
  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











  GL_GNULIB_SOCKET=0



  GL_GNULIB_CONNECT=0



  GL_GNULIB_ACCEPT=0



  GL_GNULIB_BIND=0



  GL_GNULIB_GETPEERNAME=0



  GL_GNULIB_GETSOCKNAME=0



  GL_GNULIB_GETSOCKOPT=0



  GL_GNULIB_LISTEN=0



  GL_GNULIB_RECV=0



  GL_GNULIB_SEND=0



  GL_GNULIB_RECVFROM=0



  GL_GNULIB_SENDTO=0



  GL_GNULIB_SETSOCKOPT=0



  GL_GNULIB_SHUTDOWN=0



  GL_GNULIB_ACCEPT4=0



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 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

{ $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; }


    HAVE_DECL_INET_NTOP=1;
  HAVE_DECL_INET_PTON=1;
  REPLACE_INET_NTOP=0;
  REPLACE_INET_PTON=0;







  if test $ac_cv_header_features_h = yes; then
    HAVE_FEATURES_H=1
  else
    HAVE_FEATURES_H=0
  fi






  if test $ac_cv_header_arpa_inet_h = yes; then
    HAVE_ARPA_INET_H=1
  else
    HAVE_ARPA_INET_H=0
  fi










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

             if test $ac_cv_header_arpa_inet_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <arpa/inet.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 'arpa/inet.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_arpa_inet_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

          gl_header=$gl_cv_absolute_arpa_inet_h
          gl_cv_next_arpa_inet_h='"'$gl_header'"'
          else
               gl_cv_next_arpa_inet_h='<'arpa/inet.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_arpa_inet_h" >&5
$as_echo "$gl_cv_next_arpa_inet_h" >&6; }
     fi
     NEXT_ARPA_INET_H=$gl_cv_next_arpa_inet_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='<'arpa/inet.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_arpa_inet_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H=$gl_next_as_first_directive









  if test $ac_cv_header_sys_socket_h = yes; then
    HAVE_WS2TCPIP_H=0
  else
    if test $ac_cv_header_ws2tcpip_h = yes; then
      HAVE_WS2TCPIP_H=1
    else
      HAVE_WS2TCPIP_H=0
    fi
  fi









  GL_GNULIB_INET_NTOP=0



  GL_GNULIB_INET_PTON=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_WMEMPCPY=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_WCSDUP=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 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
     case "$host_os" in
       *-gnu* | gnu*)
         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


             #define wcstod renamed_wcstod
             #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
               #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
         ;;
     esac

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




  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 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




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a traditional french locale" >&5
$as_echo_n "checking for a traditional french locale... " >&6; }
if ${gt_cv_locale_fr+:} 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 in the abbreviation of the second month, the second
     character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is only
     one byte long. This excludes the UTF-8 encoding.  */
  t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
  if (strftime (buf, sizeof (buf), "%b", &t) < 3 || buf[2] != 'v') return 1;
# 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;
#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 native Windows locale name.
          if (LC_ALL=French_France.1252 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
            gt_cv_locale_fr=French_France.1252
          else
            # None found.
            gt_cv_locale_fr=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=fr_FR
          else
            # Test for the locale name with explicit encoding suffix.
            if (LC_ALL=fr_FR.ISO-8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
              gt_cv_locale_fr=fr_FR.ISO-8859-1
            else
              # Test for the AIX, OSF/1, FreeBSD, NetBSD, OpenBSD locale name.
              if (LC_ALL=fr_FR.ISO8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
                gt_cv_locale_fr=fr_FR.ISO8859-1
              else
                # Test for the HP-UX locale name.
                if (LC_ALL=fr_FR.iso88591 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
                  gt_cv_locale_fr=fr_FR.iso88591
                else
                  # Test for the Solaris 7 locale name.
                  if (LC_ALL=fr LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
                    gt_cv_locale_fr=fr
                  else
                    # None found.
                    gt_cv_locale_fr=none
                  fi
                fi
              fi
            fi
          fi
          ;;
      esac
    fi
    rm -fr conftest*

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




  GL_GNULIB_BTOWC=0



  GL_GNULIB_WCTOB=0



  GL_GNULIB_MBSINIT=0



  GL_GNULIB_MBRTOWC=0



  GL_GNULIB_MBRLEN=0



  GL_GNULIB_MBSRTOWCS=0



  GL_GNULIB_MBSNRTOWCS=0



  GL_GNULIB_WCRTOMB=0



  GL_GNULIB_WCSRTOMBS=0



  GL_GNULIB_WCSNRTOMBS=0



  GL_GNULIB_WCWIDTH=0



  GL_GNULIB_WMEMCHR=0



  GL_GNULIB_WMEMCMP=0



  GL_GNULIB_WMEMCPY=0



  GL_GNULIB_WMEMMOVE=0



  GL_GNULIB_WMEMPCPY=0



  GL_GNULIB_WMEMSET=0



  GL_GNULIB_WCSLEN=0



  GL_GNULIB_WCSNLEN=0



  GL_GNULIB_WCSCPY=0



  GL_GNULIB_WCPCPY=0



  GL_GNULIB_WCSNCPY=0



  GL_GNULIB_WCPNCPY=0



  GL_GNULIB_WCSCAT=0



  GL_GNULIB_WCSNCAT=0



  GL_GNULIB_WCSCMP=0



  GL_GNULIB_WCSNCMP=0



  GL_GNULIB_WCSCASECMP=0



  GL_GNULIB_WCSNCASECMP=0



  GL_GNULIB_WCSCOLL=0



  GL_GNULIB_WCSXFRM=0



  GL_GNULIB_WCSDUP=0



  GL_GNULIB_WCSCHR=0



  GL_GNULIB_WCSRCHR=0



  GL_GNULIB_WCSCSPN=0



  GL_GNULIB_WCSSPN=0



  GL_GNULIB_WCSPBRK=0



  GL_GNULIB_WCSSTR=0



  GL_GNULIB_WCSTOK=0



  GL_GNULIB_WCSWIDTH=0



  GL_GNULIB_WCSFTIME=0



  GL_GNULIB_MDA_WCSDUP=1





  GL_GNULIB__EXIT=0



  GL_GNULIB_ALIGNED_ALLOC=0



  GL_GNULIB_ATOLL=0



  GL_GNULIB_CALLOC_GNU=0



  GL_GNULIB_CALLOC_POSIX=0



  GL_GNULIB_CANONICALIZE_FILE_NAME=0



  GL_GNULIB_FREE_POSIX=0



  GL_GNULIB_GETLOADAVG=0



  GL_GNULIB_GETSUBOPT=0



  GL_GNULIB_GRANTPT=0



  GL_GNULIB_MALLOC_GNU=0



  GL_GNULIB_MALLOC_POSIX=0



  GL_GNULIB_MBTOWC=0



  GL_GNULIB_MKDTEMP=0



  GL_GNULIB_MKOSTEMP=0



  GL_GNULIB_MKOSTEMPS=0



  GL_GNULIB_MKSTEMP=0



  GL_GNULIB_MKSTEMPS=0



  GL_GNULIB_POSIX_MEMALIGN=0



  GL_GNULIB_POSIX_OPENPT=0



  GL_GNULIB_PTSNAME=0



  GL_GNULIB_PTSNAME_R=0



  GL_GNULIB_PUTENV=0



  GL_GNULIB_QSORT_R=0



  GL_GNULIB_RANDOM=0



  GL_GNULIB_RANDOM_R=0



  GL_GNULIB_REALLOCARRAY=0



  GL_GNULIB_REALLOC_GNU=0



  GL_GNULIB_REALLOC_POSIX=0



  GL_GNULIB_REALPATH=0



  GL_GNULIB_RPMATCH=0



  GL_GNULIB_SECURE_GETENV=0



  GL_GNULIB_SETENV=0



  GL_GNULIB_STRTOD=0



  GL_GNULIB_STRTOL=0



  GL_GNULIB_STRTOLD=0



  GL_GNULIB_STRTOLL=0



  GL_GNULIB_STRTOUL=0



  GL_GNULIB_STRTOULL=0



  GL_GNULIB_SYSTEM_POSIX=0



  GL_GNULIB_UNLOCKPT=0



  GL_GNULIB_UNSETENV=0



  GL_GNULIB_WCTOMB=0



  GL_GNULIB_MDA_ECVT=1



  GL_GNULIB_MDA_FCVT=1



  GL_GNULIB_MDA_GCVT=1



  GL_GNULIB_MDA_MKTEMP=1



  GL_GNULIB_MDA_PUTENV=1




    HAVE__EXIT=1;
  HAVE_ALIGNED_ALLOC=1;
  HAVE_ATOLL=1;
  HAVE_CANONICALIZE_FILE_NAME=1;
  HAVE_DECL_ECVT=1;
  HAVE_DECL_FCVT=1;
  HAVE_DECL_GCVT=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_MEMALIGN=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_STRTOL=1;
  HAVE_STRTOLD=1;
  HAVE_STRTOLL=1;
  HAVE_STRTOUL=1;
  HAVE_STRTOULL=1;
  HAVE_STRUCT_RANDOM_DATA=1;
  HAVE_SYS_LOADAVG_H=0;
  HAVE_UNLOCKPT=1;
  HAVE_DECL_UNSETENV=1;
  REPLACE_ALIGNED_ALLOC=0;
  REPLACE_CALLOC_FOR_CALLOC_GNU=0;
  REPLACE_CALLOC_FOR_CALLOC_POSIX=0;
  REPLACE_CANONICALIZE_FILE_NAME=0;
  REPLACE_FREE=0;
  REPLACE_INITSTATE=0;
  REPLACE_MALLOC_FOR_MALLOC_GNU=0;
  REPLACE_MALLOC_FOR_MALLOC_POSIX=0;
  REPLACE_MBTOWC=0;
  REPLACE_MKSTEMP=0;
  REPLACE_POSIX_MEMALIGN=0;
  REPLACE_PTSNAME=0;
  REPLACE_PTSNAME_R=0;
  REPLACE_PUTENV=0;
  REPLACE_QSORT_R=0;
  REPLACE_RANDOM=0;
  REPLACE_RANDOM_R=0;
  REPLACE_REALLOC_FOR_REALLOC_GNU=0;
  REPLACE_REALLOC_FOR_REALLOC_POSIX=0;
  REPLACE_REALLOCARRAY=0;
  REPLACE_REALPATH=0;
  REPLACE_SETENV=0;
  REPLACE_SETSTATE=0;
  REPLACE_STRTOD=0;
  REPLACE_STRTOL=0;
  REPLACE_STRTOLD=0;
  REPLACE_STRTOLL=0;
  REPLACE_STRTOUL=0;
  REPLACE_STRTOULL=0;
  REPLACE_UNSETENV=0;
  REPLACE_WCTOMB=0;


         { $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







  { $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

    rm -rf conftest.a conftest.d
    touch conftest.a
    # Assume that if we have lstat, we can also check symlinks.
    if test $ac_cv_func_lstat = yes; then
      ln -s conftest.a conftest.l
    fi
    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 'nearly' on musl systems.
        *-musl*)       gl_cv_func_realpath_works="guessing nearly" ;;
                       # Guess no on Cygwin.
        cygwin*)       gl_cv_func_realpath_works="guessing no" ;;
                       # 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 <errno.h>
        #include <stdlib.h>
        #include <string.h>

int
main ()
{

        int result = 0;
        /* This test fails on Solaris 10.  */
        {
          char *name = realpath ("conftest.a", NULL);
          if (!(name && *name == '/'))
            result |= 1;
          free (name);
        }
        /* This test fails on older versions of Cygwin.  */
        {
          char *name = realpath ("conftest.b/../conftest.a", NULL);
          if (name != NULL)
            result |= 2;
          free (name);
        }
        /* This test fails on Cygwin 2.9.  */
        #if HAVE_LSTAT
        {
          char *name = realpath ("conftest.l/../conftest.a", NULL);
          if (name != NULL || errno != ENOTDIR)
            result |= 4;
          free (name);
        }
        #endif
        /* This test fails on Mac OS X 10.13, OpenBSD 6.0.  */
        {
          char *name = realpath ("conftest.a/", NULL);
          if (name != NULL)
            result |= 8;
          free (name);
        }
        /* This test fails on AIX 7, Solaris 10.  */
        {
          char *name1 = realpath (".", NULL);
          char *name2 = realpath ("conftest.d//./..", NULL);
          if (! name1 || ! name2 || strcmp (name1, name2))
            result |= 16;
          free (name1);
          free (name2);
        }
        #ifdef __linux__
        /* On Linux, // is the same as /. See also double-slash-root.m4.
           realpath() should respect this.
           This test fails on musl libc 1.2.2.  */
        {
          char *name = realpath ("//", NULL);
          if (! name || strcmp (name, "/"))
            result |= 32;
          free (name);
        }
        #endif
        return result;

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_realpath_works=yes
else
  case $? in
        32) gl_cv_func_realpath_works=nearly ;;
        *)  gl_cv_func_realpath_works=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

    rm -rf conftest.a conftest.l 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

      ;;
    *nearly)

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

      ;;
  esac









  case "$host_os" in
    mingw*) ;;
    *)      for ac_func in getcwd
do :
  ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd"
if test "x$ac_cv_func_getcwd" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_GETCWD 1
_ACEOF

fi
done
 ;;
  esac







  GL_GNULIB_ACCESS=0



  GL_GNULIB_CHDIR=0



  GL_GNULIB_CHOWN=0



  GL_GNULIB_CLOSE=0



  GL_GNULIB_COPY_FILE_RANGE=0



  GL_GNULIB_DUP=0



  GL_GNULIB_DUP2=0



  GL_GNULIB_DUP3=0



  GL_GNULIB_ENVIRON=0



  GL_GNULIB_EUIDACCESS=0



  GL_GNULIB_EXECL=0



  GL_GNULIB_EXECLE=0



  GL_GNULIB_EXECLP=0



  GL_GNULIB_EXECV=0



  GL_GNULIB_EXECVE=0



  GL_GNULIB_EXECVP=0



  GL_GNULIB_EXECVPE=0



  GL_GNULIB_FACCESSAT=0



  GL_GNULIB_FCHDIR=0



  GL_GNULIB_FCHOWNAT=0



  GL_GNULIB_FDATASYNC=0



  GL_GNULIB_FSYNC=0



  GL_GNULIB_FTRUNCATE=0



  GL_GNULIB_GETCWD=0



  GL_GNULIB_GETDOMAINNAME=0



  GL_GNULIB_GETDTABLESIZE=0



  GL_GNULIB_GETENTROPY=0



  GL_GNULIB_GETGROUPS=0



  GL_GNULIB_GETHOSTNAME=0



  GL_GNULIB_GETLOGIN=0



  GL_GNULIB_GETLOGIN_R=0



  GL_GNULIB_GETOPT_POSIX=0



  GL_GNULIB_GETPAGESIZE=0



  GL_GNULIB_GETPASS=0



  GL_GNULIB_GETPASS_GNU=0



  GL_GNULIB_GETUSERSHELL=0



  GL_GNULIB_GROUP_MEMBER=0



  GL_GNULIB_ISATTY=0



  GL_GNULIB_LCHOWN=0



  GL_GNULIB_LINK=0



  GL_GNULIB_LINKAT=0



  GL_GNULIB_LSEEK=0



  GL_GNULIB_PIPE=0



  GL_GNULIB_PIPE2=0



  GL_GNULIB_PREAD=0



  GL_GNULIB_PWRITE=0



  GL_GNULIB_READ=0



  GL_GNULIB_READLINK=0



  GL_GNULIB_READLINKAT=0



  GL_GNULIB_RMDIR=0



  GL_GNULIB_SETHOSTNAME=0



  GL_GNULIB_SLEEP=0



  GL_GNULIB_SYMLINK=0



  GL_GNULIB_SYMLINKAT=0



  GL_GNULIB_TRUNCATE=0



  GL_GNULIB_TTYNAME_R=0



  GL_GNULIB_UNISTD_H_GETOPT=0



  GL_GNULIB_UNISTD_H_NONBLOCKING=0



  GL_GNULIB_UNISTD_H_SIGPIPE=0



  GL_GNULIB_UNLINK=0



  GL_GNULIB_UNLINKAT=0



  GL_GNULIB_USLEEP=0



  GL_GNULIB_WRITE=0



  GL_GNULIB_MDA_ACCESS=1



  GL_GNULIB_MDA_CHDIR=1



  GL_GNULIB_MDA_CLOSE=1



  GL_GNULIB_MDA_DUP=1



  GL_GNULIB_MDA_DUP2=1



  GL_GNULIB_MDA_EXECL=1



  GL_GNULIB_MDA_EXECLE=1



  GL_GNULIB_MDA_EXECLP=1



  GL_GNULIB_MDA_EXECV=1



  GL_GNULIB_MDA_EXECVE=1



  GL_GNULIB_MDA_EXECVP=1



  GL_GNULIB_MDA_EXECVPE=1



  GL_GNULIB_MDA_GETCWD=1



  GL_GNULIB_MDA_GETPID=1



  GL_GNULIB_MDA_ISATTY=1



  GL_GNULIB_MDA_LSEEK=1



  GL_GNULIB_MDA_READ=1



  GL_GNULIB_MDA_RMDIR=1



  GL_GNULIB_MDA_SWAB=1



  GL_GNULIB_MDA_UNLINK=1



  GL_GNULIB_MDA_WRITE=1








{ $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

gl_mda_defines='
#if defined _WIN32 && !defined __CYGWIN__
#define access    _access
#define chdir     _chdir
#define chmod     _chmod
#define close     _close
#define creat     _creat
#define dup       _dup
#define dup2      _dup2
#define ecvt      _ecvt
#define execl     _execl
#define execle    _execle
#define execlp    _execlp
#define execv     _execv
#define execve    _execve
#define execvp    _execvp
#define execvpe   _execvpe
#define fcloseall _fcloseall
#define fcvt      _fcvt
#define fdopen    _fdopen
#define fileno    _fileno
#define gcvt      _gcvt
#define getcwd    _getcwd
#define getpid    _getpid
#define getw      _getw
#define isatty    _isatty
#define j0        _j0
#define j1        _j1
#define jn        _jn
#define lfind     _lfind
#define lsearch   _lsearch
#define lseek     _lseek
#define memccpy   _memccpy
#define mkdir     _mkdir
#define mktemp    _mktemp
#define open      _open
#define putenv    _putenv
#define putw      _putw
#define read      _read
#define rmdir     _rmdir
#define strdup    _strdup
#define swab      _swab
#define tempnam   _tempnam
#define tzset     _tzset
#define umask     _umask
#define unlink    _unlink
#define utime     _utime
#define wcsdup    _wcsdup
#define write     _write
#define y0        _y0
#define y1        _y1
#define yn        _yn
#endif
'


      for ac_header in unistd.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"
if test "x$ac_cv_header_unistd_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_UNISTD_H 1
_ACEOF

fi

done

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working chown" >&5
$as_echo_n "checking for working chown... " >&6; }
if ${ac_cv_func_chown_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  case "$host_os" in # ((
                           # Guess yes on Linux systems.
          linux-* | linux) ac_cv_func_chown_works="guessing yes" ;;
                           # Guess yes on glibc systems.
          *-gnu* | gnu*)   ac_cv_func_chown_works="guessing yes" ;;
                           # Guess no on native Windows.
          mingw*)          ac_cv_func_chown_works="guessing no" ;;
                           # If we don't know, obey --enable-cross-guesses.
          *)               ac_cv_func_chown_works="$gl_cross_guess_normal" ;;
        esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
           #include <fcntl.h>


$gl_mda_defines

int
main ()
{

            char *f = "conftest.chown";
            struct stat before, after;

            if (creat (f, 0600) < 0)
              return 1;
            if (stat (f, &before) < 0)
              return 1;
            if (chown (f, (uid_t) -1, (gid_t) -1) == -1)
              return 1;
            if (stat (f, &after) < 0)
              return 1;
            return ! (before.st_uid == after.st_uid && before.st_gid == after.st_gid);

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_func_chown_works=yes
else
  ac_cv_func_chown_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.chown

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

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

      ;;
  esac


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether chown dereferences symlinks" >&5
$as_echo_n "checking whether chown dereferences symlinks... " >&6; }
if ${gl_cv_func_chown_follows_symlink+:} false; then :
  $as_echo_n "(cached) " >&6
else

      if test "$cross_compiling" = yes; then :
  gl_cv_func_chown_follows_symlink="guessing yes"

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

#include <unistd.h>
#include <stdlib.h>
#include <errno.h>


$gl_mda_defines

        int
        main ()
        {
          int result = 0;
          char const *dangling_symlink = "conftest.dangle";

          unlink (dangling_symlink);
          if (symlink ("conftest.no-such", dangling_symlink))
            abort ();

          /* Exit successfully on a conforming system,
             i.e., where chown must fail with ENOENT.  */
          if (chown (dangling_symlink, getuid (), getgid ()) == 0)
            result |= 1;
          if (errno != ENOENT)
            result |= 2;
          return result;
        }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_chown_follows_symlink=yes
else
  gl_cv_func_chown_follows_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



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

  case "$gl_cv_func_chown_follows_symlink" in
    *yes) ;;
    *)

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

      ;;
  esac












    if test $ac_cv_func_chown = no; then
    HAVE_CHOWN=0
  else
        case "$gl_cv_func_chown_follows_symlink" in
      *yes) ;;
      *) REPLACE_CHOWN=1 ;;
    esac

        case "$ac_cv_func_chown_works" in
      *no)

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

        REPLACE_CHOWN=1
        ;;
    esac

                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether chown honors trailing slash" >&5
$as_echo_n "checking whether chown honors trailing slash... " >&6; }
if ${gl_cv_func_chown_slash_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  touch conftest.file && rm -f conftest.link
       if test "$cross_compiling" = yes; then :
  case "$host_os" in
                    # Guess yes on glibc systems.
           *-gnu*)  gl_cv_func_chown_slash_works="guessing yes" ;;
                    # Guess yes on musl systems.
           *-musl*) gl_cv_func_chown_slash_works="guessing yes" ;;
                    # If we don't know, obey --enable-cross-guesses.
           *)       gl_cv_func_chown_slash_works="$gl_cross_guess_normal" ;;
         esac

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

#include <unistd.h>
#include <stdlib.h>
#include <errno.h>


$gl_mda_defines

int
main ()
{
if (symlink ("conftest.file", "conftest.link")) return 1;
          if (chown ("conftest.link/", getuid (), getgid ()) == 0) return 2;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_chown_slash_works=yes
else
  gl_cv_func_chown_slash_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.file
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_chown_slash_works" >&5
$as_echo "$gl_cv_func_chown_slash_works" >&6; }
    case "$gl_cv_func_chown_slash_works" in
      *yes) ;;
      *)

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

        REPLACE_CHOWN=1
        ;;
    esac

        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether chown always updates ctime" >&5
$as_echo_n "checking whether chown always updates ctime... " >&6; }
if ${gl_cv_func_chown_ctime_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_chown_ctime_works="guessing yes" ;;
                    # Guess yes on musl systems.
           *-musl*) gl_cv_func_chown_ctime_works="guessing yes" ;;
                    # If we don't know, obey --enable-cross-guesses.
           *)       gl_cv_func_chown_ctime_works="$gl_cross_guess_normal" ;;
         esac

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

#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>


$gl_mda_defines

int
main ()
{
struct stat st1, st2;
          if (close (creat ("conftest.file", 0600))) return 1;
          if (stat ("conftest.file", &st1)) return 2;
          sleep (1);
          if (chown ("conftest.file", st1.st_uid, st1.st_gid)) return 3;
          if (stat ("conftest.file", &st2)) return 4;
          if (st2.st_ctime <= st1.st_ctime) return 5;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_chown_ctime_works=yes
else
  gl_cv_func_chown_ctime_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.file
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_chown_ctime_works" >&5
$as_echo "$gl_cv_func_chown_ctime_works" >&6; }
    case "$gl_cv_func_chown_ctime_works" in
      *yes) ;;
      *)

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

        REPLACE_CHOWN=1
        ;;
    esac
  fi





  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





    HAVE_OPENDIR=1;
  HAVE_READDIR=1;
  HAVE_REWINDDIR=1;
  HAVE_CLOSEDIR=1;
  HAVE_DECL_DIRFD=1;
  HAVE_DECL_FDOPENDIR=1;
  HAVE_FDOPENDIR=1;
  HAVE_SCANDIR=1;
  HAVE_ALPHASORT=1;
  REPLACE_OPENDIR=0;
  REPLACE_CLOSEDIR=0;
  REPLACE_DIRFD=0;
  REPLACE_FDOPENDIR=0;







  GL_GNULIB_OPENDIR=0



  GL_GNULIB_READDIR=0



  GL_GNULIB_REWINDDIR=0



  GL_GNULIB_CLOSEDIR=0



  GL_GNULIB_DIRFD=0



  GL_GNULIB_FDOPENDIR=0



  GL_GNULIB_SCANDIR=0



  GL_GNULIB_ALPHASORT=0




    HAVE_ISBLANK=1;












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



  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ctype.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 'ctype.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_ctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

          gl_header=$gl_cv_absolute_ctype_h
          gl_cv_next_ctype_h='"'$gl_header'"'


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_ctype_h" >&5
$as_echo "$gl_cv_next_ctype_h" >&6; }
     fi
     NEXT_CTYPE_H=$gl_cv_next_ctype_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='<'ctype.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_ctype_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_CTYPE_H=$gl_next_as_first_directive











  GL_GNULIB_ISBLANK=0

















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

             if test $ac_cv_header_dirent_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <dirent.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 'dirent.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_dirent_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

          gl_header=$gl_cv_absolute_dirent_h
          gl_cv_next_dirent_h='"'$gl_header'"'
          else
               gl_cv_next_dirent_h='<'dirent.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_dirent_h" >&5
$as_echo "$gl_cv_next_dirent_h" >&6; }
     fi
     NEXT_DIRENT_H=$gl_cv_next_dirent_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='<'dirent.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_dirent_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_DIRENT_H=$gl_next_as_first_directive




  if test $ac_cv_header_dirent_h = yes; then
    HAVE_DIRENT_H=1
  else
    HAVE_DIRENT_H=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>

            typedef struct { int foo; } foo_t;
            extern foo_t 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 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
    GL_GENERATE_ERRNO_H=false
  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




    GL_GENERATE_ERRNO_H=true
  fi

  if $GL_GENERATE_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 $GL_GENERATE_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 $GL_GENERATE_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


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ctype.h defines __header_inline" >&5
$as_echo_n "checking whether ctype.h defines __header_inline... " >&6; }
if ${gl_cv_have___header_inline+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ctype.h>
                         #ifndef __header_inline
                          #error "<ctype.h> does not define __header_inline"
                         #endif

_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  gl_cv_have___header_inline=yes
else
  gl_cv_have___header_inline=no
fi
rm -f conftest.err conftest.i conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have___header_inline" >&5
$as_echo "$gl_cv_have___header_inline" >&6; }
  if test "$gl_cv_have___header_inline" = yes; then

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

  fi



ac_fn_c_check_decl "$LINENO" "fchdir" "ac_cv_have_decl_fchdir" "$ac_includes_default"
if test "x$ac_cv_have_decl_fchdir" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_FCHDIR $ac_have_decl
_ACEOF


    HAVE_FCNTL=1;
  HAVE_OPENAT=1;
  REPLACE_CREAT=0;
  REPLACE_FCNTL=0;
  REPLACE_OPEN=0;
  REPLACE_OPENAT=0;





  GL_GNULIB_CREAT=0



  GL_GNULIB_FCNTL=0



  GL_GNULIB_NONBLOCKING=0



  GL_GNULIB_OPEN=0



  GL_GNULIB_OPENAT=0



  GL_GNULIB_MDA_CREAT=1



  GL_GNULIB_MDA_OPEN=1










  { $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>


$gl_mda_defines

           #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 >conftest.$ac_ext
/* end confdefs.h.  */

          #if defined _WIN64 && !defined __CYGWIN__
          LLP64
          #endif

int
main ()
{

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_pid_type='int'
else
  gl_pid_type='__int64'
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

cat >>confdefs.h <<_ACEOF
#define pid_t $gl_pid_type
_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












     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
















    HAVE_FFS=1;
  HAVE_STRCASECMP=1;
  HAVE_DECL_STRNCASECMP=1;



  GL_GNULIB_FFS=0






    HAVE_FNMATCH=1;
  REPLACE_FNMATCH=0;
















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

             if test $ac_cv_header_fnmatch_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <fnmatch.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 'fnmatch.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_fnmatch_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

          gl_header=$gl_cv_absolute_fnmatch_h
          gl_cv_next_fnmatch_h='"'$gl_header'"'
          else
               gl_cv_next_fnmatch_h='<'fnmatch.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_fnmatch_h" >&5
$as_echo "$gl_cv_next_fnmatch_h" >&6; }
     fi
     NEXT_FNMATCH_H=$gl_cv_next_fnmatch_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='<'fnmatch.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_fnmatch_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H=$gl_next_as_first_directive







  if test $ac_cv_header_fnmatch_h = yes; then
    HAVE_FNMATCH_H=1
  else
    HAVE_FNMATCH_H=0
  fi


  GL_GENERATE_FNMATCH_H=false
     if false; then
              GL_GENERATE_FNMATCH_H=true
     else
       if test $ac_cv_header_fnmatch_h != yes; then
                  GL_GENERATE_FNMATCH_H=true
       fi
     fi










  GL_GNULIB_FNMATCH=0





   { $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
             #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




    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_BUILTINS=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




  FREXP_LIBM=
  if test $gl_cv_func_frexp_no_libm = no; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexp() can be used with libm" >&5
$as_echo_n "checking whether frexp() can be used with libm... " >&6; }
if ${gl_cv_func_frexp_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>
               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_in_libm=yes
else
  gl_cv_func_frexp_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_frexp_in_libm" >&5
$as_echo "$gl_cv_func_frexp_in_libm" >&6; }
    if test $gl_cv_func_frexp_in_libm = yes; then
      FREXP_LIBM=-lm
    fi
  fi
  if test $gl_cv_func_frexp_no_libm = yes \
     || test $gl_cv_func_frexp_in_libm = yes; then
    save_LIBS="$LIBS"
    LIBS="$LIBS $FREXP_LIBM"



  { $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; }

    LIBS="$save_LIBS"
    case "$gl_cv_func_frexp_works" in
      *yes) gl_func_frexp=yes ;;
      *)    gl_func_frexp=no; REPLACE_FREXP=1; FREXP_LIBM= ;;
    esac
  else
    gl_func_frexp=no
  fi
  if test $gl_func_frexp = yes; then

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

  fi




  GL_GNULIB_ACOSF=0



  GL_GNULIB_ACOSL=0



  GL_GNULIB_ASINF=0



  GL_GNULIB_ASINL=0



  GL_GNULIB_ATANF=0



  GL_GNULIB_ATANL=0



  GL_GNULIB_ATAN2F=0



  GL_GNULIB_CBRT=0



  GL_GNULIB_CBRTF=0



  GL_GNULIB_CBRTL=0



  GL_GNULIB_CEIL=0



  GL_GNULIB_CEILF=0



  GL_GNULIB_CEILL=0



  GL_GNULIB_COPYSIGN=0



  GL_GNULIB_COPYSIGNF=0



  GL_GNULIB_COPYSIGNL=0



  GL_GNULIB_COSF=0



  GL_GNULIB_COSL=0



  GL_GNULIB_COSHF=0



  GL_GNULIB_EXPF=0



  GL_GNULIB_EXPL=0



  GL_GNULIB_EXP2=0



  GL_GNULIB_EXP2F=0



  GL_GNULIB_EXP2L=0



  GL_GNULIB_EXPM1=0



  GL_GNULIB_EXPM1F=0



  GL_GNULIB_EXPM1L=0



  GL_GNULIB_FABSF=0



  GL_GNULIB_FABSL=0



  GL_GNULIB_FLOOR=0



  GL_GNULIB_FLOORF=0



  GL_GNULIB_FLOORL=0



  GL_GNULIB_FMA=0



  GL_GNULIB_FMAF=0



  GL_GNULIB_FMAL=0



  GL_GNULIB_FMOD=0



  GL_GNULIB_FMODF=0



  GL_GNULIB_FMODL=0



  GL_GNULIB_FREXPF=0



  GL_GNULIB_FREXP=0



  GL_GNULIB_FREXPL=0



  GL_GNULIB_HYPOT=0



  GL_GNULIB_HYPOTF=0



  GL_GNULIB_HYPOTL=0



  GL_GNULIB_ILOGB=0



  GL_GNULIB_ILOGBF=0



  GL_GNULIB_ILOGBL=0



  GL_GNULIB_ISFINITE=0



  GL_GNULIB_ISINF=0



  GL_GNULIB_ISNAN=0



  GL_GNULIB_ISNANF=0



  GL_GNULIB_ISNAND=0



  GL_GNULIB_ISNANL=0



  GL_GNULIB_LDEXPF=0



  GL_GNULIB_LDEXPL=0



  GL_GNULIB_LOG=0



  GL_GNULIB_LOGF=0



  GL_GNULIB_LOGL=0



  GL_GNULIB_LOG10=0



  GL_GNULIB_LOG10F=0



  GL_GNULIB_LOG10L=0



  GL_GNULIB_LOG1P=0



  GL_GNULIB_LOG1PF=0



  GL_GNULIB_LOG1PL=0



  GL_GNULIB_LOG2=0



  GL_GNULIB_LOG2F=0



  GL_GNULIB_LOG2L=0



  GL_GNULIB_LOGB=0



  GL_GNULIB_LOGBF=0



  GL_GNULIB_LOGBL=0



  GL_GNULIB_MODF=0



  GL_GNULIB_MODFF=0



  GL_GNULIB_MODFL=0



  GL_GNULIB_POWF=0



  GL_GNULIB_REMAINDER=0



  GL_GNULIB_REMAINDERF=0



  GL_GNULIB_REMAINDERL=0



  GL_GNULIB_RINT=0



  GL_GNULIB_RINTF=0



  GL_GNULIB_RINTL=0



  GL_GNULIB_ROUND=0



  GL_GNULIB_ROUNDF=0



  GL_GNULIB_ROUNDL=0



  GL_GNULIB_SIGNBIT=0



  GL_GNULIB_SINF=0



  GL_GNULIB_SINL=0



  GL_GNULIB_SINHF=0



  GL_GNULIB_SQRTF=0



  GL_GNULIB_SQRTL=0



  GL_GNULIB_TANF=0



  GL_GNULIB_TANL=0



  GL_GNULIB_TANHF=0



  GL_GNULIB_TRUNC=0



  GL_GNULIB_TRUNCF=0



  GL_GNULIB_TRUNCL=0



  GL_GNULIB_MDA_J0=1



  GL_GNULIB_MDA_J1=1



  GL_GNULIB_MDA_JN=1



  GL_GNULIB_MDA_Y0=1



  GL_GNULIB_MDA_Y1=1



  GL_GNULIB_MDA_YN=1




  { $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








      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


  FREXPL_LIBM=
  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 = no; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether frexpl() can be used with libm" >&5
$as_echo_n "checking whether frexpl() can be used with libm... " >&6; }
if ${gl_cv_func_frexpl_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 ()
{
int e; return frexpl (x, &e) > 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_frexpl_in_libm=yes
else
  gl_cv_func_frexpl_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_frexpl_in_libm" >&5
$as_echo "$gl_cv_func_frexpl_in_libm" >&6; }
      if test $gl_cv_func_frexpl_in_libm = yes; then
        FREXPL_LIBM=-lm
      fi
    fi
    if test $gl_cv_func_frexpl_no_libm = yes \
       || test $gl_cv_func_frexpl_in_libm = yes; then
      save_LIBS="$LIBS"
      LIBS="$LIBS $FREXPL_LIBM"


     { $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 *);
long double zero = 0.0L;
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.  */
  /* The Microsoft MSVC 14 compiler chokes on the expression 1.0 / 0.0.  */
  x = 1.0L / zero;
  {
    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; }

      LIBS="$save_LIBS"
      case "$gl_cv_func_frexpl_works" in
        *yes) gl_func_frexpl=yes ;;
        *)    gl_func_frexpl=no; REPLACE_FREXPL=1 ;;
      esac
    else
      gl_func_frexpl=no
    fi
    if test $gl_func_frexpl = yes; then

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

    fi
  fi
  if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl = no; then
        if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then

      FREXPL_LIBM="$FREXP_LIBM"
    else
      FREXPL_LIBM=
    fi
  fi



    HAVE_FCHMODAT=1;
  HAVE_FSTATAT=1;
  HAVE_FUTIMENS=1;
  HAVE_GETUMASK=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_FCHMODAT=0;
  REPLACE_FSTAT=0;
  REPLACE_FSTATAT=0;
  REPLACE_FUTIMENS=0;
  REPLACE_LSTAT=0;
  REPLACE_MKDIR=0;
  REPLACE_MKFIFO=0;
  REPLACE_MKFIFOAT=0;
  REPLACE_MKNOD=0;
  REPLACE_MKNODAT=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





  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















     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










  case "$host_os" in
    mingw*)
      for ac_header in sdkddkver.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "sdkddkver.h" "ac_cv_header_sdkddkver_h" "$ac_includes_default"
if test "x$ac_cv_header_sdkddkver_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SDKDDKVER_H 1
_ACEOF

fi

done

      ;;
  esac







  GL_GNULIB_FCHMODAT=0



  GL_GNULIB_FSTAT=0



  GL_GNULIB_FSTATAT=0



  GL_GNULIB_FUTIMENS=0



  GL_GNULIB_GETUMASK=0



  GL_GNULIB_LCHMOD=0



  GL_GNULIB_LSTAT=0



  GL_GNULIB_MKDIR=0



  GL_GNULIB_MKDIRAT=0



  GL_GNULIB_MKFIFO=0



  GL_GNULIB_MKFIFOAT=0



  GL_GNULIB_MKNOD=0



  GL_GNULIB_MKNODAT=0



  GL_GNULIB_STAT=0



  GL_GNULIB_UTIMENSAT=0



  GL_GNULIB_OVERRIDES_STRUCT_STAT=0



  GL_GNULIB_MDA_CHMOD=1



  GL_GNULIB_MDA_MKDIR=1



  GL_GNULIB_MDA_UMASK=1







   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getcwd (NULL, 0) allocates memory for result" >&5
$as_echo_n "checking whether getcwd (NULL, 0) allocates memory for result... " >&6; }
if ${gl_cv_func_getcwd_null+:} 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_getcwd_null="guessing yes";;
                           # Guess yes on musl systems.
            *-musl*)       gl_cv_func_getcwd_null="guessing yes";;
                           # Guess yes on Cygwin.
            cygwin*)       gl_cv_func_getcwd_null="guessing yes";;
                           # If we don't know, obey --enable-cross-guesses.
            *)             gl_cv_func_getcwd_null="$gl_cross_guess_normal";;
          esac

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>
#        endif


$gl_mda_defines

#        ifndef getcwd
         char *getcwd ();
#        endif

int
main ()
{

#if defined _WIN32 && ! defined __CYGWIN__
/* mingw cwd does not start with '/', but _getcwd does allocate.
   However, mingw fails to honor non-zero size.  */
#else
           if (chdir ("/") != 0)
             return 1;
           else
             {
               char *f = getcwd (NULL, 0);
               if (! f)
                 return 2;
               if (f[0] != '/')
                 { free (f); return 3; }
               if (f[1] != '\0')
                 { free (f); return 4; }
               free (f);
               return 0;
             }
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_getcwd_null=yes
else
  gl_cv_func_getcwd_null=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_getcwd_null" >&5
$as_echo "$gl_cv_func_getcwd_null" >&6; }


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getcwd with POSIX signature" >&5
$as_echo_n "checking for getcwd with POSIX signature... " >&6; }
if ${gl_cv_func_getcwd_posix_signature+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>


$gl_mda_defines

int
main ()
{
extern
           #ifdef __cplusplus
           "C"
           #endif
           char *getcwd (char *, size_t);

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_func_getcwd_posix_signature=yes
else
  gl_cv_func_getcwd_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_getcwd_posix_signature" >&5
$as_echo "$gl_cv_func_getcwd_posix_signature" >&6; }

ac_fn_c_check_decl "$LINENO" "getcwd" "ac_cv_have_decl_getcwd" "$ac_includes_default"
if test "x$ac_cv_have_decl_getcwd" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_GETCWD $ac_have_decl
_ACEOF


    HAVE_DECL_FCLOSEALL=1;
  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_FOPEN_FOR_FOPEN_GNU=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;

ac_fn_c_check_decl "$LINENO" "getdelim" "ac_cv_have_decl_getdelim" "$ac_includes_default"
if test "x$ac_cv_have_decl_getdelim" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_GETDELIM $ac_have_decl
_ACEOF





  GL_GNULIB_DPRINTF=0



  GL_GNULIB_FCLOSE=0



  GL_GNULIB_FDOPEN=0



  GL_GNULIB_FFLUSH=0



  GL_GNULIB_FGETC=0



  GL_GNULIB_FGETS=0



  GL_GNULIB_FOPEN=0



  GL_GNULIB_FOPEN_GNU=0



  GL_GNULIB_FPRINTF=0



  GL_GNULIB_FPRINTF_POSIX=0



  GL_GNULIB_FPURGE=0



  GL_GNULIB_FPUTC=0



  GL_GNULIB_FPUTS=0



  GL_GNULIB_FREAD=0



  GL_GNULIB_FREOPEN=0



  GL_GNULIB_FSCANF=0



  GL_GNULIB_FSEEK=0



  GL_GNULIB_FSEEKO=0



  GL_GNULIB_FTELL=0



  GL_GNULIB_FTELLO=0



  GL_GNULIB_FWRITE=0



  GL_GNULIB_GETC=0



  GL_GNULIB_GETCHAR=0



  GL_GNULIB_GETDELIM=0



  GL_GNULIB_GETLINE=0



  GL_GNULIB_OBSTACK_PRINTF=0



  GL_GNULIB_OBSTACK_PRINTF_POSIX=0



  GL_GNULIB_PCLOSE=0



  GL_GNULIB_PERROR=0



  GL_GNULIB_POPEN=0



  GL_GNULIB_PRINTF=0



  GL_GNULIB_PRINTF_POSIX=0



  GL_GNULIB_PUTC=0



  GL_GNULIB_PUTCHAR=0



  GL_GNULIB_PUTS=0



  GL_GNULIB_REMOVE=0



  GL_GNULIB_RENAME=0



  GL_GNULIB_RENAMEAT=0



  GL_GNULIB_SCANF=0



  GL_GNULIB_SNPRINTF=0



  GL_GNULIB_SPRINTF_POSIX=0



  GL_GNULIB_STDIO_H_NONBLOCKING=0



  GL_GNULIB_STDIO_H_SIGPIPE=0



  GL_GNULIB_TMPFILE=0



  GL_GNULIB_VASPRINTF=0



  GL_GNULIB_VFSCANF=0



  GL_GNULIB_VSCANF=0



  GL_GNULIB_VDPRINTF=0



  GL_GNULIB_VFPRINTF=0



  GL_GNULIB_VFPRINTF_POSIX=0



  GL_GNULIB_VPRINTF=0



  GL_GNULIB_VPRINTF_POSIX=0



  GL_GNULIB_VSNPRINTF=0



  GL_GNULIB_VSPRINTF_POSIX=0



  GL_GNULIB_MDA_FCLOSEALL=1



  GL_GNULIB_MDA_FDOPEN=1



  GL_GNULIB_MDA_FILENO=1



  GL_GNULIB_MDA_GETW=1



  GL_GNULIB_MDA_PUTW=1



  GL_GNULIB_MDA_TEMPNAM=1





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

ac_fn_c_check_decl "$LINENO" "getline" "ac_cv_have_decl_getline" "$ac_includes_default"
if test "x$ac_cv_have_decl_getline" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_GETLINE $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "getlogin_r" "ac_cv_have_decl_getlogin_r" "$ac_includes_default"
if test "x$ac_cv_have_decl_getlogin_r" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_GETLOGIN_R $ac_have_decl
_ACEOF



ac_fn_c_check_decl "$LINENO" "getlogin" "ac_cv_have_decl_getlogin" "$ac_includes_default"
if test "x$ac_cv_have_decl_getlogin" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_GETLOGIN $ac_have_decl
_ACEOF



  case $host_os in
    mingw*)
      LIB_GETLOGIN='-ladvapi32' ;;
    *)
      LIB_GETLOGIN= ;;
  esac







    HAVE_GETRANDOM=1;
  REPLACE_GETRANDOM=0;





  GL_GNULIB_GETRANDOM=0




    HAVE_GETTIMEOFDAY=1;
  HAVE_STRUCT_TIMEVAL=1;
  HAVE_SYS_TIME_H=1;
  REPLACE_GETTIMEOFDAY=0;
  REPLACE_STRUCT_TIMEVAL=0;
















     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









  GL_GNULIB_GETTIMEOFDAY=0




    HAVE_GLOB=1;
  HAVE_GLOB_PATTERN_P=1;
  REPLACE_GLOB=0;
  REPLACE_GLOB_PATTERN_P=0;

















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

             if test $ac_cv_header_glob_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <glob.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 'glob.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_glob_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

          gl_header=$gl_cv_absolute_glob_h
          gl_cv_next_glob_h='"'$gl_header'"'
          else
               gl_cv_next_glob_h='<'glob.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_glob_h" >&5
$as_echo "$gl_cv_next_glob_h" >&6; }
     fi
     NEXT_GLOB_H=$gl_cv_next_glob_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='<'glob.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_glob_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_GLOB_H=$gl_next_as_first_directive





  if test $ac_cv_header_glob_h = yes; then
    HAVE_GLOB_H=1
  else
    HAVE_GLOB_H=0
  fi


  GL_GENERATE_GLOB_H=false
     if false; then
              GL_GENERATE_GLOB_H=true
     else
       if test $ac_cv_header_glob_h != yes; then
                  GL_GENERATE_GLOB_H=true
       fi
     fi












  GL_GNULIB_GLOB=0









  if test -z "$gl_pthreadlib_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
      echo "$as_me:13814: gl_pthread_api=$gl_pthread_api" >&5
      echo "$as_me:13815: LIBPTHREAD=$LIBPTHREAD" >&5

      gl_pthread_in_glibc=no
      # On Linux with glibc >= 2.34, libc contains the fully functional
      # pthread functions.
      case "$host_os" in
        linux*)
          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <features.h>
             #ifdef __GNU_LIBRARY__
              #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 34) || (__GLIBC__ > 2)
               Lucky user
              #endif
             #endif

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

          ;;
      esac
      echo "$as_me:13840: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&5

      # 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 :
  if test $gl_pthread_in_glibc = yes; then
             LIBPMULTITHREAD=
           else
             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

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
      echo "$as_me:13994: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&5
    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; }


    if test $gl_pthread_api = yes; then

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

    fi

        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sched.h>
int
main ()
{
sched_yield ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  LIB_SCHED_YIELD=

else
         { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5
$as_echo_n "checking for sched_yield in -lrt... " >&6; }
if ${ac_cv_lib_rt_sched_yield+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lrt  $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 sched_yield ();
int
main ()
{
return sched_yield ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_rt_sched_yield=yes
else
  ac_cv_lib_rt_sched_yield=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_rt_sched_yield" >&5
$as_echo "$ac_cv_lib_rt_sched_yield" >&6; }
if test "x$ac_cv_lib_rt_sched_yield" = xyes; then :
  LIB_SCHED_YIELD=-lrt
else
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lposix4" >&5
$as_echo_n "checking for sched_yield in -lposix4... " >&6; }
if ${ac_cv_lib_posix4_sched_yield+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lposix4  $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 sched_yield ();
int
main ()
{
return sched_yield ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_posix4_sched_yield=yes
else
  ac_cv_lib_posix4_sched_yield=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_posix4_sched_yield" >&5
$as_echo "$ac_cv_lib_posix4_sched_yield" >&6; }
if test "x$ac_cv_lib_posix4_sched_yield" = xyes; then :
  LIB_SCHED_YIELD=-lposix4
fi

fi


fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext


    gl_pthreadlib_body_done=done
  fi









  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setlocale (LC_ALL, NULL) is multithread-safe" >&5
$as_echo_n "checking whether setlocale (LC_ALL, NULL) is multithread-safe... " >&6; }
if ${gl_cv_func_setlocale_null_all_mtsafe+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case "$host_os" in
       # Guess no on musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin.
       *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | openbsd* | aix* | haiku* | cygwin*)
         gl_cv_func_setlocale_null_all_mtsafe=no ;;
       # Guess yes on glibc, HP-UX, IRIX, Solaris, native Windows.
       *-gnu* | gnu* | hpux* | irix* | solaris* | mingw*)
         gl_cv_func_setlocale_null_all_mtsafe=yes ;;
       # If we don't know, obey --enable-cross-guesses.
       *)
         gl_cv_func_setlocale_null_all_mtsafe="$gl_cross_guess_normal" ;;
     esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_all_mtsafe" >&5
$as_echo "$gl_cv_func_setlocale_null_all_mtsafe" >&6; }
    case "$host_os" in
    mingw*) ;;
    *)
      if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
        gl_cv_func_setlocale_null_all_mtsafe="trivially yes"
      fi
      ;;
  esac
  case "$gl_cv_func_setlocale_null_all_mtsafe" in
    *yes) SETLOCALE_NULL_ALL_MTSAFE=1 ;;
    *)    SETLOCALE_NULL_ALL_MTSAFE=0 ;;
  esac

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


    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setlocale (category, NULL) is multithread-safe" >&5
$as_echo_n "checking whether setlocale (category, NULL) is multithread-safe... " >&6; }
if ${gl_cv_func_setlocale_null_one_mtsafe+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case "$host_os" in
       # Guess no on OpenBSD, AIX.
       openbsd* | aix*)
         gl_cv_func_setlocale_null_one_mtsafe=no ;;
       # Guess yes on glibc, musl libc, macOS, FreeBSD, NetBSD, HP-UX, IRIX, Solaris, Haiku, Cygwin, native Windows.
       *-gnu* | gnu* | *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | hpux* | irix* | solaris* | haiku* | cygwin* | mingw*)
         gl_cv_func_setlocale_null_one_mtsafe=yes ;;
       # If we don't know, obey --enable-cross-guesses.
       *)
         gl_cv_func_setlocale_null_one_mtsafe="$gl_cross_guess_normal" ;;
     esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_one_mtsafe" >&5
$as_echo "$gl_cv_func_setlocale_null_one_mtsafe" >&6; }
    case "$host_os" in
    mingw*) ;;
    *)
      if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
        gl_cv_func_setlocale_null_one_mtsafe="trivially yes"
      fi
      ;;
  esac
  case "$gl_cv_func_setlocale_null_one_mtsafe" in
    *yes) SETLOCALE_NULL_ONE_MTSAFE=1 ;;
    *)    SETLOCALE_NULL_ONE_MTSAFE=0 ;;
  esac

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


    if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then
    case "$host_os" in
      mingw*) LIB_SETLOCALE_NULL= ;;
      *)


  { $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
  case "$host_os" in
       cygwin*)
                                    gl_cv_have_weak="guessing no"
         ;;
       *)
         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
         ;;
     esac
          case " $LDFLAGS " in
       *" -static "*) gl_cv_have_weak=no ;;
     esac
                    case "$gl_cv_have_weak" in
       *yes)
         case "$host_os" in
           freebsd* | dragonfly* | midnightbsd*)
             : > conftest1.c
             $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1
             cat <<EOF > conftest2.c
#include <pthread.h>
#pragma weak pthread_mutexattr_gettype
int main ()
{
  return (pthread_mutexattr_gettype != NULL);
}
EOF
             $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \
               || gl_cv_have_weak=no
             rm -f conftest1.c libempty.so conftest2.c conftest
             ;;
         esac
         ;;
     esac

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

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

      ;;
  esac

        case "$gl_cv_have_weak" in
          *yes) LIB_SETLOCALE_NULL= ;;
          *)    LIB_SETLOCALE_NULL="$LIBPTHREAD" ;;
        esac
        ;;
    esac
  else
    LIB_SETLOCALE_NULL=
  fi










  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IPv4 sockets" >&5
$as_echo_n "checking for IPv4 sockets... " >&6; }
if ${gl_cv_socket_ipv4+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_WINSOCK2_H
#include <winsock2.h>
#endif
int
main ()
{
int x = AF_INET; struct in_addr y; struct sockaddr_in z;
 if (&x && &y && &z) return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_socket_ipv4=yes
else
  gl_cv_socket_ipv4=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_socket_ipv4" >&5
$as_echo "$gl_cv_socket_ipv4" >&6; }
  if test $gl_cv_socket_ipv4 = yes; then

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

  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IPv6 sockets" >&5
$as_echo_n "checking for IPv6 sockets... " >&6; }
if ${gl_cv_socket_ipv6+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_WINSOCK2_H
#include <winsock2.h>
#endif
#ifdef HAVE_WS2TCPIP_H
#include <ws2tcpip.h>
#endif
int
main ()
{
int x = AF_INET6; struct in6_addr y; struct sockaddr_in6 z;
 if (&x && &y && &z) return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_socket_ipv6=yes
else
  gl_cv_socket_ipv6=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_socket_ipv6" >&5
$as_echo "$gl_cv_socket_ipv6" >&6; }
  if test $gl_cv_socket_ipv6 = yes; then

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

  fi













     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 WORD_BIT, BOOL_WIDTH etc." >&5
$as_echo_n "checking whether limits.h has WORD_BIT, BOOL_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 bw = BOOL_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
    GL_GENERATE_LIMITS_H=false
  else
    GL_GENERATE_LIMITS_H=true
  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.  */
#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 large enough" >&5
$as_echo_n "checking whether wint_t is large enough... " >&6; }
if ${gl_cv_type_wint_t_large_enough+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#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_large_enough=yes
else
  gl_cv_type_wint_t_large_enough=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_wint_t_large_enough" >&5
$as_echo "$gl_cv_type_wint_t_large_enough" >&6; }
    if test $gl_cv_type_wint_t_large_enough = no; then
      GNULIBHEADERS_OVERRIDE_WINT_T=1
    else
      GNULIBHEADERS_OVERRIDE_WINT_T=0
    fi
  else
    GNULIBHEADERS_OVERRIDE_WINT_T=0
  fi









    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler produces multi-arch binaries" >&5
$as_echo_n "checking whether the compiler produces multi-arch binaries... " >&6; }
if ${gl_cv_c_multiarch+:} false; then :
  $as_echo_n "(cached) " >&6
else
  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 | arm | arm64)
                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

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_multiarch" >&5
$as_echo "$gl_cv_c_multiarch" >&6; }
  if test $gl_cv_c_multiarch = yes; then
    APPLE_UNIVERSAL_BUILD=1
  else
    APPLE_UNIVERSAL_BUILD=0
  fi








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


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



  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


  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_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__ || 4 <= __clang_major__ || 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 and FreeBSD 13.0/arm64.  */
  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>


  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_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
  GL_GENERATE_STDINT_H=true
  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 works without ISO C predefines" >&5
$as_echo_n "checking whether stdint.h works without ISO C predefines... " >&6; }
if ${gl_cv_header_stdint_without_STDC_macros+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_cv_header_stdint_without_STDC_macros=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 */
#include <stdint.h>


  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_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_without_STDC_macros=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_without_STDC_macros" >&5
$as_echo "$gl_cv_header_stdint_without_STDC_macros" >&6; }

      if test $gl_cv_header_stdint_without_STDC_macros = no; 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>

  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_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
        GL_GENERATE_STDINT_H=false
      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"        "
  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_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"        "
  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_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.  */

  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_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.  */

  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_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.  */

  #include <stddef.h>
  #include <signal.h>
  #if HAVE_WCHAR_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 $GNULIBHEADERS_OVERRIDE_WINT_T = 1; then
    BITSIZEOF_WINT_T=32
  fi

      ;;
  esac



  GL_GENERATE_LIMITS_H=true







    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';
  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
















  PRIPTR_PREFIX=
  if $GL_GENERATE_STDINT_H; then
            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

         #ifdef _WIN64
         LLP64
         #endif

int
main ()
{

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  PRIPTR_PREFIX='"l"'
else
  PRIPTR_PREFIX='"ll"'
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  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)
            #else
             #define CONDITION (sizeof (int) < sizeof (long long int))
            #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)
            #else
             #define CONDITION (sizeof (long long int) == sizeof (long int))
            #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)
            #else
             #define CONDITION (sizeof (unsigned int) < sizeof (unsigned long long int))
            #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)
            #else
             #define CONDITION (sizeof (unsigned long long int) == sizeof (unsigned long int))
            #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




  GL_GNULIB_IMAXABS=0



  GL_GNULIB_IMAXDIV=0



  GL_GNULIB_STRTOIMAX=0



  GL_GNULIB_STRTOUMAX=0






  { $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 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



    HAVE_NEWLOCALE=1;
  HAVE_DUPLOCALE=1;
  HAVE_FREELOCALE=1;
  REPLACE_LOCALECONV=0;
  REPLACE_SETLOCALE=0;
  REPLACE_NEWLOCALE=0;
  REPLACE_DUPLOCALE=0;
  REPLACE_FREELOCALE=0;
  REPLACE_STRUCT_LCONV=0;
  LOCALENAME_ENHANCE_LOCALE_FUNCS=0;


    REPLACE_NULL=0;
  HAVE_MAX_ALIGN_T=1;
  HAVE_WCHAR_T=1;


  { $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







  GL_GENERATE_STDDEF_H=false

      { $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 __clang__ || 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
            typedef struct { char a; max_align_t b; } max_helper;
            typedef struct { char a; long b; } long_helper;
            typedef struct { char a; double b; } double_helper;
            typedef struct { char a; long double b; } long_double_helper;
            int check3[2 * (offsetof (long_helper, b) <= offsetof (max_helper, b)) - 1];
            int check4[2 * (offsetof (double_helper, b) <= offsetof (max_helper, b)) - 1];
            int check5[2 * (offsetof (long_double_helper, b) <= offsetof (max_helper, b)) - 1];

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
    GL_GENERATE_STDDEF_H=true
  fi

  if test $gt_cv_c_wchar_t = no; then
    HAVE_WCHAR_T=0
    GL_GENERATE_STDDEF_H=true
  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
    GL_GENERATE_STDDEF_H=true
  fi

  if $GL_GENERATE_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 "$as_me:${as_lineno-$LINENO}: checking whether locale.h defines locale_t" >&5
$as_echo_n "checking whether locale.h defines locale_t... " >&6; }
if ${gl_cv_header_locale_has_locale_t+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <locale.h>
            locale_t x;
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_header_locale_has_locale_t=yes
else
  gl_cv_header_locale_has_locale_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_header_locale_has_locale_t" >&5
$as_echo "$gl_cv_header_locale_has_locale_t" >&6; }


  if test $ac_cv_header_xlocale_h = yes; then
    HAVE_XLOCALE_H=1
    if test $gl_cv_header_locale_has_locale_t = yes; then
      gl_cv_header_locale_h_needs_xlocale_h=no
    else
      gl_cv_header_locale_h_needs_xlocale_h=yes
    fi
    HAVE_LOCALE_T=1
  else
    HAVE_XLOCALE_H=0
    gl_cv_header_locale_h_needs_xlocale_h=no
    if test $gl_cv_header_locale_has_locale_t = yes; then
      HAVE_LOCALE_T=1
    else
      HAVE_LOCALE_T=0
    fi
  fi












  case "$host_os" in
    solaris*)

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

      ;;
  esac

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether locale.h conforms to POSIX:2001" >&5
$as_echo_n "checking whether locale.h conforms to POSIX:2001... " >&6; }
if ${gl_cv_header_locale_h_posix2001+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <locale.h>
            int x = LC_MESSAGES;
            int y = sizeof (((struct lconv *) 0)->decimal_point);
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_header_locale_h_posix2001=yes
else
  gl_cv_header_locale_h_posix2001=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_locale_h_posix2001" >&5
$as_echo "$gl_cv_header_locale_h_posix2001" >&6; }

          { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct lconv is properly defined" >&5
$as_echo_n "checking whether struct lconv is properly defined... " >&6; }
if ${gl_cv_sys_struct_lconv_ok+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <locale.h>
            struct lconv l;
            int x = sizeof (l.decimal_point);
            int y = sizeof (l.int_p_cs_precedes);
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_sys_struct_lconv_ok=yes
else
  gl_cv_sys_struct_lconv_ok=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_lconv_ok" >&5
$as_echo "$gl_cv_sys_struct_lconv_ok" >&6; }
  if test $gl_cv_sys_struct_lconv_ok = no; then
            case "$host_os" in
      mingw*)
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef _MSC_VER
 Special
#endif

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

else
  REPLACE_STRUCT_LCONV=1
fi
rm -f conftest*

        ;;
      *) REPLACE_STRUCT_LCONV=1 ;;
    esac
  fi









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



  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <locale.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 'locale.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_locale_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

          gl_header=$gl_cv_absolute_locale_h
          gl_cv_next_locale_h='"'$gl_header'"'


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_locale_h" >&5
$as_echo "$gl_cv_next_locale_h" >&6; }
     fi
     NEXT_LOCALE_H=$gl_cv_next_locale_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='<'locale.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_locale_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_LOCALE_H=$gl_next_as_first_directive











  GL_GNULIB_LOCALECONV=0



  GL_GNULIB_SETLOCALE=0



  GL_GNULIB_SETLOCALE_NULL=0



  GL_GNULIB_DUPLOCALE=0



  GL_GNULIB_LOCALENAME=0





  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
  case "$host_os" in
       cygwin*)
                                    gl_cv_have_weak="guessing no"
         ;;
       *)
         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
         ;;
     esac
          case " $LDFLAGS " in
       *" -static "*) gl_cv_have_weak=no ;;
     esac
                    case "$gl_cv_have_weak" in
       *yes)
         case "$host_os" in
           freebsd* | dragonfly* | midnightbsd*)
             : > conftest1.c
             $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1
             cat <<EOF > conftest2.c
#include <pthread.h>
#pragma weak pthread_mutexattr_gettype
int main ()
{
  return (pthread_mutexattr_gettype != NULL);
}
EOF
             $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \
               || gl_cv_have_weak=no
             rm -f conftest1.c libempty.so conftest2.c conftest
             ;;
         esac
         ;;
     esac

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

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

      ;;
  esac

    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

      gl_have_isoc_threads="$ac_cv_header_threads_h"
    fi
    if test "$gl_use_threads" = yes \
       || test "$gl_use_threads" = posix \
       || test "$gl_use_threads" = isoc+posix; then


  if test -z "$gl_pthreadlib_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
      echo "$as_me:17071: gl_pthread_api=$gl_pthread_api" >&5
      echo "$as_me:17072: LIBPTHREAD=$LIBPTHREAD" >&5

      gl_pthread_in_glibc=no
      # On Linux with glibc >= 2.34, libc contains the fully functional
      # pthread functions.
      case "$host_os" in
        linux*)
          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <features.h>
             #ifdef __GNU_LIBRARY__
              #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 34) || (__GLIBC__ > 2)
               Lucky user
              #endif
             #endif

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

          ;;
      esac
      echo "$as_me:17097: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&5

      # 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 :
  if test $gl_pthread_in_glibc = yes; then
             LIBPMULTITHREAD=
           else
             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

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
      echo "$as_me:17251: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&5
    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; }


    if test $gl_pthread_api = yes; then

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

    fi

        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sched.h>
int
main ()
{
sched_yield ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  LIB_SCHED_YIELD=

else
         { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5
$as_echo_n "checking for sched_yield in -lrt... " >&6; }
if ${ac_cv_lib_rt_sched_yield+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lrt  $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 sched_yield ();
int
main ()
{
return sched_yield ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_rt_sched_yield=yes
else
  ac_cv_lib_rt_sched_yield=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_rt_sched_yield" >&5
$as_echo "$ac_cv_lib_rt_sched_yield" >&6; }
if test "x$ac_cv_lib_rt_sched_yield" = xyes; then :
  LIB_SCHED_YIELD=-lrt
else
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lposix4" >&5
$as_echo_n "checking for sched_yield in -lposix4... " >&6; }
if ${ac_cv_lib_posix4_sched_yield+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lposix4  $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 sched_yield ();
int
main ()
{
return sched_yield ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_posix4_sched_yield=yes
else
  ac_cv_lib_posix4_sched_yield=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_posix4_sched_yield" >&5
$as_echo "$ac_cv_lib_posix4_sched_yield" >&6; }
if test "x$ac_cv_lib_posix4_sched_yield" = xyes; then :
  LIB_SCHED_YIELD=-lposix4
fi

fi


fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext


    gl_pthreadlib_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 -z "$LIBMULTITHREAD" && test -z "$LTLIBMULTITHREAD"; then

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

          else
            if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then

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

              LIBTHREAD= LTLIBTHREAD=
            else
              case "$host_os" in
                freebsd* | dragonfly* | midnightbsd*)
                  if test "x$LIBTHREAD" != "x$LIBMULTITHREAD"; then

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

                  fi
                  ;;
              esac
            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



  if test -z "$gl_stdthreadlib_body_done"; then


    case "$host_os" in
      mingw*)
        LIBSTDTHREAD=
        ;;
      *)


  if test -z "$gl_pthreadlib_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
      echo "$as_me:17477: gl_pthread_api=$gl_pthread_api" >&5
      echo "$as_me:17478: LIBPTHREAD=$LIBPTHREAD" >&5

      gl_pthread_in_glibc=no
      # On Linux with glibc >= 2.34, libc contains the fully functional
      # pthread functions.
      case "$host_os" in
        linux*)
          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <features.h>
             #ifdef __GNU_LIBRARY__
              #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 34) || (__GLIBC__ > 2)
               Lucky user
              #endif
             #endif

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

          ;;
      esac
      echo "$as_me:17503: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&5

      # 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 :
  if test $gl_pthread_in_glibc = yes; then
             LIBPMULTITHREAD=
           else
             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

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
      echo "$as_me:17657: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&5
    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; }


    if test $gl_pthread_api = yes; then

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

    fi

        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sched.h>
int
main ()
{
sched_yield ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  LIB_SCHED_YIELD=

else
         { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5
$as_echo_n "checking for sched_yield in -lrt... " >&6; }
if ${ac_cv_lib_rt_sched_yield+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lrt  $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 sched_yield ();
int
main ()
{
return sched_yield ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_rt_sched_yield=yes
else
  ac_cv_lib_rt_sched_yield=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_rt_sched_yield" >&5
$as_echo "$ac_cv_lib_rt_sched_yield" >&6; }
if test "x$ac_cv_lib_rt_sched_yield" = xyes; then :
  LIB_SCHED_YIELD=-lrt
else
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lposix4" >&5
$as_echo_n "checking for sched_yield in -lposix4... " >&6; }
if ${ac_cv_lib_posix4_sched_yield+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lposix4  $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 sched_yield ();
int
main ()
{
return sched_yield ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_posix4_sched_yield=yes
else
  ac_cv_lib_posix4_sched_yield=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_posix4_sched_yield" >&5
$as_echo "$ac_cv_lib_posix4_sched_yield" >&6; }
if test "x$ac_cv_lib_posix4_sched_yield" = xyes; then :
  LIB_SCHED_YIELD=-lposix4
fi

fi


fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext


    gl_pthreadlib_body_done=done
  fi

        if test $ac_cv_header_threads_h = yes; then
                                                            for ac_func in thrd_create
do :
  ac_fn_c_check_func "$LINENO" "thrd_create" "ac_cv_func_thrd_create"
if test "x$ac_cv_func_thrd_create" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_THRD_CREATE 1
_ACEOF

fi
done

          if test $ac_cv_func_thrd_create = yes; then
            LIBSTDTHREAD=
          else
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thrd_create in -lstdthreads" >&5
$as_echo_n "checking for thrd_create in -lstdthreads... " >&6; }
if ${ac_cv_lib_stdthreads_thrd_create+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lstdthreads  $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 thrd_create ();
int
main ()
{
return thrd_create ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_stdthreads_thrd_create=yes
else
  ac_cv_lib_stdthreads_thrd_create=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_stdthreads_thrd_create" >&5
$as_echo "$ac_cv_lib_stdthreads_thrd_create" >&6; }
if test "x$ac_cv_lib_stdthreads_thrd_create" = xyes; then :

              LIBSTDTHREAD='-lstdthreads -lpthread'

else

                            LIBSTDTHREAD="$LIBPMULTITHREAD"

fi

          fi
        else
                    LIBSTDTHREAD="$LIBPMULTITHREAD $LIB_SCHED_YIELD"
        fi
        ;;
    esac


    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ISO C threads API is available" >&5
$as_echo_n "checking whether ISO C threads API is available... " >&6; }
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_threads_h" >&5
$as_echo "$ac_cv_header_threads_h" >&6; }
    gl_stdthreadlib_body_done=done
  fi

        LIBTHREAD=$LIBSTDTHREAD LTLIBTHREAD=$LIBSTDTHREAD
        LIBMULTITHREAD=$LIBSTDTHREAD LTLIBMULTITHREAD=$LIBSTDTHREAD
        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 whether malloc is ptrdiff_t safe" >&5
$as_echo_n "checking whether malloc is ptrdiff_t safe... " >&6; }
if ${gl_cv_malloc_ptrdiff+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdint.h>

int
main ()
{
/* 64-bit ptrdiff_t is so wide that no practical platform
               can exceed it.  */
            #define WIDE_PTRDIFF (PTRDIFF_MAX >> 31 >> 31 != 0)

            /* On rare machines where size_t fits in ptrdiff_t there
               is no problem.  */
            #define NARROW_SIZE (SIZE_MAX <= PTRDIFF_MAX)

            /* glibc 2.30 and later malloc refuses to exceed ptrdiff_t
               bounds even on 32-bit platforms.  We don't know which
               non-glibc systems are safe.  */
            #define KNOWN_SAFE (2 < __GLIBC__ + (30 <= __GLIBC_MINOR__))

            #if WIDE_PTRDIFF || NARROW_SIZE || KNOWN_SAFE
              return 0;
            #else
              #error "malloc might not be ptrdiff_t safe"
              syntax error
            #endif

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

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




  test "$gl_cv_malloc_ptrdiff" = yes || REPLACE_MALLOC_FOR_MALLOC_POSIX=1



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

                                    case "$host_os" in
        mingw*)
          gl_cv_func_malloc_posix=no ;;
        irix* | solaris*)

          gl_cv_func_malloc_posix=no ;;
        *)
          gl_cv_func_malloc_posix=yes ;;
      esac

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





  if test "$gl_cv_func_malloc_posix" = yes; then

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

  else
    REPLACE_MALLOC_FOR_MALLOC_POSIX=1
  fi



    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether malloc (0) returns nonnull" >&5
$as_echo_n "checking whether malloc (0) returns nonnull... " >&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* | freebsd* | netbsd* | openbsd* | bitrig* \
          | gnu* | *-musl* | midnightbsd* \
          | hpux* | solaris* | cygwin* | mingw* | msys* )
            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.  */
#include <stdlib.h>

int
main ()
{
void *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















     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












  { $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


{ $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




  # 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






  HAVE_MBSLEN=0;
    HAVE_EXPLICIT_BZERO=1;
  HAVE_FFSL=1;
  HAVE_FFSLL=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_STRERRORNAME_NP=1;
  HAVE_SIGABBREV_NP=1;
  HAVE_SIGDESCR_NP=1;
  HAVE_DECL_STRSIGNAL=1;
  HAVE_STRVERSCMP=1;
  REPLACE_FFSLL=0;
  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_STRERRORNAME_NP=0;
  REPLACE_STRSIGNAL=0;
  UNDEFINE_STRTOK_R=0;








  # 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)
    {
      /* Test against bugs on glibc systems.  */
      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 AIX 7.2.  */
      if (memchr (fence - 4, '6', 16) != fence - 4)
        result |= 8;
    }
  /* 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 |= 16;
  }
  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



  GL_GNULIB_EXPLICIT_BZERO=0



  GL_GNULIB_FFSL=0



  GL_GNULIB_FFSLL=0



  GL_GNULIB_MEMCHR=0



  GL_GNULIB_MEMMEM=0



  GL_GNULIB_MEMPCPY=0



  GL_GNULIB_MEMRCHR=0



  GL_GNULIB_RAWMEMCHR=0



  GL_GNULIB_STPCPY=0



  GL_GNULIB_STPNCPY=0



  GL_GNULIB_STRCHRNUL=0



  GL_GNULIB_STRDUP=0



  GL_GNULIB_STRNCAT=0



  GL_GNULIB_STRNDUP=0



  GL_GNULIB_STRNLEN=0



  GL_GNULIB_STRPBRK=0



  GL_GNULIB_STRSEP=0



  GL_GNULIB_STRSTR=0



  GL_GNULIB_STRCASESTR=0



  GL_GNULIB_STRTOK_R=0



  GL_GNULIB_MBSLEN=0



  GL_GNULIB_MBSNLEN=0



  GL_GNULIB_MBSCHR=0



  GL_GNULIB_MBSRCHR=0



  GL_GNULIB_MBSSTR=0



  GL_GNULIB_MBSCASECMP=0



  GL_GNULIB_MBSNCASECMP=0



  GL_GNULIB_MBSPCASECMP=0



  GL_GNULIB_MBSCASESTR=0



  GL_GNULIB_MBSCSPN=0



  GL_GNULIB_MBSPBRK=0



  GL_GNULIB_MBSSPN=0



  GL_GNULIB_MBSSEP=0



  GL_GNULIB_MBSTOK_R=0



  GL_GNULIB_STRERROR=0



  GL_GNULIB_STRERROR_R=0



  GL_GNULIB_STRERRORNAME_NP=0



  GL_GNULIB_SIGABBREV_NP=0



  GL_GNULIB_SIGDESCR_NP=0



  GL_GNULIB_STRSIGNAL=0



  GL_GNULIB_STRVERSCMP=0



  GL_GNULIB_MDA_MEMCCPY=1



  GL_GNULIB_MDA_STRDUP=1



ac_fn_c_check_decl "$LINENO" "memmem" "ac_cv_have_decl_memmem" "$ac_includes_default"
if test "x$ac_cv_have_decl_memmem" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_MEMMEM $ac_have_decl
_ACEOF





  for ac_func in memmem
do :
  ac_fn_c_check_func "$LINENO" "memmem" "ac_cv_func_memmem"
if test "x$ac_cv_func_memmem" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MEMMEM 1
_ACEOF

fi
done

  if test $ac_cv_func_memmem = yes; then
    HAVE_MEMMEM=1
  else
    HAVE_MEMMEM=0
  fi

  if test $ac_cv_have_decl_memmem = no; then
    HAVE_DECL_MEMMEM=0
  else
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether memmem works" >&5
$as_echo_n "checking whether memmem works... " >&6; }
if ${gl_cv_func_memmem_works_always+:} 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 <string.h> /* for __GNU_LIBRARY__ */
#ifdef __GNU_LIBRARY__
 #include <features.h>
 #if ((__GLIBC__ == 2 && ((__GLIBC_MINOR > 0 && __GLIBC_MINOR__ < 9) \
                          || __GLIBC_MINOR__ > 12)) \
      || (__GLIBC__ > 2)) \
     || defined __UCLIBC__
  Lucky user
 #endif
#elif defined __CYGWIN__
 #include <cygwin/version.h>
 #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7)
  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_memmem_works_always="guessing yes"
else
  gl_cv_func_memmem_works_always="$gl_cross_guess_normal"
fi
rm -f conftest*


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

#include <string.h> /* for memmem */
#define P "_EF_BF_BD"
#define HAYSTACK "F_BD_CE_BD" P P P P "_C3_88_20" P P P "_C3_A7_20" P
#define NEEDLE P P P P P

int
main ()
{

    int result = 0;
    if (memmem (HAYSTACK, strlen (HAYSTACK), NEEDLE, strlen (NEEDLE)))
      result |= 1;
    /* Check for empty needle behavior.  */
    {
      const char *haystack = "AAA";
      if (memmem (haystack, 3, (const char *) 1, 0) != haystack)
        result |= 2;
    }
    return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_memmem_works_always=yes
else
  gl_cv_func_memmem_works_always=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_memmem_works_always" >&5
$as_echo "$gl_cv_func_memmem_works_always" >&6; }
    case "$gl_cv_func_memmem_works_always" in
      *yes) ;;
      *)
        REPLACE_MEMMEM=1
        ;;
    esac
  fi
  :

ac_fn_c_check_decl "$LINENO" "memrchr" "ac_cv_have_decl_memrchr" "$ac_includes_default"
if test "x$ac_cv_have_decl_memrchr" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_MEMRCHR $ac_have_decl
_ACEOF





  { $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










    HAVE_STRUCT_ADDRINFO=1;
  HAVE_DECL_FREEADDRINFO=1;
  HAVE_DECL_GAI_STRERROR=1;
  HAVE_DECL_GETADDRINFO=1;
  HAVE_DECL_GETNAMEINFO=1;
  REPLACE_GAI_STRERROR=0;
  REPLACE_GETADDRINFO=0;












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

             if test $ac_cv_header_netdb_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <netdb.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 'netdb.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_netdb_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

          gl_header=$gl_cv_absolute_netdb_h
          gl_cv_next_netdb_h='"'$gl_header'"'
          else
               gl_cv_next_netdb_h='<'netdb.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_netdb_h" >&5
$as_echo "$gl_cv_next_netdb_h" >&6; }
     fi
     NEXT_NETDB_H=$gl_cv_next_netdb_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='<'netdb.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_netdb_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_NETDB_H=$gl_next_as_first_directive




  if test $ac_cv_header_netdb_h = yes; then
    HAVE_NETDB_H=1
  else
    HAVE_NETDB_H=0
  fi








  GL_GNULIB_GETADDRINFO=0




  { $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











    HAVE_PSELECT=1;
  REPLACE_PSELECT=0;
  REPLACE_SELECT=0;






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <sys/select.h> is self-contained" >&5
$as_echo_n "checking whether <sys/select.h> is self-contained... " >&6; }
if ${gl_cv_header_sys_select_h_selfcontained+:} false; then :
  $as_echo_n "(cached) " >&6
else

                                    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/select.h>
int
main ()
{
struct timeval b;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_header_sys_select_h_selfcontained=yes
else
  gl_cv_header_sys_select_h_selfcontained=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
                        if test $gl_cv_header_sys_select_h_selfcontained = yes; then
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/select.h>
int
main ()
{
int memset; int bzero;
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/select.h>
int
main ()
{

                  #undef memset
                  #define memset nonexistent_memset
                  extern
                  #ifdef __cplusplus
                  "C"
                  #endif
                  void *memset (void *, int, unsigned long);
                  #undef bzero
                  #define bzero nonexistent_bzero
                  extern
                  #ifdef __cplusplus
                  "C"
                  #endif
                  void bzero (void *, unsigned long);
                  fd_set fds;
                  FD_ZERO (&fds);

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_link "$LINENO"; then :

else
  gl_cv_header_sys_select_h_selfcontained=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      fi

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









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

             if test $ac_cv_header_sys_select_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/select.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/select.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_select_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

          gl_header=$gl_cv_absolute_sys_select_h
          gl_cv_next_sys_select_h='"'$gl_header'"'
          else
               gl_cv_next_sys_select_h='<'sys/select.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_select_h" >&5
$as_echo "$gl_cv_next_sys_select_h" >&6; }
     fi
     NEXT_SYS_SELECT_H=$gl_cv_next_sys_select_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/select.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_sys_select_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H=$gl_next_as_first_directive




  if test $ac_cv_header_sys_select_h = yes; then
    HAVE_SYS_SELECT_H=1
  else
    HAVE_SYS_SELECT_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












  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

   LIBSOCKET=
  if test $HAVE_WINSOCK2_H = 1; then
                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for WSAStartup" >&5
$as_echo_n "checking for WSAStartup... " >&6; }
if ${gl_cv_func_wsastartup+:} false; then :
  $as_echo_n "(cached) " >&6
else

       gl_save_LIBS="$LIBS"
       LIBS="$LIBS -lws2_32"
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#ifdef HAVE_WINSOCK2_H
# include <winsock2.h>
#endif
int
main ()
{

            WORD wVersionRequested = MAKEWORD(1, 1);
            WSADATA wsaData;
            int err = WSAStartup(wVersionRequested, &wsaData);
            WSACleanup ();

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_wsastartup=yes
else
  gl_cv_func_wsastartup=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
       LIBS="$gl_save_LIBS"

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

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

      LIBSOCKET='-lws2_32'
    fi
  else
                                    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing setsockopt" >&5
$as_echo_n "checking for library containing setsockopt... " >&6; }
if ${gl_cv_lib_socket+:} false; then :
  $as_echo_n "(cached) " >&6
else

      gl_cv_lib_socket=
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
extern
#ifdef __cplusplus
"C"
#endif
char setsockopt();
int
main ()
{
setsockopt();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :

else
  gl_save_LIBS="$LIBS"
         LIBS="$gl_save_LIBS -lsocket"
         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
extern
#ifdef __cplusplus
"C"
#endif
char setsockopt();
int
main ()
{
setsockopt();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_lib_socket="-lsocket"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
         if test -z "$gl_cv_lib_socket"; then
           LIBS="$gl_save_LIBS -lnetwork"
           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
extern
#ifdef __cplusplus
"C"
#endif
char setsockopt();
int
main ()
{
setsockopt();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_lib_socket="-lnetwork"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
           if test -z "$gl_cv_lib_socket"; then
             LIBS="$gl_save_LIBS -lnet"
             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
extern
#ifdef __cplusplus
"C"
#endif
char setsockopt();
int
main ()
{
setsockopt();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_lib_socket="-lnet"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
           fi
         fi
         LIBS="$gl_save_LIBS"

fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      if test -z "$gl_cv_lib_socket"; then
        gl_cv_lib_socket="none needed"
      fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_lib_socket" >&5
$as_echo "$gl_cv_lib_socket" >&6; }
    if test "$gl_cv_lib_socket" != "none needed"; then
      LIBSOCKET="$gl_cv_lib_socket"
    fi
  fi






  :




  GL_GNULIB_PSELECT=0



  GL_GNULIB_SELECT=0



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






  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




    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












     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










  GL_GNULIB_PTHREAD_SIGMASK=0



  GL_GNULIB_RAISE=0



  GL_GNULIB_SIGNAL_H_SIGPIPE=0



  GL_GNULIB_SIGPROCMASK=0



  GL_GNULIB_SIGACTION=0



{ $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




ac_fn_c_check_decl "$LINENO" "fcloseall" "ac_cv_have_decl_fcloseall" "$ac_includes_default"
if test "x$ac_cv_have_decl_fcloseall" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_FCLOSEALL $ac_have_decl
_ACEOF




  $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













  if test $ac_cv_have_decl_fcloseall = no; then
    HAVE_DECL_FCLOSEALL=0
  fi

ac_fn_c_check_decl "$LINENO" "ecvt" "ac_cv_have_decl_ecvt" "$ac_includes_default"
if test "x$ac_cv_have_decl_ecvt" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_ECVT $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "fcvt" "ac_cv_have_decl_fcvt" "$ac_includes_default"
if test "x$ac_cv_have_decl_fcvt" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_FCVT $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "gcvt" "ac_cv_have_decl_gcvt" "$ac_includes_default"
if test "x$ac_cv_have_decl_gcvt" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_GCVT $ac_have_decl
_ACEOF











     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












  if test $ac_cv_have_decl_ecvt = no; then
    HAVE_DECL_ECVT=0
  fi

  if test $ac_cv_have_decl_fcvt = no; then
    HAVE_DECL_FCVT=0
  fi

  if test $ac_cv_have_decl_gcvt = no; then
    HAVE_DECL_GCVT=0
  fi

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


     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 "$GL_GENERATE_ERRNO_H:$REPLACE_STRERROR_0" = false: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 $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

























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

             if test $ac_cv_header_strings_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <strings.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 'strings.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_strings_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

          gl_header=$gl_cv_absolute_strings_h
          gl_cv_next_strings_h='"'$gl_header'"'
          else
               gl_cv_next_strings_h='<'strings.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_strings_h" >&5
$as_echo "$gl_cv_next_strings_h" >&6; }
     fi
     NEXT_STRINGS_H=$gl_cv_next_strings_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='<'strings.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_strings_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_STRINGS_H=$gl_next_as_first_directive




  if test $ac_cv_header_strings_h = yes; then
    HAVE_STRINGS_H=1
  else
    HAVE_STRINGS_H=0
  fi






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 test $REPLACE_MEMCHR = 1; then
    REPLACE_STRSTR=1
  else
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strstr works" >&5
$as_echo_n "checking whether strstr works... " >&6; }
if ${gl_cv_func_strstr_works_always+:} 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 <string.h> /* for __GNU_LIBRARY__ */
#ifdef __GNU_LIBRARY__
 #include <features.h>
 #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \
     || defined __UCLIBC__
  Lucky user
 #endif
#elif defined __CYGWIN__
 #include <cygwin/version.h>
 #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7)
  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_strstr_works_always="guessing yes"
else
  gl_cv_func_strstr_works_always="$gl_cross_guess_normal"
fi
rm -f conftest*


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

#include <string.h> /* for __GNU_LIBRARY__, strstr */
#ifdef __GNU_LIBRARY__
 #include <features.h>
 #if __GLIBC__ == 2 && __GLIBC_MINOR__ == 28
  Unlucky user
 #endif
#endif
#define P "_EF_BF_BD"
#define HAYSTACK "F_BD_CE_BD" P P P P "_C3_88_20" P P P "_C3_A7_20" P
#define NEEDLE P P P P P

int
main ()
{
return !!strstr (HAYSTACK, NEEDLE);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_strstr_works_always=yes
else
  gl_cv_func_strstr_works_always=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_strstr_works_always" >&5
$as_echo "$gl_cv_func_strstr_works_always" >&6; }
    case "$gl_cv_func_strstr_works_always" in
      *yes) ;;
      *)
        REPLACE_STRSTR=1
        ;;
    esac
  fi

ac_fn_c_check_decl "$LINENO" "strtok_r" "ac_cv_have_decl_strtok_r" "$ac_includes_default"
if test "x$ac_cv_have_decl_strtok_r" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_STRTOK_R $ac_have_decl
_ACEOF














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

             if test $ac_cv_header_sys_random_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/random.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/random.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_random_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

          gl_header=$gl_cv_absolute_sys_random_h
          gl_cv_next_sys_random_h='"'$gl_header'"'
          else
               gl_cv_next_sys_random_h='<'sys/random.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_random_h" >&5
$as_echo "$gl_cv_next_sys_random_h" >&6; }
     fi
     NEXT_SYS_RANDOM_H=$gl_cv_next_sys_random_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/random.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_sys_random_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H=$gl_next_as_first_directive




  if test $ac_cv_header_sys_random_h = yes; then
    HAVE_SYS_RANDOM_H=1
  else
    HAVE_SYS_RANDOM_H=0
  fi



  if test $ac_cv_header_sys_random_h = yes; then
    UNISTD_H_HAVE_SYS_RANDOM_H=1
  fi

















$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




















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

             if test $ac_cv_header_sys_uio_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/uio.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/uio.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_uio_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

          gl_header=$gl_cv_absolute_sys_uio_h
          gl_cv_next_sys_uio_h='"'$gl_header'"'
          else
               gl_cv_next_sys_uio_h='<'sys/uio.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_uio_h" >&5
$as_echo "$gl_cv_next_sys_uio_h" >&6; }
     fi
     NEXT_SYS_UIO_H=$gl_cv_next_sys_uio_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/uio.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_sys_uio_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H=$gl_next_as_first_directive




  if test $ac_cv_header_sys_uio_h = yes; then
    HAVE_SYS_UIO_H=1
  else
    HAVE_SYS_UIO_H=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













  GL_GNULIB_WAITPID=0




    HAVE_DECL_LOCALTIME_R=1;
  HAVE_NANOSLEEP=1;
  HAVE_STRPTIME=1;
  HAVE_TIMEGM=1;
  HAVE_TIMESPEC_GET=1;
  HAVE_TIMESPEC_GETRES=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;



  { $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








  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIME_UTC in <time.h>" >&5
$as_echo_n "checking for TIME_UTC in <time.h>... " >&6; }
if ${gl_cv_time_h_has_TIME_UTC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <time.h>

int
main ()
{
static int x = TIME_UTC; x++;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_time_h_has_TIME_UTC=yes
else
  gl_cv_time_h_has_TIME_UTC=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_time_h_has_TIME_UTC" >&5
$as_echo "$gl_cv_time_h_has_TIME_UTC" >&6; }
  if test $gl_cv_time_h_has_TIME_UTC = yes; then
    TIME_H_DEFINES_TIME_UTC=1
  else
    TIME_H_DEFINES_TIME_UTC=0
  fi




  GL_GNULIB_CTIME=0



  GL_GNULIB_MKTIME=0



  GL_GNULIB_LOCALTIME=0



  GL_GNULIB_NANOSLEEP=0



  GL_GNULIB_STRFTIME=0



  GL_GNULIB_STRPTIME=0



  GL_GNULIB_TIMEGM=0



  GL_GNULIB_TIMESPEC_GET=0



  GL_GNULIB_TIMESPEC_GETRES=0



  GL_GNULIB_TIME_R=0



  GL_GNULIB_TIME_RZ=0



  GL_GNULIB_TZSET=0



  GL_GNULIB_MDA_TZSET=1





ac_fn_c_check_decl "$LINENO" "execvpe" "ac_cv_have_decl_execvpe" "$ac_includes_default"
if test "x$ac_cv_have_decl_execvpe" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_EXECVPE $ac_have_decl
_ACEOF













     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 $ac_cv_have_decl_execvpe = no; then
    HAVE_DECL_EXECVPE=0
  fi

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





  if test $ac_cv_header_crtdefs_h = yes; then
    HAVE_CRTDEFS_H=1
  else
    HAVE_CRTDEFS_H=0
  fi














     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










  ac_fn_c_check_decl "$LINENO" "wcsdup" "ac_cv_have_decl_wcsdup" "
      #include <wchar.h>

"
if test "x$ac_cv_have_decl_wcsdup" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_WCSDUP $ac_have_decl
_ACEOF

  if test $ac_cv_have_decl_wcsdup = no; then
    HAVE_DECL_WCSDUP=0
  fi


    HAVE_ISWBLANK=1;
  HAVE_WCTYPE_T=1;
  HAVE_WCTRANS_T=1;
  REPLACE_ISWBLANK=0;
  REPLACE_ISWDIGIT=0;
  REPLACE_ISWXDIGIT=0;










  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.  */

               #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 $GNULIBHEADERS_OVERRIDE_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" "#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.  */
#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.  */
#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







  GL_GNULIB_ISWBLANK=0



  GL_GNULIB_ISWDIGIT=0



  GL_GNULIB_ISWXDIGIT=0



  GL_GNULIB_WCTYPE=0



  GL_GNULIB_ISWCTYPE=0



  GL_GNULIB_WCTRANS=0



  GL_GNULIB_TOWCTRANS=0







  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler option to allow warnings" >&5
$as_echo_n "checking for C compiler option to allow warnings... " >&6; }
if ${gl_cv_cc_wallow+:} false; then :
  $as_echo_n "(cached) " >&6
else
  rm -f conftest*
     echo 'int dummy;' > conftest.c
     { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c 2>conftest1.err'
  { { 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
     { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -Wno-error -c conftest.c 2>conftest2.err'
  { { 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
                         if test $? = 0 && test `wc -l < conftest1.err` = `wc -l < conftest2.err`; then
       gl_cv_cc_wallow='-Wno-error'
     else
       gl_cv_cc_wallow=none
     fi
     rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_wallow" >&5
$as_echo "$gl_cv_cc_wallow" >&6; }
  case "$gl_cv_cc_wallow" in
    none) GL_CFLAG_ALLOW_WARNINGS='' ;;
    *)    GL_CFLAG_ALLOW_WARNINGS="$gl_cv_cc_wallow" ;;
  esac




      GL_CFLAG_GNULIB_WARNINGS=''
  if test -n "$GL_CFLAG_ALLOW_WARNINGS"; then
                                                                        cat > conftest.c <<\EOF
      #if __GNUC__ >= 3 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
      -Wno-cast-qual
      -Wno-conversion
      -Wno-float-equal
      -Wno-sign-compare
      -Wno-undef
      -Wno-unused-function
      -Wno-unused-parameter
      #endif
      #if __GNUC__ + (__GNUC_MINOR__ >= 9) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
      -Wno-float-conversion
      #endif
      #if __GNUC__ >= 7 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
      -Wimplicit-fallthrough
      #endif
      #if __GNUC__ + (__GNUC_MINOR__ >= 8) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
      -Wno-pedantic
      #endif
      #if __GNUC__ + (__GNUC_MINOR__ >= 3) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
      -Wno-sign-conversion
      -Wno-type-limits
      #endif
      #if __GNUC__ + (__GNUC_MINOR__ >= 5) > 4
      -Wno-unsuffixed-float-constants
      #endif
EOF
    gl_command="$CC $CFLAGS $CPPFLAGS -E conftest.c > conftest.out"
    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gl_command\""; } >&5
  (eval $gl_command) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
      gl_options=`grep -v '#' conftest.out`
      for word in $gl_options; do
        GL_CFLAG_GNULIB_WARNINGS="$GL_CFLAG_GNULIB_WARNINGS $word"
      done
    fi
    rm -f conftest.c conftest.out
  fi




   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='import/m4'












  gl_source_base='import'
  gl_source_base_prefix=


     if test "$ac_cv_header_winsock2_h" = yes; then
  GL_COND_OBJ_ACCEPT_TRUE=
  GL_COND_OBJ_ACCEPT_FALSE='#'
else
  GL_COND_OBJ_ACCEPT_TRUE='#'
  GL_COND_OBJ_ACCEPT_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_ACCEPT_TRUE}" && test -z "${GL_COND_OBJ_ACCEPT_FALSE}"; then
    GL_COND_OBJ_ACCEPT_TRUE='#'
    GL_COND_OBJ_ACCEPT_FALSE='#'
  fi










          GL_GNULIB_ACCEPT=1





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





  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

      GL_GENERATE_ALLOCA_H=true
    else
                  GL_GENERATE_ALLOCA_H=false
    fi
  else
    GL_GENERATE_ALLOCA_H=true
  fi

  if test $ac_cv_working_alloca_h = yes; then
    HAVE_ALLOCA_H=1
  else
    HAVE_ALLOCA_H=0
  fi






  case "$GL_GENERATE_ALLOCA_H" in
    false) ALLOCA_H='' ;;
    true)
                  if test -z "$ALLOCA_H"; then
        ALLOCA_H="${gl_source_base_prefix}alloca.h"
      fi
      ;;
    *) echo "*** GL_GENERATE_ALLOCA_H is not set correctly" 1>&2; exit 1 ;;
  esac


     if $GL_GENERATE_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 -z "${GL_GENERATE_ALLOCA_H_TRUE}" && test -z "${GL_GENERATE_ALLOCA_H_FALSE}"; then
    GL_GENERATE_ALLOCA_H_TRUE='#'
    GL_GENERATE_ALLOCA_H_FALSE='#'
  fi
















     if test "$ac_cv_header_winsock2_h" = yes; then
  GL_COND_OBJ_BIND_TRUE=
  GL_COND_OBJ_BIND_FALSE='#'
else
  GL_COND_OBJ_BIND_TRUE='#'
  GL_COND_OBJ_BIND_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_BIND_TRUE}" && test -z "${GL_COND_OBJ_BIND_FALSE}"; then
    GL_COND_OBJ_BIND_TRUE='#'
    GL_COND_OBJ_BIND_FALSE='#'
  fi










          GL_GNULIB_BIND=1





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









  if test $ac_cv_func_btowc = no; then
    HAVE_BTOWC=0
  else




        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether btowc(0) is correct" >&5
$as_echo_n "checking whether btowc(0) is correct... " >&6; }
if ${gl_cv_func_btowc_nul+:} false; then :
  $as_echo_n "(cached) " >&6
else

        if test "$cross_compiling" = yes; then :

           case "$host_os" in
                      # Guess no on Cygwin.
             cygwin*) gl_cv_func_btowc_nul="guessing no" ;;
                      # Guess yes on native Windows.
             mingw*)  gl_cv_func_btowc_nul="guessing yes" ;;
                      # Guess yes otherwise.
             *)       gl_cv_func_btowc_nul="guessing yes" ;;
           esac

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

#include <wchar.h>
int main ()
{
  if (btowc ('\0') != 0)
    return 1;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_btowc_nul=yes
else
  gl_cv_func_btowc_nul=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_btowc_nul" >&5
$as_echo "$gl_cv_func_btowc_nul" >&6; }

        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether btowc(EOF) is correct" >&5
$as_echo_n "checking whether btowc(EOF) is correct... " >&6; }
if ${gl_cv_func_btowc_eof+:} false; then :
  $as_echo_n "(cached) " >&6
else

                        case "$host_os" in
                  # Guess no on IRIX.
          irix*)  gl_cv_func_btowc_eof="guessing no" ;;
                  # Guess yes on native Windows.
          mingw*) gl_cv_func_btowc_eof="guessing yes" ;;
                  # Guess yes otherwise.
          *)      gl_cv_func_btowc_eof="guessing yes" ;;
        esac
        if test $LOCALE_FR != none; then
          if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
#include <stdio.h>
#include <wchar.h>
int main ()
{
  if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
    {
      if (btowc (EOF) != WEOF)
        return 1;
    }
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_btowc_eof=yes
else
  gl_cv_func_btowc_eof=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_btowc_eof" >&5
$as_echo "$gl_cv_func_btowc_eof" >&6; }

    case "$gl_cv_func_btowc_nul" in
      *yes) ;;
      *) REPLACE_BTOWC=1 ;;
    esac
    case "$gl_cv_func_btowc_eof" in
      *yes) ;;
      *) REPLACE_BTOWC=1 ;;
    esac
  fi


     if test $HAVE_BTOWC = 0 || test $REPLACE_BTOWC = 1; then
  GL_COND_OBJ_BTOWC_TRUE=
  GL_COND_OBJ_BTOWC_FALSE='#'
else
  GL_COND_OBJ_BTOWC_TRUE='#'
  GL_COND_OBJ_BTOWC_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_BTOWC_TRUE}" && test -z "${GL_COND_OBJ_BTOWC_FALSE}"; then
    GL_COND_OBJ_BTOWC_TRUE='#'
    GL_COND_OBJ_BTOWC_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_BTOWC_TRUE"; then :


  :


fi














          GL_GNULIB_BTOWC=1





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




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_expect" >&5
$as_echo_n "checking for __builtin_expect... " >&6; }
if ${gl_cv___builtin_expect+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

         int
         main (int argc, char **argv)
         {
           argc = __builtin_expect (argc, 100);
           return argv[argc != 100][0];
         }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv___builtin_expect=yes
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

             #include <builtins.h>
             int
             main (int argc, char **argv)
             {
               argc = __builtin_expect (argc, 100);
               return argv[argc != 100][0];
             }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv___builtin_expect="in <builtins.h>"
else
  gl_cv___builtin_expect=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
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___builtin_expect" >&5
$as_echo "$gl_cv___builtin_expect" >&6; }
  if test "$gl_cv___builtin_expect" = yes; then
    $as_echo "#define HAVE___BUILTIN_EXPECT 1" >>confdefs.h

  elif test "$gl_cv___builtin_expect" = "in <builtins.h>"; then
    $as_echo "#define HAVE___BUILTIN_EXPECT 2" >>confdefs.h

  fi





  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_COND_OBJ_CANONICALIZE_LGPL_TRUE=
  GL_COND_OBJ_CANONICALIZE_LGPL_FALSE='#'
else
  GL_COND_OBJ_CANONICALIZE_LGPL_TRUE='#'
  GL_COND_OBJ_CANONICALIZE_LGPL_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_CANONICALIZE_LGPL_TRUE}" && test -z "${GL_COND_OBJ_CANONICALIZE_LGPL_FALSE}"; then
    GL_COND_OBJ_CANONICALIZE_LGPL_TRUE='#'
    GL_COND_OBJ_CANONICALIZE_LGPL_FALSE='#'
  fi



cat >>confdefs.h <<_ACEOF
#define GNULIB_CANONICALIZE_LGPL 1
_ACEOF











          GL_GNULIB_CANONICALIZE_FILE_NAME=1





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












          GL_GNULIB_REALPATH=1





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












          GL_GNULIB_CHDIR=1





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





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether this system supports file names of any length" >&5
$as_echo_n "checking whether this system supports file names of any length... " >&6; }
if ${gl_cv_have_unlimited_file_name_length+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Arrange to define PATH_MAX, like "pathmax.h" does. */
#if HAVE_UNISTD_H
# include <unistd.h>
#endif
#include <limits.h>
#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
# include <sys/param.h>
#endif
#if !defined PATH_MAX && defined MAXPATHLEN
# define PATH_MAX MAXPATHLEN
#endif
#ifdef __hpux
# undef PATH_MAX
# define PATH_MAX 1024
#endif
#if defined _WIN32 && ! defined __CYGWIN__
# undef PATH_MAX
# define PATH_MAX 260
#endif

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

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


     if test $gl_cv_have_unlimited_file_name_length = no; then
  GL_COND_OBJ_CHDIR_LONG_TRUE=
  GL_COND_OBJ_CHDIR_LONG_FALSE='#'
else
  GL_COND_OBJ_CHDIR_LONG_TRUE='#'
  GL_COND_OBJ_CHDIR_LONG_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_CHDIR_LONG_TRUE}" && test -z "${GL_COND_OBJ_CHDIR_LONG_FALSE}"; then
    GL_COND_OBJ_CHDIR_LONG_TRUE='#'
    GL_COND_OBJ_CHDIR_LONG_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_CHDIR_LONG_TRUE"; then :

    :

fi


     if test $HAVE_CHOWN = 0 || test $REPLACE_CHOWN = 1; then
  GL_COND_OBJ_CHOWN_TRUE=
  GL_COND_OBJ_CHOWN_FALSE='#'
else
  GL_COND_OBJ_CHOWN_TRUE='#'
  GL_COND_OBJ_CHOWN_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_CHOWN_TRUE}" && test -z "${GL_COND_OBJ_CHOWN_FALSE}"; then
    GL_COND_OBJ_CHOWN_TRUE='#'
    GL_COND_OBJ_CHOWN_FALSE='#'
  fi


     if test $REPLACE_CHOWN = 1 && test $ac_cv_func_fchown = no; then
  GL_COND_OBJ_FCHOWN_STUB_TRUE=
  GL_COND_OBJ_FCHOWN_STUB_FALSE='#'
else
  GL_COND_OBJ_FCHOWN_STUB_TRUE='#'
  GL_COND_OBJ_FCHOWN_STUB_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_FCHOWN_STUB_TRUE}" && test -z "${GL_COND_OBJ_FCHOWN_STUB_FALSE}"; then
    GL_COND_OBJ_FCHOWN_STUB_TRUE='#'
    GL_COND_OBJ_FCHOWN_STUB_FALSE='#'
  fi










          GL_GNULIB_CHOWN=1





$as_echo "#define GNULIB_TEST_CHOWN 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_getres 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 = 0; then



  if test $ac_cv_func_fchdir = no; then
    HAVE_FCHDIR=0
  fi

      if test $HAVE_FCHDIR = 0; then
        REPLACE_CLOSE=1
      fi
    fi



     if test $REPLACE_CLOSE = 1; then
  GL_COND_OBJ_CLOSE_TRUE=
  GL_COND_OBJ_CLOSE_FALSE='#'
else
  GL_COND_OBJ_CLOSE_TRUE='#'
  GL_COND_OBJ_CLOSE_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_CLOSE_TRUE}" && test -z "${GL_COND_OBJ_CLOSE_FALSE}"; then
    GL_COND_OBJ_CLOSE_TRUE='#'
    GL_COND_OBJ_CLOSE_FALSE='#'
  fi










          GL_GNULIB_CLOSE=1





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






  for ac_func in closedir
do :
  ac_fn_c_check_func "$LINENO" "closedir" "ac_cv_func_closedir"
if test "x$ac_cv_func_closedir" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_CLOSEDIR 1
_ACEOF

fi
done

  if test $ac_cv_func_closedir = no; then
    HAVE_CLOSEDIR=0
  fi




  if test $ac_cv_func_fchdir = no; then
    HAVE_FCHDIR=0
  fi

    if test $HAVE_FCHDIR = 0; then
      if test $HAVE_CLOSEDIR = 1; then
        REPLACE_CLOSEDIR=1
      fi
    fi

    case $host_os,$HAVE_CLOSEDIR in
    os2*,1)
      REPLACE_CLOSEDIR=1;;
  esac


     if test $HAVE_CLOSEDIR = 0 || test $REPLACE_CLOSEDIR = 1; then
  GL_COND_OBJ_CLOSEDIR_TRUE=
  GL_COND_OBJ_CLOSEDIR_FALSE='#'
else
  GL_COND_OBJ_CLOSEDIR_TRUE='#'
  GL_COND_OBJ_CLOSEDIR_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_CLOSEDIR_TRUE}" && test -z "${GL_COND_OBJ_CLOSEDIR_FALSE}"; then
    GL_COND_OBJ_CLOSEDIR_TRUE='#'
    GL_COND_OBJ_CLOSEDIR_FALSE='#'
  fi










          GL_GNULIB_CLOSEDIR=1





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





     if test "$ac_cv_header_winsock2_h" = yes; then
  GL_COND_OBJ_CONNECT_TRUE=
  GL_COND_OBJ_CONNECT_FALSE='#'
else
  GL_COND_OBJ_CONNECT_TRUE='#'
  GL_COND_OBJ_CONNECT_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_CONNECT_TRUE}" && test -z "${GL_COND_OBJ_CONNECT_FALSE}"; then
    GL_COND_OBJ_CONNECT_TRUE='#'
    GL_COND_OBJ_CONNECT_FALSE='#'
  fi










          GL_GNULIB_CONNECT=1





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










      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for d_ino member in directory struct" >&5
$as_echo_n "checking for d_ino member in directory struct... " >&6; }
if ${gl_cv_struct_dirent_d_ino+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  case "$host_os" in
                            # Guess yes on glibc systems with Linux kernel.
              linux*-gnu*)  gl_cv_struct_dirent_d_ino="guessing yes" ;;
                            # Guess yes on musl systems with Linux kernel.
              linux*-musl*) gl_cv_struct_dirent_d_ino="guessing yes" ;;
                            # Guess no on native Windows.
              mingw*)       gl_cv_struct_dirent_d_ino="guessing no" ;;
                            # If we don't know, obey --enable-cross-guesses.
              *)            gl_cv_struct_dirent_d_ino="$gl_cross_guess_normal" ;;
            esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
             #include <sys/stat.h>
             #include <dirent.h>

int
main ()
{
DIR *dp = opendir (".");
             struct dirent *e;
             struct stat st;
             if (! dp)
               return 1;
             e = readdir (dp);
             if (! e)
               { closedir (dp); return 2; }
             if (lstat (e->d_name, &st) != 0)
               { closedir (dp); return 3; }
             if (e->d_ino != st.st_ino)
               { closedir (dp); return 4; }
             closedir (dp);
             return 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_struct_dirent_d_ino=yes
else
  gl_cv_struct_dirent_d_ino=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_struct_dirent_d_ino" >&5
$as_echo "$gl_cv_struct_dirent_d_ino" >&6; }
   case "$gl_cv_struct_dirent_d_ino" in
     *yes)

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

       ;;
   esac


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for d_type member in directory struct" >&5
$as_echo_n "checking for d_type member in directory struct... " >&6; }
if ${gl_cv_struct_dirent_d_type+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <dirent.h>

int
main ()
{
struct dirent dp; dp.d_type = 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_struct_dirent_d_type=yes
else
  gl_cv_struct_dirent_d_type=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_struct_dirent_d_type" >&5
$as_echo "$gl_cv_struct_dirent_d_type" >&6; }
   if test $gl_cv_struct_dirent_d_type = yes; then

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

   fi














  for ac_func in dirfd
do :
  ac_fn_c_check_func "$LINENO" "dirfd" "ac_cv_func_dirfd"
if test "x$ac_cv_func_dirfd" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_DIRFD 1
_ACEOF

fi
done

  ac_fn_c_check_decl "$LINENO" "dirfd" "ac_cv_have_decl_dirfd" "#include <sys/types.h>
      #include <dirent.h>
"
if test "x$ac_cv_have_decl_dirfd" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_DIRFD $ac_have_decl
_ACEOF

  if test $ac_cv_have_decl_dirfd = no; then
    HAVE_DECL_DIRFD=0
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether dirfd is a macro" >&5
$as_echo_n "checking whether dirfd is a macro... " >&6; }
if ${gl_cv_func_dirfd_macro+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <dirent.h>
#ifdef dirfd
 dirent_header_defines_dirfd
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "dirent_header_defines_dirfd" >/dev/null 2>&1; then :
  gl_cv_func_dirfd_macro=yes
else
  gl_cv_func_dirfd_macro=no
fi
rm -f conftest*

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

  # Use the replacement if we have no function or macro with that name,
  # or if OS/2 kLIBC whose dirfd() does not work.
  # Replace only if the system declares dirfd already.
  case $ac_cv_func_dirfd,$gl_cv_func_dirfd_macro,$host_os,$ac_cv_have_decl_dirfd in
    no,no,*,yes | *,*,os2*,yes)
      REPLACE_DIRFD=1

$as_echo "#define REPLACE_DIRFD 1" >>confdefs.h
;;
  esac


     if test $ac_cv_func_dirfd = no && test $gl_cv_func_dirfd_macro = no || test $REPLACE_DIRFD = 1; then
  GL_COND_OBJ_DIRFD_TRUE=
  GL_COND_OBJ_DIRFD_FALSE='#'
else
  GL_COND_OBJ_DIRFD_TRUE='#'
  GL_COND_OBJ_DIRFD_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_DIRFD_TRUE}" && test -z "${GL_COND_OBJ_DIRFD_FALSE}"; then
    GL_COND_OBJ_DIRFD_TRUE='#'
    GL_COND_OBJ_DIRFD_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_DIRFD_TRUE"; then :


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to get the file descriptor associated with an open DIR*" >&5
$as_echo_n "checking how to get the file descriptor associated with an open DIR*... " >&6; }
if ${gl_cv_sys_dir_fd_member_name+:} false; then :
  $as_echo_n "(cached) " >&6
else

      dirfd_save_CFLAGS=$CFLAGS
      for ac_expr in d_fd dd_fd; do

        CFLAGS="$CFLAGS -DDIR_FD_MEMBER_NAME=$ac_expr"
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

           #include <sys/types.h>
           #include <dirent.h>
int
main ()
{
DIR *dir_p = opendir("."); (void) dir_p->DIR_FD_MEMBER_NAME;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  dir_fd_found=yes

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
        CFLAGS=$dirfd_save_CFLAGS
        test "$dir_fd_found" = yes && break
      done
      test "$dir_fd_found" = yes || ac_expr=no_such_member

      gl_cv_sys_dir_fd_member_name=$ac_expr


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

cat >>confdefs.h <<_ACEOF
#define DIR_FD_MEMBER_NAME $gl_cv_sys_dir_fd_member_name
_ACEOF

  fi



fi









          GL_GNULIB_DIRFD=1





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





  { $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





    if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
      REPLACE_DUP=1
    fi





  if test $ac_cv_func_fchdir = no; then
    HAVE_FCHDIR=0
  fi

    if test $HAVE_FCHDIR = 0; then
      REPLACE_DUP=1
    fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether dup works" >&5
$as_echo_n "checking whether dup works... " >&6; }
if ${gl_cv_func_dup_works+:} 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_func_dup_works="guessing no" ;;
         *)      gl_cv_func_dup_works="guessing yes" ;;
       esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
                         #include <fcntl.h>
                         #include <errno.h>


$gl_mda_defines

int
main ()
{
/* On OS/2 kLIBC, dup does not work on a directory fd.  */
           int fd = open (".", O_RDONLY);
           return fd < 0 ? 1 : dup (fd) < 0 ? 2 : 0;

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_dup_works=yes
else
  gl_cv_func_dup_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_dup_works" >&5
$as_echo "$gl_cv_func_dup_works" >&6; }
  case "$gl_cv_func_dup_works" in
    *yes) ;;
    *)
      REPLACE_DUP=1
      ;;
  esac


     if test $REPLACE_DUP = 1; then
  GL_COND_OBJ_DUP_TRUE=
  GL_COND_OBJ_DUP_FALSE='#'
else
  GL_COND_OBJ_DUP_TRUE='#'
  GL_COND_OBJ_DUP_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_DUP_TRUE}" && test -z "${GL_COND_OBJ_DUP_FALSE}"; then
    GL_COND_OBJ_DUP_TRUE='#'
    GL_COND_OBJ_DUP_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_DUP_TRUE"; then :

    :

fi









          GL_GNULIB_DUP=1





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






  { $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>


$gl_mda_defines

           #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




  if test $ac_cv_func_fchdir = no; then
    HAVE_FCHDIR=0
  fi

    if test $HAVE_FCHDIR = 0; then
      REPLACE_DUP2=1
    fi



     if test $REPLACE_DUP2 = 1; then
  GL_COND_OBJ_DUP2_TRUE=
  GL_COND_OBJ_DUP2_FALSE='#'
else
  GL_COND_OBJ_DUP2_TRUE='#'
  GL_COND_OBJ_DUP2_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_DUP2_TRUE}" && test -z "${GL_COND_OBJ_DUP2_FALSE}"; then
    GL_COND_OBJ_DUP2_TRUE='#'
    GL_COND_OBJ_DUP2_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_DUP2_TRUE"; then :



fi









          GL_GNULIB_DUP2=1





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













          GL_GNULIB_ENVIRON=1





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








  case "$GL_GENERATE_ERRNO_H" in
    false) ERRNO_H='' ;;
    true)
                  if test -z "$ERRNO_H"; then
        ERRNO_H="${gl_source_base_prefix}errno.h"
      fi
      ;;
    *) echo "*** GL_GENERATE_ERRNO_H is not set correctly" 1>&2; exit 1 ;;
  esac


     if $GL_GENERATE_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 -z "${GL_GENERATE_ERRNO_H_TRUE}" && test -z "${GL_GENERATE_ERRNO_H_FALSE}"; then
    GL_GENERATE_ERRNO_H_TRUE='#'
    GL_GENERATE_ERRNO_H_FALSE='#'
  fi







      { $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_COND_OBJ_ERROR_TRUE=
  GL_COND_OBJ_ERROR_FALSE='#'
else
  GL_COND_OBJ_ERROR_TRUE='#'
  GL_COND_OBJ_ERROR_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_ERROR_TRUE}" && test -z "${GL_COND_OBJ_ERROR_FALSE}"; then
    GL_COND_OBJ_ERROR_TRUE='#'
    GL_COND_OBJ_ERROR_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_ERROR_TRUE"; then :





  :


fi







  if test $ac_cv_have_decl_fchdir = no; then
    HAVE_DECL_FCHDIR=0
  fi


  if test $HAVE_FCHDIR = 0; then

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

                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether open can visit directories" >&5
$as_echo_n "checking whether open can visit directories... " >&6; }
if ${gl_cv_func_open_directory_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  case "$host_os" in
                             # Guess yes on Linux systems.
            linux-* | linux) gl_cv_func_open_directory_works="guessing yes" ;;
                             # Guess yes on glibc systems.
            *-gnu* | gnu*)   gl_cv_func_open_directory_works="guessing yes" ;;
                             # Guess no on native Windows.
            mingw*)          gl_cv_func_open_directory_works="guessing no" ;;
                             # If we don't know, obey --enable-cross-guesses.
            *)               gl_cv_func_open_directory_works="$gl_cross_guess_normal" ;;
          esac

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


$gl_mda_defines

int
main ()
{
return open(".", O_RDONLY) < 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_open_directory_works=yes
else
  gl_cv_func_open_directory_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_open_directory_works" >&5
$as_echo "$gl_cv_func_open_directory_works" >&6; }
    case "$gl_cv_func_open_directory_works" in
      *yes) ;;
      *)

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

        ;;
    esac
  fi


     if test $HAVE_FCHDIR = 0; then
  GL_COND_OBJ_FCHDIR_TRUE=
  GL_COND_OBJ_FCHDIR_FALSE='#'
else
  GL_COND_OBJ_FCHDIR_TRUE='#'
  GL_COND_OBJ_FCHDIR_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_FCHDIR_TRUE}" && test -z "${GL_COND_OBJ_FCHDIR_FALSE}"; then
    GL_COND_OBJ_FCHDIR_TRUE='#'
    GL_COND_OBJ_FCHDIR_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_FCHDIR_TRUE"; then :

    :

fi









          GL_GNULIB_FCHDIR=1





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








  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>


$gl_mda_defines

              #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
  if test "$cross_compiling" = yes; then :
  case "$host_os" in
                     # Guess no on NetBSD.
            netbsd*) gl_cv_func_fcntl_f_dupfd_cloexec="guessing no" ;;
            *)       gl_cv_func_fcntl_f_dupfd_cloexec="$gl_cross_guess_normal" ;;
          esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <fcntl.h>
              #include <unistd.h>
              int main (int argc, char *argv[])
              {
                if (argc == 1)
                  /* parent process */
                  {
                    if (fcntl (1, F_DUPFD_CLOEXEC, 10) < 0)
                      return 1;
                    return execl ("./conftest", "./conftest", "child", NULL);
                  }
                else
                  /* child process */
                  return (fcntl (10, F_GETFL) < 0 ? 0 : 42);
              }


_ACEOF
if ac_fn_c_try_run "$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 *.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_cloexec" >&5
$as_echo "$gl_cv_func_fcntl_f_dupfd_cloexec" >&6; }
    case "$gl_cv_func_fcntl_f_dupfd_cloexec" in
      *yes) ;;
      *)


  if test $ac_cv_func_fcntl = no; then
    HAVE_FCNTL=0
  else
    REPLACE_FCNTL=1
  fi

                        ;;
    esac
  fi




  if test $ac_cv_func_fchdir = no; then
    HAVE_FCHDIR=0
  fi

    if test $HAVE_FCHDIR = 0; then



  if test $ac_cv_func_fcntl = no; then
    HAVE_FCNTL=0
  else
    REPLACE_FCNTL=1
  fi

    fi



     if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then
  GL_COND_OBJ_FCNTL_TRUE=
  GL_COND_OBJ_FCNTL_FALSE='#'
else
  GL_COND_OBJ_FCNTL_TRUE='#'
  GL_COND_OBJ_FCNTL_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_FCNTL_TRUE}" && test -z "${GL_COND_OBJ_FCNTL_FALSE}"; then
    GL_COND_OBJ_FCNTL_TRUE='#'
    GL_COND_OBJ_FCNTL_FALSE='#'
  fi










          GL_GNULIB_FCNTL=1





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












cat >>confdefs.h <<_ACEOF
#define GNULIB_FD_SAFER_FLAG 1
_ACEOF







    ac_fn_c_check_decl "$LINENO" "fdopendir" "ac_cv_have_decl_fdopendir" "
#include <dirent.h>

"
if test "x$ac_cv_have_decl_fdopendir" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_FDOPENDIR $ac_have_decl
_ACEOF
if test $ac_have_decl = 1; then :

else
  HAVE_DECL_FDOPENDIR=0
fi


  if test $ac_cv_func_fdopendir = no; then
    HAVE_FDOPENDIR=0
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fdopendir works" >&5
$as_echo_n "checking whether fdopendir works... " >&6; }
if ${gl_cv_func_fdopendir_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_fdopendir_works="guessing yes" ;;
                     # Guess yes on musl systems.
            *-musl*) gl_cv_func_fdopendir_works="guessing yes" ;;
                     # If we don't know, obey --enable-cross-guesses.
            *)       gl_cv_func_fdopendir_works="$gl_cross_guess_normal" ;;
          esac

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

#include <dirent.h>
#include <fcntl.h>
#include <unistd.h>


$gl_mda_defines

#if !HAVE_DECL_FDOPENDIR
extern
# ifdef __cplusplus
"C"
# endif
DIR *fdopendir (int);
#endif

int
main ()
{
int result = 0;
              int fd = open ("conftest.c", O_RDONLY);
              if (fd < 0) result |= 1;
              if (fdopendir (fd)) result |= 2;
              if (close (fd)) result |= 4;
              return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_fdopendir_works=yes
else
  gl_cv_func_fdopendir_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_fdopendir_works" >&5
$as_echo "$gl_cv_func_fdopendir_works" >&6; }
    case "$gl_cv_func_fdopendir_works" in
      *yes) ;;
      *)
        REPLACE_FDOPENDIR=1
        ;;
    esac
  fi


     if test $HAVE_FDOPENDIR = 0 || test $REPLACE_FDOPENDIR = 1; then
  GL_COND_OBJ_FDOPENDIR_TRUE=
  GL_COND_OBJ_FDOPENDIR_FALSE='#'
else
  GL_COND_OBJ_FDOPENDIR_TRUE='#'
  GL_COND_OBJ_FDOPENDIR_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_FDOPENDIR_TRUE}" && test -z "${GL_COND_OBJ_FDOPENDIR_FALSE}"; then
    GL_COND_OBJ_FDOPENDIR_TRUE='#'
    GL_COND_OBJ_FDOPENDIR_FALSE='#'
  fi










          GL_GNULIB_FDOPENDIR=1





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





cat >>confdefs.h <<_ACEOF
#define GNULIB_FDOPENDIR 1
_ACEOF





            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ffs" >&5
$as_echo_n "checking for ffs... " >&6; }
if ${gl_cv_func_ffs+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <strings.h>
            int x;

int
main ()
{
int (*func) (int) = ffs;
            return func (x);

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_ffs=yes
else
  gl_cv_func_ffs=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_ffs" >&5
$as_echo "$gl_cv_func_ffs" >&6; }
  if test $gl_cv_func_ffs = no; then
    HAVE_FFS=0
  fi


     if test $HAVE_FFS = 0; then
  GL_COND_OBJ_FFS_TRUE=
  GL_COND_OBJ_FFS_FALSE='#'
else
  GL_COND_OBJ_FFS_TRUE='#'
  GL_COND_OBJ_FFS_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_FFS_TRUE}" && test -z "${GL_COND_OBJ_FFS_FALSE}"; then
    GL_COND_OBJ_FFS_TRUE='#'
    GL_COND_OBJ_FFS_FALSE='#'
  fi










          GL_GNULIB_FFS=1








  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flexible array member" >&5
$as_echo_n "checking for flexible array member... " >&6; }
if ${ac_cv_c_flexmember+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
            #include <stdio.h>
            #include <stddef.h>
            struct m { struct m *next, **list; char name[]; };
            struct s { struct s *p; struct m *m; int n; double d[]; };
int
main ()
{
int m = getchar ();
            size_t nbytes = offsetof (struct s, d) + m * sizeof (double);
            nbytes += sizeof (struct s) - 1;
            nbytes -= nbytes % sizeof (struct s);
            struct s *p = malloc (nbytes);
            p->p = p;
            p->m = NULL;
            p->d[0] = 0.0;
            return p->d != (double *) NULL;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_flexmember=yes
else
  ac_cv_c_flexmember=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_flexmember" >&5
$as_echo "$ac_cv_c_flexmember" >&6; }
  if test $ac_cv_c_flexmember = yes; then

$as_echo "#define FLEXIBLE_ARRAY_MEMBER /**/" >>confdefs.h

  else
    $as_echo "#define FLEXIBLE_ARRAY_MEMBER 1" >>confdefs.h

  fi




  GL_GENERATE_FLOAT_H=false
  REPLACE_FLOAT_LDBL=0
  case "$host_os" in
    aix* | beos* | openbsd* | mirbsd* | irix*)
      GL_GENERATE_FLOAT_H=true
      ;;
    freebsd* | dragonfly*)
      case "$host_cpu" in
        i[34567]86 )
          GL_GENERATE_FLOAT_H=true
          ;;
        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
  GL_GENERATE_FLOAT_H=true
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
          ;;
      esac
      ;;
    linux*)
      case "$host_cpu" in
        powerpc*)
          GL_GENERATE_FLOAT_H=true
          ;;
      esac
      ;;
  esac
  case "$host_os" in
    aix* | freebsd* | dragonfly* | linux*)
      if $GL_GENERATE_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
                  GL_GENERATE_FLOAT_H=true
      ;;
  esac

  if $GL_GENERATE_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






  case "$GL_GENERATE_FLOAT_H" in
    false) FLOAT_H='' ;;
    true)
                  if test -z "$FLOAT_H"; then
        FLOAT_H="${gl_source_base_prefix}float.h"
      fi
      ;;
    *) echo "*** GL_GENERATE_FLOAT_H is not set correctly" 1>&2; exit 1 ;;
  esac


     if $GL_GENERATE_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 -z "${GL_GENERATE_FLOAT_H_TRUE}" && test -z "${GL_GENERATE_FLOAT_H_FALSE}"; then
    GL_GENERATE_FLOAT_H_TRUE='#'
    GL_GENERATE_FLOAT_H_FALSE='#'
  fi







     if test $REPLACE_FLOAT_LDBL = 1; then
  GL_COND_OBJ_FLOAT_TRUE=
  GL_COND_OBJ_FLOAT_FALSE='#'
else
  GL_COND_OBJ_FLOAT_TRUE='#'
  GL_COND_OBJ_FLOAT_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_FLOAT_TRUE}" && test -z "${GL_COND_OBJ_FLOAT_FALSE}"; then
    GL_COND_OBJ_FLOAT_TRUE='#'
    GL_COND_OBJ_FLOAT_FALSE='#'
  fi


     if test $REPLACE_ITOLD = 1; then
  GL_COND_OBJ_ITOLD_TRUE=
  GL_COND_OBJ_ITOLD_FALSE='#'
else
  GL_COND_OBJ_ITOLD_TRUE='#'
  GL_COND_OBJ_ITOLD_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_ITOLD_TRUE}" && test -z "${GL_COND_OBJ_ITOLD_FALSE}"; then
    GL_COND_OBJ_ITOLD_TRUE='#'
    GL_COND_OBJ_ITOLD_FALSE='#'
  fi





     gl_fnmatch_required_lowercase=`
    echo $gl_fnmatch_required | LC_ALL=C tr '[A-Z]' '[a-z]'
  `

  if test $ac_cv_func_fnmatch = no; then
    HAVE_FNMATCH=0
  else
    gl_fnmatch_cache_var="gl_cv_func_fnmatch_${gl_fnmatch_required_lowercase}"
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working $gl_fnmatch_required fnmatch" >&5
$as_echo_n "checking for working $gl_fnmatch_required fnmatch... " >&6; }
if eval \${$gl_fnmatch_cache_var+:} false; then :
  $as_echo_n "(cached) " >&6
else
                                     if test $gl_fnmatch_required = GNU; then
         gl_fnmatch_gnu_start=
         gl_fnmatch_gnu_end=
       else
         gl_fnmatch_gnu_start='#if 0'
         gl_fnmatch_gnu_end='#endif'
       fi
       if test "$cross_compiling" = yes; then :
  case "$host_os" in
                     # Guess yes on musl systems.
            *-musl*) eval "$gl_fnmatch_cache_var=\"guessing yes\"" ;;
                     # Guess no otherwise, even on glibc systems.
            *)       eval "$gl_fnmatch_cache_var=\"guessing no\"" ;;
          esac

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <fnmatch.h>
              static int
              y (char const *pattern, char const *string, int flags)
              {
                return fnmatch (pattern, string, flags) == 0;
              }
              static int
              n (char const *pattern, char const *string, int flags)
              {
                return fnmatch (pattern, string, flags) == FNM_NOMATCH;
              }

int
main ()
{
char const *Apat = 'A' < '\\\\' ? "[A-\\\\\\\\]" : "[\\\\\\\\-A]";
              char const *apat = 'a' < '\\\\' ? "[a-\\\\\\\\]" : "[\\\\\\\\-a]";
              static char const A_1[] = { 'A' - 1, 0 };
              static char const A01[] = { 'A' + 1, 0 };
              static char const a_1[] = { 'a' - 1, 0 };
              static char const a01[] = { 'a' + 1, 0 };
              static char const bs_1[] = { '\\\\' - 1, 0 };
              static char const bs01[] = { '\\\\' + 1, 0 };
              int result = 0;
              if (!n ("a*", "", 0))
                return 1;
              if (!y ("a*", "abc", 0))
                return 1;
              if (!y ("[/b", "[/b", 0)) /*"]]"*/ /* glibc Bugzilla bug 12378 */
                return 1;
              if (!n ("d*/*1", "d/s/1", FNM_PATHNAME))
                return 2;
              if (!y ("a\\\\bc", "abc", 0))
                return 3;
              if (!n ("a\\\\bc", "abc", FNM_NOESCAPE))
                return 3;
              if (!y ("*x", ".x", 0))
                return 4;
              if (!n ("*x", ".x", FNM_PERIOD))
                return 4;
              if (!y (Apat, "\\\\", 0))
                return 5;
              if (!y (Apat, "A", 0))
                return 5;
              if (!y (apat, "\\\\", 0))
                return 5;
              if (!y (apat, "a", 0))
                return 5;
              if (!(n (Apat, A_1, 0) == ('A' < '\\\\')))
                return 5;
              if (!(n (apat, a_1, 0) == ('a' < '\\\\')))
                return 5;
              if (!(y (Apat, A01, 0) == ('A' < '\\\\')))
                return 5;
              if (!(y (apat, a01, 0) == ('a' < '\\\\')))
                return 5;
              if (!(y (Apat, bs_1, 0) == ('A' < '\\\\')))
                return 5;
              if (!(y (apat, bs_1, 0) == ('a' < '\\\\')))
                return 5;
              if (!(n (Apat, bs01, 0) == ('A' < '\\\\')))
                return 5;
              if (!(n (apat, bs01, 0) == ('a' < '\\\\')))
                return 5;
              $gl_fnmatch_gnu_start
              if (!y ("xxXX", "xXxX", FNM_CASEFOLD))
                result |= 8;
              if (!y ("a++(x|yy)b", "a+xyyyyxb", FNM_EXTMATCH))
                result |= 16;
              if (!n ("d*/*1", "d/s/1", FNM_FILE_NAME))
                result |= 32;
              if (!y ("*", "x", FNM_FILE_NAME | FNM_LEADING_DIR))
                result |= 64;
              if (!y ("x*", "x/y/z", FNM_FILE_NAME | FNM_LEADING_DIR))
                result |= 64;
              if (!y ("*c*", "c/x", FNM_FILE_NAME | FNM_LEADING_DIR))
                result |= 64;
              $gl_fnmatch_gnu_end
              return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  eval "$gl_fnmatch_cache_var=yes"
else
  eval "$gl_fnmatch_cache_var=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
eval ac_res=\$$gl_fnmatch_cache_var
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
    eval "gl_fnmatch_result=\"\$$gl_fnmatch_cache_var\""
    case "$gl_fnmatch_result" in
      *yes) ;;
      *) REPLACE_FNMATCH=1 ;;
    esac
  fi
  if test $HAVE_FNMATCH = 0 || test $REPLACE_FNMATCH = 1; then






  GL_GENERATE_FNMATCH_H=true

  fi





  case "$GL_GENERATE_FNMATCH_H" in
    false) FNMATCH_H='' ;;
    true)
                  if test -z "$FNMATCH_H"; then
        FNMATCH_H="${gl_source_base_prefix}fnmatch.h"
      fi
      ;;
    *) echo "*** GL_GENERATE_FNMATCH_H is not set correctly" 1>&2; exit 1 ;;
  esac


     if $GL_GENERATE_FNMATCH_H; then
  GL_GENERATE_FNMATCH_H_TRUE=
  GL_GENERATE_FNMATCH_H_FALSE='#'
else
  GL_GENERATE_FNMATCH_H_TRUE='#'
  GL_GENERATE_FNMATCH_H_FALSE=
fi
:
    if test -z "${GL_GENERATE_FNMATCH_H_TRUE}" && test -z "${GL_GENERATE_FNMATCH_H_FALSE}"; then
    GL_GENERATE_FNMATCH_H_TRUE='#'
    GL_GENERATE_FNMATCH_H_FALSE='#'
  fi





  if test $HAVE_FNMATCH = 0 || test $REPLACE_FNMATCH = 1; then








  gl_LIBOBJS="$gl_LIBOBJS fnmatch.$ac_objext"





  fi









          GL_GNULIB_FNMATCH=1





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








  if test $HAVE_FNMATCH = 0 || test $REPLACE_FNMATCH = 1; then








  gl_LIBOBJS="$gl_LIBOBJS fnmatch.$ac_objext"





  fi


cat >>confdefs.h <<_ACEOF
#define GNULIB_FNMATCH_GNU 1
_ACEOF












  case "$GL_GENERATE_FNMATCH_H" in
    false) FNMATCH_H='' ;;
    true)
                  if test -z "$FNMATCH_H"; then
        FNMATCH_H="${gl_source_base_prefix}fnmatch.h"
      fi
      ;;
    *) echo "*** GL_GENERATE_FNMATCH_H is not set correctly" 1>&2; exit 1 ;;
  esac


     if $GL_GENERATE_FNMATCH_H; then
  GL_GENERATE_FNMATCH_H_TRUE=
  GL_GENERATE_FNMATCH_H_FALSE='#'
else
  GL_GENERATE_FNMATCH_H_TRUE='#'
  GL_GENERATE_FNMATCH_H_FALSE=
fi
:
    if test -z "${GL_GENERATE_FNMATCH_H_TRUE}" && test -z "${GL_GENERATE_FNMATCH_H_FALSE}"; then
    GL_GENERATE_FNMATCH_H_TRUE='#'
    GL_GENERATE_FNMATCH_H_FALSE='#'
  fi









                          { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether free is known to preserve errno" >&5
$as_echo_n "checking whether free is known to preserve errno... " >&6; }
if ${gl_cv_func_free_preserves_errno+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>

int
main ()
{
#if 2 < __GLIBC__ + (33 <= __GLIBC_MINOR__)
            #elif defined __OpenBSD__
            #elif defined __sun
            #else
              #error "'free' is not known to preserve errno"
            #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_func_free_preserves_errno=yes
else
  gl_cv_func_free_preserves_errno=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_free_preserves_errno" >&5
$as_echo "$gl_cv_func_free_preserves_errno" >&6; }

  case $gl_cv_func_free_preserves_errno in
   *yes)

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

    ;;
   *) REPLACE_FREE=1 ;;
  esac


     if test $REPLACE_FREE = 1; then
  GL_COND_OBJ_FREE_TRUE=
  GL_COND_OBJ_FREE_FALSE='#'
else
  GL_COND_OBJ_FREE_TRUE='#'
  GL_COND_OBJ_FREE_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_FREE_TRUE}" && test -z "${GL_COND_OBJ_FREE_FALSE}"; then
    GL_COND_OBJ_FREE_TRUE='#'
    GL_COND_OBJ_FREE_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_FREE_TRUE"; then :

    :

fi









          GL_GNULIB_FREE_POSIX=1





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




  if test $gl_func_frexp != yes; then








  gl_LIBOBJS="$gl_LIBOBJS frexp.$ac_objext"

  fi









          GL_GNULIB_FREXP=1





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




  if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl = no; then








  gl_LIBOBJS="$gl_LIBOBJS frexpl.$ac_objext"

  fi









          GL_GNULIB_FREXPL=1





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







  case "$host_os" in
    mingw* | solaris*)
                        REPLACE_FSTAT=1
      ;;
  esac





  if test $ac_cv_func_fchdir = no; then
    HAVE_FCHDIR=0
  fi

    if test $HAVE_FCHDIR = 0; then
      case "$gl_cv_func_open_directory_works" in
        *yes) ;;
        *)
          REPLACE_FSTAT=1
          ;;
      esac
    fi



     if test $REPLACE_FSTAT = 1; then
  GL_COND_OBJ_FSTAT_TRUE=
  GL_COND_OBJ_FSTAT_FALSE='#'
else
  GL_COND_OBJ_FSTAT_TRUE='#'
  GL_COND_OBJ_FSTAT_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_FSTAT_TRUE}" && test -z "${GL_COND_OBJ_FSTAT_FALSE}"; then
    GL_COND_OBJ_FSTAT_TRUE='#'
    GL_COND_OBJ_FSTAT_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_FSTAT_TRUE"; then :

    case "$host_os" in
      mingw*)








  gl_LIBOBJS="$gl_LIBOBJS stat-w32.$ac_objext"

        ;;
    esac



  :


fi









          GL_GNULIB_FSTAT=1





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










  if test $ac_cv_func_fstatat = no; then
    HAVE_FSTATAT=0
  else
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fstatat (..., 0) works" >&5
$as_echo_n "checking whether fstatat (..., 0) works... " >&6; }
if ${gl_cv_func_fstatat_zero_flag+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  case "$host_os" in
            aix*) gl_cv_func_fstatat_zero_flag="guessing no";;
            *)    gl_cv_func_fstatat_zero_flag="guessing yes";;
          esac

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

              #include <fcntl.h>
              #include <sys/stat.h>
              int
              main (void)
              {
                struct stat a;
                return fstatat (AT_FDCWD, ".", &a, 0) != 0;
              }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_fstatat_zero_flag=yes
else
  gl_cv_func_fstatat_zero_flag=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_fstatat_zero_flag" >&5
$as_echo "$gl_cv_func_fstatat_zero_flag" >&6; }

    case $gl_cv_func_fstatat_zero_flag+$gl_cv_func_lstat_dereferences_slashed_symlink in
    *yes+*yes) ;;
    *) REPLACE_FSTATAT=1 ;;
    esac

    case $host_os in
      solaris*)
        REPLACE_FSTATAT=1 ;;
    esac

    case $REPLACE_FSTATAT,$gl_cv_func_fstatat_zero_flag in
      1,*yes)

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

         ;;
    esac
  fi


     if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
  GL_COND_OBJ_FSTATAT_TRUE=
  GL_COND_OBJ_FSTATAT_FALSE='#'
else
  GL_COND_OBJ_FSTATAT_TRUE='#'
  GL_COND_OBJ_FSTATAT_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_FSTATAT_TRUE}" && test -z "${GL_COND_OBJ_FSTATAT_FALSE}"; then
    GL_COND_OBJ_FSTATAT_TRUE='#'
    GL_COND_OBJ_FSTATAT_FALSE='#'
  fi










          GL_GNULIB_FSTATAT=1





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








  gl_abort_bug=no
  case "$host_os" in
    mingw*)
      gl_cv_func_getcwd_path_max=yes
      ;;
    *)





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getcwd handles long file names properly" >&5
$as_echo_n "checking whether getcwd handles long file names properly... " >&6; }
if ${gl_cv_func_getcwd_path_max+:} false; then :
  $as_echo_n "(cached) " >&6
else
  # Arrange for deletion of the temporary directory this test creates.
     ac_clean_files="$ac_clean_files confdir3"
          if test "$cross_compiling" = yes; then :
  # Cross-compilation guesses:
        case "$host_os" in
          aix*) # On AIX, it has the AIX bug.
            gl_cv_func_getcwd_path_max='guessing no, it has the AIX bug' ;;
          gnu*) # On Hurd, it is 'yes'.
            gl_cv_func_getcwd_path_max='guessing yes' ;;
          linux* | kfreebsd*)
            # On older Linux+glibc it's 'no, but it is partly working',
            # on newer Linux+glibc it's 'yes'.
            # On Linux+musl libc, it's 'no, but it is partly working'.
            # On kFreeBSD+glibc, it's 'no, but it is partly working'.
            gl_cv_func_getcwd_path_max='guessing no, but it is partly working' ;;
          *) # If we don't know, obey --enable-cross-guesses.
            gl_cv_func_getcwd_path_max="$gl_cross_guess_normal" ;;
        esac

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

#include <errno.h>
#include <stdlib.h>
#if HAVE_UNISTD_H
# include <unistd.h>
#else
# include <direct.h>
#endif
#include <string.h>
#include <limits.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>


/* Arrange to define PATH_MAX, like "pathmax.h" does. */
#if HAVE_UNISTD_H
# include <unistd.h>
#endif
#include <limits.h>
#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
# include <sys/param.h>
#endif
#if !defined PATH_MAX && defined MAXPATHLEN
# define PATH_MAX MAXPATHLEN
#endif
#ifdef __hpux
# undef PATH_MAX
# define PATH_MAX 1024
#endif
#if defined _WIN32 && ! defined __CYGWIN__
# undef PATH_MAX
# define PATH_MAX 260
#endif


#ifndef AT_FDCWD
# define AT_FDCWD 0
#endif
#ifdef ENAMETOOLONG
# define is_ENAMETOOLONG(x) ((x) == ENAMETOOLONG)
#else
# define is_ENAMETOOLONG(x) 0
#endif

/* Use the getcwd function, not any macro.  */
#undef getcwd



$gl_mda_defines


#ifndef S_IRWXU
# define S_IRWXU 0700
#endif

/* The length of this name must be 8.  */
#define DIR_NAME "confdir3"
#define DIR_NAME_LEN 8
#define DIR_NAME_SIZE (DIR_NAME_LEN + 1)

/* The length of "../".  */
#define DOTDOTSLASH_LEN 3

/* Leftover bytes in the buffer, to work around library or OS bugs.  */
#define BUF_SLOP 20

int
main ()
{
#ifndef PATH_MAX
  /* The Hurd doesn't define this, so getcwd can't exhibit the bug --
     at least not on a local file system.  And if we were to start worrying
     about remote file systems, we'd have to enable the wrapper function
     all of the time, just to be safe.  That's not worth the cost.  */
  exit (0);
#elif ((INT_MAX / (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1) \
        - DIR_NAME_SIZE - BUF_SLOP) \
       <= PATH_MAX)
  /* FIXME: Assuming there's a system for which this is true,
     this should be done in a compile test.  */
  exit (0);
#else
  char buf[PATH_MAX * (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1)
           + DIR_NAME_SIZE + BUF_SLOP];
  char *cwd = getcwd (buf, PATH_MAX);
  size_t initial_cwd_len;
  size_t cwd_len;
  int fail = 0;
  size_t n_chdirs = 0;

  if (cwd == NULL)
    exit (10);

  cwd_len = initial_cwd_len = strlen (cwd);

  while (1)
    {
      size_t dotdot_max = PATH_MAX * (DIR_NAME_SIZE / DOTDOTSLASH_LEN);
      char *c = NULL;

      cwd_len += DIR_NAME_SIZE;
      /* If mkdir or chdir fails, it could be that this system cannot create
         any file with an absolute name longer than PATH_MAX, such as cygwin.
         If so, leave fail as 0, because the current working directory can't
         be too long for getcwd if it can't even be created.  On Linux with
         the 9p file system, mkdir fails with error EINVAL when cwd_len gets
         too long; ignore this failure because the getcwd() system call
         produces good results whereas the gnulib substitute calls getdents64
         which fails with error EPROTO.
         For other errors, be pessimistic and consider that as a failure,
         too.  */
      if (mkdir (DIR_NAME, S_IRWXU) < 0 || chdir (DIR_NAME) < 0)
        {
          if (! (errno == ERANGE || is_ENAMETOOLONG (errno)))
            #ifdef __linux__
            if (! (errno == EINVAL))
            #endif
              fail = 20;
          break;
        }

      if (PATH_MAX <= cwd_len && cwd_len < PATH_MAX + DIR_NAME_SIZE)
        {
          struct stat sb;

          c = getcwd (buf, PATH_MAX);
          if (!c && errno == ENOENT)
            {
              fail = 11;
              break;
            }
          if (c)
            {
              fail = 31;
              break;
            }
          if (! (errno == ERANGE || is_ENAMETOOLONG (errno)))
            {
              fail = 21;
              break;
            }

          /* Our replacement needs to be able to stat() long ../../paths,
             so generate a path larger than PATH_MAX to check,
             avoiding the replacement if we can't stat().  */
          c = getcwd (buf, cwd_len + 1);
          if (c && !AT_FDCWD && stat (c, &sb) != 0 && is_ENAMETOOLONG (errno))
            {
              fail = 32;
              break;
            }
        }

      if (dotdot_max <= cwd_len - initial_cwd_len)
        {
          if (dotdot_max + DIR_NAME_SIZE < cwd_len - initial_cwd_len)
            break;
          c = getcwd (buf, cwd_len + 1);
          if (!c)
            {
              if (! (errno == ERANGE || errno == ENOENT
                     || is_ENAMETOOLONG (errno)))
                {
                  fail = 22;
                  break;
                }
              if (AT_FDCWD || errno == ERANGE || errno == ENOENT)
                {
                  fail = 12;
                  break;
                }
            }
        }

      if (c && strlen (c) != cwd_len)
        {
          fail = 23;
          break;
        }
      ++n_chdirs;
    }

  /* Leaving behind such a deep directory is not polite.
     So clean up here, right away, even though the driving
     shell script would also clean up.  */
  {
    size_t i;

    /* Try rmdir first, in case the chdir failed.  */
    rmdir (DIR_NAME);
    for (i = 0; i <= n_chdirs; i++)
      {
        if (chdir ("..") < 0)
          break;
        if (rmdir (DIR_NAME) != 0)
          break;
      }
  }

  exit (fail);
#endif
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_getcwd_path_max=yes
else
  case $? in
        10|11|12) gl_cv_func_getcwd_path_max='no, but it is partly working';;
        31) gl_cv_func_getcwd_path_max='no, it has the AIX bug';;
        32) gl_cv_func_getcwd_path_max='yes, but with shorter paths';;
        *) gl_cv_func_getcwd_path_max=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_func_getcwd_path_max" >&5
$as_echo "$gl_cv_func_getcwd_path_max" >&6; }

      case "$gl_cv_func_getcwd_null" in
        *yes)






      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getpagesize" >&5
$as_echo_n "checking for getpagesize... " >&6; }
if ${gl_cv_func_getpagesize+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main ()
{
return getpagesize();
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_getpagesize=yes
else
  gl_cv_func_getpagesize=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_getpagesize" >&5
$as_echo "$gl_cv_func_getpagesize" >&6; }

  if test $gl_cv_func_getpagesize = yes; then

cat >>confdefs.h <<_ACEOF
#define HAVE_GETPAGESIZE 1
_ACEOF

  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getcwd succeeds when 4k < cwd_length < 16k" >&5
$as_echo_n "checking whether getcwd succeeds when 4k < cwd_length < 16k... " >&6; }
if ${gl_cv_func_getcwd_succeeds_beyond_4k+:} false; then :
  $as_echo_n "(cached) " >&6
else
  # Remove any remnants of a previous test.
     rm -rf confdir-14B---
     # Arrange for deletion of the temporary directory this test creates.
     ac_clean_files="$ac_clean_files confdir-14B---"
          if test "$cross_compiling" = yes; then :
  case "$host_os" in
             # Guess no otherwise, even on glibc systems and musl systems.
          *) gl_cv_func_getcwd_succeeds_beyond_4k="guessing no"
        esac

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

#include <errno.h>
#include <stdlib.h>
#if HAVE_UNISTD_H
# include <unistd.h>
#else /* on Windows with MSVC */
# include <direct.h>
#endif
#include <string.h>
#include <sys/stat.h>


/* Arrange to define PATH_MAX, like "pathmax.h" does. */
#if HAVE_UNISTD_H
# include <unistd.h>
#endif
#include <limits.h>
#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
# include <sys/param.h>
#endif
#if !defined PATH_MAX && defined MAXPATHLEN
# define PATH_MAX MAXPATHLEN
#endif
#ifdef __hpux
# undef PATH_MAX
# define PATH_MAX 1024
#endif
#if defined _WIN32 && ! defined __CYGWIN__
# undef PATH_MAX
# define PATH_MAX 260
#endif



$gl_mda_defines


#ifndef S_IRWXU
# define S_IRWXU 0700
#endif

/* FIXME: skip the run-test altogether on systems without getpagesize.  */
#if ! HAVE_GETPAGESIZE
# define getpagesize() 0
#endif

/* This size is chosen to be larger than PATH_MAX (4k), yet smaller than
   the 16kB pagesize on ia64 linux.  Those conditions make the code below
   trigger a bug in glibc's getcwd implementation before 2.4.90-10.  */
#define TARGET_LEN (5 * 1024)

int
main ()
{
  char *cwd;
  size_t initial_cwd_len;
  int fail = 0;

  /* The bug is triggered when PATH_MAX < getpagesize (), so skip
     this relatively expensive and invasive test if that's not true.  */
#ifdef PATH_MAX
  int bug_possible = PATH_MAX < getpagesize ();
#else
  int bug_possible = 0;
#endif
  if (! bug_possible)
    return 0;

  cwd = getcwd (NULL, 0);
  if (cwd == NULL)
    return 2;

  initial_cwd_len = strlen (cwd);
  free (cwd);

  if (1)
    {
      static char const dir_name[] = "confdir-14B---";
      size_t desired_depth = ((TARGET_LEN - 1 - initial_cwd_len)
                              / sizeof dir_name);
      size_t d;
      for (d = 0; d < desired_depth; d++)
        {
          if (mkdir (dir_name, S_IRWXU) < 0 || chdir (dir_name) < 0)
            {
              if (! (errno == ERANGE || errno == ENAMETOOLONG
                     || errno == ENOENT))
                fail = 3; /* Unable to construct deep hierarchy.  */
              break;
            }
        }

      /* If libc has the bug in question, this invocation of getcwd
         results in a failed assertion.  */
      cwd = getcwd (NULL, 0);
      if (cwd == NULL)
        fail = 4; /* getcwd didn't assert, but it failed for a long name
                     where the answer could have been learned.  */
      free (cwd);

      /* Call rmdir first, in case the above chdir failed.  */
      rmdir (dir_name);
      while (0 < d--)
        {
          if (chdir ("..") < 0)
            {
              fail = 5;
              break;
            }
          rmdir (dir_name);
        }
    }

  return fail;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_getcwd_succeeds_beyond_4k=yes
else
                                                          ret=$?
        if test $ret -ge 128 || test $ret = 4; then
          gl_cv_func_getcwd_succeeds_beyond_4k=no
        else
          gl_cv_func_getcwd_succeeds_beyond_4k=yes
        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
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getcwd_succeeds_beyond_4k" >&5
$as_echo "$gl_cv_func_getcwd_succeeds_beyond_4k" >&6; }
  case "$gl_cv_func_getcwd_succeeds_beyond_4k" in
    *no)
      gl_abort_bug=yes
      ;;
    *)

      ;;
  esac

          ;;
      esac
      ;;
  esac
      case "$gl_cv_func_getcwd_path_max" in
    *"no" | *"no, it has the AIX bug") ;;
    *)

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

      ;;
  esac
  case "$gl_cv_func_getcwd_path_max" in
    *"no, but it is partly working")

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

      ;;
    *"yes, but with shorter paths")

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

      ;;
  esac

  if { case "$gl_cv_func_getcwd_null" in *yes) false;; *) true;; esac; } \
     || test $gl_cv_func_getcwd_posix_signature != yes \
     || { case "$gl_cv_func_getcwd_path_max" in *yes*) false;; *) true;; esac; } \
     || test $gl_abort_bug = yes; then
    REPLACE_GETCWD=1
  fi


     if test $REPLACE_GETCWD = 1; then
  GL_COND_OBJ_GETCWD_TRUE=
  GL_COND_OBJ_GETCWD_FALSE='#'
else
  GL_COND_OBJ_GETCWD_TRUE='#'
  GL_COND_OBJ_GETCWD_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_GETCWD_TRUE}" && test -z "${GL_COND_OBJ_GETCWD_FALSE}"; then
    GL_COND_OBJ_GETCWD_TRUE='#'
    GL_COND_OBJ_GETCWD_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_GETCWD_TRUE"; then :




  :


fi


cat >>confdefs.h <<_ACEOF
#define GNULIB_GETCWD 1
_ACEOF











          GL_GNULIB_GETCWD=1





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








  case $gl_cv_func_getcwd_null,$gl_cv_func_getcwd_posix_signature in
  *yes,yes) ;;
  *)
        REPLACE_GETCWD=1
    ;;
  esac


     if test $REPLACE_GETCWD = 1; then
  GL_COND_OBJ_GETCWD_LGPL_TRUE=
  GL_COND_OBJ_GETCWD_LGPL_FALSE='#'
else
  GL_COND_OBJ_GETCWD_LGPL_TRUE='#'
  GL_COND_OBJ_GETCWD_LGPL_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_GETCWD_LGPL_TRUE}" && test -z "${GL_COND_OBJ_GETCWD_LGPL_FALSE}"; then
    GL_COND_OBJ_GETCWD_LGPL_TRUE='#'
    GL_COND_OBJ_GETCWD_LGPL_FALSE='#'
  fi










          GL_GNULIB_GETCWD=1





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











  if test $ac_cv_func_getdelim = yes; then
    HAVE_GETDELIM=1
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working getdelim function" >&5
$as_echo_n "checking for working getdelim function... " >&6; }
if ${gl_cv_func_working_getdelim+:} false; then :
  $as_echo_n "(cached) " >&6
else
  echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data
       if test "$cross_compiling" = yes; then :
                      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <features.h>
#ifdef __GNU_LIBRARY__
 #if (__GLIBC__ >= 2) && !defined __UCLIBC__
  Lucky GNU user
 #endif
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Lucky GNU user" >/dev/null 2>&1; then :
  gl_cv_func_working_getdelim="guessing yes"
else
  case "$host_os" in
               *-musl*) gl_cv_func_working_getdelim="guessing yes" ;;
               *)       gl_cv_func_working_getdelim="$gl_cross_guess_normal" ;;
             esac

fi
rm -f conftest*


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

#    include <stdio.h>
#    include <stdlib.h>
#    include <string.h>
    int main ()
    {
      FILE *in = fopen ("./conftest.data", "r");
      if (!in)
        return 1;
      {
        /* Test result for a NULL buffer and a zero size.
           Based on a test program from Karl Heuer.  */
        char *line = NULL;
        size_t siz = 0;
        int len = getdelim (&line, &siz, '\n', in);
        if (!(len == 4 && line && strcmp (line, "foo\n") == 0))
          { free (line); fclose (in); return 2; }
        free (line);
      }
      {
        /* Test result for a NULL buffer and a non-zero size.
           This crashes on FreeBSD 8.0.  */
        char *line = NULL;
        size_t siz = (size_t)(~0) / 4;
        if (getdelim (&line, &siz, '\n', in) == -1)
          { fclose (in); return 3; }
        free (line);
      }
      fclose (in);
      return 0;
    }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_working_getdelim=yes
else
  gl_cv_func_working_getdelim=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_getdelim" >&5
$as_echo "$gl_cv_func_working_getdelim" >&6; }
    case "$gl_cv_func_working_getdelim" in
      *yes) ;;
      *) REPLACE_GETDELIM=1 ;;
    esac
  else
    HAVE_GETDELIM=0
  fi

  if test $ac_cv_have_decl_getdelim = no; then
    HAVE_DECL_GETDELIM=0
  fi


     if test $HAVE_GETDELIM = 0 || test $REPLACE_GETDELIM = 1; then
  GL_COND_OBJ_GETDELIM_TRUE=
  GL_COND_OBJ_GETDELIM_FALSE='#'
else
  GL_COND_OBJ_GETDELIM_TRUE='#'
  GL_COND_OBJ_GETDELIM_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_GETDELIM_TRUE}" && test -z "${GL_COND_OBJ_GETDELIM_FALSE}"; then
    GL_COND_OBJ_GETDELIM_TRUE='#'
    GL_COND_OBJ_GETDELIM_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_GETDELIM_TRUE"; then :


  for ac_func in flockfile funlockfile
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" "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



fi









          GL_GNULIB_GETDELIM=1





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








  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>


$gl_mda_defines


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_COND_OBJ_GETDTABLESIZE_TRUE=
  GL_COND_OBJ_GETDTABLESIZE_FALSE='#'
else
  GL_COND_OBJ_GETDTABLESIZE_TRUE='#'
  GL_COND_OBJ_GETDTABLESIZE_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_GETDTABLESIZE_TRUE}" && test -z "${GL_COND_OBJ_GETDTABLESIZE_FALSE}"; then
    GL_COND_OBJ_GETDTABLESIZE_TRUE='#'
    GL_COND_OBJ_GETDTABLESIZE_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_GETDTABLESIZE_TRUE"; then :

    :

fi









          GL_GNULIB_GETDTABLESIZE=1





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










  gl_getline_needs_run_time_check=no
  ac_fn_c_check_func "$LINENO" "getline" "ac_cv_func_getline"
if test "x$ac_cv_func_getline" = xyes; then :
                   gl_getline_needs_run_time_check=yes
else
  am_cv_func_working_getline=no
fi

  if test $gl_getline_needs_run_time_check = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working getline function" >&5
$as_echo_n "checking for working getline function... " >&6; }
if ${am_cv_func_working_getline+:} false; then :
  $as_echo_n "(cached) " >&6
else
  echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data
       if test "$cross_compiling" = yes; then :
                      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <features.h>
#ifdef __GNU_LIBRARY__
 #if (__GLIBC__ >= 2) && !defined __UCLIBC__
  Lucky GNU user
 #endif
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "Lucky GNU user" >/dev/null 2>&1; then :
  am_cv_func_working_getline="guessing yes"
else
  case "$host_os" in
               *-musl*) am_cv_func_working_getline="guessing yes" ;;
               *)       am_cv_func_working_getline="$gl_cross_guess_normal" ;;
             esac

fi
rm -f conftest*


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

#    include <stdio.h>
#    include <stdlib.h>
#    include <string.h>
    int main ()
    {
      FILE *in = fopen ("./conftest.data", "r");
      if (!in)
        return 1;
      {
        /* Test result for a NULL buffer and a zero size.
           Based on a test program from Karl Heuer.  */
        char *line = NULL;
        size_t siz = 0;
        int len = getline (&line, &siz, in);
        if (!(len == 4 && line && strcmp (line, "foo\n") == 0))
          { free (line); fclose (in); return 2; }
        free (line);
      }
      {
        /* Test result for a NULL buffer and a non-zero size.
           This crashes on FreeBSD 8.0.  */
        char *line = NULL;
        size_t siz = (size_t)(~0) / 4;
        if (getline (&line, &siz, in) == -1)
          { fclose (in); return 3; }
        free (line);
      }
      fclose (in);
      return 0;
    }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  am_cv_func_working_getline=yes
else
  am_cv_func_working_getline=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: $am_cv_func_working_getline" >&5
$as_echo "$am_cv_func_working_getline" >&6; }
  fi

  if test $ac_cv_have_decl_getline = no; then
    HAVE_DECL_GETLINE=0
  fi

  case "$am_cv_func_working_getline" in
    *yes) ;;
    *)
                        REPLACE_GETLINE=1
      ;;
  esac


     if test $REPLACE_GETLINE = 1; then
  GL_COND_OBJ_GETLINE_TRUE=
  GL_COND_OBJ_GETLINE_FALSE='#'
else
  GL_COND_OBJ_GETLINE_TRUE='#'
  GL_COND_OBJ_GETLINE_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_GETLINE_TRUE}" && test -z "${GL_COND_OBJ_GETLINE_FALSE}"; then
    GL_COND_OBJ_GETLINE_TRUE='#'
    GL_COND_OBJ_GETLINE_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_GETLINE_TRUE"; then :


  :


fi









          GL_GNULIB_GETLINE=1





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









  if test $ac_cv_have_decl_getlogin_r = no; then
    HAVE_DECL_GETLOGIN_R=0
  fi


  if test $ac_cv_func_getlogin_r = no; then
    HAVE_GETLOGIN_R=0
  else
    HAVE_GETLOGIN_R=1

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

                case "$host_os" in
                          # Guess no on Mac OS X, OSF/1.
          darwin* | osf*) gl_cv_func_getlogin_r_works="guessing no" ;;
                          # Guess yes otherwise.
          *)              gl_cv_func_getlogin_r_works="guessing yes" ;;
        esac
        if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stddef.h>
#include <string.h>
#include <unistd.h>
#if !HAVE_DECL_GETLOGIN_R
extern
# ifdef __cplusplus
"C"
# endif
int getlogin_r (char *, size_t);
#endif
int
main (void)
{
  int result = 0;
  char buf[100];

  if (getlogin_r (buf, 0) == 0)
    result |= 1;
  if (getlogin_r (buf, 1) == 0)
    result |= 2;
  if (getlogin_r (buf, 100) == 0)
    {
      size_t n = strlen (buf);
      if (getlogin_r (buf, n) == 0)
        result |= 4;
    }
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_getlogin_r_works=yes
else
  gl_cv_func_getlogin_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_getlogin_r_works" >&5
$as_echo "$gl_cv_func_getlogin_r_works" >&6; }
    case "$gl_cv_func_getlogin_r_works" in
      *yes) ;;
      *) REPLACE_GETLOGIN_R=1 ;;
    esac
  fi


     if test $HAVE_GETLOGIN_R = 0 || test $REPLACE_GETLOGIN_R = 1; then
  GL_COND_OBJ_GETLOGIN_R_TRUE=
  GL_COND_OBJ_GETLOGIN_R_FALSE='#'
else
  GL_COND_OBJ_GETLOGIN_R_TRUE='#'
  GL_COND_OBJ_GETLOGIN_R_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_GETLOGIN_R_TRUE}" && test -z "${GL_COND_OBJ_GETLOGIN_R_FALSE}"; then
    GL_COND_OBJ_GETLOGIN_R_TRUE='#'
    GL_COND_OBJ_GETLOGIN_R_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_GETLOGIN_R_TRUE"; then :





fi









          GL_GNULIB_GETLOGIN_R=1





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







  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_getrandom" != yes; then
    HAVE_GETRANDOM=0
  else
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getrandom is compatible with its GNU+BSD signature" >&5
$as_echo_n "checking whether getrandom is compatible with its GNU+BSD signature... " >&6; }
if ${gl_cv_func_getrandom_ok+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* Additional includes are needed before <sys/random.h> on uClibc
                 and Mac OS X.  */
              #include <sys/types.h>
              #include <stdlib.h>
              #include <sys/random.h>
              ssize_t getrandom (void *, size_t, unsigned int);

int
main ()
{

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_func_getrandom_ok=yes
else
  gl_cv_func_getrandom_ok=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_getrandom_ok" >&5
$as_echo "$gl_cv_func_getrandom_ok" >&6; }
    if test $gl_cv_func_getrandom_ok = no; then
      REPLACE_GETRANDOM=1
    fi
  fi

  case "$host_os" in
    mingw*)
      for ac_header in bcrypt.h
do :
  ac_fn_c_check_header_compile "$LINENO" "bcrypt.h" "ac_cv_header_bcrypt_h" "#include <windows.h>

"
if test "x$ac_cv_header_bcrypt_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_BCRYPT_H 1
_ACEOF

fi

done

      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the bcrypt library is guaranteed to be present" >&5
$as_echo_n "checking whether the bcrypt library is guaranteed to be present... " >&6; }
if ${gl_cv_lib_assume_bcrypt+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <windows.h>
int
main ()
{
#if !(_WIN32_WINNT >= _WIN32_WINNT_WIN7)
                  cannot assume it
                #endif

  ;
  return 0;
}

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

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

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

        LIB_GETRANDOM='-lbcrypt'
      else
        LIB_GETRANDOM='-ladvapi32'
      fi
      ;;
    *)
      LIB_GETRANDOM= ;;
  esac



     if test $HAVE_GETRANDOM = 0 || test $REPLACE_GETRANDOM = 1; then
  GL_COND_OBJ_GETRANDOM_TRUE=
  GL_COND_OBJ_GETRANDOM_FALSE='#'
else
  GL_COND_OBJ_GETRANDOM_TRUE='#'
  GL_COND_OBJ_GETRANDOM_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_GETRANDOM_TRUE}" && test -z "${GL_COND_OBJ_GETRANDOM_FALSE}"; then
    GL_COND_OBJ_GETRANDOM_TRUE='#'
    GL_COND_OBJ_GETRANDOM_FALSE='#'
  fi










          GL_GNULIB_GETRANDOM=1





$as_echo "#define GNULIB_TEST_GETRANDOM 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 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_COND_OBJ_GETTIMEOFDAY_TRUE=
  GL_COND_OBJ_GETTIMEOFDAY_FALSE='#'
else
  GL_COND_OBJ_GETTIMEOFDAY_TRUE='#'
  GL_COND_OBJ_GETTIMEOFDAY_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_GETTIMEOFDAY_TRUE}" && test -z "${GL_COND_OBJ_GETTIMEOFDAY_FALSE}"; then
    GL_COND_OBJ_GETTIMEOFDAY_TRUE='#'
    GL_COND_OBJ_GETTIMEOFDAY_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_GETTIMEOFDAY_TRUE"; then :

    :

fi









          GL_GNULIB_GETTIMEOFDAY=1





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







  if test $ac_cv_func_glob = no; then
    HAVE_GLOB=0
  else

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU glob interface version 1 or 2" >&5
$as_echo_n "checking for GNU glob interface version 1 or 2... " >&6; }
if ${gl_cv_gnu_glob_interface_version_1_2+:} false; then :
  $as_echo_n "(cached) " >&6
else
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <gnu-versions.h>
char a[_GNU_GLOB_INTERFACE_VERSION == 1 || _GNU_GLOB_INTERFACE_VERSION == 2 ? 1 : -1];
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_gnu_glob_interface_version_1_2=yes
else
  gl_cv_gnu_glob_interface_version_1_2=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_gnu_glob_interface_version_1_2" >&5
$as_echo "$gl_cv_gnu_glob_interface_version_1_2" >&6; }
    if test "$gl_cv_gnu_glob_interface_version_1_2" = "no"; then
      REPLACE_GLOB=1
    fi

    if test $REPLACE_GLOB = 0; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether glob lists broken symlinks" >&5
$as_echo_n "checking whether glob lists broken symlinks... " >&6; }
if ${gl_cv_glob_lists_symlinks+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test $cross_compiling != yes; then
           if ln -s conf-doesntexist conf$$-globtest 2>/dev/null; then
             gl_cv_glob_lists_symlinks=maybe
           else
             # If we can't make a symlink, then we cannot test this issue.  Be
             # pessimistic about this.
             gl_cv_glob_lists_symlinks=no
           fi
           if test $gl_cv_glob_lists_symlinks = maybe; then
             if test "$cross_compiling" = yes; then :
                  :

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stddef.h>
                    #include <glob.h>
int
main ()
{
glob_t found;
                    if (glob ("conf*-globtest", 0, NULL, &found) == GLOB_NOMATCH)
                      return 1;
                    globfree (&found);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_glob_lists_symlinks=yes
else
  gl_cv_glob_lists_symlinks=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
           rm -f conf$$-globtest
         else
           gl_cv_glob_lists_symlinks="$gl_cross_guess_normal"
         fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_glob_lists_symlinks" >&5
$as_echo "$gl_cv_glob_lists_symlinks" >&6; }
      case "$gl_cv_glob_lists_symlinks" in
        *yes) ;;
        *) REPLACE_GLOB=1 ;;
      esac
    fi

    if test $REPLACE_GLOB = 0; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether glob NOTDIR*/ omits symlink to nondir" >&5
$as_echo_n "checking whether glob NOTDIR*/ omits symlink to nondir... " >&6; }
if ${gl_cv_glob_omit_nondir_symlinks+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test $cross_compiling != yes; then
           if ln -s conf$$-file conf$$-globtest 2>/dev/null && touch conf$$-file
           then
             gl_cv_glob_omit_nondir_symlinks=maybe
           else
             # If we can't make a symlink, then we cannot test this issue.  Be
             # pessimistic about this.
             gl_cv_glob_omit_nondir_symlinks=no
           fi
           if test $gl_cv_glob_omit_nondir_symlinks = maybe; then
             if test "$cross_compiling" = yes; then :
                  :

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stddef.h>
                    #include <glob.h>
int
main ()
{
glob_t found;
                    if (glob ("conf*-globtest/", 0, NULL, &found) != GLOB_NOMATCH)
                      return 1;
                    globfree (&found);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_glob_omit_nondir_symlinks=yes
else
  gl_cv_glob_omit_nondir_symlinks=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
           rm -f conf$$-file conf$$-globtest
         else
           gl_cv_glob_omit_nondir_symlinks="$gl_cross_guess_normal"
         fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_glob_omit_nondir_symlinks" >&5
$as_echo "$gl_cv_glob_omit_nondir_symlinks" >&6; }
      case "$gl_cv_glob_omit_nondir_symlinks" in
        *yes) ;;
        *) REPLACE_GLOB=1 ;;
      esac
    fi

  fi

  if test $ac_cv_func_glob_pattern_p = no; then
    HAVE_GLOB_PATTERN_P=0
  else
    if test $REPLACE_GLOB = 1; then
      REPLACE_GLOB_PATTERN_P=1
    fi
  fi

  if test $HAVE_GLOB = 0 || test $REPLACE_GLOB = 1; then






  GL_GENERATE_GLOB_H=true

  fi





  case "$GL_GENERATE_GLOB_H" in
    false) GLOB_H='' ;;
    true)
                  if test -z "$GLOB_H"; then
        GLOB_H="${gl_source_base_prefix}glob.h"
      fi
      ;;
    *) echo "*** GL_GENERATE_GLOB_H is not set correctly" 1>&2; exit 1 ;;
  esac


     if $GL_GENERATE_GLOB_H; then
  GL_GENERATE_GLOB_H_TRUE=
  GL_GENERATE_GLOB_H_FALSE='#'
else
  GL_GENERATE_GLOB_H_TRUE='#'
  GL_GENERATE_GLOB_H_FALSE=
fi
:
    if test -z "${GL_GENERATE_GLOB_H_TRUE}" && test -z "${GL_GENERATE_GLOB_H_FALSE}"; then
    GL_GENERATE_GLOB_H_TRUE='#'
    GL_GENERATE_GLOB_H_FALSE='#'
  fi






     if test $HAVE_GLOB = 0 || test $REPLACE_GLOB = 1; then
  GL_COND_OBJ_GLOB_TRUE=
  GL_COND_OBJ_GLOB_FALSE='#'
else
  GL_COND_OBJ_GLOB_TRUE='#'
  GL_COND_OBJ_GLOB_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_GLOB_TRUE}" && test -z "${GL_COND_OBJ_GLOB_FALSE}"; then
    GL_COND_OBJ_GLOB_TRUE='#'
    GL_COND_OBJ_GLOB_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_GLOB_TRUE"; then :







fi

     if test $HAVE_GLOB_PATTERN_P = 0 || test $REPLACE_GLOB_PATTERN_P = 1; then
  GL_COND_OBJ_GLOB_PATTERN_P_TRUE=
  GL_COND_OBJ_GLOB_PATTERN_P_FALSE='#'
else
  GL_COND_OBJ_GLOB_PATTERN_P_TRUE='#'
  GL_COND_OBJ_GLOB_PATTERN_P_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_GLOB_PATTERN_P_TRUE}" && test -z "${GL_COND_OBJ_GLOB_PATTERN_P_FALSE}"; then
    GL_COND_OBJ_GLOB_PATTERN_P_TRUE='#'
    GL_COND_OBJ_GLOB_PATTERN_P_FALSE='#'
  fi










          GL_GNULIB_GLOB=1





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













  case "$GL_GENERATE_GLOB_H" in
    false) GLOB_H='' ;;
    true)
                  if test -z "$GLOB_H"; then
        GLOB_H="${gl_source_base_prefix}glob.h"
      fi
      ;;
    *) echo "*** GL_GENERATE_GLOB_H is not set correctly" 1>&2; exit 1 ;;
  esac


     if $GL_GENERATE_GLOB_H; then
  GL_GENERATE_GLOB_H_TRUE=
  GL_GENERATE_GLOB_H_FALSE='#'
else
  GL_GENERATE_GLOB_H_TRUE='#'
  GL_GENERATE_GLOB_H_FALSE=
fi
:
    if test -z "${GL_GENERATE_GLOB_H_TRUE}" && test -z "${GL_GENERATE_GLOB_H_FALSE}"; then
    GL_GENERATE_GLOB_H_TRUE='#'
    GL_GENERATE_GLOB_H_FALSE='#'
  fi







  LIB_HARD_LOCALE="$LIB_SETLOCALE_NULL"








                HAVE_INET_NTOP=1
  INET_NTOP_LIB=




  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 $HAVE_WINSOCK2_H = 1; then
                    REPLACE_INET_NTOP=1
    ac_fn_c_check_decl "$LINENO" "inet_ntop" "ac_cv_have_decl_inet_ntop" "#include <ws2tcpip.h>
"
if test "x$ac_cv_have_decl_inet_ntop" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_INET_NTOP $ac_have_decl
_ACEOF

    if test $ac_cv_have_decl_inet_ntop = yes; then
      INET_NTOP_LIB="-lws2_32"
    else
      HAVE_DECL_INET_NTOP=0
    fi
  else
    gl_save_LIBS=$LIBS
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing inet_ntop" >&5
$as_echo_n "checking for library containing inet_ntop... " >&6; }
if ${ac_cv_search_inet_ntop+:} 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 inet_ntop ();
int
main ()
{
return inet_ntop ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' nsl resolv network; 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_inet_ntop=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if ${ac_cv_search_inet_ntop+:} false; then :
  break
fi
done
if ${ac_cv_search_inet_ntop+:} false; then :

else
  ac_cv_search_inet_ntop=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5
$as_echo "$ac_cv_search_inet_ntop" >&6; }
ac_res=$ac_cv_search_inet_ntop
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

else
  for ac_func in inet_ntop
do :
  ac_fn_c_check_func "$LINENO" "inet_ntop" "ac_cv_func_inet_ntop"
if test "x$ac_cv_func_inet_ntop" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_INET_NTOP 1
_ACEOF

fi
done

       if test $ac_cv_func_inet_ntop = no; then
         HAVE_INET_NTOP=0
       fi

fi

    LIBS=$gl_save_LIBS

    if test "$ac_cv_search_inet_ntop" != "no" \
       && test "$ac_cv_search_inet_ntop" != "none required"; then
      INET_NTOP_LIB="$ac_cv_search_inet_ntop"
    fi


    ac_fn_c_check_decl "$LINENO" "inet_ntop" "ac_cv_have_decl_inet_ntop" "#include <arpa/inet.h>
        #if HAVE_NETDB_H
        # include <netdb.h>
        #endif

"
if test "x$ac_cv_have_decl_inet_ntop" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_INET_NTOP $ac_have_decl
_ACEOF

    if test $ac_cv_have_decl_inet_ntop = no; then
      HAVE_DECL_INET_NTOP=0
    fi
  fi



     if test $HAVE_INET_NTOP = 0 || test $REPLACE_INET_NTOP = 1; then
  GL_COND_OBJ_INET_NTOP_TRUE=
  GL_COND_OBJ_INET_NTOP_FALSE='#'
else
  GL_COND_OBJ_INET_NTOP_TRUE='#'
  GL_COND_OBJ_INET_NTOP_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_INET_NTOP_TRUE}" && test -z "${GL_COND_OBJ_INET_NTOP_FALSE}"; then
    GL_COND_OBJ_INET_NTOP_TRUE='#'
    GL_COND_OBJ_INET_NTOP_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_INET_NTOP_TRUE"; then :





fi









          GL_GNULIB_INET_NTOP=1

















  if test $ac_cv_func_isblank = no; then
    HAVE_ISBLANK=0
  fi


     if test $HAVE_ISBLANK = 0; then
  GL_COND_OBJ_ISBLANK_TRUE=
  GL_COND_OBJ_ISBLANK_FALSE='#'
else
  GL_COND_OBJ_ISBLANK_TRUE='#'
  GL_COND_OBJ_ISBLANK_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_ISBLANK_TRUE}" && test -z "${GL_COND_OBJ_ISBLANK_FALSE}"; then
    GL_COND_OBJ_ISBLANK_TRUE='#'
    GL_COND_OBJ_ISBLANK_FALSE='#'
  fi



cat >>confdefs.h <<_ACEOF
#define GNULIB_ISBLANK 1
_ACEOF











          GL_GNULIB_ISBLANK=1






  { $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) || (__clang_major__ >= 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


  { $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) || (__clang_major__ >= 4)
             # undef isnanl
             # define isnanl(x) __builtin_isnan ((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) || (__clang_major__ >= 4)
# undef isnanl
# define isnanl(x) __builtin_isnan ((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 ()
{
  static long double samples[5] = { 0.25L, 0.5L, 1.0L, 2.0L, 4.0L };
  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;
  for (j = 0; j < 5; j++)
    add_to_ored_words (&samples[j]);
  /* 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


  { $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






  case "$GL_GENERATE_LIMITS_H" in
    false) LIMITS_H='' ;;
    true)
                  if test -z "$LIMITS_H"; then
        LIMITS_H="${gl_source_base_prefix}limits.h"
      fi
      ;;
    *) echo "*** GL_GENERATE_LIMITS_H is not set correctly" 1>&2; exit 1 ;;
  esac


     if $GL_GENERATE_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 -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then
    GL_GENERATE_LIMITS_H_TRUE='#'
    GL_GENERATE_LIMITS_H_FALSE='#'
  fi








     if test "$ac_cv_header_winsock2_h" = yes; then
  GL_COND_OBJ_LISTEN_TRUE=
  GL_COND_OBJ_LISTEN_FALSE='#'
else
  GL_COND_OBJ_LISTEN_TRUE='#'
  GL_COND_OBJ_LISTEN_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_LISTEN_TRUE}" && test -z "${GL_COND_OBJ_LISTEN_FALSE}"; then
    GL_COND_OBJ_LISTEN_TRUE='#'
    GL_COND_OBJ_LISTEN_FALSE='#'
  fi










          GL_GNULIB_LISTEN=1





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






    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






  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_COND_OBJ_LSTAT_TRUE=
  GL_COND_OBJ_LSTAT_FALSE='#'
else
  GL_COND_OBJ_LSTAT_TRUE='#'
  GL_COND_OBJ_LSTAT_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_LSTAT_TRUE}" && test -z "${GL_COND_OBJ_LSTAT_FALSE}"; then
    GL_COND_OBJ_LSTAT_TRUE='#'
    GL_COND_OBJ_LSTAT_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_LSTAT_TRUE"; then :

    :

fi









          GL_GNULIB_LSTAT=1





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




  if test $REPLACE_MALLOC_FOR_MALLOC_POSIX = 1; then








  gl_LIBOBJS="$gl_LIBOBJS malloc.$ac_objext"

  fi









          GL_GNULIB_MALLOC_POSIX=1





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


























        if case "$host_os" in
       mingw*) true ;;
       *) test $ac_cv_func_mbsinit = yes ;;
     esac \
    && 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>
#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>
#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>
#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" "
      #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>
#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>
#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>
#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>
#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 stores incomplete characters" >&5
$as_echo_n "checking whether mbrtowc stores incomplete characters... " >&6; }
if ${gl_cv_func_mbrtowc_stores_incomplete+:} false; then :
  $as_echo_n "(cached) " >&6
else

               case "$host_os" in
               # Guess yes on native Windows.
       mingw*) gl_cv_func_mbrtowc_stores_incomplete="guessing yes" ;;
       *)      gl_cv_func_mbrtowc_stores_incomplete="guessing no" ;;
     esac
     case "$host_os" in
       mingw*)
         if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <locale.h>
#include <string.h>
#include <wchar.h>
int main ()
{
  int result = 0;
  if (setlocale (LC_ALL, "French_France.65001") != NULL)
    {
      wchar_t wc = (wchar_t) 0xBADFACE;
      mbstate_t state;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2)
          && wc != (wchar_t) 0xBADFACE)
        result |= 1;
    }
  if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL)
    {
      wchar_t wc = (wchar_t) 0xBADFACE;
      mbstate_t state;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, "\226", 1, &state) == (size_t)(-2)
          && wc != (wchar_t) 0xBADFACE)
        result |= 2;
    }
  if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL)
    {
      wchar_t wc = (wchar_t) 0xBADFACE;
      mbstate_t state;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, "\245", 1, &state) == (size_t)(-2)
          && wc != (wchar_t) 0xBADFACE)
        result |= 4;
    }
  if (setlocale (LC_ALL, "Chinese_China.936") != NULL)
    {
      wchar_t wc = (wchar_t) 0xBADFACE;
      mbstate_t state;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, "\261", 1, &state) == (size_t)(-2)
          && wc != (wchar_t) 0xBADFACE)
        result |= 8;
    }
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mbrtowc_stores_incomplete=no
else
  gl_cv_func_mbrtowc_stores_incomplete=yes
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 $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>
#include <wchar.h>
int main ()
{
  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
    {
      wchar_t wc = (wchar_t) 0xBADFACE;
      mbstate_t state;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2)
          && wc != (wchar_t) 0xBADFACE)
        return 1;
    }
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mbrtowc_stores_incomplete=no
else
  gl_cv_func_mbrtowc_stores_incomplete=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
         ;;
     esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_stores_incomplete" >&5
$as_echo "$gl_cv_func_mbrtowc_stores_incomplete" >&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_func_mbrtowc_C_locale_sans_EILSEQ+:} false; then :
  $as_echo_n "(cached) " >&6
else

               gl_cv_func_mbrtowc_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_func_mbrtowc_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_func_mbrtowc_C_locale_sans_EILSEQ=yes
else
  gl_cv_func_mbrtowc_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_func_mbrtowc_C_locale_sans_EILSEQ" >&5
$as_echo "$gl_cv_func_mbrtowc_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_stores_incomplete" in
        *no) ;;
        *)
$as_echo "#define MBRTOWC_STORES_INCOMPLETE_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_func_mbrtowc_C_locale_sans_EILSEQ" in
        *yes) ;;
        *)
$as_echo "#define MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ 1" >>confdefs.h

           REPLACE_MBRTOWC=1
           ;;
      esac
    fi
  fi
  if test $REPLACE_MBSTATE_T = 1; then
    case "$host_os" in
      mingw*) LIB_MBRTOWC= ;;
      *)


  { $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
  case "$host_os" in
       cygwin*)
                                    gl_cv_have_weak="guessing no"
         ;;
       *)
         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
         ;;
     esac
          case " $LDFLAGS " in
       *" -static "*) gl_cv_have_weak=no ;;
     esac
                    case "$gl_cv_have_weak" in
       *yes)
         case "$host_os" in
           freebsd* | dragonfly* | midnightbsd*)
             : > conftest1.c
             $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1
             cat <<EOF > conftest2.c
#include <pthread.h>
#pragma weak pthread_mutexattr_gettype
int main ()
{
  return (pthread_mutexattr_gettype != NULL);
}
EOF
             $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \
               || gl_cv_have_weak=no
             rm -f conftest1.c libempty.so conftest2.c conftest
             ;;
         esac
         ;;
     esac

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

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

      ;;
  esac

        case "$gl_cv_have_weak" in
          *yes) LIB_MBRTOWC= ;;
          *)    LIB_MBRTOWC="$LIBPTHREAD" ;;
        esac
        ;;
    esac
  else
    LIB_MBRTOWC=
  fi



     if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then
  GL_COND_OBJ_MBRTOWC_TRUE=
  GL_COND_OBJ_MBRTOWC_FALSE='#'
else
  GL_COND_OBJ_MBRTOWC_TRUE='#'
  GL_COND_OBJ_MBRTOWC_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_MBRTOWC_TRUE}" && test -z "${GL_COND_OBJ_MBRTOWC_FALSE}"; then
    GL_COND_OBJ_MBRTOWC_TRUE='#'
    GL_COND_OBJ_MBRTOWC_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_MBRTOWC_TRUE"; then :

    if test $REPLACE_MBSTATE_T = 1; then








  gl_LIBOBJS="$gl_LIBOBJS lc-charset-dispatch.$ac_objext"









  gl_LIBOBJS="$gl_LIBOBJS mbtowc-lock.$ac_objext"




  CFLAG_VISIBILITY=
  HAVE_VISIBILITY=0
  if test -n "$GCC"; then
                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5
$as_echo_n "checking whether the -Werror option is usable... " >&6; }
if ${gl_cv_cc_vis_werror+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_save_CFLAGS="$CFLAGS"
       CFLAGS="$CFLAGS -Werror"
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

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

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_vis_werror" >&5
$as_echo "$gl_cv_cc_vis_werror" >&6; }
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5
$as_echo_n "checking for simple visibility declarations... " >&6; }
if ${gl_cv_cc_visibility+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_save_CFLAGS="$CFLAGS"
       CFLAGS="$CFLAGS -fvisibility=hidden"
                                          if test $gl_cv_cc_vis_werror = yes; then
         CFLAGS="$CFLAGS -Werror"
       fi
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
extern __attribute__((__visibility__("hidden"))) int hiddenvar;
              extern __attribute__((__visibility__("default"))) int exportedvar;
              extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
              extern __attribute__((__visibility__("default"))) int exportedfunc (void);
              void dummyfunc (void);
              int hiddenvar;
              int exportedvar;
              int hiddenfunc (void) { return 51; }
              int exportedfunc (void) { return 1225736919; }
              void dummyfunc (void) {}

int
main ()
{

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

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_visibility" >&5
$as_echo "$gl_cv_cc_visibility" >&6; }
    if test $gl_cv_cc_visibility = yes; then
      CFLAG_VISIBILITY="-fvisibility=hidden"
      HAVE_VISIBILITY=1
    fi
  fi



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



    fi


  :


fi














          GL_GNULIB_MBRTOWC=1





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















        if case "$host_os" in
       mingw*) true ;;
       *) test $ac_cv_func_mbsinit = yes ;;
     esac \
    && 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>
#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>
#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>
#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" "
      #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_COND_OBJ_MBSINIT_TRUE=
  GL_COND_OBJ_MBSINIT_FALSE='#'
else
  GL_COND_OBJ_MBSINIT_TRUE='#'
  GL_COND_OBJ_MBSINIT_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_MBSINIT_TRUE}" && test -z "${GL_COND_OBJ_MBSINIT_FALSE}"; then
    GL_COND_OBJ_MBSINIT_TRUE='#'
    GL_COND_OBJ_MBSINIT_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_MBSINIT_TRUE"; then :


  :


fi














          GL_GNULIB_MBSINIT=1





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














        if case "$host_os" in
       mingw*) true ;;
       *) test $ac_cv_func_mbsinit = yes ;;
     esac \
    && 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>
#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>
#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>
#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_mbsrtowcs = no; then
    HAVE_MBSRTOWCS=0
    ac_fn_c_check_decl "$LINENO" "mbsrtowcs" "ac_cv_have_decl_mbsrtowcs" "
      #include <wchar.h>

"
if test "x$ac_cv_have_decl_mbsrtowcs" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_MBSRTOWCS $ac_have_decl
_ACEOF

    if test $ac_cv_have_decl_mbsrtowcs = yes; then
                        REPLACE_MBSRTOWCS=1
    fi
  else
    if test $REPLACE_MBSTATE_T = 1; then
      REPLACE_MBSRTOWCS=1
    else






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

                  case "$host_os" in
                                   # Guess no on HP-UX, Solaris, mingw.
        hpux* | solaris* | mingw*) gl_cv_func_mbsrtowcs_works="guessing no" ;;
                                   # Guess yes otherwise.
        *)                         gl_cv_func_mbsrtowcs_works="guessing yes" ;;
      esac
      if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || 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>
#include <wchar.h>
int main ()
{
  int result = 0;
  /* Test whether the function supports a NULL destination argument.
     This fails on native Windows.  */
  if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
    {
      const char input[] = "\337er";
      const char *src = input;
      mbstate_t state;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbsrtowcs (NULL, &src, 1, &state) != 3
          || src != input)
        result |= 1;
    }
  /* Test whether the function works when started with a conversion state
     in non-initial state.  This fails on HP-UX 11.11 and Solaris 10.  */
  if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
    {
      const char input[] = "B\303\274\303\237er";
      mbstate_t state;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (NULL, input + 1, 1, &state) == (size_t)(-2))
        if (!mbsinit (&state))
          {
            const char *src = input + 2;
            if (mbsrtowcs (NULL, &src, 10, &state) != 4)
              result |= 2;
          }
    }
  if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
    {
      const char input[] = "<\306\374\313\334\270\354>";
      mbstate_t state;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (NULL, input + 3, 1, &state) == (size_t)(-2))
        if (!mbsinit (&state))
          {
            const char *src = input + 4;
            if (mbsrtowcs (NULL, &src, 10, &state) != 3)
              result |= 4;
          }
    }
  if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
    {
      const char input[] = "B\250\271\201\060\211\070er";
      mbstate_t state;

      memset (&state, '\0', sizeof (mbstate_t));
      if (mbrtowc (NULL, input + 1, 1, &state) == (size_t)(-2))
        if (!mbsinit (&state))
          {
            const char *src = input + 2;
            if (mbsrtowcs (NULL, &src, 10, &state) != 4)
              result |= 8;
          }
    }
  return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mbsrtowcs_works=yes
else
  gl_cv_func_mbsrtowcs_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

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

      case "$gl_cv_func_mbsrtowcs_works" in
        *yes) ;;
        *) REPLACE_MBSRTOWCS=1 ;;
      esac
    fi
  fi


     if test $HAVE_MBSRTOWCS = 0 || test $REPLACE_MBSRTOWCS = 1; then
  GL_COND_OBJ_MBSRTOWCS_TRUE=
  GL_COND_OBJ_MBSRTOWCS_FALSE='#'
else
  GL_COND_OBJ_MBSRTOWCS_TRUE='#'
  GL_COND_OBJ_MBSRTOWCS_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_MBSRTOWCS_TRUE}" && test -z "${GL_COND_OBJ_MBSRTOWCS_FALSE}"; then
    GL_COND_OBJ_MBSRTOWCS_TRUE='#'
    GL_COND_OBJ_MBSRTOWCS_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_MBSRTOWCS_TRUE"; then :









  gl_LIBOBJS="$gl_LIBOBJS mbsrtowcs-state.$ac_objext"


  :


fi














          GL_GNULIB_MBSRTOWCS=1





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






  for ac_func in mbtowc
do :
  ac_fn_c_check_func "$LINENO" "mbtowc" "ac_cv_func_mbtowc"
if test "x$ac_cv_func_mbtowc" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MBTOWC 1
_ACEOF

fi
done

  if test $ac_cv_func_mbtowc = no; then
    HAVE_MBTOWC=0
  else
    if false; then
      REPLACE_MBTOWC=1
    fi
  fi


     if test $HAVE_MBTOWC = 0 || test $REPLACE_MBTOWC = 1; then
  GL_COND_OBJ_MBTOWC_TRUE=
  GL_COND_OBJ_MBTOWC_FALSE='#'
else
  GL_COND_OBJ_MBTOWC_TRUE='#'
  GL_COND_OBJ_MBTOWC_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_MBTOWC_TRUE}" && test -z "${GL_COND_OBJ_MBTOWC_FALSE}"; then
    GL_COND_OBJ_MBTOWC_TRUE='#'
    GL_COND_OBJ_MBTOWC_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_MBTOWC_TRUE"; then :


  :


fi









          GL_GNULIB_MBTOWC=1





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





     if test $REPLACE_MEMCHR = 1; then
  GL_COND_OBJ_MEMCHR_TRUE=
  GL_COND_OBJ_MEMCHR_FALSE='#'
else
  GL_COND_OBJ_MEMCHR_TRUE='#'
  GL_COND_OBJ_MEMCHR_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_MEMCHR_TRUE}" && test -z "${GL_COND_OBJ_MEMCHR_FALSE}"; then
    GL_COND_OBJ_MEMCHR_TRUE='#'
    GL_COND_OBJ_MEMCHR_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_MEMCHR_TRUE"; then :


  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














          GL_GNULIB_MEMCHR=1





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





  if test $HAVE_DECL_MEMMEM = 1 && test $REPLACE_MEMMEM = 0; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether memmem works in linear time" >&5
$as_echo_n "checking whether memmem works in linear time... " >&6; }
if ${gl_cv_func_memmem_works_fast+:} 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 <features.h>
#ifdef __GNU_LIBRARY__
 #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 9) || (__GLIBC__ > 2)) \
     && !defined __UCLIBC__
  Lucky user
 #endif
#endif
#ifdef __CYGWIN__
 #include <cygwin/version.h>
 #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 0)
  Lucky user
 #endif
#endif

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


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

#include <signal.h> /* for signal */
#include <string.h> /* for memmem */
#include <stdlib.h> /* for malloc */
#include <unistd.h> /* for alarm */
static void quit (int sig) { _exit (sig + 128); }

int
main ()
{

    int result = 0;
    size_t m = 1000000;
    char *haystack = (char *) malloc (2 * m + 1);
    char *needle = (char *) malloc (m + 1);
    /* Failure to compile this test due to missing alarm is okay,
       since all such platforms (mingw) also lack memmem.  */
    signal (SIGALRM, quit);
    alarm (5);
    /* Check for quadratic performance.  */
    if (haystack && needle)
      {
        memset (haystack, 'A', 2 * m);
        haystack[2 * m] = 'B';
        memset (needle, 'A', m);
        needle[m] = 'B';
        if (!memmem (haystack, 2 * m + 1, needle, m + 1))
          result |= 1;
      }
    /* Free allocated memory, in case some sanitizer is watching.  */
    free (haystack);
    free (needle);
    return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_memmem_works_fast=yes
else
  gl_cv_func_memmem_works_fast=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_memmem_works_fast" >&5
$as_echo "$gl_cv_func_memmem_works_fast" >&6; }
    case "$gl_cv_func_memmem_works_fast" in
      *yes) ;;
      *)
        REPLACE_MEMMEM=1
        ;;
    esac
  fi

  if test $HAVE_MEMMEM = 0 || test $REPLACE_MEMMEM = 1; then








  gl_LIBOBJS="$gl_LIBOBJS memmem.$ac_objext"

  fi




  for ac_func in memmem
do :
  ac_fn_c_check_func "$LINENO" "memmem" "ac_cv_func_memmem"
if test "x$ac_cv_func_memmem" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MEMMEM 1
_ACEOF

fi
done

  if test $ac_cv_func_memmem = yes; then
    HAVE_MEMMEM=1
  else
    HAVE_MEMMEM=0
  fi

  if test $ac_cv_have_decl_memmem = no; then
    HAVE_DECL_MEMMEM=0
  else
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether memmem works" >&5
$as_echo_n "checking whether memmem works... " >&6; }
if ${gl_cv_func_memmem_works_always+:} 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 <string.h> /* for __GNU_LIBRARY__ */
#ifdef __GNU_LIBRARY__
 #include <features.h>
 #if ((__GLIBC__ == 2 && ((__GLIBC_MINOR > 0 && __GLIBC_MINOR__ < 9) \
                          || __GLIBC_MINOR__ > 12)) \
      || (__GLIBC__ > 2)) \
     || defined __UCLIBC__
  Lucky user
 #endif
#elif defined __CYGWIN__
 #include <cygwin/version.h>
 #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7)
  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_memmem_works_always="guessing yes"
else
  gl_cv_func_memmem_works_always="$gl_cross_guess_normal"
fi
rm -f conftest*


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

#include <string.h> /* for memmem */
#define P "_EF_BF_BD"
#define HAYSTACK "F_BD_CE_BD" P P P P "_C3_88_20" P P P "_C3_A7_20" P
#define NEEDLE P P P P P

int
main ()
{

    int result = 0;
    if (memmem (HAYSTACK, strlen (HAYSTACK), NEEDLE, strlen (NEEDLE)))
      result |= 1;
    /* Check for empty needle behavior.  */
    {
      const char *haystack = "AAA";
      if (memmem (haystack, 3, (const char *) 1, 0) != haystack)
        result |= 2;
    }
    return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_memmem_works_always=yes
else
  gl_cv_func_memmem_works_always=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_memmem_works_always" >&5
$as_echo "$gl_cv_func_memmem_works_always" >&6; }
    case "$gl_cv_func_memmem_works_always" in
      *yes) ;;
      *)
        REPLACE_MEMMEM=1
        ;;
    esac
  fi
  :

  if test $HAVE_MEMMEM = 0 || test $REPLACE_MEMMEM = 1; then








  gl_LIBOBJS="$gl_LIBOBJS memmem.$ac_objext"

  fi














          GL_GNULIB_MEMMEM=1





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









  for ac_func in mempcpy
do :
  ac_fn_c_check_func "$LINENO" "mempcpy" "ac_cv_func_mempcpy"
if test "x$ac_cv_func_mempcpy" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MEMPCPY 1
_ACEOF

fi
done

  if test $ac_cv_func_mempcpy = no; then
    HAVE_MEMPCPY=0
  fi


     if test $HAVE_MEMPCPY = 0; then
  GL_COND_OBJ_MEMPCPY_TRUE=
  GL_COND_OBJ_MEMPCPY_FALSE='#'
else
  GL_COND_OBJ_MEMPCPY_TRUE='#'
  GL_COND_OBJ_MEMPCPY_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_MEMPCPY_TRUE}" && test -z "${GL_COND_OBJ_MEMPCPY_FALSE}"; then
    GL_COND_OBJ_MEMPCPY_TRUE='#'
    GL_COND_OBJ_MEMPCPY_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_MEMPCPY_TRUE"; then :


  :


fi














          GL_GNULIB_MEMPCPY=1





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








  if test $ac_cv_have_decl_memrchr = no; then
    HAVE_DECL_MEMRCHR=0
  fi

  for ac_func in memrchr
do :
  ac_fn_c_check_func "$LINENO" "memrchr" "ac_cv_func_memrchr"
if test "x$ac_cv_func_memrchr" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MEMRCHR 1
_ACEOF

fi
done



     if test $ac_cv_func_memrchr = no; then
  GL_COND_OBJ_MEMRCHR_TRUE=
  GL_COND_OBJ_MEMRCHR_FALSE='#'
else
  GL_COND_OBJ_MEMRCHR_TRUE='#'
  GL_COND_OBJ_MEMRCHR_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_MEMRCHR_TRUE}" && test -z "${GL_COND_OBJ_MEMRCHR_FALSE}"; then
    GL_COND_OBJ_MEMRCHR_TRUE='#'
    GL_COND_OBJ_MEMRCHR_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_MEMRCHR_TRUE"; then :

    :

fi














          GL_GNULIB_MEMRCHR=1





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








  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mkdir handles trailing slash" >&5
$as_echo_n "checking whether mkdir handles trailing slash... " >&6; }
if ${gl_cv_func_mkdir_trailing_slash_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  rm -rf conftest.dir
     if test "$cross_compiling" = yes; then :
  case "$host_os" in
                           # Guess yes on Linux systems.
          linux-* | linux) gl_cv_func_mkdir_trailing_slash_works="guessing yes" ;;
                           # Guess yes on glibc systems.
          *-gnu* | gnu*)   gl_cv_func_mkdir_trailing_slash_works="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_mkdir_trailing_slash_works="guessing yes"
else
  gl_cv_func_mkdir_trailing_slash_works="guessing no"
fi
rm -f conftest*

                           ;;
                           # If we don't know, obey --enable-cross-guesses.
          *)               gl_cv_func_mkdir_trailing_slash_works="$gl_cross_guess_normal" ;;
        esac

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

          #include <sys/types.h>
          #include <sys/stat.h>


$gl_mda_defines

int
main ()
{
return mkdir ("conftest.dir/", 0700);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mkdir_trailing_slash_works=yes
else
  gl_cv_func_mkdir_trailing_slash_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

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mkdir_trailing_slash_works" >&5
$as_echo "$gl_cv_func_mkdir_trailing_slash_works" >&6; }
  case "$gl_cv_func_mkdir_trailing_slash_works" in
    *yes) ;;
    *)
      REPLACE_MKDIR=1
      ;;
  esac

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mkdir handles trailing dot" >&5
$as_echo_n "checking whether mkdir handles trailing dot... " >&6; }
if ${gl_cv_func_mkdir_trailing_dot_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  rm -rf conftest.dir
     if test "$cross_compiling" = yes; then :
  case "$host_os" in
                         # Guess yes on glibc systems.
          *-gnu* | gnu*) gl_cv_func_mkdir_trailing_dot_works="guessing yes" ;;
                         # Guess yes on musl systems.
          *-musl*)       gl_cv_func_mkdir_trailing_dot_works="guessing yes" ;;
                         # Guess no on native Windows.
          mingw*)        gl_cv_func_mkdir_trailing_dot_works="guessing no" ;;
                         # If we don't know, obey --enable-cross-guesses.
          *)             gl_cv_func_mkdir_trailing_dot_works="$gl_cross_guess_normal" ;;
        esac

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

          #include <sys/types.h>
          #include <sys/stat.h>


$gl_mda_defines

int
main ()
{
return !mkdir ("conftest.dir/./", 0700);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_mkdir_trailing_dot_works=yes
else
  gl_cv_func_mkdir_trailing_dot_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


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

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

      ;;
  esac


     if test $REPLACE_MKDIR = 1; then
  GL_COND_OBJ_MKDIR_TRUE=
  GL_COND_OBJ_MKDIR_FALSE='#'
else
  GL_COND_OBJ_MKDIR_TRUE='#'
  GL_COND_OBJ_MKDIR_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_MKDIR_TRUE}" && test -z "${GL_COND_OBJ_MKDIR_FALSE}"; then
    GL_COND_OBJ_MKDIR_TRUE='#'
    GL_COND_OBJ_MKDIR_FALSE='#'
  fi










          GL_GNULIB_MKDIR=1





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





  for ac_func in mkdtemp
do :
  ac_fn_c_check_func "$LINENO" "mkdtemp" "ac_cv_func_mkdtemp"
if test "x$ac_cv_func_mkdtemp" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MKDTEMP 1
_ACEOF

fi
done

  if test $ac_cv_func_mkdtemp = no; then
    HAVE_MKDTEMP=0
  fi


     if test $HAVE_MKDTEMP = 0; then
  GL_COND_OBJ_MKDTEMP_TRUE=
  GL_COND_OBJ_MKDTEMP_FALSE='#'
else
  GL_COND_OBJ_MKDTEMP_TRUE='#'
  GL_COND_OBJ_MKDTEMP_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_MKDTEMP_TRUE}" && test -z "${GL_COND_OBJ_MKDTEMP_FALSE}"; then
    GL_COND_OBJ_MKDTEMP_TRUE='#'
    GL_COND_OBJ_MKDTEMP_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_MKDTEMP_TRUE"; then :

    :


fi









          GL_GNULIB_MKDTEMP=1





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









  if test $ac_cv_func_mkostemp != yes; then
    HAVE_MKOSTEMP=0
  fi


     if test $HAVE_MKOSTEMP = 0; then
  GL_COND_OBJ_MKOSTEMP_TRUE=
  GL_COND_OBJ_MKOSTEMP_FALSE='#'
else
  GL_COND_OBJ_MKOSTEMP_TRUE='#'
  GL_COND_OBJ_MKOSTEMP_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_MKOSTEMP_TRUE}" && test -z "${GL_COND_OBJ_MKOSTEMP_FALSE}"; then
    GL_COND_OBJ_MKOSTEMP_TRUE='#'
    GL_COND_OBJ_MKOSTEMP_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_MKOSTEMP_TRUE"; then :




fi


cat >>confdefs.h <<_ACEOF
#define GNULIB_MKOSTEMP 1
_ACEOF











          GL_GNULIB_MKOSTEMP=1





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





     if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
  GL_COND_OBJ_MSVC_INVAL_TRUE=
  GL_COND_OBJ_MSVC_INVAL_FALSE='#'
else
  GL_COND_OBJ_MSVC_INVAL_TRUE='#'
  GL_COND_OBJ_MSVC_INVAL_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_MSVC_INVAL_TRUE}" && test -z "${GL_COND_OBJ_MSVC_INVAL_FALSE}"; then
    GL_COND_OBJ_MSVC_INVAL_TRUE='#'
    GL_COND_OBJ_MSVC_INVAL_FALSE='#'
  fi



     if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
  GL_COND_OBJ_MSVC_NOTHROW_TRUE=
  GL_COND_OBJ_MSVC_NOTHROW_FALSE='#'
else
  GL_COND_OBJ_MSVC_NOTHROW_TRUE='#'
  GL_COND_OBJ_MSVC_NOTHROW_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_MSVC_NOTHROW_TRUE}" && test -z "${GL_COND_OBJ_MSVC_NOTHROW_FALSE}"; then
    GL_COND_OBJ_MSVC_NOTHROW_TRUE='#'
    GL_COND_OBJ_MSVC_NOTHROW_FALSE='#'
  fi



cat >>confdefs.h <<_ACEOF
#define GNULIB_MSVC_NOTHROW 1
_ACEOF











  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <netinet/in.h> is self-contained" >&5
$as_echo_n "checking whether <netinet/in.h> is self-contained... " >&6; }
if ${gl_cv_header_netinet_in_h_selfcontained+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <netinet/in.h>
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_header_netinet_in_h_selfcontained=yes
else
  gl_cv_header_netinet_in_h_selfcontained=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_netinet_in_h_selfcontained" >&5
$as_echo "$gl_cv_header_netinet_in_h_selfcontained" >&6; }
  if test $gl_cv_header_netinet_in_h_selfcontained = yes; then
    GL_GENERATE_NETINET_IN_H=false
  else
    GL_GENERATE_NETINET_IN_H=true
    for ac_header in netinet/in.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "$ac_includes_default"
if test "x$ac_cv_header_netinet_in_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_NETINET_IN_H 1
_ACEOF

fi

done










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

             if test $ac_cv_header_netinet_in_h = yes; then




  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <netinet/in.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 'netinet/in.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_netinet_in_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
  sed -n "$gl_absolute_header_sed"`

          gl_header=$gl_cv_absolute_netinet_in_h
          gl_cv_next_netinet_in_h='"'$gl_header'"'
          else
               gl_cv_next_netinet_in_h='<'netinet/in.h'>'
             fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_netinet_in_h" >&5
$as_echo "$gl_cv_next_netinet_in_h" >&6; }
     fi
     NEXT_NETINET_IN_H=$gl_cv_next_netinet_in_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='<'netinet/in.h'>'
     else
       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
       gl_next_as_first_directive=$gl_cv_next_netinet_in_h
     fi
     NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H=$gl_next_as_first_directive




    if test $ac_cv_header_netinet_in_h = yes; then
      HAVE_NETINET_IN_H=1
    else
      HAVE_NETINET_IN_H=0
    fi

  fi





  case "$GL_GENERATE_NETINET_IN_H" in
    false) NETINET_IN_H='' ;;
    true)
                  if test -z "$NETINET_IN_H"; then
        NETINET_IN_H="${gl_source_base_prefix}netinet/in.h"
      fi
      ;;
    *) echo "*** GL_GENERATE_NETINET_IN_H is not set correctly" 1>&2; exit 1 ;;
  esac


     if $GL_GENERATE_NETINET_IN_H; then
  GL_GENERATE_NETINET_IN_H_TRUE=
  GL_GENERATE_NETINET_IN_H_FALSE='#'
else
  GL_GENERATE_NETINET_IN_H_TRUE='#'
  GL_GENERATE_NETINET_IN_H_FALSE=
fi
:
    if test -z "${GL_GENERATE_NETINET_IN_H_TRUE}" && test -z "${GL_GENERATE_NETINET_IN_H_FALSE}"; then
    GL_GENERATE_NETINET_IN_H_TRUE='#'
    GL_GENERATE_NETINET_IN_H_FALSE='#'
  fi









  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


$gl_mda_defines

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 = 0; then



  if test $ac_cv_func_fchdir = no; then
    HAVE_FCHDIR=0
  fi

      if test $HAVE_FCHDIR = 0; then
        REPLACE_OPEN=1
      fi
    fi




     if test $REPLACE_OPEN = 1; then
  GL_COND_OBJ_OPEN_TRUE=
  GL_COND_OBJ_OPEN_FALSE='#'
else
  GL_COND_OBJ_OPEN_TRUE='#'
  GL_COND_OBJ_OPEN_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_OPEN_TRUE}" && test -z "${GL_COND_OBJ_OPEN_FALSE}"; then
    GL_COND_OBJ_OPEN_TRUE='#'
    GL_COND_OBJ_OPEN_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_OPEN_TRUE"; then :



  :


fi









          GL_GNULIB_OPEN=1





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









  case $ac_cv_func_openat+$gl_cv_func_lstat_dereferences_slashed_symlink+$gl_cv_macro_O_CLOEXEC in
  yes+*yes+yes)
    ;;
  yes+*)
    # Solaris 10 lacks O_CLOEXEC.
    # Solaris 9 has *at functions, but uniformly mishandles trailing
    # slash in all of them.
    REPLACE_OPENAT=1
    ;;
  *)
    HAVE_OPENAT=0
    ;;
  esac


     if test $HAVE_OPENAT = 0 || test $REPLACE_OPENAT = 1; then
  GL_COND_OBJ_OPENAT_TRUE=
  GL_COND_OBJ_OPENAT_FALSE='#'
else
  GL_COND_OBJ_OPENAT_TRUE='#'
  GL_COND_OBJ_OPENAT_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_OPENAT_TRUE}" && test -z "${GL_COND_OBJ_OPENAT_FALSE}"; then
    GL_COND_OBJ_OPENAT_TRUE='#'
    GL_COND_OBJ_OPENAT_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_OPENAT_TRUE"; then :



  :


fi


cat >>confdefs.h <<_ACEOF
#define GNULIB_OPENAT 1
_ACEOF










          GL_GNULIB_OPENAT=1





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






  for ac_func in opendir
do :
  ac_fn_c_check_func "$LINENO" "opendir" "ac_cv_func_opendir"
if test "x$ac_cv_func_opendir" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_OPENDIR 1
_ACEOF

fi
done

  if test $ac_cv_func_opendir = no; then
    HAVE_OPENDIR=0
  fi




  if test $ac_cv_func_fchdir = no; then
    HAVE_FCHDIR=0
  fi

    if test $HAVE_FCHDIR = 0; then
      if test $HAVE_OPENDIR = 1; then
        REPLACE_OPENDIR=1
      fi
    fi

      case $host_os,$HAVE_OPENDIR in
    os2*,1)
      REPLACE_OPENDIR=1;;
  esac


     if test $HAVE_OPENDIR = 0 || test $REPLACE_OPENDIR = 1; then
  GL_COND_OBJ_OPENDIR_TRUE=
  GL_COND_OBJ_OPENDIR_FALSE='#'
else
  GL_COND_OBJ_OPENDIR_TRUE='#'
  GL_COND_OBJ_OPENDIR_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_OPENDIR_TRUE}" && test -z "${GL_COND_OBJ_OPENDIR_FALSE}"; then
    GL_COND_OBJ_OPENDIR_TRUE='#'
    GL_COND_OBJ_OPENDIR_FALSE='#'
  fi










          GL_GNULIB_OPENDIR=1





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










  if test $ac_cv_func_pipe != yes; then
    HAVE_PIPE=0
  fi


     if test $HAVE_PIPE = 0; then
  GL_COND_OBJ_PIPE_TRUE=
  GL_COND_OBJ_PIPE_FALSE='#'
else
  GL_COND_OBJ_PIPE_TRUE='#'
  GL_COND_OBJ_PIPE_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_PIPE_TRUE}" && test -z "${GL_COND_OBJ_PIPE_FALSE}"; then
    GL_COND_OBJ_PIPE_TRUE='#'
    GL_COND_OBJ_PIPE_FALSE='#'
  fi










          GL_GNULIB_PIPE=1





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







  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_COND_OBJ_RAWMEMCHR_TRUE=
  GL_COND_OBJ_RAWMEMCHR_FALSE='#'
else
  GL_COND_OBJ_RAWMEMCHR_TRUE='#'
  GL_COND_OBJ_RAWMEMCHR_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_RAWMEMCHR_TRUE}" && test -z "${GL_COND_OBJ_RAWMEMCHR_FALSE}"; then
    GL_COND_OBJ_RAWMEMCHR_TRUE='#'
    GL_COND_OBJ_RAWMEMCHR_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_RAWMEMCHR_TRUE"; then :

    :

fi














          GL_GNULIB_RAWMEMCHR=1





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






  for ac_func in readdir
do :
  ac_fn_c_check_func "$LINENO" "readdir" "ac_cv_func_readdir"
if test "x$ac_cv_func_readdir" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_READDIR 1
_ACEOF

fi
done

  if test $ac_cv_func_readdir = no; then
    HAVE_READDIR=0
  fi


     if test $HAVE_READDIR = 0; then
  GL_COND_OBJ_READDIR_TRUE=
  GL_COND_OBJ_READDIR_FALSE='#'
else
  GL_COND_OBJ_READDIR_TRUE='#'
  GL_COND_OBJ_READDIR_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_READDIR_TRUE}" && test -z "${GL_COND_OBJ_READDIR_FALSE}"; then
    GL_COND_OBJ_READDIR_TRUE='#'
    GL_COND_OBJ_READDIR_FALSE='#'
  fi










          GL_GNULIB_READDIR=1





$as_echo "#define GNULIB_TEST_READDIR 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_trailing_slash+:} 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 or glibc systems.
            linux-* | linux | *-gnu* | gnu*)
              gl_cv_func_readlink_trailing_slash="guessing yes" ;;
            # Guess no on AIX or HP-UX.
            aix* | hpux*)
              gl_cv_func_readlink_trailing_slash="guessing no" ;;
            # If we don't know, obey --enable-cross-guesses.
            *)
              gl_cv_func_readlink_trailing_slash="$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_trailing_slash=yes
else
  gl_cv_func_readlink_trailing_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.link conftest.lnk2
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_readlink_trailing_slash" >&5
$as_echo "$gl_cv_func_readlink_trailing_slash" >&6; }
    case "$gl_cv_func_readlink_trailing_slash" 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

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether readlink truncates results correctly" >&5
$as_echo_n "checking whether readlink truncates results correctly... " >&6; }
if ${gl_cv_func_readlink_truncate+:} false; then :
  $as_echo_n "(cached) " >&6
else
  # We have readlink, so assume ln -s works.
       ln -s ab conftest.link
       if test "$cross_compiling" = yes; then :
  case "$host_os" in
            # Guess yes on Linux or glibc systems.
            linux-* | linux | *-gnu* | gnu*)
              gl_cv_func_readlink_truncate="guessing yes" ;;
            # Guess no on AIX or HP-UX.
            aix* | hpux*)
              gl_cv_func_readlink_truncate="guessing no" ;;
            # If we don't know, obey --enable-cross-guesses.
            *)
              gl_cv_func_readlink_truncate="$gl_cross_guess_normal" ;;
          esac

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

int
main ()
{
char c;
      return readlink ("conftest.link", &c, 1) != 1;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_readlink_truncate=yes
else
  gl_cv_func_readlink_truncate=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_truncate" >&5
$as_echo "$gl_cv_func_readlink_truncate" >&6; }
    case $gl_cv_func_readlink_truncate in
      *yes)
        if test "$gl_cv_decl_readlink_works" != yes; then
          REPLACE_READLINK=1
        fi
        ;;
      *)

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

        REPLACE_READLINK=1
        ;;
    esac
  fi


     if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then
  GL_COND_OBJ_READLINK_TRUE=
  GL_COND_OBJ_READLINK_FALSE='#'
else
  GL_COND_OBJ_READLINK_TRUE='#'
  GL_COND_OBJ_READLINK_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_READLINK_TRUE}" && test -z "${GL_COND_OBJ_READLINK_FALSE}"; then
    GL_COND_OBJ_READLINK_TRUE='#'
    GL_COND_OBJ_READLINK_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_READLINK_TRUE"; then :


  :


fi









          GL_GNULIB_READLINK=1





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






  if test $REPLACE_MALLOC_FOR_MALLOC_POSIX = 1; then
    REPLACE_REALLOC_FOR_REALLOC_POSIX=1
  fi

  if test $REPLACE_REALLOC_FOR_REALLOC_POSIX = 1; then








  gl_LIBOBJS="$gl_LIBOBJS realloc.$ac_objext"

  fi









          GL_GNULIB_REALLOC_POSIX=1





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








                { $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>


$gl_mda_defines

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_COND_OBJ_RENAME_TRUE=
  GL_COND_OBJ_RENAME_FALSE='#'
else
  GL_COND_OBJ_RENAME_TRUE='#'
  GL_COND_OBJ_RENAME_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_RENAME_TRUE}" && test -z "${GL_COND_OBJ_RENAME_FALSE}"; then
    GL_COND_OBJ_RENAME_TRUE='#'
    GL_COND_OBJ_RENAME_FALSE='#'
  fi










          GL_GNULIB_RENAME=1





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






  for ac_func in rewinddir
do :
  ac_fn_c_check_func "$LINENO" "rewinddir" "ac_cv_func_rewinddir"
if test "x$ac_cv_func_rewinddir" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_REWINDDIR 1
_ACEOF

fi
done

  if test $ac_cv_func_rewinddir = no; then
    HAVE_REWINDDIR=0
  fi


     if test $HAVE_REWINDDIR = 0; then
  GL_COND_OBJ_REWINDDIR_TRUE=
  GL_COND_OBJ_REWINDDIR_FALSE='#'
else
  GL_COND_OBJ_REWINDDIR_TRUE='#'
  GL_COND_OBJ_REWINDDIR_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_REWINDDIR_TRUE}" && test -z "${GL_COND_OBJ_REWINDDIR_FALSE}"; then
    GL_COND_OBJ_REWINDDIR_TRUE='#'
    GL_COND_OBJ_REWINDDIR_FALSE='#'
  fi










          GL_GNULIB_REWINDDIR=1





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






  { $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


$gl_mda_defines

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_COND_OBJ_RMDIR_TRUE=
  GL_COND_OBJ_RMDIR_FALSE='#'
else
  GL_COND_OBJ_RMDIR_TRUE='#'
  GL_COND_OBJ_RMDIR_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_RMDIR_TRUE}" && test -z "${GL_COND_OBJ_RMDIR_FALSE}"; then
    GL_COND_OBJ_RMDIR_TRUE='#'
    GL_COND_OBJ_RMDIR_FALSE='#'
  fi










          GL_GNULIB_RMDIR=1





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











  if test "$ac_cv_header_winsock2_h" = yes; then
    REPLACE_SELECT=1
  else

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether select supports a 0 argument" >&5
$as_echo_n "checking whether select supports a 0 argument... " >&6; }
if ${gl_cv_func_select_supports0+:} false; then :
  $as_echo_n "(cached) " >&6
else

        if test "$cross_compiling" = yes; then :

           case "$host_os" in
                       # Guess no on Interix.
             interix*) gl_cv_func_select_supports0="guessing no";;
                       # Guess yes otherwise.
             *)        gl_cv_func_select_supports0="guessing yes";;
           esac

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

#include <sys/types.h>
#include <sys/time.h>
#if HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
int main ()
{
  struct timeval timeout;
  timeout.tv_sec = 0;
  timeout.tv_usec = 5;
  return select (0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &timeout) < 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_select_supports0=yes
else
  gl_cv_func_select_supports0=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_select_supports0" >&5
$as_echo "$gl_cv_func_select_supports0" >&6; }
    case "$gl_cv_func_select_supports0" in
      *yes) ;;
      *) REPLACE_SELECT=1 ;;
    esac

        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether select detects invalid fds" >&5
$as_echo_n "checking whether select detects invalid fds... " >&6; }
if ${gl_cv_func_select_detects_ebadf+:} false; then :
  $as_echo_n "(cached) " >&6
else

        if test "$cross_compiling" = yes; then :

           case "$host_os" in
                             # Guess yes on Linux systems.
            linux-* | linux) gl_cv_func_select_detects_ebadf="guessing yes" ;;
                             # Guess yes on glibc systems.
            *-gnu* | gnu*)   gl_cv_func_select_detects_ebadf="guessing yes" ;;
                             # If we don't know, obey --enable-cross-guesses.
            *)               gl_cv_func_select_detects_ebadf="$gl_cross_guess_normal" ;;
           esac

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

#include <sys/types.h>
#include <sys/time.h>
#if HAVE_SYS_SELECT_H
# include <sys/select.h>
#endif
#include <unistd.h>
#include <errno.h>


$gl_mda_defines

int
main ()
{

  fd_set set;
  dup2(0, 16);
  FD_ZERO(&set);
  FD_SET(16, &set);
  close(16);
  struct timeval timeout;
  timeout.tv_sec = 0;
  timeout.tv_usec = 5;
  return select (17, &set, NULL, NULL, &timeout) != -1 || errno != EBADF;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_select_detects_ebadf=yes
else
  gl_cv_func_select_detects_ebadf=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_select_detects_ebadf" >&5
$as_echo "$gl_cv_func_select_detects_ebadf" >&6; }
    case $gl_cv_func_select_detects_ebadf in
      *yes) ;;
      *) REPLACE_SELECT=1 ;;
    esac
  fi

    LIB_SELECT="$LIBSOCKET"
  if test $REPLACE_SELECT = 1; then
    case "$host_os" in
      mingw*)
                                cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
int
main ()
{
  MsgWaitForMultipleObjects (0, NULL, 0, 0, 0);
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :

else
  LIB_SELECT="$LIB_SELECT -luser32"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
        ;;
    esac
  fi



     if test $REPLACE_SELECT = 1; then
  GL_COND_OBJ_SELECT_TRUE=
  GL_COND_OBJ_SELECT_FALSE='#'
else
  GL_COND_OBJ_SELECT_TRUE='#'
  GL_COND_OBJ_SELECT_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_SELECT_TRUE}" && test -z "${GL_COND_OBJ_SELECT_FALSE}"; then
    GL_COND_OBJ_SELECT_TRUE='#'
    GL_COND_OBJ_SELECT_FALSE='#'
  fi










          GL_GNULIB_SELECT=1





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





     if test $ac_cv_func_setenv = no; then
    HAVE_SETENV=0
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setenv validates arguments" >&5
$as_echo_n "checking whether setenv validates arguments... " >&6; }
if ${gl_cv_func_setenv_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_setenv_works="guessing yes" ;;
                        # Guess yes on musl systems.
         *-musl*)       gl_cv_func_setenv_works="guessing yes" ;;
                        # If we don't know, obey --enable-cross-guesses.
         *)             gl_cv_func_setenv_works="$gl_cross_guess_normal" ;;
       esac

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

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

int
main ()
{

       int result = 0;
       {
         if (setenv ("", "", 0) != -1)
           result |= 1;
         else if (errno != EINVAL)
           result |= 2;
       }
       {
         if (setenv ("a", "=", 1) != 0)
           result |= 4;
         else if (strcmp (getenv ("a"), "=") != 0)
           result |= 8;
       }
       return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_setenv_works=yes
else
  gl_cv_func_setenv_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_setenv_works" >&5
$as_echo "$gl_cv_func_setenv_works" >&6; }
    case "$gl_cv_func_setenv_works" in
      *yes) ;;
      *)
        REPLACE_SETENV=1
        ;;
    esac
  fi


     if test $HAVE_SETENV = 0 || test $REPLACE_SETENV = 1; then
  GL_COND_OBJ_SETENV_TRUE=
  GL_COND_OBJ_SETENV_FALSE='#'
else
  GL_COND_OBJ_SETENV_TRUE='#'
  GL_COND_OBJ_SETENV_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_SETENV_TRUE}" && test -z "${GL_COND_OBJ_SETENV_FALSE}"; then
    GL_COND_OBJ_SETENV_TRUE='#'
    GL_COND_OBJ_SETENV_FALSE='#'
  fi










          GL_GNULIB_SETENV=1





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








  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setlocale (LC_ALL, NULL) is multithread-safe" >&5
$as_echo_n "checking whether setlocale (LC_ALL, NULL) is multithread-safe... " >&6; }
if ${gl_cv_func_setlocale_null_all_mtsafe+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case "$host_os" in
       # Guess no on musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin.
       *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | openbsd* | aix* | haiku* | cygwin*)
         gl_cv_func_setlocale_null_all_mtsafe=no ;;
       # Guess yes on glibc, HP-UX, IRIX, Solaris, native Windows.
       *-gnu* | gnu* | hpux* | irix* | solaris* | mingw*)
         gl_cv_func_setlocale_null_all_mtsafe=yes ;;
       # If we don't know, obey --enable-cross-guesses.
       *)
         gl_cv_func_setlocale_null_all_mtsafe="$gl_cross_guess_normal" ;;
     esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_all_mtsafe" >&5
$as_echo "$gl_cv_func_setlocale_null_all_mtsafe" >&6; }
    case "$host_os" in
    mingw*) ;;
    *)
      if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
        gl_cv_func_setlocale_null_all_mtsafe="trivially yes"
      fi
      ;;
  esac
  case "$gl_cv_func_setlocale_null_all_mtsafe" in
    *yes) SETLOCALE_NULL_ALL_MTSAFE=1 ;;
    *)    SETLOCALE_NULL_ALL_MTSAFE=0 ;;
  esac

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


    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setlocale (category, NULL) is multithread-safe" >&5
$as_echo_n "checking whether setlocale (category, NULL) is multithread-safe... " >&6; }
if ${gl_cv_func_setlocale_null_one_mtsafe+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case "$host_os" in
       # Guess no on OpenBSD, AIX.
       openbsd* | aix*)
         gl_cv_func_setlocale_null_one_mtsafe=no ;;
       # Guess yes on glibc, musl libc, macOS, FreeBSD, NetBSD, HP-UX, IRIX, Solaris, Haiku, Cygwin, native Windows.
       *-gnu* | gnu* | *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | hpux* | irix* | solaris* | haiku* | cygwin* | mingw*)
         gl_cv_func_setlocale_null_one_mtsafe=yes ;;
       # If we don't know, obey --enable-cross-guesses.
       *)
         gl_cv_func_setlocale_null_one_mtsafe="$gl_cross_guess_normal" ;;
     esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_one_mtsafe" >&5
$as_echo "$gl_cv_func_setlocale_null_one_mtsafe" >&6; }
    case "$host_os" in
    mingw*) ;;
    *)
      if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
        gl_cv_func_setlocale_null_one_mtsafe="trivially yes"
      fi
      ;;
  esac
  case "$gl_cv_func_setlocale_null_one_mtsafe" in
    *yes) SETLOCALE_NULL_ONE_MTSAFE=1 ;;
    *)    SETLOCALE_NULL_ONE_MTSAFE=0 ;;
  esac

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


    if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then
    case "$host_os" in
      mingw*) LIB_SETLOCALE_NULL= ;;
      *)


  { $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
  case "$host_os" in
       cygwin*)
                                    gl_cv_have_weak="guessing no"
         ;;
       *)
         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
         ;;
     esac
          case " $LDFLAGS " in
       *" -static "*) gl_cv_have_weak=no ;;
     esac
                    case "$gl_cv_have_weak" in
       *yes)
         case "$host_os" in
           freebsd* | dragonfly* | midnightbsd*)
             : > conftest1.c
             $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1
             cat <<EOF > conftest2.c
#include <pthread.h>
#pragma weak pthread_mutexattr_gettype
int main ()
{
  return (pthread_mutexattr_gettype != NULL);
}
EOF
             $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \
               || gl_cv_have_weak=no
             rm -f conftest1.c libempty.so conftest2.c conftest
             ;;
         esac
         ;;
     esac

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

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

      ;;
  esac

        case "$gl_cv_have_weak" in
          *yes) LIB_SETLOCALE_NULL= ;;
          *)    LIB_SETLOCALE_NULL="$LIBPTHREAD" ;;
        esac
        ;;
    esac
  else
    LIB_SETLOCALE_NULL=
  fi



     if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then
  GL_COND_OBJ_SETLOCALE_LOCK_TRUE=
  GL_COND_OBJ_SETLOCALE_LOCK_FALSE='#'
else
  GL_COND_OBJ_SETLOCALE_LOCK_TRUE='#'
  GL_COND_OBJ_SETLOCALE_LOCK_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_SETLOCALE_LOCK_TRUE}" && test -z "${GL_COND_OBJ_SETLOCALE_LOCK_FALSE}"; then
    GL_COND_OBJ_SETLOCALE_LOCK_TRUE='#'
    GL_COND_OBJ_SETLOCALE_LOCK_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_SETLOCALE_LOCK_TRUE"; then :




  CFLAG_VISIBILITY=
  HAVE_VISIBILITY=0
  if test -n "$GCC"; then
                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5
$as_echo_n "checking whether the -Werror option is usable... " >&6; }
if ${gl_cv_cc_vis_werror+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_save_CFLAGS="$CFLAGS"
       CFLAGS="$CFLAGS -Werror"
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

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

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_vis_werror" >&5
$as_echo "$gl_cv_cc_vis_werror" >&6; }
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5
$as_echo_n "checking for simple visibility declarations... " >&6; }
if ${gl_cv_cc_visibility+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gl_save_CFLAGS="$CFLAGS"
       CFLAGS="$CFLAGS -fvisibility=hidden"
                                          if test $gl_cv_cc_vis_werror = yes; then
         CFLAGS="$CFLAGS -Werror"
       fi
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
extern __attribute__((__visibility__("hidden"))) int hiddenvar;
              extern __attribute__((__visibility__("default"))) int exportedvar;
              extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
              extern __attribute__((__visibility__("default"))) int exportedfunc (void);
              void dummyfunc (void);
              int hiddenvar;
              int exportedvar;
              int hiddenfunc (void) { return 51; }
              int exportedfunc (void) { return 1225736919; }
              void dummyfunc (void) {}

int
main ()
{

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

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_visibility" >&5
$as_echo "$gl_cv_cc_visibility" >&6; }
    if test $gl_cv_cc_visibility = yes; then
      CFLAG_VISIBILITY="-fvisibility=hidden"
      HAVE_VISIBILITY=1
    fi
  fi



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




fi









          GL_GNULIB_SETLOCALE_NULL=1





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





     if test "$ac_cv_header_winsock2_h" = yes; then
  GL_COND_OBJ_SETSOCKOPT_TRUE=
  GL_COND_OBJ_SETSOCKOPT_FALSE='#'
else
  GL_COND_OBJ_SETSOCKOPT_TRUE='#'
  GL_COND_OBJ_SETSOCKOPT_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_SETSOCKOPT_TRUE}" && test -z "${GL_COND_OBJ_SETSOCKOPT_FALSE}"; then
    GL_COND_OBJ_SETSOCKOPT_TRUE='#'
    GL_COND_OBJ_SETSOCKOPT_FALSE='#'
  fi










          GL_GNULIB_SETSOCKOPT=1





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












     if test "$ac_cv_header_winsock2_h" = yes; then
  GL_COND_OBJ_SOCKET_TRUE=
  GL_COND_OBJ_SOCKET_FALSE='#'
else
  GL_COND_OBJ_SOCKET_TRUE='#'
  GL_COND_OBJ_SOCKET_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_SOCKET_TRUE}" && test -z "${GL_COND_OBJ_SOCKET_FALSE}"; then
    GL_COND_OBJ_SOCKET_TRUE='#'
    GL_COND_OBJ_SOCKET_FALSE='#'
  fi

  # When this module is used, sockets may actually occur as file descriptors,
  # hence it is worth warning if the modules 'close' and 'ioctl' are not used.







  if test "$ac_cv_header_winsock2_h" = yes; then
    UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=1
    SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=1
  fi









          GL_GNULIB_SOCKET=1





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





     ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "
/* <sys/types.h> is not needed according to POSIX, but the
   <sys/socket.h> in i386-unknown-freebsd4.10 and
   powerpc-apple-darwin5.5 required it. */
#include <sys/types.h>
#if HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#elif HAVE_WS2TCPIP_H
# include <ws2tcpip.h>
#endif

"
if test "x$ac_cv_type_socklen_t" = xyes; then :

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t equivalent" >&5
$as_echo_n "checking for socklen_t equivalent... " >&6; }
if ${gl_cv_socklen_t_equiv+:} false; then :
  $as_echo_n "(cached) " >&6
else
  # Systems have either "struct sockaddr *" or
         # "void *" as the second argument to getpeername
         gl_cv_socklen_t_equiv=
         for arg2 in "struct sockaddr" void; do
           for t in int size_t "unsigned int" "long int" "unsigned long int"; do
             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
                   #include <sys/socket.h>

                   int getpeername (int, $arg2 *, $t *);
int
main ()
{
$t len;
                  getpeername (0, 0, &len);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_socklen_t_equiv="$t"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
             test "$gl_cv_socklen_t_equiv" != "" && break
           done
           test "$gl_cv_socklen_t_equiv" != "" && break
         done
         if test "$gl_cv_socklen_t_equiv" = ""; then
           as_fn_error $? "Cannot find a type to use in place of socklen_t" "$LINENO" 5
         fi

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

cat >>confdefs.h <<_ACEOF
#define socklen_t $gl_cv_socklen_t_equiv
_ACEOF

fi


  { $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





  case "$host_os" in
    mingw*)
                        ;;
    *)
                        { $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_COND_OBJ_STAT_TRUE=
  GL_COND_OBJ_STAT_FALSE='#'
else
  GL_COND_OBJ_STAT_TRUE='#'
  GL_COND_OBJ_STAT_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_STAT_TRUE}" && test -z "${GL_COND_OBJ_STAT_FALSE}"; then
    GL_COND_OBJ_STAT_TRUE='#'
    GL_COND_OBJ_STAT_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_STAT_TRUE"; then :

    case "$host_os" in
      mingw*)








  gl_LIBOBJS="$gl_LIBOBJS stat-w32.$ac_objext"

        ;;
    esac



  :


fi









          GL_GNULIB_STAT=1





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







  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



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working stdalign.h" >&5
$as_echo_n "checking for working stdalign.h... " >&6; }
if ${gl_cv_header_working_stdalign_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdint.h>
            #include <stdalign.h>
            #include <stddef.h>

            /* Test that alignof yields a result consistent with offsetof.
               This catches GCC bug 52023
               <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>.  */
            #ifdef __cplusplus
               template <class t> struct alignof_helper { char a; t b; };
            # define ao(type) offsetof (alignof_helper<type>, b)
            #else
            # define ao(type) offsetof (struct { char a; type b; }, b)
            #endif
            char test_double[ao (double) % _Alignof (double) == 0 ? 1 : -1];
            char test_long[ao (long int) % _Alignof (long int) == 0 ? 1 : -1];
            char test_alignof[alignof (double) == _Alignof (double) ? 1 : -1];

            /* Test _Alignas only on platforms where gnulib can help.  */
            #if \
                ((defined __cplusplus && 201103 <= __cplusplus) \
                 || (__TINYC__ && defined __attribute__) \
                 || (defined __APPLE__ && defined __MACH__ \
                     ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \
                     : __GNUC__) \
                 || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \
                 || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__ \
                 || 1300 <= _MSC_VER)
              struct alignas_test { char c; char alignas (8) alignas_8; };
              char test_alignas[offsetof (struct alignas_test, alignas_8) == 8
                                ? 1 : -1];
            #endif

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_header_working_stdalign_h=yes
else
  gl_cv_header_working_stdalign_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_working_stdalign_h" >&5
$as_echo "$gl_cv_header_working_stdalign_h" >&6; }

  if test $gl_cv_header_working_stdalign_h = yes; then
    GL_GENERATE_STDALIGN_H=false
  else
    GL_GENERATE_STDALIGN_H=true
  fi





  case "$GL_GENERATE_STDALIGN_H" in
    false) STDALIGN_H='' ;;
    true)
                  if test -z "$STDALIGN_H"; then
        STDALIGN_H="${gl_source_base_prefix}stdalign.h"
      fi
      ;;
    *) echo "*** GL_GENERATE_STDALIGN_H is not set correctly" 1>&2; exit 1 ;;
  esac


     if $GL_GENERATE_STDALIGN_H; then
  GL_GENERATE_STDALIGN_H_TRUE=
  GL_GENERATE_STDALIGN_H_FALSE='#'
else
  GL_GENERATE_STDALIGN_H_TRUE='#'
  GL_GENERATE_STDALIGN_H_FALSE=
fi
:
    if test -z "${GL_GENERATE_STDALIGN_H_TRUE}" && test -z "${GL_GENERATE_STDALIGN_H_FALSE}"; then
    GL_GENERATE_STDALIGN_H_TRUE='#'
    GL_GENERATE_STDALIGN_H_FALSE='#'
  fi










          if test "$ac_cv_header_stdbool_h" = yes; then
    case "$host_os" in
      solaris*)
        if test -z "$GCC"; then
          GL_GENERATE_STDBOOL_H=true
        else
          GL_GENERATE_STDBOOL_H=false
        fi
        ;;
      *)
        GL_GENERATE_STDBOOL_H=false
        ;;
    esac
  else
    GL_GENERATE_STDBOOL_H=true
  fi

  if test "$ac_cv_type__Bool" = yes; then
    HAVE__BOOL=1
  else
    HAVE__BOOL=0
  fi






  case "$GL_GENERATE_STDBOOL_H" in
    false) STDBOOL_H='' ;;
    true)
                  if test -z "$STDBOOL_H"; then
        STDBOOL_H="${gl_source_base_prefix}stdbool.h"
      fi
      ;;
    *) echo "*** GL_GENERATE_STDBOOL_H is not set correctly" 1>&2; exit 1 ;;
  esac


     if $GL_GENERATE_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 -z "${GL_GENERATE_STDBOOL_H_TRUE}" && test -z "${GL_GENERATE_STDBOOL_H_FALSE}"; then
    GL_GENERATE_STDBOOL_H_TRUE='#'
    GL_GENERATE_STDBOOL_H_FALSE='#'
  fi
















  case "$GL_GENERATE_STDDEF_H" in
    false) STDDEF_H='' ;;
    true)
                  if test -z "$STDDEF_H"; then
        STDDEF_H="${gl_source_base_prefix}stddef.h"
      fi
      ;;
    *) echo "*** GL_GENERATE_STDDEF_H is not set correctly" 1>&2; exit 1 ;;
  esac


     if $GL_GENERATE_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 -z "${GL_GENERATE_STDDEF_H_TRUE}" && test -z "${GL_GENERATE_STDDEF_H_FALSE}"; then
    GL_GENERATE_STDDEF_H_TRUE='#'
    GL_GENERATE_STDDEF_H_FALSE='#'
  fi











  case "$GL_GENERATE_STDINT_H" in
    false) STDINT_H='' ;;
    true)
                  if test -z "$STDINT_H"; then
        STDINT_H="${gl_source_base_prefix}stdint.h"
      fi
      ;;
    *) echo "*** GL_GENERATE_STDINT_H is not set correctly" 1>&2; exit 1 ;;
  esac


     if $GL_GENERATE_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
:
    if test -z "${GL_GENERATE_STDINT_H_TRUE}" && test -z "${GL_GENERATE_STDINT_H_FALSE}"; then
    GL_GENERATE_STDINT_H_TRUE='#'
    GL_GENERATE_STDINT_H_FALSE='#'
  fi









  case "$GL_GENERATE_LIMITS_H" in
    false) LIMITS_H='' ;;
    true)
                  if test -z "$LIMITS_H"; then
        LIMITS_H="${gl_source_base_prefix}limits.h"
      fi
      ;;
    *) echo "*** GL_GENERATE_LIMITS_H is not set correctly" 1>&2; exit 1 ;;
  esac


     if $GL_GENERATE_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 -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then
    GL_GENERATE_LIMITS_H_TRUE='#'
    GL_GENERATE_LIMITS_H_FALSE='#'
  fi














     if test $REPLACE_STDIO_READ_FUNCS = 1; then
  GL_COND_OBJ_STDIO_READ_TRUE=
  GL_COND_OBJ_STDIO_READ_FALSE='#'
else
  GL_COND_OBJ_STDIO_READ_TRUE='#'
  GL_COND_OBJ_STDIO_READ_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_STDIO_READ_TRUE}" && test -z "${GL_COND_OBJ_STDIO_READ_FALSE}"; then
    GL_COND_OBJ_STDIO_READ_TRUE='#'
    GL_COND_OBJ_STDIO_READ_FALSE='#'
  fi


     if test $REPLACE_STDIO_WRITE_FUNCS = 1; then
  GL_COND_OBJ_STDIO_WRITE_TRUE=
  GL_COND_OBJ_STDIO_WRITE_FALSE='#'
else
  GL_COND_OBJ_STDIO_WRITE_TRUE='#'
  GL_COND_OBJ_STDIO_WRITE_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_STDIO_WRITE_TRUE}" && test -z "${GL_COND_OBJ_STDIO_WRITE_FALSE}"; then
    GL_COND_OBJ_STDIO_WRITE_TRUE='#'
    GL_COND_OBJ_STDIO_WRITE_FALSE='#'
  fi










          GL_GNULIB_FSCANF=1





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





cat >>confdefs.h <<_ACEOF
#define GNULIB_FSCANF 1
_ACEOF











          GL_GNULIB_SCANF=1





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





cat >>confdefs.h <<_ACEOF
#define GNULIB_SCANF 1
_ACEOF











          GL_GNULIB_FGETC=1





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












          GL_GNULIB_GETC=1





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












          GL_GNULIB_GETCHAR=1





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












          GL_GNULIB_FGETS=1





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












          GL_GNULIB_FREAD=1





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












          GL_GNULIB_FPRINTF=1





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












          GL_GNULIB_PRINTF=1





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












          GL_GNULIB_VFPRINTF=1





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












          GL_GNULIB_VPRINTF=1





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












          GL_GNULIB_FPUTC=1





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












          GL_GNULIB_PUTC=1





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












          GL_GNULIB_PUTCHAR=1





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












          GL_GNULIB_FPUTS=1





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












          GL_GNULIB_PUTS=1





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












          GL_GNULIB_FWRITE=1





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














  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_COND_OBJ_STRCHRNUL_TRUE=
  GL_COND_OBJ_STRCHRNUL_FALSE='#'
else
  GL_COND_OBJ_STRCHRNUL_TRUE='#'
  GL_COND_OBJ_STRCHRNUL_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_STRCHRNUL_TRUE}" && test -z "${GL_COND_OBJ_STRCHRNUL_FALSE}"; then
    GL_COND_OBJ_STRCHRNUL_TRUE='#'
    GL_COND_OBJ_STRCHRNUL_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_STRCHRNUL_TRUE"; then :

    :

fi














          GL_GNULIB_STRCHRNUL=1





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






  if test $gl_cv_func_malloc_posix != yes; then
    REPLACE_STRDUP=1
  fi

  if test $ac_cv_have_decl_strdup = no; then
    HAVE_DECL_STRDUP=0
  fi


     if test $REPLACE_STRDUP = 1; then
  GL_COND_OBJ_STRDUP_TRUE=
  GL_COND_OBJ_STRDUP_FALSE='#'
else
  GL_COND_OBJ_STRDUP_TRUE='#'
  GL_COND_OBJ_STRDUP_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_STRDUP_TRUE}" && test -z "${GL_COND_OBJ_STRDUP_FALSE}"; then
    GL_COND_OBJ_STRDUP_TRUE='#'
    GL_COND_OBJ_STRDUP_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_STRDUP_TRUE"; then :

    :

fi














          GL_GNULIB_STRDUP=1





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










  if test "$GL_GENERATE_ERRNO_H:$REPLACE_STRERROR_0" = false: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_COND_OBJ_STRERROR_TRUE=
  GL_COND_OBJ_STRERROR_FALSE='#'
else
  GL_COND_OBJ_STRERROR_TRUE='#'
  GL_COND_OBJ_STRERROR_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_STRERROR_TRUE}" && test -z "${GL_COND_OBJ_STRERROR_FALSE}"; then
    GL_COND_OBJ_STRERROR_TRUE='#'
    GL_COND_OBJ_STRERROR_FALSE='#'
  fi



cat >>confdefs.h <<_ACEOF
#define GNULIB_STRERROR 1
_ACEOF
















          GL_GNULIB_STRERROR=1





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






     if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then
  GL_COND_OBJ_STRERROR_OVERRIDE_TRUE=
  GL_COND_OBJ_STRERROR_OVERRIDE_FALSE='#'
else
  GL_COND_OBJ_STRERROR_OVERRIDE_TRUE='#'
  GL_COND_OBJ_STRERROR_OVERRIDE_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_STRERROR_OVERRIDE_TRUE}" && test -z "${GL_COND_OBJ_STRERROR_OVERRIDE_FALSE}"; then
    GL_COND_OBJ_STRERROR_OVERRIDE_TRUE='#'
    GL_COND_OBJ_STRERROR_OVERRIDE_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_STRERROR_OVERRIDE_TRUE"; then :





  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





  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 "$GL_GENERATE_ERRNO_H:$REPLACE_STRERROR_0" = false: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














          GL_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



























  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_COND_OBJ_STRNLEN_TRUE=
  GL_COND_OBJ_STRNLEN_FALSE='#'
else
  GL_COND_OBJ_STRNLEN_TRUE='#'
  GL_COND_OBJ_STRNLEN_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_STRNLEN_TRUE}" && test -z "${GL_COND_OBJ_STRNLEN_FALSE}"; then
    GL_COND_OBJ_STRNLEN_TRUE='#'
    GL_COND_OBJ_STRNLEN_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_STRNLEN_TRUE"; then :

    :

fi














          GL_GNULIB_STRNLEN=1





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





  if test $REPLACE_STRSTR = 0; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strstr works in linear time" >&5
$as_echo_n "checking whether strstr works in linear time... " >&6; }
if ${gl_cv_func_strstr_linear+:} 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 <features.h>
#ifdef __GNU_LIBRARY__
 #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \
     && !(defined __i386__ || defined __x86_64__) \
     && !defined __UCLIBC__
  Lucky user
 #endif
#endif
#ifdef __CYGWIN__
 #include <cygwin/version.h>
 #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7)
  Lucky user
 #endif
#endif

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


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

#ifdef __MVS__
/* z/OS does not deliver signals while strstr() is running (thanks to
   restrictions on its LE runtime), which prevents us from limiting the
   running time of this test.  */
# error "This test does not work properly on z/OS"
#endif
#include <signal.h> /* for signal */
#include <string.h> /* for strstr */
#include <stdlib.h> /* for malloc */
#include <unistd.h> /* for alarm */
static void quit (int sig) { _exit (sig + 128); }

int
main ()
{

    int result = 0;
    size_t m = 1000000;
    char *haystack = (char *) malloc (2 * m + 2);
    char *needle = (char *) malloc (m + 2);
    /* Failure to compile this test due to missing alarm is okay,
       since all such platforms (mingw) also have quadratic strstr.  */
    signal (SIGALRM, quit);
    alarm (5);
    /* Check for quadratic performance.  */
    if (haystack && needle)
      {
        memset (haystack, 'A', 2 * m);
        haystack[2 * m] = 'B';
        haystack[2 * m + 1] = 0;
        memset (needle, 'A', m);
        needle[m] = 'B';
        needle[m + 1] = 0;
        if (!strstr (haystack, needle))
          result |= 1;
      }
    /* Free allocated memory, in case some sanitizer is watching.  */
    free (haystack);
    free (needle);
    return result;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_strstr_linear=yes
else
  gl_cv_func_strstr_linear=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_strstr_linear" >&5
$as_echo "$gl_cv_func_strstr_linear" >&6; }
    case "$gl_cv_func_strstr_linear" in
      *yes) ;;
      *)
        REPLACE_STRSTR=1
        ;;
    esac
  fi

  if test $REPLACE_STRSTR = 1; then








  gl_LIBOBJS="$gl_LIBOBJS strstr.$ac_objext"

  fi



  if test $REPLACE_MEMCHR = 1; then
    REPLACE_STRSTR=1
  else
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strstr works" >&5
$as_echo_n "checking whether strstr works... " >&6; }
if ${gl_cv_func_strstr_works_always+:} 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 <string.h> /* for __GNU_LIBRARY__ */
#ifdef __GNU_LIBRARY__
 #include <features.h>
 #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \
     || defined __UCLIBC__
  Lucky user
 #endif
#elif defined __CYGWIN__
 #include <cygwin/version.h>
 #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7)
  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_strstr_works_always="guessing yes"
else
  gl_cv_func_strstr_works_always="$gl_cross_guess_normal"
fi
rm -f conftest*


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

#include <string.h> /* for __GNU_LIBRARY__, strstr */
#ifdef __GNU_LIBRARY__
 #include <features.h>
 #if __GLIBC__ == 2 && __GLIBC_MINOR__ == 28
  Unlucky user
 #endif
#endif
#define P "_EF_BF_BD"
#define HAYSTACK "F_BD_CE_BD" P P P P "_C3_88_20" P P P "_C3_A7_20" P
#define NEEDLE P P P P P

int
main ()
{
return !!strstr (HAYSTACK, NEEDLE);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_strstr_works_always=yes
else
  gl_cv_func_strstr_works_always=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_strstr_works_always" >&5
$as_echo "$gl_cv_func_strstr_works_always" >&6; }
    case "$gl_cv_func_strstr_works_always" in
      *yes) ;;
      *)
        REPLACE_STRSTR=1
        ;;
    esac
  fi

  if test $REPLACE_STRSTR = 1; then








  gl_LIBOBJS="$gl_LIBOBJS strstr.$ac_objext"

  fi














          GL_GNULIB_STRSTR=1





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







     for ac_func in strtok_r
do :
  ac_fn_c_check_func "$LINENO" "strtok_r" "ac_cv_func_strtok_r"
if test "x$ac_cv_func_strtok_r" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOK_R 1
_ACEOF

fi
done

  if test $ac_cv_func_strtok_r = yes; then
    HAVE_STRTOK_R=1
                        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strtok_r works" >&5
$as_echo_n "checking whether strtok_r works... " >&6; }
if ${gl_cv_func_strtok_r_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  case "$host_os" in
                           # Guess no on glibc systems.
            *-gnu* | gnu*) gl_cv_func_strtok_r_works="guessing no" ;;
                           # Guess yes on native Windows.
            mingw*)        gl_cv_func_strtok_r_works="guessing yes" ;;
            *)             gl_cv_func_strtok_r_works="guessing yes" ;;
          esac

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

              #ifndef __OPTIMIZE__
              # define __OPTIMIZE__ 1
              #endif
              #undef __OPTIMIZE_SIZE__
              #undef __NO_INLINE__
              #include <stdlib.h>
              #include <string.h>

int
main ()
{
static const char dummy[] = "\177\01a";
              char delimiters[] = "xxxxxxxx";
              char *save_ptr = (char *) dummy;
              strtok_r (delimiters, "x", &save_ptr);
              strtok_r (NULL, "x", &save_ptr);
              return 0;

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gl_cv_func_strtok_r_works=yes
else
  gl_cv_func_strtok_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_strtok_r_works" >&5
$as_echo "$gl_cv_func_strtok_r_works" >&6; }
    case "$gl_cv_func_strtok_r_works" in
      *no)
                                UNDEFINE_STRTOK_R=1
        ;;
    esac
  else
    HAVE_STRTOK_R=0
  fi

  if test $ac_cv_have_decl_strtok_r = no; then
    HAVE_DECL_STRTOK_R=0
  fi


     if test $HAVE_STRTOK_R = 0 || test $REPLACE_STRTOK_R = 1; then
  GL_COND_OBJ_STRTOK_R_TRUE=
  GL_COND_OBJ_STRTOK_R_FALSE='#'
else
  GL_COND_OBJ_STRTOK_R_TRUE='#'
  GL_COND_OBJ_STRTOK_R_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_STRTOK_R_TRUE}" && test -z "${GL_COND_OBJ_STRTOK_R_FALSE}"; then
    GL_COND_OBJ_STRTOK_R_TRUE='#'
    GL_COND_OBJ_STRTOK_R_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_STRTOK_R_TRUE"; then :


  :


fi














          GL_GNULIB_STRTOK_R=1





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





























































  :




cat >>confdefs.h <<_ACEOF
#define GNULIB_TEMPNAME 1
_ACEOF
















      ac_fn_c_check_decl "$LINENO" "localtime_r" "ac_cv_have_decl_localtime_r" "/* mingw's <time.h> provides the functions asctime_r, ctime_r,
         gmtime_r, localtime_r only if <unistd.h> or <pthread.h> has
         been included before.  */
      #if defined __MINGW32__
      # include <unistd.h>
      #endif
      #include <time.h>

"
if test "x$ac_cv_have_decl_localtime_r" = xyes; then :
  ac_have_decl=1
else
  ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_LOCALTIME_R $ac_have_decl
_ACEOF

  if test $ac_cv_have_decl_localtime_r = no; then
    HAVE_DECL_LOCALTIME_R=0
  fi


  if test $ac_cv_func_localtime_r = yes; then
    HAVE_LOCALTIME_R=1
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether localtime_r is compatible with its POSIX signature" >&5
$as_echo_n "checking whether localtime_r is compatible with its POSIX signature... " >&6; }
if ${gl_cv_time_r_posix+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* mingw's <time.h> provides the functions asctime_r, ctime_r,
                 gmtime_r, localtime_r only if <unistd.h> or <pthread.h> has
                 been included before.  */
              #if defined __MINGW32__
              # include <unistd.h>
              #endif
              #include <time.h>

int
main ()
{
/* We don't need to append 'restrict's to the argument types,
                 even though the POSIX signature has the 'restrict's,
                 since C99 says they can't affect type compatibility.  */
              struct tm * (*ptr) (time_t const *, struct tm *) = localtime_r;
              if (ptr) return 0;
              /* Check the return type is a pointer.
                 On HP-UX 10 it is 'int'.  */
              *localtime_r (0, 0);
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  gl_cv_time_r_posix=yes
else
  gl_cv_time_r_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_time_r_posix" >&5
$as_echo "$gl_cv_time_r_posix" >&6; }
    if test $gl_cv_time_r_posix = yes; then
      REPLACE_LOCALTIME_R=0
    else
      REPLACE_LOCALTIME_R=1
    fi
  else
    HAVE_LOCALTIME_R=0
                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether localtime_r exists as an inline function" >&5
$as_echo_n "checking whether localtime_r exists as an inline function... " >&6; }
if ${gl_cv_func_localtime_r_inline+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* mingw's <time.h> provides the functions asctime_r, ctime_r,
                 gmtime_r, localtime_r only if <unistd.h> or <pthread.h> has
                 been included before.  */
              #if defined __MINGW32__
              # include <unistd.h>
              #endif
              #include <time.h>

int
main ()
{
time_t a;
              struct tm r;
              localtime_r (&a, &r);

  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_localtime_r_inline=yes
else
  gl_cv_func_localtime_r_inline=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_localtime_r_inline" >&5
$as_echo "$gl_cv_func_localtime_r_inline" >&6; }
    if test $gl_cv_func_localtime_r_inline = yes; then
      REPLACE_LOCALTIME_R=1
    fi
  fi


     if test $HAVE_LOCALTIME_R = 0 || test $REPLACE_LOCALTIME_R = 1; then
  GL_COND_OBJ_TIME_R_TRUE=
  GL_COND_OBJ_TIME_R_FALSE='#'
else
  GL_COND_OBJ_TIME_R_TRUE='#'
  GL_COND_OBJ_TIME_R_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_TIME_R_TRUE}" && test -z "${GL_COND_OBJ_TIME_R_FALSE}"; then
    GL_COND_OBJ_TIME_R_TRUE='#'
    GL_COND_OBJ_TIME_R_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_TIME_R_TRUE"; then :


  :


fi









          GL_GNULIB_TIME_R=1





$as_echo "#define GNULIB_TEST_TIME_R 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;


$gl_mda_defines

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_COND_OBJ_UNSETENV_TRUE=
  GL_COND_OBJ_UNSETENV_FALSE='#'
else
  GL_COND_OBJ_UNSETENV_TRUE='#'
  GL_COND_OBJ_UNSETENV_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_UNSETENV_TRUE}" && test -z "${GL_COND_OBJ_UNSETENV_FALSE}"; then
    GL_COND_OBJ_UNSETENV_TRUE='#'
    GL_COND_OBJ_UNSETENV_FALSE='#'
  fi

  if test -z "$GL_COND_OBJ_UNSETENV_TRUE"; then :






fi









          GL_GNULIB_UNSETENV=1





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




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for variable-length arrays" >&5
$as_echo_n "checking for variable-length arrays... " >&6; }
if ${ac_cv_c_vararrays+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __STDC_NO_VLA__
        defined
        #endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "defined" >/dev/null 2>&1; then :
  ac_cv_c_vararrays='no: __STDC_NO_VLA__ is defined'
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* Test for VLA support.  This test is partly inspired
                  from examples in the C standard.  Use at least two VLA
                  functions to detect the GCC 3.4.3 bug described in:
                  https://lists.gnu.org/archive/html/bug-gnulib/2014-08/msg00014.html
                  */
               #ifdef __STDC_NO_VLA__
                syntax error;
               #else
                 extern int n;
                 int B[100];
                 int fvla (int m, int C[m][m]);

                 int
                 simple (int count, int all[static count])
                 {
                   return all[count - 1];
                 }

                 int
                 fvla (int m, int C[m][m])
                 {
                   typedef int VLA[m][m];
                   VLA x;
                   int D[m];
                   static int (*q)[m] = &B;
                   int (*s)[n] = q;
                   return C && &x[0][0] == &D[0] && &D[0] == s[0];
                 }
               #endif

int
main ()
{

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

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

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

  elif test "$ac_cv_c_vararrays" = no; then

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

  fi






















     if case "$host_os" in mingw*) true;; *) false;; esac; then
  GL_COND_OBJ_WINDOWS_MUTEX_TRUE=
  GL_COND_OBJ_WINDOWS_MUTEX_FALSE='#'
else
  GL_COND_OBJ_WINDOWS_MUTEX_TRUE='#'
  GL_COND_OBJ_WINDOWS_MUTEX_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_WINDOWS_MUTEX_TRUE}" && test -z "${GL_COND_OBJ_WINDOWS_MUTEX_FALSE}"; then
    GL_COND_OBJ_WINDOWS_MUTEX_TRUE='#'
    GL_COND_OBJ_WINDOWS_MUTEX_FALSE='#'
  fi



     if case "$host_os" in mingw*) true;; *) false;; esac; then
  GL_COND_OBJ_WINDOWS_ONCE_TRUE=
  GL_COND_OBJ_WINDOWS_ONCE_FALSE='#'
else
  GL_COND_OBJ_WINDOWS_ONCE_TRUE='#'
  GL_COND_OBJ_WINDOWS_ONCE_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_WINDOWS_ONCE_TRUE}" && test -z "${GL_COND_OBJ_WINDOWS_ONCE_FALSE}"; then
    GL_COND_OBJ_WINDOWS_ONCE_TRUE='#'
    GL_COND_OBJ_WINDOWS_ONCE_FALSE='#'
  fi



     if case "$host_os" in mingw*) true;; *) false;; esac; then
  GL_COND_OBJ_WINDOWS_RECMUTEX_TRUE=
  GL_COND_OBJ_WINDOWS_RECMUTEX_FALSE='#'
else
  GL_COND_OBJ_WINDOWS_RECMUTEX_TRUE='#'
  GL_COND_OBJ_WINDOWS_RECMUTEX_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_WINDOWS_RECMUTEX_TRUE}" && test -z "${GL_COND_OBJ_WINDOWS_RECMUTEX_FALSE}"; then
    GL_COND_OBJ_WINDOWS_RECMUTEX_TRUE='#'
    GL_COND_OBJ_WINDOWS_RECMUTEX_FALSE='#'
  fi



     if case "$host_os" in mingw*) true;; *) false;; esac; then
  GL_COND_OBJ_WINDOWS_RWLOCK_TRUE=
  GL_COND_OBJ_WINDOWS_RWLOCK_FALSE='#'
else
  GL_COND_OBJ_WINDOWS_RWLOCK_TRUE='#'
  GL_COND_OBJ_WINDOWS_RWLOCK_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_WINDOWS_RWLOCK_TRUE}" && test -z "${GL_COND_OBJ_WINDOWS_RWLOCK_FALSE}"; then
    GL_COND_OBJ_WINDOWS_RWLOCK_TRUE='#'
    GL_COND_OBJ_WINDOWS_RWLOCK_FALSE='#'
  fi



      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wmemchr" >&5
$as_echo_n "checking for wmemchr... " >&6; }
if ${gl_cv_func_wmemchr+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wchar.h>

int
main ()
{
return ! wmemchr ((const wchar_t *) 0, (wchar_t) ' ', 0);
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gl_cv_func_wmemchr=yes
else
  gl_cv_func_wmemchr=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_wmemchr" >&5
$as_echo "$gl_cv_func_wmemchr" >&6; }
  if test $gl_cv_func_wmemchr = no; then
    HAVE_WMEMCHR=0
  fi


     if test $HAVE_WMEMCHR = 0; then
  GL_COND_OBJ_WMEMCHR_TRUE=
  GL_COND_OBJ_WMEMCHR_FALSE='#'
else
  GL_COND_OBJ_WMEMCHR_TRUE='#'
  GL_COND_OBJ_WMEMCHR_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_WMEMCHR_TRUE}" && test -z "${GL_COND_OBJ_WMEMCHR_FALSE}"; then
    GL_COND_OBJ_WMEMCHR_TRUE='#'
    GL_COND_OBJ_WMEMCHR_FALSE='#'
  fi















          GL_GNULIB_WMEMCHR=1





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











  if test $ac_cv_func_wmempcpy = no; then
    HAVE_WMEMPCPY=0
  fi


     if test $HAVE_WMEMPCPY = 0; then
  GL_COND_OBJ_WMEMPCPY_TRUE=
  GL_COND_OBJ_WMEMPCPY_FALSE='#'
else
  GL_COND_OBJ_WMEMPCPY_TRUE='#'
  GL_COND_OBJ_WMEMPCPY_FALSE=
fi
:
    if test -z "${GL_COND_OBJ_WMEMPCPY_TRUE}" && test -z "${GL_COND_OBJ_WMEMPCPY_FALSE}"; then
    GL_COND_OBJ_WMEMPCPY_TRUE='#'
    GL_COND_OBJ_WMEMPCPY_FALSE='#'
  fi















          GL_GNULIB_WMEMPCPY=1





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



  # End of code from modules











  gltests_libdeps=
  gltests_ltlibdeps=












  gl_source_base='tests'
  gl_source_base_prefix=
  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












  LIBGNU_LIBDEPS="$gl_libdeps"

  LIBGNU_LTLIBDEPS="$gl_ltlibdeps"



am__api_version='1.15'

# 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"

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

DEPDIR="${am__leading_dot}deps"

ac_config_commands="$ac_config_commands depfiles"


am_make=${MAKE-make}
cat > confinc << 'END'
am__doit:
	@echo this is the am__doit target
.PHONY: am__doit
END
# If we don't find an include directive, just comment out the code.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
$as_echo_n "checking for style of include used by $am_make... " >&6; }
am__include="#"
am__quote=
_am_result=none
# First try GNU make style include.
echo "include confinc" > confmf
# Ignore all kinds of additional output from 'make'.
case `$am_make -s -f confmf 2> /dev/null` in #(
*the\ am__doit\ target*)
  am__include=include
  am__quote=
  _am_result=GNU
  ;;
esac
# Now try BSD make style include.
if test "$am__include" = "#"; then
   echo '.include "confinc"' > confmf
   case `$am_make -s -f confmf 2> /dev/null` in #(
   *the\ am__doit\ target*)
     am__include=.include
     am__quote="\""
     _am_result=BSD
     ;;
   esac
fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
$as_echo "$_am_result" >&6; }
rm -f confinc confmf

# 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


# 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='libgnu'
 VERSION='UNUSED-VERSION'


# 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:
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
# <http://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 -'





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



# 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: <http://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='\'


# --------------------- #
# Checks for programs.  #
# --------------------- #


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
$as_echo_n "checking whether ln -s works... " >&6; }
LN_S=$as_ln_s
if test "$LN_S" = "ln -s"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
$as_echo "no, using $LN_S" >&6; }
fi

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


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=""
  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


# ---------------------- #
# Checks for libraries.  #
# ---------------------- #

ac_config_files="$ac_config_files Makefile.gnulib.inc Makefile import/Makefile"

ac_config_commands="$ac_config_commands default"

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


if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
  as_fn_error $? "conditional \"MAINTAINER_MODE\" 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



    gl_libobjs=
    gl_ltlibobjs=
    gl_libobjdeps=
    if test -n "$gl_LIBOBJS"; then
      # Remove the extension.
      sed_drop_objext='s/\.o$//;s/\.obj$//'
      sed_dirname1='s,//*,/,g'
      sed_dirname2='s,\(.\)/$,\1,'
      sed_dirname3='s,^[^/]*$,.,'
      sed_dirname4='s,\(.\)/[^/]*$,\1,'
      sed_basename1='s,.*/,,'
      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"
        i_dir=`echo "$i" | sed -e "$sed_dirname1" -e "$sed_dirname2" -e "$sed_dirname3" -e "$sed_dirname4"`
        i_base=`echo "$i" | sed -e "$sed_basename1"`
        gl_libobjdeps="$gl_libobjdeps $i_dir/\$(DEPDIR)/$i_base.Po"
      done
    fi
    gl_LIBOBJS=$gl_libobjs

    gl_LTLIBOBJS=$gl_ltlibobjs

    gl_LIBOBJDEPS=$gl_libobjdeps



    gltests_libobjs=
    gltests_ltlibobjs=
    gltests_libobjdeps=
    if test -n "$gltests_LIBOBJS"; then
      # Remove the extension.
      sed_drop_objext='s/\.o$//;s/\.obj$//'
      sed_dirname1='s,//*,/,g'
      sed_dirname2='s,\(.\)/$,\1,'
      sed_dirname3='s,^[^/]*$,.,'
      sed_dirname4='s,\(.\)/[^/]*$,\1,'
      sed_basename1='s,.*/,,'
      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"
        i_dir=`echo "$i" | sed -e "$sed_dirname1" -e "$sed_dirname2" -e "$sed_dirname3" -e "$sed_dirname4"`
        i_base=`echo "$i" | sed -e "$sed_basename1"`
        gltests_libobjdeps="$gltests_libobjdeps $i_dir/\$(DEPDIR)/$i_base.Po"
      done
    fi
    gltests_LIBOBJS=$gltests_libobjs

    gltests_LTLIBOBJS=$gltests_ltlibobjs

    gltests_LIBOBJDEPS=$gltests_libobjdeps


{ $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 -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 -n "$EXEEXT"; then
  am__EXEEXT_TRUE=
  am__EXEEXT_FALSE='#'
else
  am__EXEEXT_TRUE='#'
  am__EXEEXT_FALSE=
fi


: "${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 libgnu $as_me UNUSED-VERSION, 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_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 commands:
$config_commands

Report bugs to the package provider."

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
libgnu config.status UNUSED-VERSION
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" ac_aux_dir="$ac_aux_dir"

_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
    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;;
    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
    "Makefile.gnulib.inc") CONFIG_FILES="$CONFIG_FILES Makefile.gnulib.inc" ;;
    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
    "import/Makefile") CONFIG_FILES="$CONFIG_FILES import/Makefile" ;;
    "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;

  *) 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_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


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


{
  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 = ""

}
{
  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
  }

  print line
}

_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    :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" | $AWK -f "$ac_tmp/subs.awk" \
  >$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
 ;;

  :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.
  case $CONFIG_FILES in
  *\'*) eval set x "$CONFIG_FILES" ;;
  *)   set x $CONFIG_FILES ;;
  esac
  shift
  for mf
  do
    # Strip MF so we end up with the name of the file.
    mf=`echo "$mf" | sed -e 's/:.*$//'`
    # Check whether this is an Automake generated Makefile or not.
    # We used to match only the files named 'Makefile.in', but
    # some people rename them; so instead we look at the file content.
    # Grep'ing the first line is not enough: some people post-process
    # each Makefile.in and add a new line on top of each file to say so.
    # Grep'ing the whole file is not good either: AIX grep has a line
    # limit of 2048, but all sed's we know have understand at least 4000.
    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
      dirpart=`$as_dirname -- "$mf" ||
$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$mf" : 'X\(//\)[^/]' \| \
	 X"$mf" : 'X\(//\)$' \| \
	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$mf" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
    else
      continue
    fi
    # Extract the definition of DEPDIR, am__include, and am__quote
    # from the Makefile without running 'make'.
    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
    test -z "$DEPDIR" && continue
    am__include=`sed -n 's/^am__include = //p' < "$mf"`
    test -z "$am__include" && continue
    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
    # Find all dependency output files, they are included files with
    # $(DEPDIR) in their names.  We invoke sed twice because it is the
    # simplest approach to changing $(DEPDIR) to its actual value in the
    # expansion.
    for file in `sed -n "
      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
      # Make sure the directory exists.
      test -f "$dirpart/$file" && continue
      fdir=`$as_dirname -- "$file" ||
$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$file" : 'X\(//\)[^/]' \| \
	 X"$file" : 'X\(//\)$' \| \
	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$file" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
      as_dir=$dirpart/$fdir; as_fn_mkdir_p
      # echo "creating $dirpart/$file"
      echo '# dummy' > "$dirpart/$file"
    done
  done
}
 ;;
    "default":C)
case x$CONFIG_HEADERS in
xconfig.h:config.in)
echo > stamp-h ;;
esac
 ;;

  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


exit 0
