#! /bin/sh
# From configure.in Revision: 1.736 .
# Guess values for system-dependent variables and create Makefiles.
# Generated by Autoconf 2.52.20210509.
#
# Copyright 2003-2020,2021	Thomas E. Dickey
# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
# Free Software Foundation, Inc.
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.

# 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

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

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

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
  set -o posix
fi

# Name of the executable.
as_me=`echo "$0" |sed 's,.*[\\/],,'`

if expr a : '\(a\)' >/dev/null 2>&1; then
  as_expr=expr
else
  as_expr=false
fi

rm -f conf$$ conf$$.exe conf$$.file
echo >conf$$.file
if ln -s conf$$.file conf$$ 2>/dev/null; then
  # We could just check for DJGPP; but this test a) works b) is more generic
  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
  if test -f conf$$.exe; then
    # Don't use ln at all; we don't have any links
    as_ln_s='cp -p'
  else
    as_ln_s='ln -s'
  fi
elif ln conf$$.file conf$$ 2>/dev/null; then
  as_ln_s=ln
else
  as_ln_s='cp -p'
fi
rm -f conf$$ conf$$.exe conf$$.file

as_executable_p="test -f"

# Support unset when possible.
if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
  as_unset="unset"
else
  as_unset="false"
fi

# NLS nuisances.
$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; }
$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; }
$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; }
$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; }
$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; }
$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; }
$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; }
$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; }

# IFS
# We need space, tab and new line, in precisely that order.
as_nl='
'
IFS=" 	$as_nl"

# CDPATH.
$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; }

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

exec 6>&1

#
# Initializations.
#
ac_default_prefix=/usr/local
cross_compiling=no
subdirs=
MFLAGS=
MAKEFLAGS=
SHELL=${CONFIG_SHELL-/bin/sh}

# Maximum number of lines to put in a shell here document.
# This variable seems obsolete.  It should probably be removed, and
# only ac_max_sed_lines should be used.
: "${ac_max_here_lines=38}"

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

# Initialize some variables set by options.
ac_init_help=
ac_init_version=false
# 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.
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'
runstatedir='${localstatedir}/run'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
oldincludedir='/usr/include'
infodir='${datarootdir}/info'
mandir='${datarootdir}/man'

# Identity of this package.
PACKAGE_NAME=
PACKAGE_TARNAME=
PACKAGE_VERSION=
PACKAGE_STRING=
PACKAGE_BUGREPORT=

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

  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`

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

  case "$ac_option" in

  -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 | --data | --dat | --da)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
  | --da=*)
    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_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
   { (exit 1); exit 1; }; }
    ac_feature=`echo "$ac_feature" | sed 's/-/_/g'`
    eval "enable_$ac_feature=no" ;;

  -enable-* | --enable-*)
    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
   { (exit 1); exit 1; }; }
    ac_feature=`echo "$ac_feature" | sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
      *) ac_optarg=yes ;;
    esac
    eval "enable_$ac_feature='$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 ;;

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

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

  -runstatedir | --runstatedir | --runstatedi | --runstated \
  | --runstate | --runstat | --runsta | --runst \
  | --runs | --run | --ru)
    ac_prev=runstatedir ;;
  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
  | --runstate=* | --runstat=* | --runsta=* | --runst=* \
  | --runs=* | --run=* | --ru=*)
    runstatedir=$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)
    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 ;;

  -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
      { echo "$as_me: error: invalid package name: $ac_package" >&2
   { (exit 1); exit 1; }; }
    ac_package=`echo "$ac_package" | sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
      *) ac_optarg=yes ;;
    esac
    eval "with_$ac_package='$ac_optarg'" ;;

  -without-* | --without-*)
    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
      { echo "$as_me: error: invalid package name: $ac_package" >&2
   { (exit 1); exit 1; }; }
    ac_package=`echo "$ac_package" | sed 's/-/_/g'`
    eval "with_$ac_package=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 ;;

  -*) { echo "$as_me: error: unrecognized option: $ac_option
Try \`$0 --help' for more information." >&2
   { (exit 1); exit 1; }; }
    ;;

  *=*)
    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
    # Reject names that are not valid shell variable names.
    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
   { (exit 1); exit 1; }; }
    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
    eval "$ac_envvar='$ac_optarg'"
    export "$ac_envvar" ;;

  *)
    # FIXME: should be removed in autoconf 3.0.
    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
      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'`
  { echo "$as_me: error: missing argument to $ac_option" >&2
   { (exit 1); exit 1; }; }
fi

# Be sure to have absolute paths.
for ac_var in exec_prefix prefix
do
  eval ac_val=$`echo "$ac_var"`
  case "$ac_val" in
    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
    *)  { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2
   { (exit 1); exit 1; }; };;
  esac
done

# Be sure to have absolute paths.
for ac_var in bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir \
              localstatedir libdir includedir oldincludedir infodir mandir
do
  eval ac_val=$`echo "$ac_var"`
  case "$ac_val" in
    [\\/$]* | ?:[\\/]* ) ;;
    *)  { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2
   { (exit 1); exit 1; }; };;
  esac
done

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

# FIXME: should be removed in autoconf 3.0.
if test "x$host_alias" != x; then
  if test "x$build_alias" = x; then
    cross_compiling=maybe
    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
    If a cross compiler is detected then cross compile mode will be used." >&2
  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

# 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 its parent.
  ac_prog=$0
  ac_confdir=`echo "$ac_prog" | sed 's%[\\/][^\\/][^\\/]*$%%'`
  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
  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
  if test "$ac_srcdir_defaulted" = yes; then
    { echo "$as_me: error: cannot find sources in $ac_confdir or .." >&2
   { (exit 1); exit 1; }; }
  else
    { echo "$as_me: error: cannot find sources in $srcdir" >&2
   { (exit 1); exit 1; }; }
  fi
fi
srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
ac_env_build_alias_set=${build_alias+set}
ac_env_build_alias_value=$build_alias
ac_cv_env_build_alias_set=${build_alias+set}
ac_cv_env_build_alias_value=$build_alias
ac_env_host_alias_set=${host_alias+set}
ac_env_host_alias_value=$host_alias
ac_cv_env_host_alias_set=${host_alias+set}
ac_cv_env_host_alias_value=$host_alias
ac_env_target_alias_set=${target_alias+set}
ac_env_target_alias_value=$target_alias
ac_cv_env_target_alias_set=${target_alias+set}
ac_cv_env_target_alias_value=$target_alias
ac_env_CC_set=${CC+set}
ac_env_CC_value=$CC
ac_cv_env_CC_set=${CC+set}
ac_cv_env_CC_value=$CC
ac_env_CFLAGS_set=${CFLAGS+set}
ac_env_CFLAGS_value=$CFLAGS
ac_cv_env_CFLAGS_set=${CFLAGS+set}
ac_cv_env_CFLAGS_value=$CFLAGS
ac_env_LDFLAGS_set=${LDFLAGS+set}
ac_env_LDFLAGS_value=$LDFLAGS
ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
ac_cv_env_LDFLAGS_value=$LDFLAGS
ac_env_CPPFLAGS_set=${CPPFLAGS+set}
ac_env_CPPFLAGS_value=$CPPFLAGS
ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
ac_cv_env_CPPFLAGS_value=$CPPFLAGS
ac_env_CPP_set=${CPP+set}
ac_env_CPP_value=$CPP
ac_cv_env_CPP_set=${CPP+set}
ac_cv_env_CPP_value=$CPP
ac_env_CXX_set=${CXX+set}
ac_env_CXX_value=$CXX
ac_cv_env_CXX_set=${CXX+set}
ac_cv_env_CXX_value=$CXX
ac_env_CXXFLAGS_set=${CXXFLAGS+set}
ac_env_CXXFLAGS_value=$CXXFLAGS
ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
ac_cv_env_CXXFLAGS_value=$CXXFLAGS
ac_env_CXXCPP_set=${CXXCPP+set}
ac_env_CXXCPP_value=$CXXCPP
ac_cv_env_CXXCPP_set=${CXXCPP+set}
ac_cv_env_CXXCPP_value=$CXXCPP

#
# 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 <<EOF
\`configure' configures this package 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 \`..']

EOF

  cat <<EOF
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]
  --datarootdir=DIR       read-only architecture-independent data [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --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]
  --runstatedir=DIR       extra definition of runtime data [LOCALSTATEDIR/run]
  --libdir=DIR            object code libraries [EPREFIX/lib]
  --includedir=DIR        C header files [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
EOF

  cat <<\EOF

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       build programs to run on HOST [BUILD]
  --target=TARGET   configure for building compilers for TARGET [HOST]
EOF
fi

if test -n "$ac_init_help"; then

  cat <<\EOF

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)

Optional Features:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]

  --with-rel-version=XXX  override derived release version
  --with-abi-version=XXX  override derived ABI version
  --with-system-type=XXX  test: override derived host system-type
  --without-ada           suppress check for Ada compiler, don't build demo
  --without-cxx           do not adjust ncurses bool to match C++
  --without-cxx-binding   do not build C++ binding and demo
  --disable-db-install    suppress install of terminal database
  --without-manpages      suppress install of manpages
  --without-progs         suppress build/install with programs (e.g., tic)
  --without-tack          suppress build/install with tack program
  --without-tests         suppress build/install with test-programs
  --without-curses-h      install curses.h as ncurses.h only
  --with-config-suffix=X  suffixes ncursesXX-config file
  --with-pkg-config{=path} enable/disable use of pkg-config
  --with-pkg-config-libdir=XXX use given directory for installing pc-files
  --enable-pc-files       generate and install .pc files for pkg-config
  --with-pc-suffix        suffixes pc-files
  --enable-mixed-case     tic should assume mixed-case filenames
  --with-install-prefix   prefixes actual install-location ($DESTDIR)
Build-Tools Needed to Compile Temporary Applications for Cross-compiling:
  --with-build-cc=XXX     the build C compiler ($BUILD_CC)
  --with-build-cpp=XXX    the build C preprocessor ($BUILD_CPP)
  --with-build-cflags=XXX the build C compiler-flags ($BUILD_CFLAGS)
  --with-build-cppflags=XXX the build C preprocessor-flags ($BUILD_CPPFLAGS)
  --with-build-ldflags=XXX the build linker-flags ($BUILD_LDFLAGS)
  --with-build-libs=XXX   the build libraries (${BUILD_LIBS})
Options to Specify the Libraries Built/Used:
  --disable-libtool-version  enable to use libtool's incompatible naming scheme
  --with-libtool          generate libraries with libtool
  --with-shared           generate shared-libraries
  --with-normal           generate normal-libraries (default)
  --with-debug            generate debug-libraries (default)
  --with-profile          generate profile-libraries
  --with-cxx-shared       generate C++ shared-libraries
  --with-lib-prefix       override library-prefix
  --with-termlib          generate separate terminfo library
  --with-ticlib           generate separate tic library
  --enable-rpath          use rpath option when generating shared libraries
  --disable-relink        relink shared libraries during install
  --with-shlib-version=X  Specify rel or abi version for shared libs
  --with-libtool-opts=XXX specify additional libtool options
  --with-export-syms=XXX  limit exported symbols using libtool
  --with-versioned-syms=X markup versioned symbols using ld
  --with-gpm              use Alessandro Rubini's GPM library
  --without-dlsym         do not use dlsym() to load GPM dynamically
  --with-pcre2            use PCRE2 for regular-expressions
  --with-sysmouse         use sysmouse (FreeBSD console)
  --disable-lib-suffixes  disable library suffixes
  --disable-rpath-hack    don't add rpath options for additional libraries
  --disable-pkg-ldflags   disable extra LDFLAGS for package-scripts
Fine-Tuning Your Configuration:
  --with-extra-suffix=X   append extra suffix to header/library paths
  --disable-overwrite     put headers in subdir, omit link to -lcurses
  --disable-database      do not use terminfo, only fallbacks/termcap
  --with-database=XXX     specify terminfo source to install
  --with-hashed-db        specify hashed-database library
  --with-fallbacks=XXX    specify list of fallback terminal descriptions
  --with-tic-path=XXX     specify path of tic for fallbacks
  --with-infocmp-path=XXX     specify path of infocmp for fallbacks
  --without-xterm-new     specify if xterm terminfo should be old version
  --with-xterm-kbs=XXX    specify if xterm backspace sends BS or DEL
  --with-terminfo-dirs=XXX specify list of terminfo directories (default: DATADIR/terminfo)
  --with-default-terminfo-dir=DIR default terminfo directory (default: DATADIR/terminfo)
  --disable-big-core      assume machine has little memory
  --disable-big-strings   assume compiler has only standard-size strings
  --enable-termcap        compile in termcap fallback support
  --with-termpath=XXX     specify list of termcap files (default: /etc/termcap:/usr/share/misc/termcap)
  --enable-getcap         fast termcap load, no xrefs to terminfo
  --enable-getcap-cache   cache translated termcaps in ~/.terminfo
  --disable-home-terminfo drop ~/.terminfo from terminfo search-path
  --disable-root-environ  restrict root use of ncurses environment variables
  --disable-root-access   restrict file-access when running setuid
  --enable-symlinks       make tic use symbolic links not hard links
  --enable-broken_linker  compile with broken-linker support code
  --enable-bsdpad         recognize BSD-style prefix padding
  --enable-widec          compile with wide-char/UTF-8 code
  --disable-lp64          allow chtype to be long (ignore _LP64)
  --disable-largefile     omit support for large files
  --disable-tparm-varargs compile tparm() without varargs interface
  --disable-tic-depends   link tic library without explicit dependency on ncurses library
  --enable-wattr-macros   enable wattr* macros
  --with-x11-rgb=FILE   file containing X11 rgb information (EPREFIX/lib/X11/rgb.txt)
  --with-bool=TYPE        override fallback type of bool variable
  --with-caps=alt         compile with alternate Caps file
  --with-chtype=TYPE      override type of chtype
  --with-ospeed=TYPE      override type of ospeed variable
  --with-mmask-t=TYPE     override type of mmask_t
  --with-ccharw-max=XXX   override size CCHARW_MAX
  --enable-signed-char    compile using signed Boolean's in term.h
  --with-tparm-arg=TYPE   override parameter type of tparm
  --with-rcs-ids          compile-in RCS identifiers
Options to Specify How Manpages are Installed:
  --with-manpage-format   specify manpage-format: gzip/compress/BSDI/normal and
                          optionally formatted/catonly, e.g., gzip,formatted
  --with-manpage-renames  specify manpage-renaming
  --with-manpage-aliases  specify manpage-aliases using .so
  --with-manpage-symlinks specify manpage-aliases using symlinks
  --with-manpage-tbl      specify manpage processing with tbl
Extensions:
  --disable-ext-funcs     disable function-extensions
  --enable-sp-funcs       enable SCREEN-extensions
  --enable-term-driver    enable terminal-driver
  --enable-const          compile with extra/non-standard const
  --enable-ext-colors     compile for 256-color support
  --enable-ext-mouse      compile for extended mouse-encoding
  --enable-ext-putwin     compile with extended putwin/screendump
  --enable-no-padding     compile with $NCURSES_NO_PADDING code
  --enable-sigwinch       compile with SIGWINCH handler
  --enable-tcap-names     compile with user-definable terminal capabilities
Reentrant Code:
  --with-pthread          use POSIX thread library
  --enable-pthreads-eintr enable EINTR in wgetch with pthreads
  --enable-weak-symbols   enable weak-symbols for pthreads
  --enable-reentrant      compile with reentrant code
  --enable-opaque-curses  make curses WINDOW, etc., "opaque"
  --enable-opaque-form    make form-library structures "opaque"
  --enable-opaque-menu    make menu-library structures "opaque"
  --enable-opaque-panel   make panel-library structures "opaque"
  --with-wrap-prefix=XXX  override prefix used for public variables
Development Code:
  --without-develop       disable development options
  --enable-hard-tabs      compile with hard-tabs code
  --enable-xmc-glitch     compile with support for xmc (magic-cookie)
Experimental Code:
  --disable-assumed-color do not assume anything about default-colors
  --disable-hashmap       compile without hashmap scrolling-optimization
  --enable-colorfgbg      compile-in experimental $COLORFGBG code
  --enable-fvisibility    compile with -fvisibility=hidden
  --enable-interop        compile-in interop bindings
  --enable-safe-sprintf   compile with experimental safe-sprintf code
  --disable-scroll-hints  compile without scroll-hints code
  --enable-wgetch-events  compile with wgetch-events code
  --enable-exp-win32      compile with experimental-Windows driver
Testing/development Options:
  --disable-echo          do not display "compiling" commands
  --disable-stripping     do not strip (debug info) installed executables
  --enable-warnings       test: turn on gcc compiler warnings
  --enable-stdnoreturn    enable C11 _Noreturn feature for diagnostics
  --enable-string-hacks   work around bogus compiler/loader warnings
  --enable-assertions     test: turn on generation of assertion code
  --with-dmalloc          test: use Gray Watson's dmalloc library
  --with-dbmalloc         test: use Conor Cahill's dbmalloc library
  --with-valgrind         test: use valgrind
  --disable-leaks         test: free permanent memory, analyze leaks
  --enable-expanded       test: generate functions for certain macros
  --disable-macros        test: use functions rather than macros
  --with-trace            test: add trace() function to all models of ncurses
  --disable-gnat-projects test: disable GNAT projects even if usable
Ada Binding Options:
  --with-ada-compiler=CMD specify Ada95 compiler command (default gnatmake)
  --with-ada-include=DIR  Ada includes are in DIR (default: PREFIX/share/ada/adainclude)
  --with-ada-objects=DIR  Ada objects are in DIR (default: PREFIX/lib/ada/adalib)
  --with-ada-sharedlib=soname build shared-library (requires GNAT projects)
  --with-ada-libname=XXX  override default Ada library-name
  --with-form-libname=XXX override form basename of library
  --with-menu-libname=XXX override menu basename of library
  --with-panel-libname=XXX override panel basename of library
  --with-cxx-libname=XXX override ncurses++ basename of library

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>
  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
              headers in a nonstandard directory <include dir>
  CPP         C preprocessor
  CXX         C++ compiler command
  CXXFLAGS    C++ compiler flags
  CXXCPP      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.

EOF
fi

if test "$ac_init_help" = "recursive"; then
  # If there are subdirs, report their specific --help.
  ac_popdir=`pwd`
  for ac_subdir in : $ac_subdirs_all; do test "x$ac_subdir" = x: && continue
    cd "$ac_subdir"
    # A "../" for each directory in /$ac_subdir.
    ac_dots=`echo "$ac_subdir" |
             sed 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g'`

    case "$srcdir" in
    .) # No --srcdir option.  We are building in place.
      ac_sub_srcdir="$srcdir" ;;
    [\\/]* | ?:[\\/]* ) # Absolute path.
      ac_sub_srcdir="$srcdir/$ac_subdir" ;;
    *) # Relative path.
      ac_sub_srcdir="$ac_dots$srcdir/$ac_subdir" ;;
    esac

    # Check for guested configure; otherwise get Cygnus style configure.
    if test -f "$ac_sub_srcdir/configure.gnu"; then
      echo
      $SHELL "$ac_sub_srcdir/configure.gnu" --help=recursive
    elif test -f "$ac_sub_srcdir/configure"; then
      echo
      $SHELL "$ac_sub_srcdir/configure" --help=recursive
    elif test -f "$ac_sub_srcdir/configure.ac" ||
           test -f "$ac_sub_srcdir/configure.in"; then
      echo
      "$ac_configure" --help
    else
      echo "$as_me: WARNING: no configuration information is in $ac_subdir" >&2
    fi
    cd "$ac_popdir"
  done
fi

test -n "$ac_init_help" && exit 0
if "$ac_init_version"; then
  cat <<\EOF

Copyright 2003-2020,2021	Thomas E. Dickey
Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
EOF
  exit 0
fi
exec 5>config.log
cat >&5 <<EOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by $as_me, which was
generated by GNU Autoconf 2.52.20210509.  Invocation command line was

  $ $0 $@

EOF
{
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`
hostinfo               = `(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`

PATH = $PATH

_ASUNAME
} >&5

cat >&5 <<EOF
## ------------ ##
## Core tests.  ##
## ------------ ##

EOF

# Keep a trace of the command line.
# Strip out --no-create and --no-recursion so they do not pile up.
# Also quote any args containing shell meta-characters.
ac_configure_args=
ac_sep=
for ac_arg
do
  case "$ac_arg" in
  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c) ;;
  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
    ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"`
    ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
    ac_sep=" " ;;
  *) ac_configure_args="$ac_configure_args$ac_sep$ac_arg"
     ac_sep=" " ;;
  esac
  # Get rid of the leading space.
done

# 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.
trap 'exit_status=$?
  # Save into config.log some information that might help in debugging.
  echo >&5
  echo "## ----------------- ##" >&5
  echo "## Cache variables.  ##" >&5
  echo "## ----------------- ##" >&5
  echo >&5
  # The following way of writing the cache mishandles newlines in values,
{
  (set) 2>&1 |
    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
    *ac_space=\ *)
      sed -n \
        "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
    	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
      ;;
    *)
      sed -n \
        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
      ;;
    esac;
} >&5
  sed "/^$/d" confdefs.h >conftest.log
  if test -s conftest.log; then
    echo >&5
    echo "## ------------ ##" >&5
    echo "## confdefs.h.  ##" >&5
    echo "## ------------ ##" >&5
    echo >&5
    cat conftest.log >&5
  fi
  (echo; echo) >&5
  test "$ac_signal" != 0 &&
    echo "$as_me: caught signal $ac_signal" >&5
  echo "$as_me: exit $exit_status" >&5
  rm -rf conftest* confdefs* core core.* *.core conf$$* $ac_clean_files &&
    exit $exit_status
     ' 0
for ac_signal in 1 2 13 15; do
  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' "$ac_signal"
done
ac_signal=0

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -rf conftest* confdefs.h
# AIX cpp loses on an empty file, so make sure it contains at least a newline.
echo >confdefs.h

# Let the site file select an alternate cache file if it wants to.
# Prefer explicitly selected file to automatically selected ones.
if test -z "$CONFIG_SITE"; then
  if test "x$prefix" != xNONE; then
    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
  else
    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
  fi
fi
for ac_site_file in $CONFIG_SITE; do
  if test -r "$ac_site_file"; then
    { echo "$as_me:1071: loading site script $ac_site_file" >&5
echo "$as_me: loading site script $ac_site_file" >&6;}
    cat "$ac_site_file" >&5
    . "$ac_site_file"
  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.
  if test -f "$cache_file"; then
    { echo "$as_me:1082: loading cache $cache_file" >&5
echo "$as_me: loading cache $cache_file" >&6;}
    case $cache_file in
      [\\/]* | ?:[\\/]* ) . $cache_file;;
      *)                      . ./$cache_file;;
    esac
  fi
else
  { echo "$as_me:1090: creating cache $cache_file" >&5
echo "$as_me: creating cache $cache_file" >&6;}
  >$cache_file
fi

# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
for ac_var in `(set) 2>&1 |
               sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; 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,)
      { echo "$as_me:1106: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
      ac_cache_corrupted=: ;;
    ,set)
      { echo "$as_me:1110: error: \`$ac_var' was not set in the previous run" >&5
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
        { echo "$as_me:1116: error: \`$ac_var' has changed since the previous run:" >&5
echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
        { echo "$as_me:1118:   former value:  $ac_old_val" >&5
echo "$as_me:   former value:  $ac_old_val" >&2;}
        { echo "$as_me:1120:   current value: $ac_new_val" >&5
echo "$as_me:   current value: $ac_new_val" >&2;}
        ac_cache_corrupted=:
      fi;;
  esac
  # Pass precious variables to config.status.  It doesn't matter if
  # we pass some twice (in addition to the command line arguments).
  if test "$ac_new_set" = set; then
    case "$ac_new_val" in
    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"`
      ac_configure_args="$ac_configure_args '$ac_arg'"
      ;;
    *) ac_configure_args="$ac_configure_args $ac_var=$ac_new_val"
       ;;
    esac
  fi
done
if "$ac_cache_corrupted"; then
  { echo "$as_me:1139: error: changes in the environment can compromise the build" >&5
echo "$as_me: error: changes in the environment can compromise the build" >&2;}
  { { echo "$as_me:1141: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
   { (exit 1); exit 1; }; }
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
ac_main_return="return"

case `echo "testing\c" 2>/dev/null; echo 1,2,3`,`echo -n testing 2>/dev/null; echo 1,2,3` in
  *c*,-n*) ECHO_N=
           ECHO_C=      # newlines do not sed ;-) only broken shells would use this case anyway
           ECHO_T='	'
           ;;
  *c*,*  ) ECHO_N=-n
           ECHO_C=
           ECHO_T=
           ;;
  *)       ECHO_N=
           ECHO_C='\c'
           ECHO_T=
           ;;
esac
echo "#! $SHELL" >conftest.sh
echo  "exit 0"   >>conftest.sh
chmod +x conftest.sh
if { (echo "$as_me:1170: PATH=\".;.\"; conftest.sh") >&5
  (PATH=".;."; conftest.sh) 2>&5
  ac_status=$?
  echo "$as_me:1173: \$? = $ac_status" >&5
  (exit "$ac_status"); }; then
  ac_path_separator=';'
else
  ac_path_separator=:
fi
PATH_SEPARATOR="$ac_path_separator"
rm -f conftest.sh

ac_config_headers="$ac_config_headers include/ncurses_cfg.h:include/ncurses_cfg.hin"

top_builddir=`pwd`

for ac_prog in ggrep grep
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:1190: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_GREP+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$GREP"; then
  ac_cv_prog_GREP="$GREP" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_GREP="$ac_prog"
echo "$as_me:1205: found $ac_dir/$ac_word" >&5
break
done

fi
fi
GREP=$ac_cv_prog_GREP
if test -n "$GREP"; then
  echo "$as_me:1213: result: $GREP" >&5
echo "${ECHO_T}$GREP" >&6
else
  echo "$as_me:1216: result: no" >&5
echo "${ECHO_T}no" >&6
fi

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

echo "$as_me:1224: checking for egrep" >&5
echo $ECHO_N "checking for egrep... $ECHO_C" >&6
if test "${ac_cv_path_EGREP+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
   then ac_cv_path_EGREP="$GREP -E"
   else
     for ac_prog in gegrep egrep
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:1236: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_EGREP+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  case $EGREP in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_EGREP="$EGREP" # Let the user override the test with a path.
  ;;
  *)
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  if $as_executable_p "$ac_dir/$ac_word"; then
   ac_cv_path_EGREP="$ac_dir/$ac_word"
   echo "$as_me:1253: found $ac_dir/$ac_word" >&5
   break
fi
done

  ;;
esac
fi
EGREP=$ac_cv_path_EGREP

if test -n "$EGREP"; then
  echo "$as_me:1264: result: $EGREP" >&5
echo "${ECHO_T}$EGREP" >&6
else
  echo "$as_me:1267: result: no" >&5
echo "${ECHO_T}no" >&6
fi

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

     test "x$ac_cv_path_EGREP" = "x:" && { { echo "$as_me:1275: error: cannot find workable egrep" >&5
echo "$as_me: error: cannot find workable egrep" >&2;}
   { (exit 1); exit 1; }; }
   fi
fi
echo "$as_me:1280: result: $ac_cv_path_EGREP" >&5
echo "${ECHO_T}$ac_cv_path_EGREP" >&6
 EGREP="$ac_cv_path_EGREP"

NCURSES_MAJOR="`${EGREP-egrep} '^NCURSES_MAJOR[ 	]*=' "$srcdir/dist.mk" | sed -e 's/^[^0-9]*//'`"
NCURSES_MINOR="`${EGREP-egrep} '^NCURSES_MINOR[ 	]*=' "$srcdir/dist.mk" | sed -e 's/^[^0-9]*//'`"
NCURSES_PATCH="`${EGREP-egrep} '^NCURSES_PATCH[ 	]*=' "$srcdir/dist.mk" | sed -e 's/^[^0-9]*//'`"
cf_cv_abi_version=${NCURSES_MAJOR}
cf_cv_rel_version=${NCURSES_MAJOR}.${NCURSES_MINOR}
cf_cv_timestamp=`date`
echo "$as_me:1290: result: Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_version ($cf_cv_timestamp)" >&5
echo "${ECHO_T}Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_version ($cf_cv_timestamp)" >&6

if test -f "$srcdir/VERSION" ; then
	echo "$as_me:1294: checking for package version" >&5
echo $ECHO_N "checking for package version... $ECHO_C" >&6

	# if there are not enough fields, cut returns the last one...
	cf_field1=`sed -e '2,$d' "$srcdir/VERSION" |cut -f1`
	cf_field2=`sed -e '2,$d' "$srcdir/VERSION" |cut -f2`
	cf_field3=`sed -e '2,$d' "$srcdir/VERSION" |cut -f3`

	# this is how CF_BUNDLED_INTL uses $VERSION:
	VERSION="$cf_field1"

	VERSION_MAJOR=`echo "$cf_field2" | sed -e 's/\..*//'`
	test -z "$VERSION_MAJOR" && { { echo "$as_me:1306: error: missing major-version" >&5
echo "$as_me: error: missing major-version" >&2;}
   { (exit 1); exit 1; }; }

	VERSION_MINOR=`echo "$cf_field2" | sed -e 's/^[^.]*\.//' -e 's/-.*//'`
	test -z "$VERSION_MINOR" && { { echo "$as_me:1311: error: missing minor-version" >&5
echo "$as_me: error: missing minor-version" >&2;}
   { (exit 1); exit 1; }; }

	echo "$as_me:1315: result: ${VERSION_MAJOR}.${VERSION_MINOR}" >&5
echo "${ECHO_T}${VERSION_MAJOR}.${VERSION_MINOR}" >&6

	echo "$as_me:1318: checking for package patch date" >&5
echo $ECHO_N "checking for package patch date... $ECHO_C" >&6
	VERSION_PATCH=`echo "$cf_field3" | sed -e 's/^[^-]*-//'`
	case .$VERSION_PATCH in
	(.)
		{ { echo "$as_me:1323: error: missing patch-date $VERSION_PATCH" >&5
echo "$as_me: error: missing patch-date $VERSION_PATCH" >&2;}
   { (exit 1); exit 1; }; }
		;;
	(.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])
		;;
	(*)
		{ { echo "$as_me:1330: error: illegal patch-date $VERSION_PATCH" >&5
echo "$as_me: error: illegal patch-date $VERSION_PATCH" >&2;}
   { (exit 1); exit 1; }; }
		;;
	esac
	echo "$as_me:1335: result: $VERSION_PATCH" >&5
echo "${ECHO_T}$VERSION_PATCH" >&6
else
	{ { echo "$as_me:1338: error: did not find $srcdir/VERSION" >&5
echo "$as_me: error: did not find $srcdir/VERSION" >&2;}
   { (exit 1); exit 1; }; }
fi

# show the actual data that we have for versions:
test -n "$verbose" && echo "	ABI VERSION $VERSION" 1>&6

echo "${as_me:-configure}:1346: testing ABI VERSION $VERSION ..." 1>&5

test -n "$verbose" && echo "	VERSION_MAJOR $VERSION_MAJOR" 1>&6

echo "${as_me:-configure}:1350: testing VERSION_MAJOR $VERSION_MAJOR ..." 1>&5

test -n "$verbose" && echo "	VERSION_MINOR $VERSION_MINOR" 1>&6

echo "${as_me:-configure}:1354: testing VERSION_MINOR $VERSION_MINOR ..." 1>&5

test -n "$verbose" && echo "	VERSION_PATCH $VERSION_PATCH" 1>&6

echo "${as_me:-configure}:1358: testing VERSION_PATCH $VERSION_PATCH ..." 1>&5

	cf_PACKAGE=NCURSES
	PACKAGE=ncurses

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

cf_PACKAGE=`echo "$cf_PACKAGE" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`

	cat >>confdefs.h <<EOF
#define ${cf_PACKAGE}_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}"
EOF

	cat >>confdefs.h <<EOF
#define ${cf_PACKAGE}_PATCHDATE ${VERSION_PATCH}
EOF

test -z "$cf_cv_rel_version" && cf_cv_rel_version=0.0

# Check whether --with-rel-version or --without-rel-version was given.
if test "${with_rel_version+set}" = set; then
  withval="$with_rel_version"
  { echo "$as_me:1382: WARNING: overriding release version $cf_cv_rel_version to $withval" >&5
echo "$as_me: WARNING: overriding release version $cf_cv_rel_version to $withval" >&2;}
 cf_cv_rel_version=$withval
fi;

 NCURSES_MAJOR=`echo "$cf_cv_rel_version" | sed -e 's/\..*//'`
 NCURSES_MINOR=`echo "$cf_cv_rel_version" | sed -e 's/^[^.]*//' -e 's/^\.//' -e 's/\..*//'`

if test -n "$NCURSES_MAJOR" ; then
  case $NCURSES_MAJOR in
  ([0-9]*)
 	;;
  (*)
	{ { echo "$as_me:1395: error: Release major-version is not a number: $NCURSES_MAJOR" >&5
echo "$as_me: error: Release major-version is not a number: $NCURSES_MAJOR" >&2;}
   { (exit 1); exit 1; }; }
 	;;
  esac
else
  { { echo "$as_me:1401: error: Release major-version value is empty" >&5
echo "$as_me: error: Release major-version value is empty" >&2;}
   { (exit 1); exit 1; }; }
fi

if test -n "$NCURSES_MINOR" ; then
  case $NCURSES_MINOR in
  ([0-9]*)
 	;;
  (*)
	{ { echo "$as_me:1411: error: Release minor-version is not a number: $NCURSES_MINOR" >&5
echo "$as_me: error: Release minor-version is not a number: $NCURSES_MINOR" >&2;}
   { (exit 1); exit 1; }; }
 	;;
  esac
else
  { { echo "$as_me:1417: error: Release minor-version value is empty" >&5
echo "$as_me: error: Release minor-version value is empty" >&2;}
   { (exit 1); exit 1; }; }
fi

test -z "$cf_cv_abi_version" && cf_cv_abi_version=0

# Check whether --with-abi-version or --without-abi-version was given.
if test "${with_abi_version+set}" = set; then
  withval="$with_abi_version"

	if test "x$cf_cv_abi_version" != "x$withval"
	then
		{ echo "$as_me:1430: WARNING: overriding ABI version $cf_cv_abi_version to $withval" >&5
echo "$as_me: WARNING: overriding ABI version $cf_cv_abi_version to $withval" >&2;}
		case "$cf_cv_rel_version" in
		(5.*)
			cf_cv_rel_version=$withval.0
			;;
		(6.*)
			cf_cv_rel_version=$withval.9	# FIXME: should be 10 as of 6.0 release
			;;
		esac
	fi
	cf_cv_abi_version=$withval
fi;

if test -n "$cf_cv_abi_version" ; then
  case $cf_cv_abi_version in
  ([0-9]*)
 	;;
  (*)
	{ { echo "$as_me:1449: error: ABI version is not a number: $cf_cv_abi_version" >&5
echo "$as_me: error: ABI version is not a number: $cf_cv_abi_version" >&2;}
   { (exit 1); exit 1; }; }
 	;;
  esac
else
  { { echo "$as_me:1455: error: ABI version value is empty" >&5
echo "$as_me: error: ABI version value is empty" >&2;}
   { (exit 1); exit 1; }; }
fi

if test "x$cf_cv_abi_version" != "x$with_abi_version"
then
	case "$cf_cv_rel_version" in
	(5.*)
		cf_cv_rel_version=$with_abi_version.0
		;;
	esac
fi

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
  { { echo "$as_me:1486: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
   { (exit 1); exit 1; }; }
fi
ac_config_guess="$SHELL $ac_aux_dir/config.guess"
ac_config_sub="$SHELL $ac_aux_dir/config.sub"
ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.

# Make sure we can run config.sub.
$ac_config_sub sun4 >/dev/null 2>&1 ||
  { { echo "$as_me:1496: error: cannot run $ac_config_sub" >&5
echo "$as_me: error: cannot run $ac_config_sub" >&2;}
   { (exit 1); exit 1; }; }

echo "$as_me:1500: checking build system type" >&5
echo $ECHO_N "checking build system type... $ECHO_C" >&6
if test "${ac_cv_build+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_cv_build_alias=$build_alias
test -z "$ac_cv_build_alias" &&
  ac_cv_build_alias=`$ac_config_guess`
test -z "$ac_cv_build_alias" &&
  { { echo "$as_me:1509: error: cannot guess build type; you must specify one" >&5
echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
   { (exit 1); exit 1; }; }
ac_cv_build=`$ac_config_sub "$ac_cv_build_alias"` ||
  { { echo "$as_me:1513: error: $ac_config_sub $ac_cv_build_alias failed." >&5
echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed." >&2;}
   { (exit 1); exit 1; }; }

fi
echo "$as_me:1518: result: $ac_cv_build" >&5
echo "${ECHO_T}$ac_cv_build" >&6
build=$ac_cv_build
build_cpu=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
build_vendor=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
build_os=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`

echo "$as_me:1525: checking host system type" >&5
echo $ECHO_N "checking host system type... $ECHO_C" >&6
if test "${ac_cv_host+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_cv_host_alias=$host_alias
test -z "$ac_cv_host_alias" &&
  ac_cv_host_alias=$ac_cv_build_alias
ac_cv_host=`$ac_config_sub "$ac_cv_host_alias"` ||
  { { echo "$as_me:1534: error: $ac_config_sub $ac_cv_host_alias failed" >&5
echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
   { (exit 1); exit 1; }; }

fi
echo "$as_me:1539: result: $ac_cv_host" >&5
echo "${ECHO_T}$ac_cv_host" >&6
host=$ac_cv_host
host_cpu=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
host_vendor=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
host_os=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`

if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then
	echo "$as_me:1547: checking target system type" >&5
echo $ECHO_N "checking target system type... $ECHO_C" >&6
if test "${ac_cv_target+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_cv_target_alias=$target_alias
test "x$ac_cv_target_alias" = "x" &&
  ac_cv_target_alias=$ac_cv_host_alias
ac_cv_target=`$ac_config_sub "$ac_cv_target_alias"` ||
  { { echo "$as_me:1556: error: $ac_config_sub $ac_cv_target_alias failed" >&5
echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;}
   { (exit 1); exit 1; }; }

fi
echo "$as_me:1561: result: $ac_cv_target" >&5
echo "${ECHO_T}$ac_cv_target" >&6
target=$ac_cv_target
target_cpu=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
target_vendor=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
target_os=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`

# 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}-
	system_name="$host_os"
else
	system_name="`(uname -s -r) 2>/dev/null`"
	if test -z "$system_name" ; then
		system_name="`(hostname) 2>/dev/null`"
	fi
fi
test -n "$system_name" &&
cat >>confdefs.h <<EOF
#define SYSTEM_NAME "$system_name"
EOF

if test "${cf_cv_system_name+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cf_cv_system_name="$system_name"
fi

test -z "$system_name" && system_name="$cf_cv_system_name"
test -n "$cf_cv_system_name" && echo "$as_me:1593: result: Configuring for $cf_cv_system_name" >&5
echo "${ECHO_T}Configuring for $cf_cv_system_name" >&6

if test ".$system_name" != ".$cf_cv_system_name" ; then
	echo "$as_me:1597: result: Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&5
echo "${ECHO_T}Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&6
	{ { echo "$as_me:1599: error: \"Please remove config.cache and try again.\"" >&5
echo "$as_me: error: \"Please remove config.cache and try again.\"" >&2;}
   { (exit 1); exit 1; }; }
fi

# Check whether --with-system-type or --without-system-type was given.
if test "${with_system_type+set}" = set; then
  withval="$with_system_type"
  { echo "$as_me:1607: WARNING: overriding system type to $withval" >&5
echo "$as_me: WARNING: overriding system type to $withval" >&2;}
	cf_cv_system_name=$withval
	host_os=$withval

fi;

###	Save the given $CFLAGS to allow user-override.
cf_user_CFLAGS="$CFLAGS"

###	Default install-location
echo "$as_me:1618: checking for fgrep" >&5
echo $ECHO_N "checking for fgrep... $ECHO_C" >&6
if test "${ac_cv_path_FGREP+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
   then ac_cv_path_FGREP="$GREP -F"
   else
     for ac_prog in gfgrep fgrep
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:1630: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_FGREP+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  case $FGREP in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_FGREP="$FGREP" # Let the user override the test with a path.
  ;;
  *)
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  if $as_executable_p "$ac_dir/$ac_word"; then
   ac_cv_path_FGREP="$ac_dir/$ac_word"
   echo "$as_me:1647: found $ac_dir/$ac_word" >&5
   break
fi
done

  ;;
esac
fi
FGREP=$ac_cv_path_FGREP

if test -n "$FGREP"; then
  echo "$as_me:1658: result: $FGREP" >&5
echo "${ECHO_T}$FGREP" >&6
else
  echo "$as_me:1661: result: no" >&5
echo "${ECHO_T}no" >&6
fi

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

     test "x$ac_cv_path_FGREP" = "x:" && { { echo "$as_me:1669: error: cannot find workable fgrep" >&5
echo "$as_me: error: cannot find workable fgrep" >&2;}
   { (exit 1); exit 1; }; }
   fi
fi
echo "$as_me:1674: result: $ac_cv_path_FGREP" >&5
echo "${ECHO_T}$ac_cv_path_FGREP" >&6
 FGREP="$ac_cv_path_FGREP"

echo "$as_me:1678: checking for prefix" >&5
echo $ECHO_N "checking for prefix... $ECHO_C" >&6
if test "x$prefix" = "xNONE" ; then
	case "$cf_cv_system_name" in
		# non-vendor systems don't have a conflict
	(openbsd*|freebsd*|mirbsd*|linux*|cygwin*|msys*|k*bsd*-gnu|mingw*)
		prefix=/usr
		;;
	(*)	prefix=$ac_default_prefix
		;;
	esac
fi
echo "$as_me:1690: result: $prefix" >&5
echo "${ECHO_T}$prefix" >&6

if test "x$prefix" = "xNONE" ; then
echo "$as_me:1694: checking for default include-directory" >&5
echo $ECHO_N "checking for default include-directory... $ECHO_C" >&6
test -n "$verbose" && echo 1>&6
for cf_symbol in \
	"$includedir" \
	"$includedir/ncurses" \
	"$prefix/include" \
	"$prefix/include/ncurses" \
	/usr/local/include \
	/usr/local/include/ncurses \
	/usr/include \
	/usr/include/ncurses
do
	cf_dir=`eval echo "$cf_symbol"`
	if test -f "$cf_dir/curses.h" ; then
	if ( ${FGREP-fgrep} NCURSES_VERSION "$cf_dir/curses.h" >/dev/null 2>&1 ) ; then
		includedir="$cf_symbol"
		test -n "$verbose"  && echo $ECHO_N "	found " 1>&6
		break
	fi
	fi
	test -n "$verbose"  && echo "	tested $cf_dir" 1>&6
done
echo "$as_me:1717: result: $includedir" >&5
echo "${ECHO_T}$includedir" >&6
fi

### Defaults for ncurses ABI

case x$cf_cv_abi_version in
(x[6789])
	cf_dft_ext_colors=yes
	cf_dft_ext_const=yes
	cf_dft_ext_mouse=yes
	cf_dft_ext_putwin=yes
	cf_dft_ext_spfuncs=yes
	cf_dft_filter_syms=yes
	cf_dft_chtype=uint32_t
	cf_dft_mmask_t=uint32_t
	cf_dft_interop=yes
	cf_dft_tparm_arg=intptr_t
	cf_dft_with_lp64=yes
	;;
(*)
	cf_dft_ext_colors=no
	cf_dft_ext_const=no
	cf_dft_ext_mouse=no
	cf_dft_ext_putwin=no
	cf_dft_ext_spfuncs=no
	cf_dft_filter_syms=no
	cf_dft_chtype=auto
	cf_dft_mmask_t=auto
	cf_dft_interop=no
	cf_dft_tparm_arg=long
	cf_dft_with_lp64=no
	;;
esac

###	Checks for programs.

# Check whether --with-ada or --without-ada was given.
if test "${with_ada+set}" = set; then
  withval="$with_ada"
  cf_with_ada=$withval
else
  cf_with_ada=yes
fi;

if test "x$cf_with_ada" = xyes
then
	cf_prog_cc="gnatgcc gcc cc"
else
	cf_prog_cc="gcc cc"
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
ac_main_return="return"
if test -n "$ac_tool_prefix"; then
  for ac_prog in $cf_prog_cc
  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
echo "$as_me:1780: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_CC+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
echo "$as_me:1795: found $ac_dir/$ac_word" >&5
break
done

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  echo "$as_me:1803: result: $CC" >&5
echo "${ECHO_T}$CC" >&6
else
  echo "$as_me:1806: result: no" >&5
echo "${ECHO_T}no" >&6
fi

    test -n "$CC" && break
  done
fi
if test -z "$CC"; then
  ac_ct_CC=$CC
  for ac_prog in $cf_prog_cc
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:1819: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&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
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_ac_ct_CC="$ac_prog"
echo "$as_me:1834: found $ac_dir/$ac_word" >&5
break
done

fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
  echo "$as_me:1842: result: $ac_ct_CC" >&5
echo "${ECHO_T}$ac_ct_CC" >&6
else
  echo "$as_me:1845: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  test -n "$ac_ct_CC" && break
done

  CC=$ac_ct_CC
fi

test -z "$CC" && { { echo "$as_me:1855: error: no acceptable cc found in \$PATH" >&5
echo "$as_me: error: no acceptable cc found in \$PATH" >&2;}
   { (exit 1); exit 1; }; }

# Provide some information about the compiler.
echo "$as_me:1860:" \
     "checking for C compiler version" >&5
ac_compiler=`set X $ac_compile; echo "$2"`
{ (eval echo "$as_me:1863: \"$ac_compiler --version </dev/null >&5\"") >&5
  (eval $ac_compiler --version </dev/null >&5) 2>&5
  ac_status=$?
  echo "$as_me:1866: \$? = $ac_status" >&5
  (exit "$ac_status"); }
{ (eval echo "$as_me:1868: \"$ac_compiler -v </dev/null >&5\"") >&5
  (eval $ac_compiler -v </dev/null >&5) 2>&5
  ac_status=$?
  echo "$as_me:1871: \$? = $ac_status" >&5
  (exit "$ac_status"); }
{ (eval echo "$as_me:1873: \"$ac_compiler -V </dev/null >&5\"") >&5
  (eval $ac_compiler -V </dev/null >&5) 2>&5
  ac_status=$?
  echo "$as_me:1876: \$? = $ac_status" >&5
  (exit "$ac_status"); }

cat >"conftest.$ac_ext" <<_ACEOF
#line 1880 "configure"
#include "confdefs.h"

int
main (void)
{

  ;
  return 0;
}
_ACEOF
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files a.out a.exe"
# 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.
echo "$as_me:1896: checking for C compiler default output" >&5
echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
ac_link_default=`echo "$ac_link" | sed 's/ -o *"conftest[^"]*"//'`
if { (eval echo "$as_me:1899: \"$ac_link_default\"") >&5
  (eval $ac_link_default) 2>&5
  ac_status=$?
  echo "$as_me:1902: \$? = $ac_status" >&5
  (exit "$ac_status"); }; then
  # Find the output, starting from the most likely.  This scheme is
# not robust to junk in `.', hence go to wildcards (a.*) only as a last
# resort.
for ac_file in `ls a.exe conftest.exe 2>/dev/null;
                ls a.out conftest 2>/dev/null;
                ls a.* conftest.* 2>/dev/null`; do
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
    a.out ) # We found the default executable, but exeext='' is most
            # certainly right.
            break;;
    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
          # FIXME: I believe we export ac_cv_exeext for Libtool --akim.
          export ac_cv_exeext
          break;;
    * ) break;;
  esac
done
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
{ { echo "$as_me:1925: error: C compiler cannot create executables" >&5
echo "$as_me: error: C compiler cannot create executables" >&2;}
   { (exit 77); exit 77; }; }
fi

ac_exeext=$ac_cv_exeext
echo "$as_me:1931: result: $ac_file" >&5
echo "${ECHO_T}$ac_file" >&6

# Check the compiler produces executables we can run.  If not, either
# the compiler is broken, or we cross compile.
echo "$as_me:1936: checking whether the C compiler works" >&5
echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
# If not cross compiling, check that we can run a simple program.
if test "$cross_compiling" != yes; then
  if { ac_try='./$ac_file'
  { (eval echo "$as_me:1942: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:1945: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
    cross_compiling=no
  else
    if test "$cross_compiling" = maybe; then
	cross_compiling=yes
    else
	{ { echo "$as_me:1952: error: cannot run C compiled programs.
If you meant to cross compile, use \`--host'." >&5
echo "$as_me: error: cannot run C compiled programs.
If you meant to cross compile, use \`--host'." >&2;}
   { (exit 1); exit 1; }; }
    fi
  fi
fi
echo "$as_me:1960: result: yes" >&5
echo "${ECHO_T}yes" >&6

rm -f a.out a.exe "conftest$ac_cv_exeext"
ac_clean_files=$ac_clean_files_save
# Check the compiler produces executables we can run.  If not, either
# the compiler is broken, or we cross compile.
echo "$as_me:1967: checking whether we are cross compiling" >&5
echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
echo "$as_me:1969: result: $cross_compiling" >&5
echo "${ECHO_T}$cross_compiling" >&6

echo "$as_me:1972: checking for executable suffix" >&5
echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6
if { (eval echo "$as_me:1974: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:1977: \$? = $ac_status" >&5
  (exit "$ac_status"); }; 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 `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
          export ac_cv_exeext
          break;;
    * ) break;;
  esac
done
else
  { { echo "$as_me:1993: error: cannot compute EXEEXT: cannot compile and link" >&5
echo "$as_me: error: cannot compute EXEEXT: cannot compile and link" >&2;}
   { (exit 1); exit 1; }; }
fi

rm -f "conftest$ac_cv_exeext"
echo "$as_me:1999: result: $ac_cv_exeext" >&5
echo "${ECHO_T}$ac_cv_exeext" >&6

rm -f "conftest.$ac_ext"
EXEEXT=$ac_cv_exeext
ac_exeext=$EXEEXT
echo "$as_me:2005: checking for object suffix" >&5
echo $ECHO_N "checking for object suffix... $ECHO_C" >&6
if test "${ac_cv_objext+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 2011 "configure"
#include "confdefs.h"

int
main (void)
{

  ;
  return 0;
}
_ACEOF
rm -f conftest.o conftest.obj
if { (eval echo "$as_me:2023: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:2026: \$? = $ac_status" >&5
  (exit "$ac_status"); }; then
  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.map | *.inf ) ;;
    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
       break;;
  esac
done
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
{ { echo "$as_me:2038: error: cannot compute OBJEXT: cannot compile" >&5
echo "$as_me: error: cannot compute OBJEXT: cannot compile" >&2;}
   { (exit 1); exit 1; }; }
fi

rm -f "conftest.$ac_cv_objext" "conftest.$ac_ext"
fi
echo "$as_me:2045: result: $ac_cv_objext" >&5
echo "${ECHO_T}$ac_cv_objext" >&6
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
echo "$as_me:2049: checking whether we are using the GNU C compiler" >&5
echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
if test "${ac_cv_c_compiler_gnu+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 2055 "configure"
#include "confdefs.h"

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

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:2070: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:2073: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:2076: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:2079: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_compiler_gnu=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_compiler_gnu=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
ac_cv_c_compiler_gnu=$ac_compiler_gnu

fi
echo "$as_me:2091: result: $ac_cv_c_compiler_gnu" >&5
echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
GCC=`test $ac_compiler_gnu = yes && echo yes`
ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS
CFLAGS="-g"
echo "$as_me:2097: checking whether $CC accepts -g" >&5
echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
if test "${ac_cv_prog_cc_g+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 2103 "configure"
#include "confdefs.h"

int
main (void)
{

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:2115: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:2118: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:2121: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:2124: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_prog_cc_g=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_prog_cc_g=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:2134: result: $ac_cv_prog_cc_g" >&5
echo "${ECHO_T}$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
# Some people use a C++ compiler to compile C.  Since we use `exit',
# in C++ we need to declare it.  In case someone uses the same compiler
# for both compiling C and C++ we need to have the C++ compiler decide
# the declaration of exit, since it's the most demanding environment.
cat >"conftest.$ac_ext" <<_ACEOF
#ifndef __cplusplus
  choke me
#endif
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:2161: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:2164: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:2167: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:2170: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  for ac_declaration in \
   ''\
   '#include <stdlib.h>' \
   'extern "C" void std::exit (int) throw (); using std::exit;' \
   'extern "C" void std::exit (int); using std::exit;' \
   'extern "C" void exit (int) throw ();' \
   'extern "C" void exit (int);' \
   'void exit (int);'
do
  cat >"conftest.$ac_ext" <<_ACEOF
#line 2182 "configure"
#include "confdefs.h"
#include <stdlib.h>
$ac_declaration
int
main (void)
{
exit (42);
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:2195: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:2198: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:2201: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:2204: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  :
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
continue
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  cat >"conftest.$ac_ext" <<_ACEOF
#line 2214 "configure"
#include "confdefs.h"
$ac_declaration
int
main (void)
{
exit (42);
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:2226: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:2229: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:2232: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:2235: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
done
rm -rf conftest*
if test -n "$ac_declaration"; then
  echo '#ifdef __cplusplus' >>confdefs.h
  echo "$ac_declaration"    >>confdefs.h
  echo '#endif'             >>confdefs.h
fi

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
ac_main_return="return"

GCC_VERSION=none
if test "$GCC" = yes ; then
	echo "$as_me:2265: checking version of $CC" >&5
echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
	GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(GCC[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
	test -z "$GCC_VERSION" && GCC_VERSION=unknown
	echo "$as_me:2269: result: $GCC_VERSION" >&5
echo "${ECHO_T}$GCC_VERSION" >&6
fi

INTEL_COMPILER=no

if test "$GCC" = yes ; then
	case "$host_os" in
	(linux*|gnu*)
		echo "$as_me:2278: checking if this is really Intel C compiler" >&5
echo $ECHO_N "checking if this is really Intel C compiler... $ECHO_C" >&6
		cf_save_CFLAGS="$CFLAGS"
		CFLAGS="$CFLAGS -no-gcc"
		cat >"conftest.$ac_ext" <<_ACEOF
#line 2283 "configure"
#include "confdefs.h"

int
main (void)
{

#ifdef __INTEL_COMPILER
#else
make an error
#endif

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:2300: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:2303: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:2306: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:2309: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  INTEL_COMPILER=yes
cf_save_CFLAGS="$cf_save_CFLAGS -we147"

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
		CFLAGS="$cf_save_CFLAGS"
		echo "$as_me:2320: result: $INTEL_COMPILER" >&5
echo "${ECHO_T}$INTEL_COMPILER" >&6
		;;
	esac
fi

CLANG_COMPILER=no

if test "$GCC" = yes ; then
	echo "$as_me:2329: checking if this is really Clang C compiler" >&5
echo $ECHO_N "checking if this is really Clang C compiler... $ECHO_C" >&6
	cf_save_CFLAGS="$CFLAGS"
	cat >"conftest.$ac_ext" <<_ACEOF
#line 2333 "configure"
#include "confdefs.h"

int
main (void)
{

#ifdef __clang__
#else
make an error
#endif

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:2350: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:2353: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:2356: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:2359: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  CLANG_COMPILER=yes

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
	CFLAGS="$cf_save_CFLAGS"
	echo "$as_me:2369: result: $CLANG_COMPILER" >&5
echo "${ECHO_T}$CLANG_COMPILER" >&6
fi

CLANG_VERSION=none

if test "x$CLANG_COMPILER" = "xyes" ; then
	case "$CC" in
	(c[1-9][0-9]|*/c[1-9][0-9])
		{ echo "$as_me:2378: WARNING: replacing broken compiler alias $CC" >&5
echo "$as_me: WARNING: replacing broken compiler alias $CC" >&2;}
		CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`"
		CC=clang
		;;
	esac

	echo "$as_me:2385: checking version of $CC" >&5
echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
	CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
	test -z "$CLANG_VERSION" && CLANG_VERSION=unknown
	echo "$as_me:2389: result: $CLANG_VERSION" >&5
echo "${ECHO_T}$CLANG_VERSION" >&6

	for cf_clang_opt in \
		-Qunused-arguments \
		-Wno-error=implicit-function-declaration
	do
		echo "$as_me:2396: checking if option $cf_clang_opt works" >&5
echo $ECHO_N "checking if option $cf_clang_opt works... $ECHO_C" >&6
		cf_save_CFLAGS="$CFLAGS"
		CFLAGS="$CFLAGS $cf_clang_opt"
		cat >"conftest.$ac_ext" <<_ACEOF
#line 2401 "configure"
#include "confdefs.h"

			#include <stdio.h>
int
main (void)
{

			printf("hello!\\n");
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:2415: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:2418: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:2421: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:2424: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

			cf_clang_optok=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

			cf_clang_optok=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
		echo "$as_me:2435: result: $cf_clang_optok" >&5
echo "${ECHO_T}$cf_clang_optok" >&6
		CFLAGS="$cf_save_CFLAGS"
		if test "$cf_clang_optok" = yes; then
			test -n "$verbose" && echo "	adding option $cf_clang_opt" 1>&6

echo "${as_me:-configure}:2441: testing adding option $cf_clang_opt ..." 1>&5

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_clang_opt"

		fi
	done
fi

echo "$as_me:2450: checking for $CC option to accept ANSI C" >&5
echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
if test "${ac_cv_prog_cc_stdc+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_cv_prog_cc_stdc=no
ac_save_CC=$CC
cat >"conftest.$ac_ext" <<_ACEOF
#line 2458 "configure"
#include "confdefs.h"
#include <stdarg.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
/* 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;
}
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 (void)
{
return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
  ;
  return 0;
}
_ACEOF
# Don't try gcc -ansi; that turns off useful extensions and
# breaks some systems' header files.
# AIX			-qlanglvl=ansi
# Ultrix and OSF/1	-std1
# HP-UX 10.20 and later	-Ae
# HP-UX older versions	-Aa -D_HPUX_SOURCE
# SVR4			-Xc -D__EXTENSIONS__
for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
  CC="$ac_save_CC $ac_arg"
  rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:2507: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:2510: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:2513: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:2516: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_prog_cc_stdc=$ac_arg
break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext"
done
rm -f "conftest.$ac_ext" "conftest.$ac_objext"
CC=$ac_save_CC

fi

case "x$ac_cv_prog_cc_stdc" in
  x|xno)
    echo "$as_me:2533: result: none needed" >&5
echo "${ECHO_T}none needed" >&6 ;;
  *)
    echo "$as_me:2536: result: $ac_cv_prog_cc_stdc" >&5
echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
    CC="$CC $ac_cv_prog_cc_stdc" ;;
esac

# This should have been defined by AC_PROG_CC
: "${CC:=cc}"

echo "$as_me:2544: checking \$CFLAGS variable" >&5
echo $ECHO_N "checking \$CFLAGS variable... $ECHO_C" >&6
case "x$CFLAGS" in
(*-[IUD]*)
	echo "$as_me:2548: result: broken" >&5
echo "${ECHO_T}broken" >&6
	{ echo "$as_me:2550: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&5
echo "$as_me: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&2;}
	cf_flags="$CFLAGS"
	CFLAGS=
	for cf_arg in $cf_flags
	do

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in $cf_arg
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

	done
	;;
(*)
	echo "$as_me:2658: result: ok" >&5
echo "${ECHO_T}ok" >&6
	;;
esac

echo "$as_me:2663: checking \$CC variable" >&5
echo $ECHO_N "checking \$CC variable... $ECHO_C" >&6
case "$CC" in
(*[\ \	]-*)
	echo "$as_me:2667: result: broken" >&5
echo "${ECHO_T}broken" >&6
	{ echo "$as_me:2669: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&5
echo "$as_me: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&2;}
	# humor him...
	cf_prog=`echo "$CC" | sed -e 's/	/ /g' -e 's/[ ]* / /g' -e 's/[ ]*[ ]-[^ ].*//'`
	cf_flags=`echo "$CC" | ${AWK:-awk} -v prog="$cf_prog" '{ printf("%s", substr($0,1+length(prog))); }'`
	CC="$cf_prog"
	for cf_arg in $cf_flags
	do
		case "x$cf_arg" in
		(x-[IUDfgOW]*)

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in $cf_arg
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

			;;
		(*)
			CC="$CC $cf_arg"
			;;
		esac
	done
	test -n "$verbose" && echo "	resulting CC: '$CC'" 1>&6

echo "${as_me:-configure}:2786: testing resulting CC: '$CC' ..." 1>&5

	test -n "$verbose" && echo "	resulting CFLAGS: '$CFLAGS'" 1>&6

echo "${as_me:-configure}:2790: testing resulting CFLAGS: '$CFLAGS' ..." 1>&5

	test -n "$verbose" && echo "	resulting CPPFLAGS: '$CPPFLAGS'" 1>&6

echo "${as_me:-configure}:2794: testing resulting CPPFLAGS: '$CPPFLAGS' ..." 1>&5

	;;
(*)
	echo "$as_me:2798: result: ok" >&5
echo "${ECHO_T}ok" >&6
	;;
esac

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
ac_main_return="return"
echo "$as_me:2809: checking how to run the C preprocessor" >&5
echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
  CPP=
fi
if test -z "$CPP"; then
  if test "${ac_cv_prog_CPP+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&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.
  # 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 >"conftest.$ac_ext" <<_ACEOF
#line 2830 "configure"
#include "confdefs.h"
#include <assert.h>
                     Syntax error
_ACEOF
if { (eval echo "$as_me:2835: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:2841: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  :
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err "conftest.$ac_ext"

  # OK, works on sane cases.  Now check whether non-existent headers
  # can be detected and how.
  cat >"conftest.$ac_ext" <<_ACEOF
#line 2864 "configure"
#include "confdefs.h"
#include <ac_nonexistent.h>
_ACEOF
if { (eval echo "$as_me:2868: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:2874: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  # Broken: success on invalid input.
continue
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err "conftest.$ac_ext"

done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f 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
echo "$as_me:2911: result: $CPP" >&5
echo "${ECHO_T}$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.
  # 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 >"conftest.$ac_ext" <<_ACEOF
#line 2921 "configure"
#include "confdefs.h"
#include <assert.h>
                     Syntax error
_ACEOF
if { (eval echo "$as_me:2926: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:2932: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  :
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err "conftest.$ac_ext"

  # OK, works on sane cases.  Now check whether non-existent headers
  # can be detected and how.
  cat >"conftest.$ac_ext" <<_ACEOF
#line 2955 "configure"
#include "confdefs.h"
#include <ac_nonexistent.h>
_ACEOF
if { (eval echo "$as_me:2959: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:2965: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  # Broken: success on invalid input.
continue
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err "conftest.$ac_ext"

done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.err "conftest.$ac_ext"
if $ac_preproc_ok; then
  :
else
  { { echo "$as_me:2993: error: C preprocessor \"$CPP\" fails sanity check" >&5
echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;}
   { (exit 1); exit 1; }; }
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
ac_main_return="return"

if test $ac_cv_c_compiler_gnu = yes; then
    echo "$as_me:3006: checking whether $CC needs -traditional" >&5
echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6
if test "${ac_cv_prog_gcc_traditional+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
    ac_pattern="Autoconf.*'x'"
  cat >"conftest.$ac_ext" <<_ACEOF
#line 3013 "configure"
#include "confdefs.h"
#include <sgtty.h>
int Autoconf = TIOCGETP;
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "$ac_pattern" >/dev/null 2>&1; then
  ac_cv_prog_gcc_traditional=yes
else
  ac_cv_prog_gcc_traditional=no
fi
rm -rf conftest*

  if test $ac_cv_prog_gcc_traditional = no; then
    cat >"conftest.$ac_ext" <<_ACEOF
#line 3028 "configure"
#include "confdefs.h"
#include <termio.h>
int Autoconf = TCGETA;
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "$ac_pattern" >/dev/null 2>&1; then
  ac_cv_prog_gcc_traditional=yes
fi
rm -rf conftest*

  fi
fi
echo "$as_me:3041: result: $ac_cv_prog_gcc_traditional" >&5
echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6
  if test $ac_cv_prog_gcc_traditional = yes; then
    CC="$CC -traditional"
  fi
fi

echo "$as_me:3048: checking whether $CC understands -c and -o together" >&5
echo $ECHO_N "checking whether $CC understands -c and -o together... $ECHO_C" >&6
if test "${cf_cv_prog_CC_c_o+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat > conftest.$ac_ext <<CF_EOF
int main(void)
{
	${cf_cv_main_return:-return}(0);
}
CF_EOF
# We do the test twice because some compilers refuse to overwrite an
# existing .o file with -o, though they will create one.
ac_try='$CC $CFLAGS $CPPFLAGS -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
if { (eval echo "$as_me:3063: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:3066: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
  test -f conftest2.$ac_objext && { (eval echo "$as_me:3068: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:3071: \$? = $ac_status" >&5
  (exit "$ac_status"); };
then
  eval cf_cv_prog_CC_c_o=yes
else
  eval cf_cv_prog_CC_c_o=no
fi
rm -rf ./conftest*

fi
if test "$cf_cv_prog_CC_c_o" = yes; then
  echo "$as_me:3082: result: yes" >&5
echo "${ECHO_T}yes" >&6
else
  echo "$as_me:3085: result: no" >&5
echo "${ECHO_T}no" >&6
fi

if test "$cross_compiling" = yes ; then
	LDCONFIG=:
else
	case "$cf_cv_system_name" in
	(dragonfly*|mirbsd*|freebsd*)
		test -z "$LDCONFIG" && LDCONFIG="/sbin/ldconfig -R"
		;;
	(*) LDPATH=$PATH:/sbin:/usr/sbin
		# Extract the first word of "ldconfig", so it can be a program name with args.
set dummy ldconfig; ac_word=$2
echo "$as_me:3099: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_LDCONFIG+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  case $LDCONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_LDCONFIG="$LDCONFIG" # Let the user override the test with a path.
  ;;
  *)
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$LDPATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  if $as_executable_p "$ac_dir/$ac_word"; then
   ac_cv_path_LDCONFIG="$ac_dir/$ac_word"
   echo "$as_me:3116: found $ac_dir/$ac_word" >&5
   break
fi
done

  ;;
esac
fi
LDCONFIG=$ac_cv_path_LDCONFIG

if test -n "$LDCONFIG"; then
  echo "$as_me:3127: result: $LDCONFIG" >&5
echo "${ECHO_T}$LDCONFIG" >&6
else
  echo "$as_me:3130: result: no" >&5
echo "${ECHO_T}no" >&6
fi

		;;
	esac
fi

echo "$as_me:3138: checking if you want to ensure bool is consistent with C++" >&5
echo $ECHO_N "checking if you want to ensure bool is consistent with C++... $ECHO_C" >&6

# Check whether --with-cxx or --without-cxx was given.
if test "${with_cxx+set}" = set; then
  withval="$with_cxx"
  cf_with_cxx=$withval
else
  cf_with_cxx=yes
fi;
echo "$as_me:3148: result: $cf_with_cxx" >&5
echo "${ECHO_T}$cf_with_cxx" >&6
if test "X$cf_with_cxx" = Xno ; then
	CXX=""
	GXX=""
else
	# with autoconf 2.13, we can change the error to a warning:
		ac_ext=cc
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
ac_main_return="return"
if test -n "$ac_tool_prefix"; then
  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
  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
echo "$as_me:3166: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_CXX+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$CXX"; then
  ac_cv_prog_CXX="$CXX" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
echo "$as_me:3181: found $ac_dir/$ac_word" >&5
break
done

fi
fi
CXX=$ac_cv_prog_CXX
if test -n "$CXX"; then
  echo "$as_me:3189: result: $CXX" >&5
echo "${ECHO_T}$CXX" >&6
else
  echo "$as_me:3192: result: no" >&5
echo "${ECHO_T}no" >&6
fi

    test -n "$CXX" && break
  done
fi
if test -z "$CXX"; then
  ac_ct_CXX=$CXX
  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:3205: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$ac_ct_CXX"; then
  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_ac_ct_CXX="$ac_prog"
echo "$as_me:3220: found $ac_dir/$ac_word" >&5
break
done

fi
fi
ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
if test -n "$ac_ct_CXX"; then
  echo "$as_me:3228: result: $ac_ct_CXX" >&5
echo "${ECHO_T}$ac_ct_CXX" >&6
else
  echo "$as_me:3231: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  test -n "$ac_ct_CXX" && break
done
test -n "$ac_ct_CXX" || ac_ct_CXX="g++"

  CXX=$ac_ct_CXX
fi

# Provide some information about the compiler.
echo "$as_me:3243:" \
     "checking for C++ compiler version" >&5
ac_compiler=`set X $ac_compile; echo $2`
{ (eval echo "$as_me:3246: \"$ac_compiler --version </dev/null >&5\"") >&5
  (eval $ac_compiler --version </dev/null >&5) 2>&5
  ac_status=$?
  echo "$as_me:3249: \$? = $ac_status" >&5
  (exit "$ac_status"); }
{ (eval echo "$as_me:3251: \"$ac_compiler -v </dev/null >&5\"") >&5
  (eval $ac_compiler -v </dev/null >&5) 2>&5
  ac_status=$?
  echo "$as_me:3254: \$? = $ac_status" >&5
  (exit "$ac_status"); }
{ (eval echo "$as_me:3256: \"$ac_compiler -V </dev/null >&5\"") >&5
  (eval $ac_compiler -V </dev/null >&5) 2>&5
  ac_status=$?
  echo "$as_me:3259: \$? = $ac_status" >&5
  (exit "$ac_status"); }

echo "$as_me:3262: checking whether we are using the GNU C++ compiler" >&5
echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 3268 "configure"
#include "confdefs.h"

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

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:3283: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:3286: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:3289: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:3292: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_compiler_gnu=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_compiler_gnu=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
ac_cv_cxx_compiler_gnu=$ac_compiler_gnu

fi
echo "$as_me:3304: result: $ac_cv_cxx_compiler_gnu" >&5
echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
GXX=`test $ac_compiler_gnu = yes && echo yes`
ac_test_CXXFLAGS=${CXXFLAGS+set}
ac_save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="-g"
echo "$as_me:3310: checking whether $CXX accepts -g" >&5
echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
if test "${ac_cv_prog_cxx_g+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 3316 "configure"
#include "confdefs.h"

int
main (void)
{

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:3328: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:3331: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:3334: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:3337: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_prog_cxx_g=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_prog_cxx_g=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:3347: result: $ac_cv_prog_cxx_g" >&5
echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
if test "$ac_test_CXXFLAGS" = set; then
  CXXFLAGS=$ac_save_CXXFLAGS
elif test $ac_cv_prog_cxx_g = yes; then
  if test "$GXX" = yes; then
    CXXFLAGS="-g -O2"
  else
    CXXFLAGS="-g"
  fi
else
  if test "$GXX" = yes; then
    CXXFLAGS="-O2"
  else
    CXXFLAGS=
  fi
fi
for ac_declaration in \
   ''\
   '#include <stdlib.h>' \
   'extern "C" void std::exit (int) throw (); using std::exit;' \
   'extern "C" void std::exit (int); using std::exit;' \
   'extern "C" void exit (int) throw ();' \
   'extern "C" void exit (int);' \
   'void exit (int);'
do
  cat >"conftest.$ac_ext" <<_ACEOF
#line 3374 "configure"
#include "confdefs.h"
#include <stdlib.h>
$ac_declaration
int
main (void)
{
exit (42);
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:3387: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:3390: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:3393: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:3396: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  :
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
continue
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  cat >"conftest.$ac_ext" <<_ACEOF
#line 3406 "configure"
#include "confdefs.h"
$ac_declaration
int
main (void)
{
exit (42);
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:3418: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:3421: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:3424: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:3427: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
done
rm -rf conftest*
if test -n "$ac_declaration"; then
  echo '#ifdef __cplusplus' >>confdefs.h
  echo "$ac_declaration"    >>confdefs.h
  echo '#endif'             >>confdefs.h
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
ac_main_return="return"

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

	if test "x$cf_with_cxx" != xno
	then
		# Several of the C++ configurations do not work, particularly when
		# cross-compiling (20140913 -TD)
		echo "$as_me:3461: checking if $CXX works" >&5
echo $ECHO_N "checking if $CXX works... $ECHO_C" >&6

		save_CPPFLAGS="$CPPFLAGS"
		eval cf_includedir=${includedir}
		CPPFLAGS="$CPPFLAGS -I${cf_includedir}"

cat >"conftest.$ac_ext" <<_ACEOF
#line 3469 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>

int
main (void)
{

		printf("Hello world!\n")

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:3486: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:3489: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:3492: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:3495: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cxx_works=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cxx_works=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
		CPPFLAGS="$save_CPPFLAGS"

		echo "$as_me:3506: result: $cf_cxx_works" >&5
echo "${ECHO_T}$cf_cxx_works" >&6
		if test "x$cf_cxx_works" = xno
		then
			{ echo "$as_me:3510: WARNING: Ignore $CXX, since it cannot compile hello-world." >&5
echo "$as_me: WARNING: Ignore $CXX, since it cannot compile hello-world." >&2;}
			cf_with_cxx=no; CXX=""; GXX="";
		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
ac_main_return="return"

	# autoconf 2.5x removed the error (hardcoding it to g++, or just blank)
	if test "$CXX" = "g++" ; then
		# Extract the first word of "g++", so it can be a program name with args.
set dummy g++; ac_word=$2
echo "$as_me:3526: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_CXX+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  case $CXX in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_CXX="$CXX" # Let the user override the test with a path.
  ;;
  *)
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  if $as_executable_p "$ac_dir/$ac_word"; then
   ac_cv_path_CXX="$ac_dir/$ac_word"
   echo "$as_me:3543: found $ac_dir/$ac_word" >&5
   break
fi
done

  ;;
esac
fi
CXX=$ac_cv_path_CXX

if test -n "$CXX"; then
  echo "$as_me:3554: result: $CXX" >&5
echo "${ECHO_T}$CXX" >&6
else
  echo "$as_me:3557: result: no" >&5
echo "${ECHO_T}no" >&6
fi

	fi
	case "x$CXX" in
	(x|xg++)
		{ echo "$as_me:3564: WARNING: You don't have any C++ compiler, too bad" >&5
echo "$as_me: WARNING: You don't have any C++ compiler, too bad" >&2;}
		cf_with_cxx=no; CXX=""; GXX="";
		;;
	esac
fi

GXX_VERSION=none
if test "$GXX" = yes; then
	echo "$as_me:3573: checking version of ${CXX:-g++}" >&5
echo $ECHO_N "checking version of ${CXX:-g++}... $ECHO_C" >&6
	GXX_VERSION="`${CXX:-g++} --version| sed -e '2,$d' -e 's/^.*(GCC) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
	if test -z "$GXX_VERSION"
	then
		GXX_VERSION=unknown
		GXX=no
	fi
	echo "$as_me:3581: result: $GXX_VERSION" >&5
echo "${ECHO_T}$GXX_VERSION" >&6
fi

case "$GXX_VERSION" in
([1-9][0-9].*)
	;;
(1.*|2.[0-6]*)
	{ echo "$as_me:3589: WARNING: templates do not work" >&5
echo "$as_me: WARNING: templates do not work" >&2;}
	;;
esac

echo "$as_me:3594: checking if you want to build C++ binding and demo" >&5
echo $ECHO_N "checking if you want to build C++ binding and demo... $ECHO_C" >&6

# Check whether --with-cxx-binding or --without-cxx-binding was given.
if test "${with_cxx_binding+set}" = set; then
  withval="$with_cxx_binding"
  cf_with_cxx_binding=$withval
else
  cf_with_cxx_binding=$cf_with_cxx
fi;
echo "$as_me:3604: result: $cf_with_cxx_binding" >&5
echo "${ECHO_T}$cf_with_cxx_binding" >&6

echo "$as_me:3607: checking if you want to build with Ada" >&5
echo $ECHO_N "checking if you want to build with Ada... $ECHO_C" >&6
echo "$as_me:3609: result: $cf_with_ada" >&5
echo "${ECHO_T}$cf_with_ada" >&6

echo "$as_me:3612: checking if you want to install terminal database" >&5
echo $ECHO_N "checking if you want to install terminal database... $ECHO_C" >&6

# Check whether --enable-db-install or --disable-db-install was given.
if test "${enable_db_install+set}" = set; then
  enableval="$enable_db_install"
  cf_with_db_install=$enableval
else
  cf_with_db_install=yes
fi;
echo "$as_me:3622: result: $cf_with_db_install" >&5
echo "${ECHO_T}$cf_with_db_install" >&6

echo "$as_me:3625: checking if you want to install manpages" >&5
echo $ECHO_N "checking if you want to install manpages... $ECHO_C" >&6

# Check whether --with-manpages or --without-manpages was given.
if test "${with_manpages+set}" = set; then
  withval="$with_manpages"
  cf_with_manpages=$withval
else
  cf_with_manpages=yes
fi;
echo "$as_me:3635: result: $cf_with_manpages" >&5
echo "${ECHO_T}$cf_with_manpages" >&6

echo "$as_me:3638: checking if you want to build programs such as tic" >&5
echo $ECHO_N "checking if you want to build programs such as tic... $ECHO_C" >&6

# Check whether --with-progs or --without-progs was given.
if test "${with_progs+set}" = set; then
  withval="$with_progs"
  cf_with_progs=$withval
else
  cf_with_progs=yes
fi;
echo "$as_me:3648: result: $cf_with_progs" >&5
echo "${ECHO_T}$cf_with_progs" >&6

if test -f "$srcdir/tack/tack.h" ; then
	if test "x$cross_compiling" = xyes ; then
		test -n "$verbose" && echo "	ignoring tack because we are cross-compiling" 1>&6

echo "${as_me:-configure}:3655: testing ignoring tack because we are cross-compiling ..." 1>&5

		cf_with_tack=no
	else
		echo "$as_me:3659: checking if you want to build the tack program" >&5
echo $ECHO_N "checking if you want to build the tack program... $ECHO_C" >&6

# Check whether --with-tack or --without-tack was given.
if test "${with_tack+set}" = set; then
  withval="$with_tack"
  cf_with_tack=$withval
else
  cf_with_tack=$cf_with_progs
fi;
		echo "$as_me:3669: result: $cf_with_tack" >&5
echo "${ECHO_T}$cf_with_tack" >&6
	fi
else
	cf_with_tack=no
fi

echo "$as_me:3676: checking if you want to build test-programs" >&5
echo $ECHO_N "checking if you want to build test-programs... $ECHO_C" >&6

# Check whether --with-tests or --without-tests was given.
if test "${with_tests+set}" = set; then
  withval="$with_tests"
  cf_with_tests=$withval
else
  cf_with_tests=yes
fi;
echo "$as_me:3686: result: $cf_with_tests" >&5
echo "${ECHO_T}$cf_with_tests" >&6

echo "$as_me:3689: checking if you wish to install curses.h" >&5
echo $ECHO_N "checking if you wish to install curses.h... $ECHO_C" >&6

# Check whether --with-curses-h or --without-curses-h was given.
if test "${with_curses_h+set}" = set; then
  withval="$with_curses_h"
  with_curses_h=$withval
else
  with_curses_h=yes
fi;
echo "$as_me:3699: result: $with_curses_h" >&5
echo "${ECHO_T}$with_curses_h" >&6

modules_to_build="ncurses"
test "X$cf_with_progs" != Xno && modules_to_build="$modules_to_build progs"
test "X$cf_with_tack"  != Xno && modules_to_build="$modules_to_build tack"
modules_to_build="$modules_to_build panel menu form"

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 $.  echo might interpret backslashes.
# By default was `s,x,x', remove it if useless.
cat <<\_ACEOF >conftest.sed
s/[\\$]/&&/g;s/;s,x,x,$//
_ACEOF
program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
rm conftest.sed

for ac_prog in mawk gawk 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
echo "$as_me:3724: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_AWK+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$AWK"; then
  ac_cv_prog_AWK="$AWK" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_AWK="$ac_prog"
echo "$as_me:3739: found $ac_dir/$ac_word" >&5
break
done

fi
fi
AWK=$ac_cv_prog_AWK
if test -n "$AWK"; then
  echo "$as_me:3747: result: $AWK" >&5
echo "${ECHO_T}$AWK" >&6
else
  echo "$as_me:3750: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  test -n "$AWK" && break
done

test -z "$AWK" && { { echo "$as_me:3757: error: No awk program found" >&5
echo "$as_me: error: No awk program found" >&2;}
   { (exit 1); exit 1; }; }

# 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"
# ./install, which can be erroneously created by make from ./install.sh.
echo "$as_me:3773: checking for a BSD compatible install" >&5
echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6
if test -z "$INSTALL"; then
if test "${ac_cv_path_install+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
    ac_save_IFS=$IFS; IFS=$ac_path_separator
  for ac_dir in $PATH; do
    IFS=$ac_save_IFS
    # Account for people who put trailing slashes in PATH elements.
    case $ac_dir/ in
    / | ./ | .// | /cC/* \
    | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \
    | /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
        if $as_executable_p "$ac_dir/$ac_prog"; then
	  if test $ac_prog = install &&
            grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then
	    # AIX install.  It has an incompatible calling convention.
	    :
	  elif test $ac_prog = install &&
	    grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then
	    # program-specific install script used by HP pwplus--don't use.
	    :
	  else
	    ac_cv_path_install="$ac_dir/$ac_prog -c"
	    break 2
	  fi
	fi
      done
      ;;
    esac
  done

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.  We don't cache a
    # path for INSTALL within a source directory, because that will
    # break other packages using the cache if that directory is
    # removed, or if the path is relative.
    INSTALL=$ac_install_sh
  fi
fi
echo "$as_me:3822: result: $INSTALL" >&5
echo "${ECHO_T}$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'

case $INSTALL in
(/*)
	;;
(*)
	cf_dir=`echo "$INSTALL" | sed -e 's%/[^/]*$%%'`
	test -z "$cf_dir" && cf_dir=.
	INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`"
	;;
esac

for ac_prog in lint cppcheck splint
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:3847: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_LINT+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$LINT"; then
  ac_cv_prog_LINT="$LINT" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_LINT="$ac_prog"
echo "$as_me:3862: found $ac_dir/$ac_word" >&5
break
done

fi
fi
LINT=$ac_cv_prog_LINT
if test -n "$LINT"; then
  echo "$as_me:3870: result: $LINT" >&5
echo "${ECHO_T}$LINT" >&6
else
  echo "$as_me:3873: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  test -n "$LINT" && break
done

case "x$LINT" in
(xcppcheck|x*/cppcheck)
	test -z "$LINT_OPTS" && LINT_OPTS="--enable=all"
	;;
esac

echo "$as_me:3886: checking whether ln -s works" >&5
echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
LN_S=$as_ln_s
if test "$LN_S" = "ln -s"; then
  echo "$as_me:3890: result: yes" >&5
echo "${ECHO_T}yes" >&6
else
  echo "$as_me:3893: result: no, using $LN_S" >&5
echo "${ECHO_T}no, using $LN_S" >&6
fi

echo "$as_me:3897: checking if $LN_S -f options work" >&5
echo $ECHO_N "checking if $LN_S -f options work... $ECHO_C" >&6

rm -f conf$$.src conf$$dst
echo >conf$$.dst
echo first >conf$$.src
if $LN_S -f conf$$.src conf$$.dst 2>/dev/null; then
	cf_prog_ln_sf=yes
else
	cf_prog_ln_sf=no
fi
rm -f conf$$.dst conf$$src
echo "$as_me:3909: result: $cf_prog_ln_sf" >&5
echo "${ECHO_T}$cf_prog_ln_sf" >&6

test "$cf_prog_ln_sf" = yes && LN_S="$LN_S -f"

echo "$as_me:3914: checking for long file names" >&5
echo $ECHO_N "checking for long file names... $ECHO_C" >&6
if test "${ac_cv_sys_long_file_names+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_cv_sys_long_file_names=yes
# Test for long file names in all the places we know might matter:
#      .		the current directory, where building will happen
#      $prefix/lib	where we will be installing things
#      $exec_prefix/lib	likewise
# eval it to expand exec_prefix.
#      $TMPDIR		if set, where it might want to write temporary files
# if $TMPDIR is not set:
#      /tmp		where it might want to write temporary files
#      /var/tmp		likewise
#      /usr/tmp		likewise
if test -n "$TMPDIR" && test -d "$TMPDIR" && test -w "$TMPDIR"; then
  ac_tmpdirs=$TMPDIR
else
  ac_tmpdirs='/tmp /var/tmp /usr/tmp'
fi
for ac_dir in  . $ac_tmpdirs `eval echo "$prefix/lib" "$exec_prefix/lib"` ; do
  test -d "$ac_dir" || continue
  test -w "$ac_dir" || continue # It is less confusing to not echo anything here.
  ac_xdir=$ac_dir/cf$$
  (umask 077 && mkdir "$ac_xdir" 2>/dev/null) || continue
  ac_tf1=$ac_xdir/conftest9012345
  ac_tf2=$ac_xdir/conftest9012346
  (echo 1 >"$ac_tf1") 2>/dev/null
  (echo 2 >"$ac_tf2") 2>/dev/null
  ac_val=`cat "$ac_tf1" 2>/dev/null`
  if test ! -f "$ac_tf1" || test "$ac_val" != 1; then
    ac_cv_sys_long_file_names=no
    rm -rf "$ac_xdir" 2>/dev/null
    break
  fi
  rm -rf "$ac_xdir" 2>/dev/null
done
fi
echo "$as_me:3953: result: $ac_cv_sys_long_file_names" >&5
echo "${ECHO_T}$ac_cv_sys_long_file_names" >&6
if test "$ac_cv_sys_long_file_names" = yes; then

cat >>confdefs.h <<\EOF
#define HAVE_LONG_FILE_NAMES 1
EOF

fi

# Provide for renaming "ncurses5-config" to "ncurses5X-config", etc., in case
# of package conflict.
cf_config_suffix=

# Check whether --with-config-suffix or --without-config-suffix was given.
if test "${with_config_suffix+set}" = set; then
  withval="$with_config_suffix"
  case "x$withval" in
	(xyes|xno)
		{ echo "$as_me:3972: WARNING: expected a value for config-suffix option" >&5
echo "$as_me: WARNING: expected a value for config-suffix option" >&2;}
		;;
	(*)	cf_config_suffix="$withval"
		;;
	esac
fi;

# If we find pkg-config, check if we should install the ".pc" files.

echo "$as_me:3982: checking if you want to use pkg-config" >&5
echo $ECHO_N "checking if you want to use pkg-config... $ECHO_C" >&6

# Check whether --with-pkg-config or --without-pkg-config was given.
if test "${with_pkg_config+set}" = set; then
  withval="$with_pkg_config"
  cf_pkg_config=$withval
else
  cf_pkg_config=yes
fi;
echo "$as_me:3992: result: $cf_pkg_config" >&5
echo "${ECHO_T}$cf_pkg_config" >&6

case "$cf_pkg_config" in
(no)
	PKG_CONFIG=none
	;;
(yes)

if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
echo "$as_me:4004: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  case $PKG_CONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
  ;;
  *)
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  if $as_executable_p "$ac_dir/$ac_word"; then
   ac_cv_path_PKG_CONFIG="$ac_dir/$ac_word"
   echo "$as_me:4021: found $ac_dir/$ac_word" >&5
   break
fi
done

  ;;
esac
fi
PKG_CONFIG=$ac_cv_path_PKG_CONFIG

if test -n "$PKG_CONFIG"; then
  echo "$as_me:4032: result: $PKG_CONFIG" >&5
echo "${ECHO_T}$PKG_CONFIG" >&6
else
  echo "$as_me:4035: result: no" >&5
echo "${ECHO_T}no" >&6
fi

fi
if test -z "$ac_cv_path_PKG_CONFIG"; then
  ac_pt_PKG_CONFIG=$PKG_CONFIG
  # Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$2
echo "$as_me:4044: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  case $ac_pt_PKG_CONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
  ;;
  *)
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  if $as_executable_p "$ac_dir/$ac_word"; then
   ac_cv_path_ac_pt_PKG_CONFIG="$ac_dir/$ac_word"
   echo "$as_me:4061: found $ac_dir/$ac_word" >&5
   break
fi
done

  test -z "$ac_cv_path_ac_pt_PKG_CONFIG" && ac_cv_path_ac_pt_PKG_CONFIG="none"
  ;;
esac
fi
ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG

if test -n "$ac_pt_PKG_CONFIG"; then
  echo "$as_me:4073: result: $ac_pt_PKG_CONFIG" >&5
echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6
else
  echo "$as_me:4076: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  PKG_CONFIG=$ac_pt_PKG_CONFIG
else
  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
fi

	;;
(*)
	PKG_CONFIG=$withval
	;;
esac

test -z "$PKG_CONFIG" && PKG_CONFIG=none
if test "$PKG_CONFIG" != none ; then

if test "x$prefix" != xNONE; then
	cf_path_syntax="$prefix"
else
	cf_path_syntax="$ac_default_prefix"
fi

case ".$PKG_CONFIG" in
(.\$\(*\)*|.\'*\'*)
	;;
(..|./*|.\\*)
	;;
(.[a-zA-Z]:[\\/]*) # OS/2 EMX
	;;
(.\$\{*prefix\}*|.\$\{*dir\}*)
	eval PKG_CONFIG="$PKG_CONFIG"
	case ".$PKG_CONFIG" in
	(.NONE/*)
		PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%`
		;;
	esac
	;;
(.no|.NONE/*)
	PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%`
	;;
(*)
	{ { echo "$as_me:4119: error: expected a pathname, not \"$PKG_CONFIG\"" >&5
echo "$as_me: error: expected a pathname, not \"$PKG_CONFIG\"" >&2;}
   { (exit 1); exit 1; }; }
	;;
esac

elif test "x$cf_pkg_config" != xno ; then
	{ echo "$as_me:4126: WARNING: pkg-config is not installed" >&5
echo "$as_me: WARNING: pkg-config is not installed" >&2;}
fi

case "$PKG_CONFIG" in
(no|none|yes)
	echo "$as_me:4132: checking for pkg-config library directory" >&5
echo $ECHO_N "checking for pkg-config library directory... $ECHO_C" >&6
	;;
(*)
	echo "$as_me:4136: checking for $PKG_CONFIG library directory" >&5
echo $ECHO_N "checking for $PKG_CONFIG library directory... $ECHO_C" >&6
	;;
esac

cf_search_path=`echo "$PKG_CONFIG_LIBDIR" | sed -e 's/:/ /g' -e 's,^[ 	]*,,'`

# Check whether --with-pkg-config-libdir or --without-pkg-config-libdir was given.
if test "${with_pkg_config_libdir+set}" = set; then
  withval="$with_pkg_config_libdir"
  cf_search_path=$withval
else
  test "x$PKG_CONFIG" != xnone && cf_search_path=yes
fi;

case x$cf_search_path in
(x/*)
	;;
(xyes)
	cf_search_path=
	test -n "$verbose" && echo "	auto..." 1>&6

echo "${as_me:-configure}:4158: testing auto... ..." 1>&5

	# Look for the library directory using the same prefix as the executable
	echo "$as_me:4161: checking for search-list" >&5
echo $ECHO_N "checking for search-list... $ECHO_C" >&6
	if test "x$PKG_CONFIG" = xnone
	then
		cf_path=$prefix
	else
		cf_path=`echo "$PKG_CONFIG" | sed -e 's,/[^/]*/[^/]*$,,'`
		cf_search_path=`
		"$PKG_CONFIG" --debug --exists no-such-package 2>&1 | awk "\
/^Scanning directory #[1-9][0-9]* '.*'$/{ \
	sub(\"^[^']*'\",\"\"); \
	sub(\"'.*\",\"\"); \
	printf \" %s\", \\$0; } \
/trying path:/{
	sub(\"^.* trying path: \",\"\");
	sub(\" for no-such-package.*$\",\"\");
	printf \" %s\", \\$0;
}
{ next; } \
"`
	fi

	if test -z "$cf_search_path"
	then
		# If you don't like using the default architecture, you have to specify
		# the intended library directory and corresponding compiler/linker
		# options.
		#
		# This case allows for Debian's 2014-flavor of multiarch, along with
		# the most common variations before that point.  Some other variants
		# spell the directory differently, e.g., "pkg-config", and put it in
		# unusual places.
		#
		# pkg-config has always been poorly standardized, which is ironic...
		case x`(arch) 2>/dev/null` in
		(*64)
			cf_test_path="\
				$cf_path/lib/*64-linux-gnu \
				$cf_path/share \
				$cf_path/lib64 \
				$cf_path/lib32 \
				$cf_path/lib"
			;;
		(*)
			cf_test_path="\
				$cf_path/lib/*-linux-gnu \
				$cf_path/share \
				$cf_path/lib32 \
				$cf_path/lib \
				$cf_path/libdata"
			;;
		esac
		for cf_config in $cf_test_path
		do
			test -d "$cf_config/pkgconfig" && cf_search_path="$cf_search_path $cf_config/pkgconfig"
		done
	fi

	echo "$as_me:4219: result: $cf_search_path" >&5
echo "${ECHO_T}$cf_search_path" >&6

	;;
(*)
	;;
esac

echo "$as_me:4227: checking for first directory" >&5
echo $ECHO_N "checking for first directory... $ECHO_C" >&6
cf_pkg_config_path=none
for cf_config in $cf_search_path
do
	if test -d "$cf_config"
	then
		cf_pkg_config_path=$cf_config
		break
	fi
done
echo "$as_me:4238: result: $cf_pkg_config_path" >&5
echo "${ECHO_T}$cf_pkg_config_path" >&6

if test "x$cf_pkg_config_path" != xnone ; then
	# limit this to the first directory found
	PKG_CONFIG_LIBDIR="$cf_pkg_config_path"
fi

if test "x$PKG_CONFIG" != xnone
then
	echo "$as_me:4248: checking if we should install .pc files for $PKG_CONFIG" >&5
echo $ECHO_N "checking if we should install .pc files for $PKG_CONFIG... $ECHO_C" >&6
else
	echo "$as_me:4251: checking if we should install .pc files" >&5
echo $ECHO_N "checking if we should install .pc files... $ECHO_C" >&6
fi

# Check whether --enable-pc-files or --disable-pc-files was given.
if test "${enable_pc_files+set}" = set; then
  enableval="$enable_pc_files"
  enable_pc_files=$enableval
else
  enable_pc_files=no
fi;
echo "$as_me:4262: result: $enable_pc_files" >&5
echo "${ECHO_T}$enable_pc_files" >&6

if test "x$enable_pc_files" != xno
then
	MAKE_PC_FILES=
	case "x$PKG_CONFIG_LIBDIR" in
	(xno|xnone|xyes)
		{ echo "$as_me:4270: WARNING: no PKG_CONFIG_LIBDIR was found" >&5
echo "$as_me: WARNING: no PKG_CONFIG_LIBDIR was found" >&2;}
		;;
	(*)

if test "x$prefix" != xNONE; then
	cf_path_syntax="$prefix"
else
	cf_path_syntax="$ac_default_prefix"
fi

case ".$PKG_CONFIG_LIBDIR" in
(.\$\(*\)*|.\'*\'*)
	;;
(..|./*|.\\*)
	;;
(.[a-zA-Z]:[\\/]*) # OS/2 EMX
	;;
(.\$\{*prefix\}*|.\$\{*dir\}*)
	eval PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR"
	case ".$PKG_CONFIG_LIBDIR" in
	(.NONE/*)
		PKG_CONFIG_LIBDIR=`echo "$PKG_CONFIG_LIBDIR" | sed -e s%NONE%$cf_path_syntax%`
		;;
	esac
	;;
(.no|.NONE/*)
	PKG_CONFIG_LIBDIR=`echo "$PKG_CONFIG_LIBDIR" | sed -e s%NONE%$cf_path_syntax%`
	;;
(*)
	{ { echo "$as_me:4300: error: expected a pathname, not \"$PKG_CONFIG_LIBDIR\"" >&5
echo "$as_me: error: expected a pathname, not \"$PKG_CONFIG_LIBDIR\"" >&2;}
   { (exit 1); exit 1; }; }
	;;
esac

		;;
	esac
else
	MAKE_PC_FILES="#"
fi

if test -z "$MAKE_PC_FILES"
then
	echo "$as_me:4314: checking for suffix to add to pc-files" >&5
echo $ECHO_N "checking for suffix to add to pc-files... $ECHO_C" >&6

# Check whether --with-pc-suffix or --without-pc-suffix was given.
if test "${with_pc_suffix+set}" = set; then
  withval="$with_pc_suffix"
  case "x$withval" in
	(xyes|xno)
		PC_MODULE_SUFFIX=
		;;
	(*)	PC_MODULE_SUFFIX="$withval"
		;;
	esac
fi;
	test -z "$PC_MODULE_SUFFIX" && PC_MODULE_SUFFIX=none
	echo "$as_me:4329: result: $PC_MODULE_SUFFIX" >&5
echo "${ECHO_T}$PC_MODULE_SUFFIX" >&6
	test "$PC_MODULE_SUFFIX" = none && PC_MODULE_SUFFIX=

fi

echo "$as_me:4335: checking if we should assume mixed-case filenames" >&5
echo $ECHO_N "checking if we should assume mixed-case filenames... $ECHO_C" >&6

# Check whether --enable-mixed-case or --disable-mixed-case was given.
if test "${enable_mixed_case+set}" = set; then
  enableval="$enable_mixed_case"
  enable_mixedcase=$enableval
else
  enable_mixedcase=auto
fi;
echo "$as_me:4345: result: $enable_mixedcase" >&5
echo "${ECHO_T}$enable_mixedcase" >&6
if test "$enable_mixedcase" = "auto" ; then

echo "$as_me:4349: checking if filesystem supports mixed-case filenames" >&5
echo $ECHO_N "checking if filesystem supports mixed-case filenames... $ECHO_C" >&6
if test "${cf_cv_mixedcase+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

if test "$cross_compiling" = yes ; then
	case "$target_alias" in
	(*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*|darwin*)
		cf_cv_mixedcase=no
		;;
	(*)
		cf_cv_mixedcase=yes
		;;
	esac
else
	rm -f conftest CONFTEST
	echo test >conftest
	if test -f CONFTEST ; then
		cf_cv_mixedcase=no
	else
		cf_cv_mixedcase=yes
	fi
	rm -f conftest CONFTEST
fi

fi
echo "$as_me:4376: result: $cf_cv_mixedcase" >&5
echo "${ECHO_T}$cf_cv_mixedcase" >&6
test "$cf_cv_mixedcase" = yes &&
cat >>confdefs.h <<\EOF
#define MIXEDCASE_FILENAMES 1
EOF

else
	cf_cv_mixedcase=$enable_mixedcase
	if test "x$enable_mixedcase" = "xyes" ; then

cat >>confdefs.h <<\EOF
#define MIXEDCASE_FILENAMES 1
EOF

	fi
fi

# do this after mixed-case option (tags/TAGS is not as important as tic).
echo "$as_me:4395: checking whether ${MAKE-make} sets \${MAKE}" >&5
echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'`
if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >conftest.make <<\EOF
all:
	@echo 'ac_maketemp="${MAKE}"'
EOF
# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
if test -n "$ac_maketemp"; then
  eval ac_cv_prog_make_${ac_make}_set=yes
else
  eval ac_cv_prog_make_${ac_make}_set=no
fi
rm -f conftest.make
fi
if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
  echo "$as_me:4415: result: yes" >&5
echo "${ECHO_T}yes" >&6
  SET_MAKE=
else
  echo "$as_me:4419: result: no" >&5
echo "${ECHO_T}no" >&6
  SET_MAKE="MAKE=${MAKE-make}"
fi

echo "$as_me:4424: checking for \".PHONY\" make-support" >&5
echo $ECHO_N "checking for \".PHONY\" make-support... $ECHO_C" >&6
if test "${cf_cv_make_PHONY+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	rm -rf conftest*
	(
		mkdir conftest || exit 1
		cd conftest
		cat >makefile <<'CF_EOF'
.PHONY: always
DATA=0
always:	always.out
	@echo "** making $@ $(DATA)"
once: once.out
	@echo "** making $@ $(DATA)"
always.out:
	@echo "** making $@ $(DATA)"
	echo $(DATA) > $@
once.out:
	@echo "** making $@ $(DATA)"
	echo $(DATA) > $@
CF_EOF
		for cf_data in 1 2 3
		do
			${MAKE:-make} always DATA=$cf_data
			${MAKE:-make} once   DATA=$cf_data
			${MAKE:-make} -t always once
			if test -f always ; then
				echo "no (case 1)" > ../conftest.tmp
			elif test ! -f always.out ; then
				echo "no (case 2)" > ../conftest.tmp
			elif test ! -f once.out ; then
				echo "no (case 3)" > ../conftest.tmp
			elif ! cmp -s always.out once.out ; then
				echo "no (case 4)" > ../conftest.tmp
				diff always.out once.out
			else
				cf_check="`cat always.out`"
				if test "x$cf_check" != "x$cf_data" ; then
					echo "no (case 5)" > ../conftest.tmp
				else
					echo yes > ../conftest.tmp
					rm -f ./*.out
					continue
				fi
			fi
			break
		done
	) >&5 2>&1
	cf_cv_make_PHONY="`cat conftest.tmp`"
	rm -rf conftest*

fi
echo "$as_me:4479: result: $cf_cv_make_PHONY" >&5
echo "${ECHO_T}$cf_cv_make_PHONY" >&6
MAKE_NO_PHONY="#"
MAKE_PHONY="#"
test "x$cf_cv_make_PHONY" = xyes && MAKE_PHONY=
test "x$cf_cv_make_PHONY" != xyes && MAKE_NO_PHONY=

for ac_prog in exctags ctags
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:4490: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_CTAGS+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$CTAGS"; then
  ac_cv_prog_CTAGS="$CTAGS" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_CTAGS="$ac_prog"
echo "$as_me:4505: found $ac_dir/$ac_word" >&5
break
done

fi
fi
CTAGS=$ac_cv_prog_CTAGS
if test -n "$CTAGS"; then
  echo "$as_me:4513: result: $CTAGS" >&5
echo "${ECHO_T}$CTAGS" >&6
else
  echo "$as_me:4516: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  test -n "$CTAGS" && break
done

for ac_prog in exetags etags
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:4527: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ETAGS+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$ETAGS"; then
  ac_cv_prog_ETAGS="$ETAGS" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_ETAGS="$ac_prog"
echo "$as_me:4542: found $ac_dir/$ac_word" >&5
break
done

fi
fi
ETAGS=$ac_cv_prog_ETAGS
if test -n "$ETAGS"; then
  echo "$as_me:4550: result: $ETAGS" >&5
echo "${ECHO_T}$ETAGS" >&6
else
  echo "$as_me:4553: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  test -n "$ETAGS" && break
done

# Extract the first word of "${CTAGS:-ctags}", so it can be a program name with args.
set dummy ${CTAGS:-ctags}; ac_word=$2
echo "$as_me:4562: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_MAKE_LOWER_TAGS+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$MAKE_LOWER_TAGS"; then
  ac_cv_prog_MAKE_LOWER_TAGS="$MAKE_LOWER_TAGS" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_MAKE_LOWER_TAGS="yes"
echo "$as_me:4577: found $ac_dir/$ac_word" >&5
break
done

  test -z "$ac_cv_prog_MAKE_LOWER_TAGS" && ac_cv_prog_MAKE_LOWER_TAGS="no"
fi
fi
MAKE_LOWER_TAGS=$ac_cv_prog_MAKE_LOWER_TAGS
if test -n "$MAKE_LOWER_TAGS"; then
  echo "$as_me:4586: result: $MAKE_LOWER_TAGS" >&5
echo "${ECHO_T}$MAKE_LOWER_TAGS" >&6
else
  echo "$as_me:4589: result: no" >&5
echo "${ECHO_T}no" >&6
fi

if test "$cf_cv_mixedcase" = yes ; then
	# Extract the first word of "${ETAGS:-etags}", so it can be a program name with args.
set dummy ${ETAGS:-etags}; ac_word=$2
echo "$as_me:4596: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_MAKE_UPPER_TAGS+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$MAKE_UPPER_TAGS"; then
  ac_cv_prog_MAKE_UPPER_TAGS="$MAKE_UPPER_TAGS" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_MAKE_UPPER_TAGS="yes"
echo "$as_me:4611: found $ac_dir/$ac_word" >&5
break
done

  test -z "$ac_cv_prog_MAKE_UPPER_TAGS" && ac_cv_prog_MAKE_UPPER_TAGS="no"
fi
fi
MAKE_UPPER_TAGS=$ac_cv_prog_MAKE_UPPER_TAGS
if test -n "$MAKE_UPPER_TAGS"; then
  echo "$as_me:4620: result: $MAKE_UPPER_TAGS" >&5
echo "${ECHO_T}$MAKE_UPPER_TAGS" >&6
else
  echo "$as_me:4623: result: no" >&5
echo "${ECHO_T}no" >&6
fi

else
	MAKE_UPPER_TAGS=no
fi

if test "$MAKE_UPPER_TAGS" = yes ; then
	MAKE_UPPER_TAGS=
else
	MAKE_UPPER_TAGS="#"
fi

if test "$MAKE_LOWER_TAGS" = yes ; then
	MAKE_LOWER_TAGS=
else
	MAKE_LOWER_TAGS="#"
fi

echo "$as_me:4643: checking for makeflags variable" >&5
echo $ECHO_N "checking for makeflags variable... $ECHO_C" >&6
if test "${cf_cv_makeflags+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cf_cv_makeflags=''
	for cf_option in '-${MAKEFLAGS}' '${MFLAGS}'
	do
		cat >cf_makeflags.tmp <<CF_EOF
SHELL = $SHELL
all :
	@ echo '.$cf_option'
CF_EOF
		cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp 2>/dev/null | ${FGREP-fgrep} -v "ing directory" | sed -e 's,[ 	]*$,,'`
		case "$cf_result" in
		(.*k|.*kw)
			cf_result="`${MAKE:-make} -k -f cf_makeflags.tmp CC=cc 2>/dev/null`"
			case "$cf_result" in
			(.*CC=*)	cf_cv_makeflags=
				;;
			(*)	cf_cv_makeflags=$cf_option
				;;
			esac
			break
			;;
		(.-)
			;;
		(*)

echo "${as_me:-configure}:4673: testing given option \"$cf_option\",no match \"$cf_result\" ..." 1>&5

			;;
		esac
	done
	rm -f cf_makeflags.tmp

fi
echo "$as_me:4681: result: $cf_cv_makeflags" >&5
echo "${ECHO_T}$cf_cv_makeflags" >&6

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
echo "$as_me:4687: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_RANLIB+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
echo "$as_me:4702: found $ac_dir/$ac_word" >&5
break
done

fi
fi
RANLIB=$ac_cv_prog_RANLIB
if test -n "$RANLIB"; then
  echo "$as_me:4710: result: $RANLIB" >&5
echo "${ECHO_T}$RANLIB" >&6
else
  echo "$as_me:4713: result: no" >&5
echo "${ECHO_T}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
echo "$as_me:4722: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&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
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_ac_ct_RANLIB="ranlib"
echo "$as_me:4737: found $ac_dir/$ac_word" >&5
break
done

  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB="':'"
fi
fi
ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
if test -n "$ac_ct_RANLIB"; then
  echo "$as_me:4746: result: $ac_ct_RANLIB" >&5
echo "${ECHO_T}$ac_ct_RANLIB" >&6
else
  echo "$as_me:4749: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  RANLIB=$ac_ct_RANLIB
else
  RANLIB="$ac_cv_prog_RANLIB"
fi

if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
set dummy ${ac_tool_prefix}ld; ac_word=$2
echo "$as_me:4761: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_LD+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$LD"; then
  ac_cv_prog_LD="$LD" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_LD="${ac_tool_prefix}ld"
echo "$as_me:4776: found $ac_dir/$ac_word" >&5
break
done

fi
fi
LD=$ac_cv_prog_LD
if test -n "$LD"; then
  echo "$as_me:4784: result: $LD" >&5
echo "${ECHO_T}$LD" >&6
else
  echo "$as_me:4787: result: no" >&5
echo "${ECHO_T}no" >&6
fi

fi
if test -z "$ac_cv_prog_LD"; then
  ac_ct_LD=$LD
  # Extract the first word of "ld", so it can be a program name with args.
set dummy ld; ac_word=$2
echo "$as_me:4796: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_LD+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$ac_ct_LD"; then
  ac_cv_prog_ac_ct_LD="$ac_ct_LD" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_ac_ct_LD="ld"
echo "$as_me:4811: found $ac_dir/$ac_word" >&5
break
done

  test -z "$ac_cv_prog_ac_ct_LD" && ac_cv_prog_ac_ct_LD="ld"
fi
fi
ac_ct_LD=$ac_cv_prog_ac_ct_LD
if test -n "$ac_ct_LD"; then
  echo "$as_me:4820: result: $ac_ct_LD" >&5
echo "${ECHO_T}$ac_ct_LD" >&6
else
  echo "$as_me:4823: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  LD=$ac_ct_LD
else
  LD="$ac_cv_prog_LD"
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
echo "$as_me:4835: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_AR+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_AR="${ac_tool_prefix}ar"
echo "$as_me:4850: found $ac_dir/$ac_word" >&5
break
done

fi
fi
AR=$ac_cv_prog_AR
if test -n "$AR"; then
  echo "$as_me:4858: result: $AR" >&5
echo "${ECHO_T}$AR" >&6
else
  echo "$as_me:4861: result: no" >&5
echo "${ECHO_T}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
echo "$as_me:4870: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&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
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_ac_ct_AR="ar"
echo "$as_me:4885: found $ac_dir/$ac_word" >&5
break
done

  test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="ar"
fi
fi
ac_ct_AR=$ac_cv_prog_ac_ct_AR
if test -n "$ac_ct_AR"; then
  echo "$as_me:4894: result: $ac_ct_AR" >&5
echo "${ECHO_T}$ac_ct_AR" >&6
else
  echo "$as_me:4897: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  AR=$ac_ct_AR
else
  AR="$ac_cv_prog_AR"
fi

if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args.
set dummy ${ac_tool_prefix}nm; ac_word=$2
echo "$as_me:4909: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_NM+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$NM"; then
  ac_cv_prog_NM="$NM" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_NM="${ac_tool_prefix}nm"
echo "$as_me:4924: found $ac_dir/$ac_word" >&5
break
done

fi
fi
NM=$ac_cv_prog_NM
if test -n "$NM"; then
  echo "$as_me:4932: result: $NM" >&5
echo "${ECHO_T}$NM" >&6
else
  echo "$as_me:4935: result: no" >&5
echo "${ECHO_T}no" >&6
fi

fi
if test -z "$ac_cv_prog_NM"; then
  ac_ct_NM=$NM
  # Extract the first word of "nm", so it can be a program name with args.
set dummy nm; ac_word=$2
echo "$as_me:4944: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_NM+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$ac_ct_NM"; then
  ac_cv_prog_ac_ct_NM="$ac_ct_NM" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_ac_ct_NM="nm"
echo "$as_me:4959: found $ac_dir/$ac_word" >&5
break
done

  test -z "$ac_cv_prog_ac_ct_NM" && ac_cv_prog_ac_ct_NM="nm"
fi
fi
ac_ct_NM=$ac_cv_prog_ac_ct_NM
if test -n "$ac_ct_NM"; then
  echo "$as_me:4968: result: $ac_ct_NM" >&5
echo "${ECHO_T}$ac_ct_NM" >&6
else
  echo "$as_me:4971: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  NM=$ac_ct_NM
else
  NM="$ac_cv_prog_NM"
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
echo "$as_me:4983: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_AR+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_AR="${ac_tool_prefix}ar"
echo "$as_me:4998: found $ac_dir/$ac_word" >&5
break
done

fi
fi
AR=$ac_cv_prog_AR
if test -n "$AR"; then
  echo "$as_me:5006: result: $AR" >&5
echo "${ECHO_T}$AR" >&6
else
  echo "$as_me:5009: result: no" >&5
echo "${ECHO_T}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
echo "$as_me:5018: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&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
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_ac_ct_AR="ar"
echo "$as_me:5033: found $ac_dir/$ac_word" >&5
break
done

  test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="ar"
fi
fi
ac_ct_AR=$ac_cv_prog_ac_ct_AR
if test -n "$ac_ct_AR"; then
  echo "$as_me:5042: result: $ac_ct_AR" >&5
echo "${ECHO_T}$ac_ct_AR" >&6
else
  echo "$as_me:5045: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  AR=$ac_ct_AR
else
  AR="$ac_cv_prog_AR"
fi

echo "$as_me:5054: checking for options to update archives" >&5
echo $ECHO_N "checking for options to update archives... $ECHO_C" >&6
if test "${cf_cv_ar_flags+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	case "$cf_cv_system_name" in
	(*-msvc*)
		cf_cv_ar_flags=''
		cat >mk_static_lib.sh <<-EOF
		#!$SHELL
		MSVC_BIN="$AR"
		out="\$1"
		shift
		exec \$MSVC_BIN -out:"\$out" \$@
		EOF
		chmod +x mk_static_lib.sh
		AR=`pwd`/mk_static_lib.sh
		;;
	(*)
		cf_cv_ar_flags=unknown
		for cf_ar_flags in -curvU -curv curv -crv crv -cqv cqv -rv rv
		do

			# check if $ARFLAGS already contains this choice
			if test "x$ARFLAGS" != "x" ; then
				cf_check_ar_flags=`echo "x$ARFLAGS" | sed -e "s/$cf_ar_flags\$//" -e "s/$cf_ar_flags / /"`
				if test "x$ARFLAGS" != "$cf_check_ar_flags" ; then
					cf_cv_ar_flags=
					break
				fi
			fi

			rm -f "conftest.$ac_cv_objext"
			rm -f conftest.a

			cat >"conftest.$ac_ext" <<EOF
#line 5091 "configure"
int	testdata[3] = { 123, 456, 789 };
EOF
			if { (eval echo "$as_me:5094: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:5097: \$? = $ac_status" >&5
  (exit "$ac_status"); } ; then
				echo "$AR $ARFLAGS $cf_ar_flags conftest.a conftest.$ac_cv_objext" >&5
				$AR $ARFLAGS "$cf_ar_flags" conftest.a "conftest.$ac_cv_objext" 2>&5 1>/dev/null
				if test -f conftest.a ; then
					cf_cv_ar_flags="$cf_ar_flags"
					break
				fi
			else
				test -n "$verbose" && echo "	cannot compile test-program" 1>&6

echo "${as_me:-configure}:5108: testing cannot compile test-program ..." 1>&5

				break
			fi
		done
		rm -f conftest.a "conftest.$ac_ext" "conftest.$ac_cv_objext"
		;;
	esac

fi
echo "$as_me:5118: result: $cf_cv_ar_flags" >&5
echo "${ECHO_T}$cf_cv_ar_flags" >&6

if test -n "$ARFLAGS" ; then
	if test -n "$cf_cv_ar_flags" ; then
		ARFLAGS="$ARFLAGS $cf_cv_ar_flags"
	fi
else
	ARFLAGS=$cf_cv_ar_flags
fi

echo "$as_me:5129: checking if you have specified an install-prefix" >&5
echo $ECHO_N "checking if you have specified an install-prefix... $ECHO_C" >&6

# Check whether --with-install-prefix or --without-install-prefix was given.
if test "${with_install_prefix+set}" = set; then
  withval="$with_install_prefix"
  case "x$withval" in
	(xyes|xno)
		;;
	(*)	DESTDIR="$withval"
		;;
	esac
fi;
echo "$as_me:5142: result: $DESTDIR" >&5
echo "${ECHO_T}$DESTDIR" >&6

###############################################################################

# If we're cross-compiling, allow the user to override the tools and their
# options.  The configure script is oriented toward identifying the host
# compiler, etc., but we need a build compiler to generate parts of the source.

case "$cf_cv_system_name" in
(*-msvc*)
	LDFLAGS="$LDFLAGS user32.lib"
	export LDFLAGS
	;;
esac

if test "$cross_compiling" = yes ; then

	# defaults that we might want to override
	: ${BUILD_CFLAGS:=''}
	: ${BUILD_CPPFLAGS:=''}
	: ${BUILD_LDFLAGS:=''}
	: ${BUILD_LIBS:=''}
	: ${BUILD_EXEEXT:='$x'}
	: ${BUILD_OBJEXT:='o'}

# Check whether --with-build-cc or --without-build-cc was given.
if test "${with_build_cc+set}" = set; then
  withval="$with_build_cc"
  BUILD_CC="$withval"
else
  for ac_prog in gcc clang c99 c89 cc cl
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:5177: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_BUILD_CC+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$BUILD_CC"; then
  ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_BUILD_CC="$ac_prog"
echo "$as_me:5192: found $ac_dir/$ac_word" >&5
break
done

fi
fi
BUILD_CC=$ac_cv_prog_BUILD_CC
if test -n "$BUILD_CC"; then
  echo "$as_me:5200: result: $BUILD_CC" >&5
echo "${ECHO_T}$BUILD_CC" >&6
else
  echo "$as_me:5203: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  test -n "$BUILD_CC" && break
done
test -n "$BUILD_CC" || BUILD_CC="none"

fi;
	echo "$as_me:5212: checking for native build C compiler" >&5
echo $ECHO_N "checking for native build C compiler... $ECHO_C" >&6
	echo "$as_me:5214: result: $BUILD_CC" >&5
echo "${ECHO_T}$BUILD_CC" >&6

	echo "$as_me:5217: checking for native build C preprocessor" >&5
echo $ECHO_N "checking for native build C preprocessor... $ECHO_C" >&6

# Check whether --with-build-cpp or --without-build-cpp was given.
if test "${with_build_cpp+set}" = set; then
  withval="$with_build_cpp"
  BUILD_CPP="$withval"
else
  BUILD_CPP='${BUILD_CC} -E'
fi;
	echo "$as_me:5227: result: $BUILD_CPP" >&5
echo "${ECHO_T}$BUILD_CPP" >&6

	echo "$as_me:5230: checking for native build C flags" >&5
echo $ECHO_N "checking for native build C flags... $ECHO_C" >&6

# Check whether --with-build-cflags or --without-build-cflags was given.
if test "${with_build_cflags+set}" = set; then
  withval="$with_build_cflags"
  BUILD_CFLAGS="$withval"
fi;
	echo "$as_me:5238: result: $BUILD_CFLAGS" >&5
echo "${ECHO_T}$BUILD_CFLAGS" >&6

	echo "$as_me:5241: checking for native build C preprocessor-flags" >&5
echo $ECHO_N "checking for native build C preprocessor-flags... $ECHO_C" >&6

# Check whether --with-build-cppflags or --without-build-cppflags was given.
if test "${with_build_cppflags+set}" = set; then
  withval="$with_build_cppflags"
  BUILD_CPPFLAGS="$withval"
fi;
	echo "$as_me:5249: result: $BUILD_CPPFLAGS" >&5
echo "${ECHO_T}$BUILD_CPPFLAGS" >&6

	echo "$as_me:5252: checking for native build linker-flags" >&5
echo $ECHO_N "checking for native build linker-flags... $ECHO_C" >&6

# Check whether --with-build-ldflags or --without-build-ldflags was given.
if test "${with_build_ldflags+set}" = set; then
  withval="$with_build_ldflags"
  BUILD_LDFLAGS="$withval"
fi;
	echo "$as_me:5260: result: $BUILD_LDFLAGS" >&5
echo "${ECHO_T}$BUILD_LDFLAGS" >&6

	echo "$as_me:5263: checking for native build linker-libraries" >&5
echo $ECHO_N "checking for native build linker-libraries... $ECHO_C" >&6

# Check whether --with-build-libs or --without-build-libs was given.
if test "${with_build_libs+set}" = set; then
  withval="$with_build_libs"
  BUILD_LIBS="$withval"
fi;
	echo "$as_me:5271: result: $BUILD_LIBS" >&5
echo "${ECHO_T}$BUILD_LIBS" >&6

	# this assumes we're on Unix.
	BUILD_EXEEXT=
	BUILD_OBJEXT=o

	: ${BUILD_CC:='${CC}'}

	if { test "$BUILD_CC" = "$CC" || test "$BUILD_CC" = '${CC}'; } ; then
		{ { echo "$as_me:5281: error: Cross-build requires two compilers.
Use --with-build-cc to specify the native compiler." >&5
echo "$as_me: error: Cross-build requires two compilers.
Use --with-build-cc to specify the native compiler." >&2;}
   { (exit 1); exit 1; }; }
	fi

else
	: ${BUILD_CC:='${CC}'}
	: ${BUILD_CPP:='${CPP}'}
	: ${BUILD_CFLAGS:='${CFLAGS}'}
	: ${BUILD_CPPFLAGS:='${CPPFLAGS}'}
	: ${BUILD_LDFLAGS:='${LDFLAGS}'}
	: ${BUILD_LIBS:='${LIBS}'}
	: ${BUILD_EXEEXT:='$x'}
	: ${BUILD_OBJEXT:='o'}
fi

###############################################################################

### Options to allow the user to specify the set of libraries which are used.
### Use "--without-normal --with-shared" to allow the default model to be
### shared, for example.
cf_list_models=""

echo "$as_me:5306: checking if libtool -version-number should be used" >&5
echo $ECHO_N "checking if libtool -version-number should be used... $ECHO_C" >&6

# Check whether --enable-libtool-version or --disable-libtool-version was given.
if test "${enable_libtool_version+set}" = set; then
  enableval="$enable_libtool_version"
  test "$enableval" != no && enableval=yes
	if test "$enableval" != "yes" ; then
    cf_libtool_version=no
	else
		cf_libtool_version=yes
	fi
else
  enableval=yes
	cf_libtool_version=yes

fi;
echo "$as_me:5323: result: $cf_libtool_version" >&5
echo "${ECHO_T}$cf_libtool_version" >&6

if test "$cf_libtool_version" = yes ; then
	LIBTOOL_VERSION="-version-number"
else
	LIBTOOL_VERSION="-version-info"
	case "x$VERSION" in
	(x)
		{ echo "$as_me:5332: WARNING: VERSION was not set" >&5
echo "$as_me: WARNING: VERSION was not set" >&2;}
		;;
	(x*.*.*)
		ABI_VERSION="$VERSION"
		test -n "$verbose" && echo "	ABI_VERSION: $ABI_VERSION" 1>&6

echo "${as_me:-configure}:5339: testing ABI_VERSION: $ABI_VERSION ..." 1>&5

		;;
	(x*:*:*)
		ABI_VERSION=`echo "$VERSION" | sed -e 's/:/./g'`
		test -n "$verbose" && echo "	ABI_VERSION: $ABI_VERSION" 1>&6

echo "${as_me:-configure}:5346: testing ABI_VERSION: $ABI_VERSION ..." 1>&5

		;;
	(*)
		{ echo "$as_me:5350: WARNING: unexpected VERSION value: $VERSION" >&5
echo "$as_me: WARNING: unexpected VERSION value: $VERSION" >&2;}
		;;
	esac
fi

LIBTOOL=

# common library maintenance symbols that are convenient for libtool scripts:
LIB_CREATE='${AR} -cr'
LIB_OBJECT='${OBJECTS}'
LIB_SUFFIX=.a
LIB_PREP="$RANLIB"

# symbols used to prop libtool up to enable it to determine what it should be
# doing:
LIB_CLEAN=
LIB_COMPILE=
LIB_LINK='${CC}'
LIB_INSTALL=
LIB_UNINSTALL=

echo "$as_me:5372: checking if you want to build libraries with libtool" >&5
echo $ECHO_N "checking if you want to build libraries with libtool... $ECHO_C" >&6

# Check whether --with-libtool or --without-libtool was given.
if test "${with_libtool+set}" = set; then
  withval="$with_libtool"
  with_libtool=$withval
else
  with_libtool=no
fi;
echo "$as_me:5382: result: $with_libtool" >&5
echo "${ECHO_T}$with_libtool" >&6
if test "$with_libtool" != "no"; then

	if test "$with_libtool" != "yes" ; then

if test "x$prefix" != xNONE; then
	cf_path_syntax="$prefix"
else
	cf_path_syntax="$ac_default_prefix"
fi

case ".$with_libtool" in
(.\$\(*\)*|.\'*\'*)
	;;
(..|./*|.\\*)
	;;
(.[a-zA-Z]:[\\/]*) # OS/2 EMX
	;;
(.\$\{*prefix\}*|.\$\{*dir\}*)
	eval with_libtool="$with_libtool"
	case ".$with_libtool" in
	(.NONE/*)
		with_libtool=`echo "$with_libtool" | sed -e s%NONE%$cf_path_syntax%`
		;;
	esac
	;;
(.no|.NONE/*)
	with_libtool=`echo "$with_libtool" | sed -e s%NONE%$cf_path_syntax%`
	;;
(*)
	{ { echo "$as_me:5413: error: expected a pathname, not \"$with_libtool\"" >&5
echo "$as_me: error: expected a pathname, not \"$with_libtool\"" >&2;}
   { (exit 1); exit 1; }; }
	;;
esac

		LIBTOOL=$with_libtool
	else
		if test -n "$ac_tool_prefix"; then
  for ac_prog in libtool glibtool
  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
echo "$as_me:5426: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_LIBTOOL+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$LIBTOOL"; then
  ac_cv_prog_LIBTOOL="$LIBTOOL" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_LIBTOOL="$ac_tool_prefix$ac_prog"
echo "$as_me:5441: found $ac_dir/$ac_word" >&5
break
done

fi
fi
LIBTOOL=$ac_cv_prog_LIBTOOL
if test -n "$LIBTOOL"; then
  echo "$as_me:5449: result: $LIBTOOL" >&5
echo "${ECHO_T}$LIBTOOL" >&6
else
  echo "$as_me:5452: result: no" >&5
echo "${ECHO_T}no" >&6
fi

    test -n "$LIBTOOL" && break
  done
fi
if test -z "$LIBTOOL"; then
  ac_ct_LIBTOOL=$LIBTOOL
  for ac_prog in libtool glibtool
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:5465: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_LIBTOOL+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$ac_ct_LIBTOOL"; then
  ac_cv_prog_ac_ct_LIBTOOL="$ac_ct_LIBTOOL" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_ac_ct_LIBTOOL="$ac_prog"
echo "$as_me:5480: found $ac_dir/$ac_word" >&5
break
done

fi
fi
ac_ct_LIBTOOL=$ac_cv_prog_ac_ct_LIBTOOL
if test -n "$ac_ct_LIBTOOL"; then
  echo "$as_me:5488: result: $ac_ct_LIBTOOL" >&5
echo "${ECHO_T}$ac_ct_LIBTOOL" >&6
else
  echo "$as_me:5491: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  test -n "$ac_ct_LIBTOOL" && break
done
test -n "$ac_ct_LIBTOOL" || ac_ct_LIBTOOL="none"

  LIBTOOL=$ac_ct_LIBTOOL
fi

if test -n "$LIBTOOL" && test "$LIBTOOL" != none
then
	cf_cv_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' |sed -e '2,$d' -e 's/([^)]*)//g' -e 's/^[^1-9]*//' -e 's/[^0-9.].*//'`
else
	cf_cv_libtool_version=
fi
test -z "$cf_cv_libtool_version" && unset cf_cv_libtool_version

		if test -z "$cf_cv_libtool_version" && test "$LIBTOOL" = libtool
		then

unset ac_cv_prog_ac_ct_LIBTOOL
unset ac_ct_LIBTOOL
unset LIBTOOL

			if test -n "$ac_tool_prefix"; then
  for ac_prog in glibtool
  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
echo "$as_me:5522: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_LIBTOOL+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$LIBTOOL"; then
  ac_cv_prog_LIBTOOL="$LIBTOOL" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_LIBTOOL="$ac_tool_prefix$ac_prog"
echo "$as_me:5537: found $ac_dir/$ac_word" >&5
break
done

fi
fi
LIBTOOL=$ac_cv_prog_LIBTOOL
if test -n "$LIBTOOL"; then
  echo "$as_me:5545: result: $LIBTOOL" >&5
echo "${ECHO_T}$LIBTOOL" >&6
else
  echo "$as_me:5548: result: no" >&5
echo "${ECHO_T}no" >&6
fi

    test -n "$LIBTOOL" && break
  done
fi
if test -z "$LIBTOOL"; then
  ac_ct_LIBTOOL=$LIBTOOL
  for ac_prog in glibtool
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:5561: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_LIBTOOL+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$ac_ct_LIBTOOL"; then
  ac_cv_prog_ac_ct_LIBTOOL="$ac_ct_LIBTOOL" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_ac_ct_LIBTOOL="$ac_prog"
echo "$as_me:5576: found $ac_dir/$ac_word" >&5
break
done

fi
fi
ac_ct_LIBTOOL=$ac_cv_prog_ac_ct_LIBTOOL
if test -n "$ac_ct_LIBTOOL"; then
  echo "$as_me:5584: result: $ac_ct_LIBTOOL" >&5
echo "${ECHO_T}$ac_ct_LIBTOOL" >&6
else
  echo "$as_me:5587: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  test -n "$ac_ct_LIBTOOL" && break
done
test -n "$ac_ct_LIBTOOL" || ac_ct_LIBTOOL="none"

  LIBTOOL=$ac_ct_LIBTOOL
fi

if test -n "$LIBTOOL" && test "$LIBTOOL" != none
then
	cf_cv_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' |sed -e '2,$d' -e 's/([^)]*)//g' -e 's/^[^1-9]*//' -e 's/[^0-9.].*//'`
else
	cf_cv_libtool_version=
fi
test -z "$cf_cv_libtool_version" && unset cf_cv_libtool_version

		fi
	fi
	if test -z "$LIBTOOL" ; then
		{ { echo "$as_me:5609: error: Cannot find libtool" >&5
echo "$as_me: error: Cannot find libtool" >&2;}
   { (exit 1); exit 1; }; }
	fi
	LIB_CREATE='${LIBTOOL} --mode=link ${CC} -rpath ${libdir} ${LIBTOOL_VERSION} `cut -f1 ${top_srcdir}/VERSION` ${LIBTOOL_OPTS} ${LT_UNDEF} $(LIBS) -o'
	LIB_OBJECT='${OBJECTS:.o=.lo}'
	LIB_SUFFIX=.la
	LIB_CLEAN='${LIBTOOL} --mode=clean'
	LIB_COMPILE='${LIBTOOL} --mode=compile'
	LIB_LINK='${LIBTOOL} --mode=link ${CC} ${LIBTOOL_OPTS}'
	LIB_INSTALL='${LIBTOOL} --mode=install'
	LIB_UNINSTALL='${LIBTOOL} --mode=uninstall'
	LIB_PREP=:

if test -n "$LIBTOOL" && test "$LIBTOOL" != none
then
	echo "$as_me:5625: checking version of $LIBTOOL" >&5
echo $ECHO_N "checking version of $LIBTOOL... $ECHO_C" >&6

if test -n "$LIBTOOL" && test "$LIBTOOL" != none
then
	cf_cv_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' |sed -e '2,$d' -e 's/([^)]*)//g' -e 's/^[^1-9]*//' -e 's/[^0-9.].*//'`
else
	cf_cv_libtool_version=
fi
test -z "$cf_cv_libtool_version" && unset cf_cv_libtool_version

	echo "$as_me:5636: result: $cf_cv_libtool_version" >&5
echo "${ECHO_T}$cf_cv_libtool_version" >&6
	if test -n "$cf_cv_libtool_version"
	then
		cf_check_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' -e 's,[()],...,g' -e 's,[ ],-,g' -e '2,$d'`
		case "x$cf_check_libtool_version" in
		(*...GNU-libtool...*)
			;;
		(*)
			{ { echo "$as_me:5645: error: This is not GNU libtool" >&5
echo "$as_me: error: This is not GNU libtool" >&2;}
   { (exit 1); exit 1; }; }
			;;
		esac
	else
		{ { echo "$as_me:5651: error: No version found for $LIBTOOL" >&5
echo "$as_me: error: No version found for $LIBTOOL" >&2;}
   { (exit 1); exit 1; }; }
	fi
else
	{ { echo "$as_me:5656: error: GNU libtool has not been found" >&5
echo "$as_me: error: GNU libtool has not been found" >&2;}
   { (exit 1); exit 1; }; }
fi

	# special hack to add -no-undefined (which libtool should do for itself)
	LT_UNDEF=
	case "$cf_cv_system_name" in
	(cygwin*|msys*|mingw32*|os2*|uwin*|aix[4-7])
		LT_UNDEF=-no-undefined
		;;
	esac

	# special hack to add --tag option for C++ compiler
	case "$cf_cv_libtool_version" in
	(1.[5-9]*|[2-9].[0-9.a-z]*)
		LIBTOOL_CXX="$LIBTOOL --tag=CXX"
		LIBTOOL="$LIBTOOL --tag=CC"
		;;
	(*)
		LIBTOOL_CXX="$LIBTOOL"
		;;
	esac
else
	LIBTOOL=""
	LIBTOOL_CXX=""
fi

test -z "$LIBTOOL" && ECHO_LT=

if test "$with_libtool" != "no" ; then

cf_list_models="$cf_list_models libtool"

else

echo "$as_me:5692: checking if you want to build shared libraries" >&5
echo $ECHO_N "checking if you want to build shared libraries... $ECHO_C" >&6

# Check whether --with-shared or --without-shared was given.
if test "${with_shared+set}" = set; then
  withval="$with_shared"
  with_shared=$withval
else
  with_shared=no
fi;
echo "$as_me:5702: result: $with_shared" >&5
echo "${ECHO_T}$with_shared" >&6
test "x$with_shared" = "xyes" && cf_list_models="$cf_list_models shared"

echo "$as_me:5706: checking if you want to build static libraries" >&5
echo $ECHO_N "checking if you want to build static libraries... $ECHO_C" >&6

# Check whether --with-normal or --without-normal was given.
if test "${with_normal+set}" = set; then
  withval="$with_normal"
  with_normal=$withval
else
  with_normal=yes
fi;
echo "$as_me:5716: result: $with_normal" >&5
echo "${ECHO_T}$with_normal" >&6
test "x$with_normal" = "xyes" && cf_list_models="$cf_list_models normal"

echo "$as_me:5720: checking if you want to build debug libraries" >&5
echo $ECHO_N "checking if you want to build debug libraries... $ECHO_C" >&6

# Check whether --with-debug or --without-debug was given.
if test "${with_debug+set}" = set; then
  withval="$with_debug"
  with_debug=$withval
else
  with_debug=yes
fi;
echo "$as_me:5730: result: $with_debug" >&5
echo "${ECHO_T}$with_debug" >&6
test "x$with_debug" = "xyes" && cf_list_models="$cf_list_models debug"

echo "$as_me:5734: checking if you want to build profiling libraries" >&5
echo $ECHO_N "checking if you want to build profiling libraries... $ECHO_C" >&6

# Check whether --with-profile or --without-profile was given.
if test "${with_profile+set}" = set; then
  withval="$with_profile"
  with_profile=$withval
else
  with_profile=no
fi;
echo "$as_me:5744: result: $with_profile" >&5
echo "${ECHO_T}$with_profile" >&6
test "x$with_profile" = "xyes" && cf_list_models="$cf_list_models profile"

fi

if test "X$cf_with_cxx_binding" != Xno; then
if test "x$with_shared" = "xyes"; then
echo "$as_me:5752: checking if you want to build C++ shared libraries" >&5
echo $ECHO_N "checking if you want to build C++ shared libraries... $ECHO_C" >&6

# Check whether --with-cxx-shared or --without-cxx-shared was given.
if test "${with_cxx_shared+set}" = set; then
  withval="$with_cxx_shared"
  with_shared_cxx=$withval
else
  with_shared_cxx=no
fi;
echo "$as_me:5762: result: $with_shared_cxx" >&5
echo "${ECHO_T}$with_shared_cxx" >&6
fi
fi

###############################################################################

echo "$as_me:5769: checking for specified models" >&5
echo $ECHO_N "checking for specified models... $ECHO_C" >&6
test -z "$cf_list_models" && cf_list_models=normal
test "$with_libtool" != "no" && cf_list_models=libtool
echo "$as_me:5773: result: $cf_list_models" >&5
echo "${ECHO_T}$cf_list_models" >&6

### Use the first model as the default, and save its suffix for use in building
### up test-applications.
echo "$as_me:5778: checking for default model" >&5
echo $ECHO_N "checking for default model... $ECHO_C" >&6
DFT_LWR_MODEL=`echo "$cf_list_models" | $AWK '{print $1}'`
echo "$as_me:5781: result: $DFT_LWR_MODEL" >&5
echo "${ECHO_T}$DFT_LWR_MODEL" >&6

DFT_UPR_MODEL=`echo "$DFT_LWR_MODEL" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`

TICS_NAME=tic

TINFO_NAME=tinfo

LIB_NAME=ncurses

LIB_DIR=../lib
LIB_2ND=../../lib

echo "$as_me:5795: checking if you want to have a library-prefix" >&5
echo $ECHO_N "checking if you want to have a library-prefix... $ECHO_C" >&6

# Check whether --with-lib-prefix or --without-lib-prefix was given.
if test "${with_lib_prefix+set}" = set; then
  withval="$with_lib_prefix"
  with_lib_prefix=$withval
else
  with_lib_prefix=auto
fi;
echo "$as_me:5805: result: $with_lib_prefix" >&5
echo "${ECHO_T}$with_lib_prefix" >&6

if test "$with_lib_prefix" = auto
then

	case "$cf_cv_system_name" in
	(OS/2*|os2*)
		if test "$DFT_LWR_MODEL" = libtool; then
			LIB_PREFIX='lib'
		else
			LIB_PREFIX=''
		fi
		;;
	(*-msvc*)
		LIB_PREFIX=''
		;;
	(*)	LIB_PREFIX='lib'
		;;
	esac
cf_prefix=$LIB_PREFIX

elif test "$with_lib_prefix" = no
then
	LIB_PREFIX=
else
	LIB_PREFIX=$with_lib_prefix
fi

LIB_SUFFIX=

	echo "$as_me:5836: checking for PATH separator" >&5
echo $ECHO_N "checking for PATH separator... $ECHO_C" >&6
	case "$cf_cv_system_name" in
	(os2*)	PATH_SEPARATOR=';'  ;;
	(*)	${PATH_SEPARATOR:=':'}  ;;
	esac

	echo "$as_me:5843: result: $PATH_SEPARATOR" >&5
echo "${ECHO_T}$PATH_SEPARATOR" >&6

###############################################################################

echo "$as_me:5848: checking if you want to build a separate terminfo library" >&5
echo $ECHO_N "checking if you want to build a separate terminfo library... $ECHO_C" >&6

# Check whether --with-termlib or --without-termlib was given.
if test "${with_termlib+set}" = set; then
  withval="$with_termlib"
  with_termlib=$withval
else
  with_termlib=no
fi;
echo "$as_me:5858: result: $with_termlib" >&5
echo "${ECHO_T}$with_termlib" >&6

echo "$as_me:5861: checking if you want to build a separate tic library" >&5
echo $ECHO_N "checking if you want to build a separate tic library... $ECHO_C" >&6

# Check whether --with-ticlib or --without-ticlib was given.
if test "${with_ticlib+set}" = set; then
  withval="$with_ticlib"
  with_ticlib=$withval
else
  with_ticlib=no
fi;
echo "$as_me:5871: result: $with_ticlib" >&5
echo "${ECHO_T}$with_ticlib" >&6

if test X"$CC_G_OPT" = X"" ; then
	CC_G_OPT='-g'
	test -n "$GCC" && test "x${ac_cv_prog_cc_g}" != xyes && CC_G_OPT=''
fi

if test X"$CXX_G_OPT" = X"" ; then
	CXX_G_OPT='-g'
	test -n "$GXX" && test "x${ac_cv_prog_cxx_g}" != xyes && CXX_G_OPT=''
fi

echo "$as_me:5884: checking for default loader flags" >&5
echo $ECHO_N "checking for default loader flags... $ECHO_C" >&6
case "$DFT_LWR_MODEL" in
(libtool) LD_MODEL=''   ;;
(normal)  LD_MODEL=''   ;;
(debug)   LD_MODEL=$CC_G_OPT ;;
(profile) LD_MODEL='-pg';;
(shared)  LD_MODEL=''   ;;
esac
echo "$as_me:5893: result: $LD_MODEL" >&5
echo "${ECHO_T}$LD_MODEL" >&6

case "$DFT_LWR_MODEL" in
(shared)

echo "$as_me:5899: checking if rpath option should be used" >&5
echo $ECHO_N "checking if rpath option should be used... $ECHO_C" >&6

# Check whether --enable-rpath or --disable-rpath was given.
if test "${enable_rpath+set}" = set; then
  enableval="$enable_rpath"
  cf_cv_enable_rpath=$enableval
else
  cf_cv_enable_rpath=no
fi;
echo "$as_me:5909: result: $cf_cv_enable_rpath" >&5
echo "${ECHO_T}$cf_cv_enable_rpath" >&6

echo "$as_me:5912: checking if shared libraries should be relinked during install" >&5
echo $ECHO_N "checking if shared libraries should be relinked during install... $ECHO_C" >&6

# Check whether --enable-relink or --disable-relink was given.
if test "${enable_relink+set}" = set; then
  enableval="$enable_relink"
  cf_cv_do_relink=$enableval
else
  cf_cv_do_relink=yes
fi;
echo "$as_me:5922: result: $cf_cv_do_relink" >&5
echo "${ECHO_T}$cf_cv_do_relink" >&6
	;;
esac

# we will build libraries one-level down.
rel_builddir=..

LD_RPATH_OPT=
if test "x$cf_cv_enable_rpath" != xno
then
	echo "$as_me:5933: checking for an rpath option" >&5
echo $ECHO_N "checking for an rpath option... $ECHO_C" >&6
	case "$cf_cv_system_name" in
	(irix*)
		if test "$GCC" = yes; then
			LD_RPATH_OPT="-Wl,-rpath,"
		else
			LD_RPATH_OPT="-rpath "
		fi
		;;
	(linux*|gnu*|k*bsd*-gnu|freebsd*)
		LD_RPATH_OPT="-Wl,-rpath,"
		;;
	(openbsd[2-9].*|mirbsd*)
		LD_RPATH_OPT="-Wl,-rpath,"
		;;
	(dragonfly*)
		LD_RPATH_OPT="-rpath "
		;;
	(netbsd*)
		LD_RPATH_OPT="-Wl,-rpath,"
		;;
	(osf*|mls+*)
		LD_RPATH_OPT="-rpath "
		;;
	(solaris2*)
		LD_RPATH_OPT="-R"
		;;
	(*)
		;;
	esac
	echo "$as_me:5964: result: $LD_RPATH_OPT" >&5
echo "${ECHO_T}$LD_RPATH_OPT" >&6

	case "x$LD_RPATH_OPT" in
	(x-R*)
		echo "$as_me:5969: checking if we need a space after rpath option" >&5
echo $ECHO_N "checking if we need a space after rpath option... $ECHO_C" >&6
		cf_save_LIBS="$LIBS"

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in ${LD_RPATH_OPT}$libdir; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

		cat >"conftest.$ac_ext" <<_ACEOF
#line 5990 "configure"
#include "confdefs.h"

int
main (void)
{

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:6002: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:6005: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:6008: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:6011: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_rpath_space=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_rpath_space=yes
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
		LIBS="$cf_save_LIBS"
		echo "$as_me:6021: result: $cf_rpath_space" >&5
echo "${ECHO_T}$cf_rpath_space" >&6
		test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT "
		;;
	esac
fi

	RM_SHARED_OPTS=
	LOCAL_LDFLAGS=
	LOCAL_LDFLAGS2=
	LD_SHARED_OPTS=
	INSTALL_LIB="-m 644"
	: ${rel_builddir:=.}

	shlibdir=$libdir

	MAKE_DLLS="#"

	cf_cv_do_symlinks=no
	cf_ld_rpath_opt=
	test "$cf_cv_enable_rpath" = yes && cf_ld_rpath_opt="$LD_RPATH_OPT"

	echo "$as_me:6043: checking if release/abi version should be used for shared libs" >&5
echo $ECHO_N "checking if release/abi version should be used for shared libs... $ECHO_C" >&6

# Check whether --with-shlib-version or --without-shlib-version was given.
if test "${with_shlib_version+set}" = set; then
  withval="$with_shlib_version"
  test -z "$withval" && withval=auto
	case "$withval" in
	(yes)
		cf_cv_shlib_version=auto
		;;
	(rel|abi|auto)
		cf_cv_shlib_version=$withval
		;;
	(*)
		echo "$as_me:6058: result: $withval" >&5
echo "${ECHO_T}$withval" >&6
		{ { echo "$as_me:6060: error: option value must be one of: rel, abi, or auto" >&5
echo "$as_me: error: option value must be one of: rel, abi, or auto" >&2;}
   { (exit 1); exit 1; }; }
		;;
	esac

else
  cf_cv_shlib_version=auto
fi;
	echo "$as_me:6069: result: $cf_cv_shlib_version" >&5
echo "${ECHO_T}$cf_cv_shlib_version" >&6

	cf_cv_rm_so_locs=no
	cf_try_cflags=

	# Some less-capable ports of gcc support only -fpic
	CC_SHARED_OPTS=

	cf_try_fPIC=no
	if test "$GCC" = yes
	then
		cf_try_fPIC=yes
	else
		case "$cf_cv_system_name" in
		(*linux*)	# e.g., PGI compiler
			cf_try_fPIC=yes
			;;
		esac
	fi

	if test "$cf_try_fPIC" = yes
	then
		echo "$as_me:6092: checking which $CC option to use" >&5
echo $ECHO_N "checking which $CC option to use... $ECHO_C" >&6
		cf_save_CFLAGS="$CFLAGS"
		for CC_SHARED_OPTS in -fPIC -fpic ''
		do
			CFLAGS="$cf_save_CFLAGS $CC_SHARED_OPTS"
			cat >"conftest.$ac_ext" <<_ACEOF
#line 6099 "configure"
#include "confdefs.h"
#include <stdio.h>
int
main (void)
{
int x = 1
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:6111: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:6114: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:6117: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:6120: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
		done
		echo "$as_me:6129: result: $CC_SHARED_OPTS" >&5
echo "${ECHO_T}$CC_SHARED_OPTS" >&6
		CFLAGS="$cf_save_CFLAGS"
	fi

	cf_cv_shlib_version_infix=no

	case "$cf_cv_system_name" in
	(aix4.3-9*|aix[5-7]*)
		if test "$GCC" = yes; then
			CC_SHARED_OPTS='-Wl,-brtl'
			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o $@'
		else
			CC_SHARED_OPTS='-brtl'
			# as well as '-qpic=large -G' or perhaps "-bM:SRE -bnoentry -bexpall"
			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -G -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o $@'
		fi
		;;
	(beos*)
		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -o $@ -Xlinker -soname=`basename $@` -nostart -e 0'
		;;
	(cygwin*)
		CC_SHARED_OPTS=
		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${CC} ${CFLAGS}'
		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a"
		cf_cv_shlib_version=cygdll
		cf_cv_shlib_version_infix=cygdll
		shlibdir=$bindir
		MAKE_DLLS=
		cat >mk_shared_lib.sh <<-CF_EOF
		#!$SHELL
		SHARED_LIB=\$1
		IMPORT_LIB=\`echo "\$1" | sed -e 's/cyg/lib/' -e 's/[0-9]*\.dll$/.dll.a/'\`
		shift
		cat <<-EOF
		Linking shared library
		** SHARED_LIB \$SHARED_LIB
		** IMPORT_LIB \$IMPORT_LIB
EOF
		exec \$* ${LDFLAGS} -shared -Wl,--out-implib=\${IMPORT_LIB} -Wl,--export-all-symbols -o \${SHARED_LIB}
CF_EOF
		chmod +x mk_shared_lib.sh
		;;
	(msys*)
		CC_SHARED_OPTS=
		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${CC} ${CFLAGS}'
		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a"
		cf_cv_shlib_version=msysdll
		cf_cv_shlib_version_infix=msysdll
		shlibdir=$bindir
		MAKE_DLLS=
		cat >mk_shared_lib.sh <<-CF_EOF
		#!$SHELL
		SHARED_LIB=\$1
		IMPORT_LIB=\`echo "\$1" | sed -e 's/msys-/lib/' -e 's/[0-9]*\.dll$/.dll.a/'\`
		shift
		cat <<-EOF
		Linking shared library
		** SHARED_LIB \$SHARED_LIB
		** IMPORT_LIB \$IMPORT_LIB
EOF
		exec \$* ${LDFLAGS} -shared -Wl,--out-implib=\${IMPORT_LIB} -Wl,--export-all-symbols -o \${SHARED_LIB}
CF_EOF
		chmod +x mk_shared_lib.sh
		;;
	(darwin*)
		cf_try_cflags="no-cpp-precomp"
		CC_SHARED_OPTS="-dynamic"
		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dynamiclib -install_name ${libdir}/`basename $@` -compatibility_version ${ABI_VERSION} -current_version ${ABI_VERSION} -o $@'
		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=abi
		cf_cv_shlib_version_infix=yes
		echo "$as_me:6200: checking if ld -search_paths_first works" >&5
echo $ECHO_N "checking if ld -search_paths_first works... $ECHO_C" >&6
if test "${cf_cv_ldflags_search_paths_first+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

			cf_save_LDFLAGS=$LDFLAGS
			LDFLAGS="$LDFLAGS -Wl,-search_paths_first"
			cat >"conftest.$ac_ext" <<_ACEOF
#line 6209 "configure"
#include "confdefs.h"

int
main (void)
{
int i;
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:6221: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:6224: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:6227: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:6230: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_ldflags_search_paths_first=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_ldflags_search_paths_first=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
				LDFLAGS=$cf_save_LDFLAGS
fi
echo "$as_me:6241: result: $cf_cv_ldflags_search_paths_first" >&5
echo "${ECHO_T}$cf_cv_ldflags_search_paths_first" >&6
		if test "$cf_cv_ldflags_search_paths_first" = yes; then
			LDFLAGS="$LDFLAGS -Wl,-search_paths_first"
		fi
		;;
	(haiku*)

	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
	if test "$cf_cv_shlib_version" = rel; then
		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
	else
		cf_cv_shared_soname='`basename $@`'
	fi

		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@'
		;;
	(hpux[7-8]*)
		# HP-UX 8.07 ld lacks "+b" option used for libdir search-list
		if test "$GCC" != yes; then
			CC_SHARED_OPTS='+Z'
		fi
		MK_SHARED_LIB='${LD} ${LDFLAGS} -b -o $@'
		INSTALL_LIB="-m 555"
		;;
	(hpux*)
		# (tested with gcc 2.7.2 -- I don't have c89)
		if test "$GCC" = yes; then
			LD_SHARED_OPTS='-Xlinker +b -Xlinker ${libdir}'
		else
			CC_SHARED_OPTS='+Z'
			LD_SHARED_OPTS='-Wl,+b,${libdir}'
		fi
		MK_SHARED_LIB='${LD} ${LDFLAGS} +b ${libdir} -b -o $@'
		# HP-UX shared libraries must be executable, and should be
		# readonly to exploit a quirk in the memory manager.
		INSTALL_LIB="-m 555"
		;;
	(interix*)
		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
		if test "$cf_cv_shlib_version" = rel; then
			cf_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
		else
			cf_shared_soname='`basename $@`'
		fi
		CC_SHARED_OPTS=
		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-rpath,${RPATH_LIST} -Wl,-h,'$cf_shared_soname' -o $@'
		;;
	(irix*)
		if test "$cf_cv_enable_rpath" = yes ; then
			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
		fi
		# tested with IRIX 5.2 and 'cc'.
		if test "$GCC" != yes; then
			CC_SHARED_OPTS='-KPIC'
			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -rdata_shared -soname `basename $@` -o $@'
		else
			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,`basename $@` -o $@'
		fi
		cf_cv_rm_so_locs=yes
		;;
	(linux*|gnu*|k*bsd*-gnu)
		if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then
			LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)"
			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
		fi
		if test "$cf_cv_enable_rpath" = yes ; then
			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
		fi

	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
	if test "$cf_cv_shlib_version" = rel; then
		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
	else
		cf_cv_shared_soname='`basename $@`'
	fi

		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@'
		;;
	(mingw*msvc*)
		cf_cv_shlib_version=msvcdll
		cf_cv_shlib_version_infix=msvcdll
		shlibdir=$bindir
		MAKE_DLLS=
		if test "$DFT_LWR_MODEL" = "shared" ; then
			LOCAL_LDFLAGS="-link -dll"
			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
			EXTRA_LDFLAGS="-link -dll $EXTRA_LDFLAGS"
		fi
		CC_SHARED_OPTS=
		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${LD} ${CFLAGS}'
		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.lib"
		cat >mk_shared_lib.sh <<-CF_EOF
		#!$SHELL
		SHARED_LIB=\$1
		IMPORT_LIB=\`echo "\$1" | sed -e 's/[0-9]*\.dll$/.dll.lib/'\`
		shift
		my_ld=\$1
		shift
		cat <<-EOF
		Linking shared library
		** SHARED LIB \$SHARED_LIB
		** IMPORT_LIB \$IMPORT_LIB
EOF
		args=\$(echo \$* | sed -E "s#-l(\w*)#\1.dll.lib#g" | sed -E "s#-L(\w*)#-LIBPATH:\1#g")
		exec \$my_ld -DLL -IMPLIB:"\${IMPORT_LIB}" -OUT:"\${SHARED_LIB}" ${LDFLAGS} \$args
		mv "\${IMPORT_LIB}" "\${IMPORT_LIB}"
CF_EOF
		chmod +x mk_shared_lib.sh
		cat >mk_prog.sh <<-CF_EOF
		#!$SHELL
		shift
		# Ignore first argument (compiler) and use LD (link.exe) unconditionally
		LD="$LD"
		clopts=()
		ldopts=("/subsystem:console")
		libs=()
		isdll=0
		while test \$# -gt 0; do
			case "\$1" in
				-link)
					# ignore -link argument
					;;
				-M[TD] | -M[TD]d)
					# ignore runtime-library option
					;;
				-dll)
					isdll=1
					;;
				-W* | -w*)
					# ignore warnings
					;;
				-D*)
					clopts+=("\$1")
					;;
				-I*)
					clopts+=("\$1")
					;;
				-l*)
					libs+=("\`echo \"\$1\" | sed \"s/^-l//\"\`")
					;;
				-L*)
					ldopts+=("\`echo \"\$1\" | sed \"s/^-L/-LIBPATH:/\"\`")
					;;
				*.obj | *.o)
					ldopts+=("\$1")
					;;
				-Wl,*)
					for linkarg in \`echo '\$1' | sed -e 's/-Wl,//' -e 's/,/ /'\`; do
						ldopts+=("\${linkarg}")
					done
					;;
				*.lib)
					ldopts+=("\$1")
					;;
				-o)
					shift
					ldopts+=("-out:\$1")
					;;
				*)
					clopts+=("\$1")
					ldopts+=("\$1")
					;;
			esac
			shift
		done
		if [ "\$isdll" -ne 0 ]; then
			for lib in \${libs[*]}; do
				ldopts+=("\$lib.dll.lib")
			done
		else
			for lib in \${libs[*]}; do
				ldopts+=("\$lib.lib")
			done
		fi
		cat <<-EOF
		Creating program
		** ld options:   "\${ldopts[@]}"
EOF
		exec \$LD \${ldopts[@]}
CF_EOF
		chmod +x mk_prog.sh
		LINK_PROGS="$SHELL ${rel_builddir}/mk_prog.sh"
		LINK_TESTS="$SHELL ${rel_builddir}/mk_prog.sh"
		;;
	(mingw*)
		cf_cv_shlib_version=mingw
		cf_cv_shlib_version_infix=mingw
		shlibdir=$bindir
		MAKE_DLLS=
		if test "$DFT_LWR_MODEL" = "shared" ; then
			LOCAL_LDFLAGS="-Wl,--enable-auto-import"
			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
			EXTRA_LDFLAGS="-Wl,--enable-auto-import $EXTRA_LDFLAGS"
		fi
		CC_SHARED_OPTS=
		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${CC} ${CFLAGS}'
		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a"
		cat >mk_shared_lib.sh <<-CF_EOF
		#!$SHELL
		SHARED_LIB=\$1
		IMPORT_LIB=\`echo "\$1" | sed -e 's/[0-9]*\.dll$/.dll.a/'\`
		shift
		cat <<-EOF
		Linking shared library
		** SHARED_LIB \$SHARED_LIB
		** IMPORT_LIB \$IMPORT_LIB
EOF
		exec \$* ${LDFLAGS} -shared -Wl,--enable-auto-import,--out-implib=\${IMPORT_LIB} -Wl,--export-all-symbols -o \${SHARED_LIB}
CF_EOF
		chmod +x mk_shared_lib.sh
		;;
	(openbsd[2-9].*|mirbsd*)
		if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then
			LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)"
			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
		fi
		if test "$cf_cv_enable_rpath" = yes ; then
			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
		fi
		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"

	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
	if test "$cf_cv_shlib_version" = rel; then
		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
	else
		cf_cv_shared_soname='`basename $@`'
	fi

		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-Bshareable,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@'
		;;
	(nskJ*)
		CC_SHARED_OPTS=
		MK_SHARED_LIB='${LD} -Wshared -Weld=-export_all -o $@'
		;;
	(nskL*)
		CC_SHARED_OPTS=
		MK_SHARED_LIB='${LD} -Wshared -Wxld=-export_all -o $@'
		;;
	(nto-qnx*|openbsd*|freebsd[12].*)
		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
		MK_SHARED_LIB='${LD} ${LDFLAGS} -Bshareable -o $@'
		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
		;;
	(dragonfly*|freebsd*)
		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
		if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then
			LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)"
			LOCAL_LDFLAGS2="${cf_ld_rpath_opt}\${RPATH_LIST} $LOCAL_LDFLAGS"
			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
		fi

	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
	if test "$cf_cv_shlib_version" = rel; then
		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
	else
		cf_cv_shared_soname='`basename $@`'
	fi

		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@'
		;;
	(netbsd*)
		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
		if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then
			LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)"
			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
			if test "$cf_cv_shlib_version" = auto; then
			if test -f /usr/libexec/ld.elf_so; then
				cf_cv_shlib_version=abi
			else
				cf_cv_shlib_version=rel
			fi
			fi

	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
	if test "$cf_cv_shlib_version" = rel; then
		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
	else
		cf_cv_shared_soname='`basename $@`'
	fi

			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname' -o $@'
		else
			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -o $@'
		fi
		;;
	(osf*|mls+*)
		# tested with OSF/1 V3.2 and 'cc'
		# tested with OSF/1 V3.2 and gcc 2.6.3 (but the c++ demo didn't
		# link with shared libs).
		MK_SHARED_LIB='${LD} ${LDFLAGS} -set_version ${REL_VERSION}:${ABI_VERSION} -expect_unresolved "*" -shared -soname `basename $@`'
		case "$host_os" in
		(osf4*)
			MK_SHARED_LIB="${MK_SHARED_LIB} -msym"
			;;
		esac
		MK_SHARED_LIB="${MK_SHARED_LIB}"' -o $@'
		if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then
			LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)"
			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
		fi
		cf_cv_rm_so_locs=yes
		;;
	(sco3.2v5*)  # also uw2* and UW7: hops 13-Apr-98
		# tested with osr5.0.5
		if test "$GCC" != yes; then
			CC_SHARED_OPTS='-belf -KPIC'
		fi
		MK_SHARED_LIB='${LD} ${LDFLAGS} -dy -G -h `basename $@ .${REL_VERSION}`.${ABI_VERSION} -o $@'
		if test "$cf_cv_enable_rpath" = yes ; then
			# only way is to set LD_RUN_PATH but no switch for it
			RUN_PATH=$libdir
		fi
		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
		LINK_PROGS='LD_RUN_PATH=${libdir}'
		LINK_TESTS='Pwd=`pwd`;LD_RUN_PATH=`dirname $${Pwd}`/lib'
		;;
	(sunos4*)
		# tested with SunOS 4.1.1 and gcc 2.7.0
		if test "$GCC" != yes; then
			CC_SHARED_OPTS='-KPIC'
		fi
		MK_SHARED_LIB='${LD} ${LDFLAGS} -assert pure-text -o $@'
		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
		;;
	(solaris2*)
		# tested with SunOS 5.5.1 (solaris 2.5.1) and gcc 2.7.2
		# tested with SunOS 5.10 (solaris 10) and gcc 3.4.3
		if test "$DFT_LWR_MODEL" = "shared" ; then
			LOCAL_LDFLAGS="-R \$(LOCAL_LIBDIR):\${libdir}"
			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
		fi
		if test "$cf_cv_enable_rpath" = yes ; then
			EXTRA_LDFLAGS="-R \${libdir} $EXTRA_LDFLAGS"
		fi

	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
	if test "$cf_cv_shlib_version" = rel; then
		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
	else
		cf_cv_shared_soname='`basename $@`'
	fi

		if test "$GCC" != yes; then
			cf_save_CFLAGS="$CFLAGS"
			for cf_shared_opts in -xcode=pic32 -xcode=pic13 -KPIC -Kpic -O
			do
				CFLAGS="$cf_shared_opts $cf_save_CFLAGS"
				cat >"conftest.$ac_ext" <<_ACEOF
#line 6591 "configure"
#include "confdefs.h"
#include <stdio.h>
int
main (void)
{
printf("Hello\\n");
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:6603: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:6606: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:6609: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:6612: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
			done
			CFLAGS="$cf_save_CFLAGS"
			CC_SHARED_OPTS=$cf_shared_opts
			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dy -G -h '$cf_cv_shared_soname' -o $@'
		else
			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -dy -G -h '$cf_cv_shared_soname' -o $@'
		fi
		;;
	(sysv5uw7*|unix_sv*)
		# tested with UnixWare 7.1.0 (gcc 2.95.2 and cc)
		if test "$GCC" != yes; then
			CC_SHARED_OPTS='-KPIC'
		fi
		MK_SHARED_LIB='${LD} ${LDFLAGS} -d y -G -o $@'
		;;
	(*)
		CC_SHARED_OPTS='unknown'
		MK_SHARED_LIB='echo unknown'
		;;
	esac

	# This works if the last tokens in $MK_SHARED_LIB are the -o target.
	case "$cf_cv_shlib_version" in
	(rel|abi)
		case "$MK_SHARED_LIB" in
		(*'-o $@')
			test "$cf_cv_do_symlinks" = no && cf_cv_do_symlinks=yes
			;;
		(*)
			{ echo "$as_me:6649: WARNING: ignored --with-shlib-version" >&5
echo "$as_me: WARNING: ignored --with-shlib-version" >&2;}
			;;
		esac
		;;
	esac

	if test -n "$cf_try_cflags"
	then
cat > conftest.$ac_ext <<EOF
#line 6659 "${as_me:-configure}"
#include <stdio.h>
int main(int argc, char *argv[])
{
	printf("hello\\n");
	return (argv[argc-1] == 0) ;
}
EOF
		cf_save_CFLAGS="$CFLAGS"
		for cf_opt in $cf_try_cflags
		do
			CFLAGS="$cf_save_CFLAGS -$cf_opt"
			echo "$as_me:6671: checking if CFLAGS option -$cf_opt works" >&5
echo $ECHO_N "checking if CFLAGS option -$cf_opt works... $ECHO_C" >&6
			if { (eval echo "$as_me:6673: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:6676: \$? = $ac_status" >&5
  (exit "$ac_status"); }; then
				echo "$as_me:6678: result: yes" >&5
echo "${ECHO_T}yes" >&6
				cf_save_CFLAGS="$CFLAGS"
			else
				echo "$as_me:6682: result: no" >&5
echo "${ECHO_T}no" >&6
			fi
		done
		CFLAGS="$cf_save_CFLAGS"
	fi

	# RPATH_LIST is a colon-separated list of directories
	test -n "$cf_ld_rpath_opt" && MK_SHARED_LIB="$MK_SHARED_LIB $cf_ld_rpath_opt\${RPATH_LIST}"
	test -z "$RPATH_LIST" && RPATH_LIST="\${libdir}"

	test "$cf_cv_rm_so_locs" = yes && RM_SHARED_OPTS="$RM_SHARED_OPTS so_locations"

	test -n "$verbose" && echo "	CC_SHARED_OPTS: $CC_SHARED_OPTS" 1>&6

echo "${as_me:-configure}:6697: testing CC_SHARED_OPTS: $CC_SHARED_OPTS ..." 1>&5

	test -n "$verbose" && echo "	MK_SHARED_LIB:  $MK_SHARED_LIB" 1>&6

echo "${as_me:-configure}:6701: testing MK_SHARED_LIB:  $MK_SHARED_LIB ..." 1>&5

for model in $cf_list_models ; do
	case "$model" in
	(libtool)

echo "$as_me:6707: checking for additional libtool options" >&5
echo $ECHO_N "checking for additional libtool options... $ECHO_C" >&6

# Check whether --with-libtool-opts or --without-libtool-opts was given.
if test "${with_libtool_opts+set}" = set; then
  withval="$with_libtool_opts"
  with_libtool_opts=$withval
else
  with_libtool_opts=no
fi;
echo "$as_me:6717: result: $with_libtool_opts" >&5
echo "${ECHO_T}$with_libtool_opts" >&6

case .$with_libtool_opts in
(.yes|.no|.)
	;;
(*)
	LIBTOOL_OPTS="$LIBTOOL_OPTS $with_libtool_opts"
	;;
esac

echo "$as_me:6728: checking if exported-symbols file should be used" >&5
echo $ECHO_N "checking if exported-symbols file should be used... $ECHO_C" >&6

# Check whether --with-export-syms or --without-export-syms was given.
if test "${with_export_syms+set}" = set; then
  withval="$with_export_syms"
  with_export_syms=$withval
else
  with_export_syms=no
fi;
if test "x$with_export_syms" = xyes
then
	with_export_syms='${top_srcdir}/package/${PACKAGE}.sym'

fi
echo "$as_me:6743: result: $with_export_syms" >&5
echo "${ECHO_T}$with_export_syms" >&6
if test "x$with_export_syms" != xno
then
	EXPORT_SYMS="-export-symbols $with_export_syms"

fi

		;;
	(shared)
		if test "$CC_SHARED_OPTS" = "unknown"; then
			{ { echo "$as_me:6754: error: Shared libraries are not supported in this version" >&5
echo "$as_me: error: Shared libraries are not supported in this version" >&2;}
   { (exit 1); exit 1; }; }
		fi
		# workaround for inept transition to PIE vs PIC...
		echo "$as_me:6759: checking if current CFLAGS link properly" >&5
echo $ECHO_N "checking if current CFLAGS link properly... $ECHO_C" >&6
		cat >"conftest.$ac_ext" <<_ACEOF
#line 6762 "configure"
#include "confdefs.h"
#include <stdio.h>
int
main (void)
{
printf("Hello work\\n");
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:6774: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:6777: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:6780: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:6783: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cflags_work=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cflags_work=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
		echo "$as_me:6792: result: $cf_cflags_work" >&5
echo "${ECHO_T}$cf_cflags_work" >&6
		if test "$cf_cflags_work" = no
		then
			test -n "$verbose" && echo "	try to work around by appending shared-options" 1>&6

echo "${as_me:-configure}:6798: testing try to work around by appending shared-options ..." 1>&5

			CFLAGS="$CFLAGS $CC_SHARED_OPTS"
		fi

echo "$as_me:6803: checking if versioned-symbols file should be used" >&5
echo $ECHO_N "checking if versioned-symbols file should be used... $ECHO_C" >&6

# Check whether --with-versioned-syms or --without-versioned-syms was given.
if test "${with_versioned_syms+set}" = set; then
  withval="$with_versioned_syms"
  with_versioned_syms=$withval
else
  with_versioned_syms=no
fi;
case "x$with_versioned_syms" in
(xyes)
	with_versioned_syms='${top_srcdir}/package/${PACKAGE}.map'

	;;
(xno)
	;;
(x/*)
	test -f "$with_versioned_syms" || { { echo "$as_me:6821: error: expected a filename: $with_versioned_syms" >&5
echo "$as_me: error: expected a filename: $with_versioned_syms" >&2;}
   { (exit 1); exit 1; }; }
	;;
(*)
	test -f "$with_versioned_syms" || { { echo "$as_me:6826: error: expected a filename: $with_versioned_syms" >&5
echo "$as_me: error: expected a filename: $with_versioned_syms" >&2;}
   { (exit 1); exit 1; }; }
	with_versioned_syms=`pwd`/"$with_versioned_syms"
	;;
esac
echo "$as_me:6832: result: $with_versioned_syms" >&5
echo "${ECHO_T}$with_versioned_syms" >&6

RESULTING_SYMS=
VERSIONED_SYMS=
WILDCARD_SYMS=

if test "x$with_versioned_syms" != xno
then
	RESULTING_SYMS=$with_versioned_syms
	case "x$MK_SHARED_LIB" in
	(*-Wl,*)
		VERSIONED_SYMS="-Wl,--version-script,\${RESULTING_SYMS}"
		MK_SHARED_LIB=`echo "$MK_SHARED_LIB" | sed -e "s%-Wl,%\\${VERSIONED_SYMS} -Wl,%"`
		test -n "$verbose" && echo "	MK_SHARED_LIB:  $MK_SHARED_LIB" 1>&6

echo "${as_me:-configure}:6848: testing MK_SHARED_LIB:  $MK_SHARED_LIB ..." 1>&5

		;;
	(*-dy\ *)
		VERSIONED_SYMS="-Wl,-M,\${RESULTING_SYMS}"
		MK_SHARED_LIB=`echo "$MK_SHARED_LIB" | sed -e "s%-dy%\\${VERSIONED_SYMS} -dy%"`
		test -n "$verbose" && echo "	MK_SHARED_LIB:  $MK_SHARED_LIB" 1>&6

echo "${as_me:-configure}:6856: testing MK_SHARED_LIB:  $MK_SHARED_LIB ..." 1>&5

		;;
	(*)
		{ echo "$as_me:6860: WARNING: this system does not support versioned-symbols" >&5
echo "$as_me: WARNING: this system does not support versioned-symbols" >&2;}
		;;
	esac

	# Linux ld can selectively override scope, e.g., of symbols beginning with
	# "_" by first declaring some as global, and then using a wildcard to
	# declare the others as local.  Some other loaders cannot do this.  Check
	# by constructing a (very) simple shared library and inspecting its
	# symbols.
	if test "x$VERSIONED_SYMS" != "x"
	then
		echo "$as_me:6872: checking if wildcards can be used to selectively omit symbols" >&5
echo $ECHO_N "checking if wildcards can be used to selectively omit symbols... $ECHO_C" >&6
		WILDCARD_SYMS=no

		# make sources
		rm -f conftest.*

		cat >conftest.ver <<EOF
module_1.0 {
global:
	globalf1;
local:
	localf1;
};
module_2.0 {
global:
	globalf2;
local:
	localf2;
	_*;
} module_1.0;
submodule_1.0 {
global:
	subglobalf1;
	_ismissing;
local:
	sublocalf1;
};
submodule_2.0 {
global:
	subglobalf2;
local:
	sublocalf2;
	_*;
} submodule_1.0;
EOF
		cat >conftest.$ac_ext <<EOF
#line 6909 "configure"
int	_ismissing(void) { return 1; }
int	_localf1(void) { return 1; }
int	_localf2(void) { return 2; }
int	globalf1(void) { return 1; }
int	globalf2(void) { return 2; }
int	_sublocalf1(void) { return 1; }
int	_sublocalf2(void) { return 2; }
int	subglobalf1(void) { return 1; }
int	subglobalf2(void) { return 2; }
EOF
		cat >conftest.mk <<EOF
CC=${CC}
CFLAGS=${CFLAGS}
CPPFLAGS=${CPPFLAGS}
LDFLAGS=${LDFLAGS}
LIBS=${LIBS}
VERSIONED_SYMS=${VERSIONED_SYMS}
RESULTING_SYMS=conftest.ver
MK_SHARED_LIB=${MK_SHARED_LIB}
conftest.so: conftest.$ac_cv_objext
		\$(MK_SHARED_LIB) conftest.$ac_cv_objext
EOF

		# compile source, make library
		if make -f conftest.mk 2>&5 >/dev/null
		then
			# test for missing symbol in either Data or Text section
			cf_missing="`nm -P conftest.so 2>&5 |${FGREP-fgrep} _ismissing | ${EGREP-egrep} '[ 	][DT][ 	]'`"
			test -n "$cf_missing" && WILDCARD_SYMS=yes
		fi
		echo "$as_me:6940: result: $WILDCARD_SYMS" >&5
echo "${ECHO_T}$WILDCARD_SYMS" >&6
		rm -f conftest.*
	fi
fi

		;;
	esac
done

### Checks for special libraries, must be done up-front.
SHLIB_LIST=""

echo "$as_me:6953: checking if you want to link with the GPM mouse library" >&5
echo $ECHO_N "checking if you want to link with the GPM mouse library... $ECHO_C" >&6

# Check whether --with-gpm or --without-gpm was given.
if test "${with_gpm+set}" = set; then
  withval="$with_gpm"
  with_gpm=$withval
else
  with_gpm=maybe
fi;
echo "$as_me:6963: result: $with_gpm" >&5
echo "${ECHO_T}$with_gpm" >&6

if test "$with_gpm" != no ; then
	echo "$as_me:6967: checking for gpm.h" >&5
echo $ECHO_N "checking for gpm.h... $ECHO_C" >&6
if test "${ac_cv_header_gpm_h+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 6973 "configure"
#include "confdefs.h"
#include <gpm.h>
_ACEOF
if { (eval echo "$as_me:6977: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:6983: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  ac_cv_header_gpm_h=yes
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  ac_cv_header_gpm_h=no
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:7002: result: $ac_cv_header_gpm_h" >&5
echo "${ECHO_T}$ac_cv_header_gpm_h" >&6
if test "$ac_cv_header_gpm_h" = yes; then

cat >>confdefs.h <<\EOF
#define HAVE_GPM_H 1
EOF

		if test "$with_gpm" != yes && test "$with_gpm" != maybe ; then
			test -n "$verbose" && echo "	assuming we really have GPM library" 1>&6

echo "${as_me:-configure}:7013: testing assuming we really have GPM library ..." 1>&5

cat >>confdefs.h <<\EOF
#define HAVE_LIBGPM 1
EOF

			with_gpm=yes
		else
			echo "$as_me:7021: checking for Gpm_Open in -lgpm" >&5
echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6
if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lgpm  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 7029 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char Gpm_Open ();
int
main (void)
{
Gpm_Open ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:7048: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:7051: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:7054: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:7057: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_gpm_Gpm_Open=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_gpm_Gpm_Open=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:7068: result: $ac_cv_lib_gpm_Gpm_Open" >&5
echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6
if test "$ac_cv_lib_gpm_Gpm_Open" = yes; then
  with_gpm=yes
else

				if test "$with_gpm" = maybe; then
					{ echo "$as_me:7075: WARNING: Cannot link with GPM library" >&5
echo "$as_me: WARNING: Cannot link with GPM library" >&2;}
					with_gpm=no
				else
					{ { echo "$as_me:7079: error: Cannot link with GPM library" >&5
echo "$as_me: error: Cannot link with GPM library" >&2;}
   { (exit 1); exit 1; }; }
				fi

fi

		fi

else

		test "$with_gpm" != maybe && { echo "$as_me:7090: WARNING: Cannot find GPM header" >&5
echo "$as_me: WARNING: Cannot find GPM header" >&2;}
		with_gpm=no

fi

fi

if test "$with_gpm" != no ; then
	echo "$as_me:7099: checking if you want to load GPM dynamically" >&5
echo $ECHO_N "checking if you want to load GPM dynamically... $ECHO_C" >&6

# Check whether --with-dlsym or --without-dlsym was given.
if test "${with_dlsym+set}" = set; then
  withval="$with_dlsym"
  with_dlsym=$withval
else
  with_dlsym=yes
fi;
	echo "$as_me:7109: result: $with_dlsym" >&5
echo "${ECHO_T}$with_dlsym" >&6
	if test "x$with_dlsym" = xyes ; then

cf_have_dlsym=no
echo "$as_me:7114: checking for dlsym" >&5
echo $ECHO_N "checking for dlsym... $ECHO_C" >&6
if test "${ac_cv_func_dlsym+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 7120 "configure"
#include "confdefs.h"
#define dlsym autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef dlsym

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char dlsym (void);

int
main (void)
{

/* The GNU C library defines stubs 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_dlsym) || defined (__stub___dlsym)
#error found stub for dlsym
#endif

	return dlsym ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:7151: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:7154: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:7157: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:7160: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_func_dlsym=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_func_dlsym=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:7170: result: $ac_cv_func_dlsym" >&5
echo "${ECHO_T}$ac_cv_func_dlsym" >&6
if test "$ac_cv_func_dlsym" = yes; then
  cf_have_dlsym=yes
else

cf_have_libdl=no
echo "$as_me:7177: checking for dlsym in -ldl" >&5
echo $ECHO_N "checking for dlsym in -ldl... $ECHO_C" >&6
if test "${ac_cv_lib_dl_dlsym+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 7185 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char dlsym ();
int
main (void)
{
dlsym ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:7204: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:7207: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:7210: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:7213: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_dl_dlsym=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_dl_dlsym=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:7224: result: $ac_cv_lib_dl_dlsym" >&5
echo "${ECHO_T}$ac_cv_lib_dl_dlsym" >&6
if test "$ac_cv_lib_dl_dlsym" = yes; then

	cf_have_dlsym=yes
	cf_have_libdl=yes
fi

fi

if test "$cf_have_dlsym" = yes ; then
	test "$cf_have_libdl" = yes && {
cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -ldl; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"
 }

	echo "$as_me:7253: checking whether able to link to dl*() functions" >&5
echo $ECHO_N "checking whether able to link to dl*() functions... $ECHO_C" >&6
	cat >"conftest.$ac_ext" <<_ACEOF
#line 7256 "configure"
#include "confdefs.h"
#include <dlfcn.h>
int
main (void)
{

		void *obj;
		if ((obj = dlopen("filename", 0)) != 0) {
			if (dlsym(obj, "symbolname") == 0) {
			dlclose(obj);
			}
		}
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:7274: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:7277: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:7280: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:7283: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

cat >>confdefs.h <<\EOF
#define HAVE_LIBDL 1
EOF

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

		{ { echo "$as_me:7294: error: Cannot link test program for libdl" >&5
echo "$as_me: error: Cannot link test program for libdl" >&2;}
   { (exit 1); exit 1; }; }
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
	echo "$as_me:7299: result: ok" >&5
echo "${ECHO_T}ok" >&6
else
	{ { echo "$as_me:7302: error: Cannot find dlsym function" >&5
echo "$as_me: error: Cannot find dlsym function" >&2;}
   { (exit 1); exit 1; }; }
fi

		if test "x$with_gpm" != xyes ; then
			test -n "$verbose" && echo "	assuming soname for gpm is $with_gpm" 1>&6

echo "${as_me:-configure}:7310: testing assuming soname for gpm is $with_gpm ..." 1>&5

			cf_cv_gpm_soname="$with_gpm"
		else

echo "$as_me:7315: checking for soname of gpm library" >&5
echo $ECHO_N "checking for soname of gpm library... $ECHO_C" >&6
if test "${cf_cv_gpm_soname+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cf_cv_gpm_soname=unknown
if test "$cross_compiling" != yes ; then
cat >conftest.$ac_ext <<CF_EOF
#include <gpm.h>
int main(void)
{
if (Gpm_Open(0,0)) Gpm_Close();
	${cf_cv_main_return:-return}(0);
}
CF_EOF
cf_save_LIBS="$LIBS"

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lgpm; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

	if { (eval echo "$as_me:7349: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:7352: \$? = $ac_status" >&5
  (exit "$ac_status"); } ; then
		if { (eval echo "$as_me:7354: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:7357: \$? = $ac_status" >&5
  (exit "$ac_status"); } ; then
			cf_cv_gpm_soname="`ldd \"conftest$ac_exeext\" 2>/dev/null | sed -e 's,^.*/,,' -e 's, .*$,,' | ${FGREP-fgrep} libgpm.`"
			test -z "$cf_cv_gpm_soname" && cf_cv_gpm_soname=unknown
		fi
	fi
rm -rf ./conftest*
LIBS="$cf_save_LIBS"
fi

fi
echo "$as_me:7368: result: $cf_cv_gpm_soname" >&5
echo "${ECHO_T}$cf_cv_gpm_soname" >&6

		fi
		test "$cf_cv_gpm_soname" != "unknown" &&
cat >>confdefs.h <<EOF
#define LIBGPM_SONAME "$cf_cv_gpm_soname"
EOF

		SHLIB_LIST="-ldl $SHLIB_LIST"

cf_add_libs="$PRIVATE_LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -ldl; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
PRIVATE_LIBS="$cf_add_libs"

	else
		SHLIB_LIST="-lgpm $SHLIB_LIST"

cf_add_libs="$TEST_LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lgpm; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
TEST_LIBS="$cf_add_libs"

cf_add_libs="$PRIVATE_LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lgpm; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
PRIVATE_LIBS="$cf_add_libs"

	fi

cat >>confdefs.h <<\EOF
#define HAVE_LIBGPM 1
EOF

echo "$as_me:7436: checking for Gpm_Wgetch in -lgpm" >&5
echo $ECHO_N "checking for Gpm_Wgetch in -lgpm... $ECHO_C" >&6
if test "${ac_cv_lib_gpm_Gpm_Wgetch+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lgpm  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 7444 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char Gpm_Wgetch ();
int
main (void)
{
Gpm_Wgetch ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:7463: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:7466: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:7469: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:7472: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_gpm_Gpm_Wgetch=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_gpm_Gpm_Wgetch=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:7483: result: $ac_cv_lib_gpm_Gpm_Wgetch" >&5
echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Wgetch" >&6
if test "$ac_cv_lib_gpm_Gpm_Wgetch" = yes; then

echo "$as_me:7487: checking if GPM is weakly bound to curses library" >&5
echo $ECHO_N "checking if GPM is weakly bound to curses library... $ECHO_C" >&6
if test "${cf_cv_check_gpm_wgetch+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cf_cv_check_gpm_wgetch=unknown
if test "$cross_compiling" != yes ; then

cat >conftest.$ac_ext <<CF_EOF
#include <gpm.h>
int main(void)
{
	Gpm_Wgetch();
	${cf_cv_main_return:-return}(0);
}
CF_EOF

	cf_save_LIBS="$LIBS"
	# This only works if we can look at the symbol table.  If a shared
	# library is stripped for install, we cannot use that.  So we're forced
	# to rely on the static library, noting that some packagers may not
	# include it.
	LIBS="-static -lgpm -dynamic $LIBS"
	if { (eval echo "$as_me:7511: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:7514: \$? = $ac_status" >&5
  (exit "$ac_status"); } ; then
		if { (eval echo "$as_me:7516: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:7519: \$? = $ac_status" >&5
  (exit "$ac_status"); } ; then
			cf_cv_check_gpm_wgetch="`nm \"conftest$ac_exeext\" | ${EGREP-egrep} '\<wgetch\>' | ${EGREP-egrep} '\<[vVwW]\>'`"
			test -n "$cf_cv_check_gpm_wgetch" && cf_cv_check_gpm_wgetch=yes
			test -z "$cf_cv_check_gpm_wgetch" && cf_cv_check_gpm_wgetch=no
		fi
	fi
	rm -rf ./conftest*
	LIBS="$cf_save_LIBS"
fi

fi
echo "$as_me:7531: result: $cf_cv_check_gpm_wgetch" >&5
echo "${ECHO_T}$cf_cv_check_gpm_wgetch" >&6

if test "$cf_cv_check_gpm_wgetch" != yes ; then
	{ echo "$as_me:7535: WARNING: GPM library is already linked with curses - read the FAQ" >&5
echo "$as_me: WARNING: GPM library is already linked with curses - read the FAQ" >&2;}
fi

fi

fi

echo "$as_me:7543: checking if you want to use PCRE2 for regular-expressions" >&5
echo $ECHO_N "checking if you want to use PCRE2 for regular-expressions... $ECHO_C" >&6

# Check whether --with-pcre2 or --without-pcre2 was given.
if test "${with_pcre2+set}" = set; then
  withval="$with_pcre2"

fi;
test -z "$with_pcre2" && with_pcre2=no
echo "$as_me:7552: result: $with_pcre2" >&5
echo "${ECHO_T}$with_pcre2" >&6

if test "x$with_pcre2" != xno ; then
	cf_with_pcre2_ok=no
	for cf_with_pcre2 in libpcre2 libpcre2-posix libpcre
	do

if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "$cf_with_pcre2"; then
	test -n "$verbose" && echo "	found package $cf_with_pcre2" 1>&6

echo "${as_me:-configure}:7563: testing found package $cf_with_pcre2 ..." 1>&5

	cf_pkgconfig_incs="`$PKG_CONFIG --cflags "$cf_with_pcre2" 2>/dev/null`"
	cf_pkgconfig_libs="`$PKG_CONFIG --libs   "$cf_with_pcre2" 2>/dev/null`"
	test -n "$verbose" && echo "	package $cf_with_pcre2 CFLAGS: $cf_pkgconfig_incs" 1>&6

echo "${as_me:-configure}:7569: testing package $cf_with_pcre2 CFLAGS: $cf_pkgconfig_incs ..." 1>&5

	test -n "$verbose" && echo "	package $cf_with_pcre2 LIBS: $cf_pkgconfig_libs" 1>&6

echo "${as_me:-configure}:7573: testing package $cf_with_pcre2 LIBS: $cf_pkgconfig_libs ..." 1>&5

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in $cf_pkgconfig_incs
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

	cf_with_pcre2_ok=yes; break
else
	cf_pkgconfig_incs=
	cf_pkgconfig_libs=
	:
fi

	done
	cf_with_pcre2_ok=yes || { { echo "$as_me:7697: error: Cannot find PCRE2 library" >&5
echo "$as_me: error: Cannot find PCRE2 library" >&2;}
   { (exit 1); exit 1; }; }

cat >>confdefs.h <<\EOF
#define HAVE_LIB_PCRE2 1
EOF

	# if pkgconfig gave no results, look for the libraries directly
	case "$LIBS" in
	(*pcre2-posix*|*pcreposix*)
		;;
	(*)
		echo "$as_me:7710: checking for regcomp in -lpcre2-posix" >&5
echo $ECHO_N "checking for regcomp in -lpcre2-posix... $ECHO_C" >&6
if test "${ac_cv_lib_pcre2_posix_regcomp+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lpcre2-posix  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 7718 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char regcomp ();
int
main (void)
{
regcomp ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:7737: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:7740: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:7743: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:7746: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_pcre2_posix_regcomp=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_pcre2_posix_regcomp=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:7757: result: $ac_cv_lib_pcre2_posix_regcomp" >&5
echo "${ECHO_T}$ac_cv_lib_pcre2_posix_regcomp" >&6
if test "$ac_cv_lib_pcre2_posix_regcomp" = yes; then

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lpcre2-posix; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

else
  echo "$as_me:7778: checking for regcomp in -lpcreposix" >&5
echo $ECHO_N "checking for regcomp in -lpcreposix... $ECHO_C" >&6
if test "${ac_cv_lib_pcreposix_regcomp+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lpcreposix  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 7786 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char regcomp ();
int
main (void)
{
regcomp ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:7805: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:7808: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:7811: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:7814: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_pcreposix_regcomp=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_pcreposix_regcomp=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:7825: result: $ac_cv_lib_pcreposix_regcomp" >&5
echo "${ECHO_T}$ac_cv_lib_pcreposix_regcomp" >&6
if test "$ac_cv_lib_pcreposix_regcomp" = yes; then

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lpcreposix; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

else
  { { echo "$as_me:7846: error: Cannot find PCRE2 POSIX library" >&5
echo "$as_me: error: Cannot find PCRE2 POSIX library" >&2;}
   { (exit 1); exit 1; }; }
fi

fi

		;;
	esac

	# either way, check for the library header files

for ac_header in pcre2posix.h pcreposix.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
echo "$as_me:7861: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 7867 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:7871: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:7877: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  eval "$as_ac_Header=yes"
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  eval "$as_ac_Header=no"
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:7896: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
EOF

fi
done

for ac_func in PCRE2regcomp
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
echo "$as_me:7909: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 7915 "configure"
#include "confdefs.h"
#define $ac_func autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef $ac_func

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char $ac_func (void);

int
main (void)
{

/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func)
#error found stub for $ac_func
#endif

	return $ac_func ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:7946: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:7949: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:7952: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:7955: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  eval "$as_ac_var=yes"
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
eval "$as_ac_var=no"
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:7965: result: `eval echo '${'"$as_ac_var"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
EOF

fi
done

fi

# not everyone has "test -c"
if test -c /dev/sysmouse 2>/dev/null ; then
echo "$as_me:7979: checking if you want to use sysmouse" >&5
echo $ECHO_N "checking if you want to use sysmouse... $ECHO_C" >&6

# Check whether --with-sysmouse or --without-sysmouse was given.
if test "${with_sysmouse+set}" = set; then
  withval="$with_sysmouse"
  cf_with_sysmouse=$withval
else
  cf_with_sysmouse=maybe
fi;
	if test "$cf_with_sysmouse" != no ; then
	cat >"conftest.$ac_ext" <<_ACEOF
#line 7991 "configure"
#include "confdefs.h"

#include <osreldate.h>
#if (__FreeBSD_version >= 400017)
#include <sys/consio.h>
#include <sys/fbio.h>
#else
#include <machine/console.h>
#endif

int
main (void)
{

	struct mouse_info the_mouse;
	ioctl(0, CONS_MOUSECTL, &the_mouse);

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:8014: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:8017: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:8020: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:8023: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_with_sysmouse=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_with_sysmouse=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
	fi
echo "$as_me:8033: result: $cf_with_sysmouse" >&5
echo "${ECHO_T}$cf_with_sysmouse" >&6
test "$cf_with_sysmouse" = yes &&
cat >>confdefs.h <<\EOF
#define USE_SYSMOUSE 1
EOF

fi

# pretend that ncurses==ncursesw==ncursest
echo "$as_me:8043: checking if you want to disable library suffixes" >&5
echo $ECHO_N "checking if you want to disable library suffixes... $ECHO_C" >&6

# Check whether --enable-lib-suffixes or --disable-lib-suffixes was given.
if test "${enable_lib_suffixes+set}" = set; then
  enableval="$enable_lib_suffixes"
  test "$enableval" != no && enableval=yes
	if test "$enableval" != "yes" ; then
    disable_lib_suffixes=yes
	else
		disable_lib_suffixes=no
	fi
else
  enableval=yes
	disable_lib_suffixes=no

fi;
echo "$as_me:8060: result: $disable_lib_suffixes" >&5
echo "${ECHO_T}$disable_lib_suffixes" >&6

### If we're building with rpath, try to link non-standard libs that way too.
if test "$DFT_LWR_MODEL" = "shared" && test "x$cf_cv_enable_rpath" != xno; then

echo "$as_me:8066: checking if rpath-hack should be disabled" >&5
echo $ECHO_N "checking if rpath-hack should be disabled... $ECHO_C" >&6

# Check whether --enable-rpath-hack or --disable-rpath-hack was given.
if test "${enable_rpath_hack+set}" = set; then
  enableval="$enable_rpath_hack"
  test "$enableval" != no && enableval=yes
	if test "$enableval" != "yes" ; then
    enable_rpath_hack=no
	else
		enable_rpath_hack=yes
	fi
else
  enableval=yes
	enable_rpath_hack=yes

fi;
if test "x$enable_rpath_hack" = xno; then cf_disable_rpath_hack=yes; else cf_disable_rpath_hack=no; fi
echo "$as_me:8084: result: $cf_disable_rpath_hack" >&5
echo "${ECHO_T}$cf_disable_rpath_hack" >&6

if test "$enable_rpath_hack" = yes ; then

echo "$as_me:8089: checking for updated LDFLAGS" >&5
echo $ECHO_N "checking for updated LDFLAGS... $ECHO_C" >&6
if test -n "$LD_RPATH_OPT" ; then
	echo "$as_me:8092: result: maybe" >&5
echo "${ECHO_T}maybe" >&6

	for ac_prog in ldd
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:8099: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_cf_ldd_prog+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$cf_ldd_prog"; then
  ac_cv_prog_cf_ldd_prog="$cf_ldd_prog" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_cf_ldd_prog="$ac_prog"
echo "$as_me:8114: found $ac_dir/$ac_word" >&5
break
done

fi
fi
cf_ldd_prog=$ac_cv_prog_cf_ldd_prog
if test -n "$cf_ldd_prog"; then
  echo "$as_me:8122: result: $cf_ldd_prog" >&5
echo "${ECHO_T}$cf_ldd_prog" >&6
else
  echo "$as_me:8125: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  test -n "$cf_ldd_prog" && break
done
test -n "$cf_ldd_prog" || cf_ldd_prog="no"

	cf_rpath_list="/usr/lib /lib"
	if test "$cf_ldd_prog" != no
	then
		cf_rpath_oops=

cat >"conftest.$ac_ext" <<_ACEOF
#line 8139 "configure"
#include "confdefs.h"
#include <stdio.h>
int
main (void)
{
printf("Hello");
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:8151: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:8154: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:8157: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:8160: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_rpath_oops=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} ' not found' | sed -e 's% =>.*$%%' |sort | uniq`
		 cf_rpath_list=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} / | sed -e 's%^.*[ 	]/%/%' -e 's%/[^/][^/]*$%%' |sort | uniq`
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"

		# If we passed the link-test, but get a "not found" on a given library,
		# this could be due to inept reconfiguration of gcc to make it only
		# partly honor /usr/local/lib (or whatever).  Sometimes this behavior
		# is intentional, e.g., installing gcc in /usr/bin and suppressing the
		# /usr/local libraries.
		if test -n "$cf_rpath_oops"
		then
			for cf_rpath_src in $cf_rpath_oops
			do
				for cf_rpath_dir in \
					/usr/local \
					/usr/pkg \
					/opt/sfw
				do
					if test -f "$cf_rpath_dir/lib/$cf_rpath_src"
					then
						test -n "$verbose" && echo "	...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src" 1>&6

echo "${as_me:-configure}:8188: testing ...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src ..." 1>&5

						LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib"
						break
					fi
				done
			done
		fi
	fi

	test -n "$verbose" && echo "	...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6

echo "${as_me:-configure}:8200: testing ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5

test -n "$verbose" && echo "	...checking LDFLAGS $LDFLAGS" 1>&6

echo "${as_me:-configure}:8204: testing ...checking LDFLAGS $LDFLAGS ..." 1>&5

cf_rpath_dst=
for cf_rpath_src in $LDFLAGS
do
	case "$cf_rpath_src" in
	(-L*)

		# check if this refers to a directory which we will ignore
		cf_rpath_skip=no
		if test -n "$cf_rpath_list"
		then
			for cf_rpath_item in $cf_rpath_list
			do
				if test "x$cf_rpath_src" = "x-L$cf_rpath_item"
				then
					cf_rpath_skip=yes
					break
				fi
			done
		fi

		if test "$cf_rpath_skip" = no
		then
			# transform the option
			if test "$LD_RPATH_OPT" = "-R " ; then
				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"`
			else
				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"`
			fi

			# if we have not already added this, add it now
			cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"`
			if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS"
			then
				test -n "$verbose" && echo "	...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6

echo "${as_me:-configure}:8241: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5

				EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS"
			fi
		fi
		;;
	esac
	cf_rpath_dst="$cf_rpath_dst $cf_rpath_src"
done
LDFLAGS=$cf_rpath_dst

test -n "$verbose" && echo "	...checked LDFLAGS $LDFLAGS" 1>&6

echo "${as_me:-configure}:8254: testing ...checked LDFLAGS $LDFLAGS ..." 1>&5

test -n "$verbose" && echo "	...checking LIBS $LIBS" 1>&6

echo "${as_me:-configure}:8258: testing ...checking LIBS $LIBS ..." 1>&5

cf_rpath_dst=
for cf_rpath_src in $LIBS
do
	case "$cf_rpath_src" in
	(-L*)

		# check if this refers to a directory which we will ignore
		cf_rpath_skip=no
		if test -n "$cf_rpath_list"
		then
			for cf_rpath_item in $cf_rpath_list
			do
				if test "x$cf_rpath_src" = "x-L$cf_rpath_item"
				then
					cf_rpath_skip=yes
					break
				fi
			done
		fi

		if test "$cf_rpath_skip" = no
		then
			# transform the option
			if test "$LD_RPATH_OPT" = "-R " ; then
				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"`
			else
				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"`
			fi

			# if we have not already added this, add it now
			cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"`
			if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS"
			then
				test -n "$verbose" && echo "	...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6

echo "${as_me:-configure}:8295: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5

				EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS"
			fi
		fi
		;;
	esac
	cf_rpath_dst="$cf_rpath_dst $cf_rpath_src"
done
LIBS=$cf_rpath_dst

test -n "$verbose" && echo "	...checked LIBS $LIBS" 1>&6

echo "${as_me:-configure}:8308: testing ...checked LIBS $LIBS ..." 1>&5

	test -n "$verbose" && echo "	...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6

echo "${as_me:-configure}:8312: testing ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5

else
	echo "$as_me:8315: result: no" >&5
echo "${ECHO_T}no" >&6
fi

fi

fi

### Depending on the system, someone may use rpath to build ncurses but not
# want users of the package to rely upon that feature.  Give those people an
# option to suppress that detail from EXTRA_LDFLAGS.
EXTRA_PKG_LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS"
if test -n "$EXTRA_PKG_LDFLAGS"
then
	echo "$as_me:8329: checking if you want to disable extra LDFLAGS for package-scripts" >&5
echo $ECHO_N "checking if you want to disable extra LDFLAGS for package-scripts... $ECHO_C" >&6

# Check whether --enable-pkg-ldflags or --disable-pkg-ldflags was given.
if test "${enable_pkg_ldflags+set}" = set; then
  enableval="$enable_pkg_ldflags"
  test "$enableval" != no && enableval=yes
	if test "$enableval" != "yes" ; then
    disable_pkg_ldflags=yes
	else
		disable_pkg_ldflags=no
	fi
else
  enableval=yes
	disable_pkg_ldflags=no

fi;
	echo "$as_me:8346: result: $disable_pkg_ldflags" >&5
echo "${ECHO_T}$disable_pkg_ldflags" >&6
	test "$disable_pkg_ldflags" = yes && EXTRA_PKG_LDFLAGS=
fi

###############################################################################

###	use option --with-extra-suffix to append suffix to headers and libraries
echo "$as_me:8354: checking if you wish to append extra suffix to header/library paths" >&5
echo $ECHO_N "checking if you wish to append extra suffix to header/library paths... $ECHO_C" >&6
EXTRA_SUFFIX=

# Check whether --with-extra-suffix or --without-extra-suffix was given.
if test "${with_extra_suffix+set}" = set; then
  withval="$with_extra_suffix"
  case x$withval in
	(xno)
		;;
	(xyes|x)
		EXTRA_SUFFIX=$cf_cv_abi_version
		;;
	(*)
		EXTRA_SUFFIX=$withval
		;;
	esac

fi;
echo "$as_me:8373: result: $EXTRA_SUFFIX" >&5
echo "${ECHO_T}$EXTRA_SUFFIX" >&6

###	use option --disable-overwrite to leave out the link to -lcurses
echo "$as_me:8377: checking if you wish to install ncurses overwriting curses" >&5
echo $ECHO_N "checking if you wish to install ncurses overwriting curses... $ECHO_C" >&6

# Check whether --enable-overwrite or --disable-overwrite was given.
if test "${enable_overwrite+set}" = set; then
  enableval="$enable_overwrite"
  with_overwrite=$enableval
else
  if test "$prefix" = "/usr" ; then with_overwrite=yes; else with_overwrite=no; fi
fi;
echo "$as_me:8387: result: $with_overwrite" >&5
echo "${ECHO_T}$with_overwrite" >&6

echo "$as_me:8390: checking if external terminfo-database is used" >&5
echo $ECHO_N "checking if external terminfo-database is used... $ECHO_C" >&6

# Check whether --enable-database or --disable-database was given.
if test "${enable_database+set}" = set; then
  enableval="$enable_database"
  use_database=$enableval
else
  use_database=yes
fi;
echo "$as_me:8400: result: $use_database" >&5
echo "${ECHO_T}$use_database" >&6

case "$host_os" in
(os2*)
	TERMINFO_SRC='${top_srcdir}/misc/emx.src'
	;;
(*)
	TERMINFO_SRC='${top_srcdir}/misc/terminfo.src'
	;;
esac

NCURSES_USE_DATABASE=0
if test "$use_database" != no ; then
	NCURSES_USE_DATABASE=1

	echo "$as_me:8416: checking which terminfo source-file will be installed" >&5
echo $ECHO_N "checking which terminfo source-file will be installed... $ECHO_C" >&6

# Check whether --with-database or --without-database was given.
if test "${with_database+set}" = set; then
  withval="$with_database"
  TERMINFO_SRC=$withval
fi;
	echo "$as_me:8424: result: $TERMINFO_SRC" >&5
echo "${ECHO_T}$TERMINFO_SRC" >&6

	echo "$as_me:8427: checking whether to use hashed database instead of directory/tree" >&5
echo $ECHO_N "checking whether to use hashed database instead of directory/tree... $ECHO_C" >&6

# Check whether --with-hashed-db or --without-hashed-db was given.
if test "${with_hashed_db+set}" = set; then
  withval="$with_hashed_db"

else
  with_hashed_db=no
fi;
	echo "$as_me:8437: result: $with_hashed_db" >&5
echo "${ECHO_T}$with_hashed_db" >&6
else
	with_hashed_db=no
fi

echo "$as_me:8443: checking for list of fallback descriptions" >&5
echo $ECHO_N "checking for list of fallback descriptions... $ECHO_C" >&6

# Check whether --with-fallbacks or --without-fallbacks was given.
if test "${with_fallbacks+set}" = set; then
  withval="$with_fallbacks"
  with_fallback=$withval
else
  with_fallback=
fi;
echo "$as_me:8453: result: $with_fallback" >&5
echo "${ECHO_T}$with_fallback" >&6

case ".$with_fallback" in
(.|.no)
	FALLBACK_LIST=
	;;
(.yes)
	{ echo "$as_me:8461: WARNING: expected a list of terminal descriptions" >&5
echo "$as_me: WARNING: expected a list of terminal descriptions" >&2;}
	;;
(*)
	FALLBACK_LIST=`echo "$with_fallback" | sed -e 's/,/ /g'`
	;;
esac

# The fallback feature in ncurses relies upon tic/infocmp outside the build
# tree for generating the terminal descriptions that will be compiled into the
# library.  If your toolchain is old, it may not handle current terminal
# databases.  Use configure-options to point to the tools which will be used,
# rather than the first ones found on the $PATH.
if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}tic", so it can be a program name with args.
set dummy ${ac_tool_prefix}tic; ac_word=$2
echo "$as_me:8477: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_TIC+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$TIC"; then
  ac_cv_prog_TIC="$TIC" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_TIC="${ac_tool_prefix}tic"
echo "$as_me:8492: found $ac_dir/$ac_word" >&5
break
done

fi
fi
TIC=$ac_cv_prog_TIC
if test -n "$TIC"; then
  echo "$as_me:8500: result: $TIC" >&5
echo "${ECHO_T}$TIC" >&6
else
  echo "$as_me:8503: result: no" >&5
echo "${ECHO_T}no" >&6
fi

fi
if test -z "$ac_cv_prog_TIC"; then
  ac_ct_TIC=$TIC
  # Extract the first word of "tic", so it can be a program name with args.
set dummy tic; ac_word=$2
echo "$as_me:8512: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_TIC+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$ac_ct_TIC"; then
  ac_cv_prog_ac_ct_TIC="$ac_ct_TIC" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_ac_ct_TIC="tic"
echo "$as_me:8527: found $ac_dir/$ac_word" >&5
break
done

fi
fi
ac_ct_TIC=$ac_cv_prog_ac_ct_TIC
if test -n "$ac_ct_TIC"; then
  echo "$as_me:8535: result: $ac_ct_TIC" >&5
echo "${ECHO_T}$ac_ct_TIC" >&6
else
  echo "$as_me:8538: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  TIC=$ac_ct_TIC
else
  TIC="$ac_cv_prog_TIC"
fi

if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}infocmp", so it can be a program name with args.
set dummy ${ac_tool_prefix}infocmp; ac_word=$2
echo "$as_me:8550: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_INFOCMP+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$INFOCMP"; then
  ac_cv_prog_INFOCMP="$INFOCMP" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_INFOCMP="${ac_tool_prefix}infocmp"
echo "$as_me:8565: found $ac_dir/$ac_word" >&5
break
done

fi
fi
INFOCMP=$ac_cv_prog_INFOCMP
if test -n "$INFOCMP"; then
  echo "$as_me:8573: result: $INFOCMP" >&5
echo "${ECHO_T}$INFOCMP" >&6
else
  echo "$as_me:8576: result: no" >&5
echo "${ECHO_T}no" >&6
fi

fi
if test -z "$ac_cv_prog_INFOCMP"; then
  ac_ct_INFOCMP=$INFOCMP
  # Extract the first word of "infocmp", so it can be a program name with args.
set dummy infocmp; ac_word=$2
echo "$as_me:8585: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_ac_ct_INFOCMP+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$ac_ct_INFOCMP"; then
  ac_cv_prog_ac_ct_INFOCMP="$ac_ct_INFOCMP" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_ac_ct_INFOCMP="infocmp"
echo "$as_me:8600: found $ac_dir/$ac_word" >&5
break
done

fi
fi
ac_ct_INFOCMP=$ac_cv_prog_ac_ct_INFOCMP
if test -n "$ac_ct_INFOCMP"; then
  echo "$as_me:8608: result: $ac_ct_INFOCMP" >&5
echo "${ECHO_T}$ac_ct_INFOCMP" >&6
else
  echo "$as_me:8611: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  INFOCMP=$ac_ct_INFOCMP
else
  INFOCMP="$ac_cv_prog_INFOCMP"
fi

if test -n "$FALLBACK_LIST"
then

# Check whether --with-tic-path or --without-tic-path was given.
if test "${with_tic_path+set}" = set; then
  withval="$with_tic_path"
  echo "$as_me:8626: checking for tic program for fallbacks" >&5
echo $ECHO_N "checking for tic program for fallbacks... $ECHO_C" >&6
		TIC=$withval
		echo "$as_me:8629: result: $TIC" >&5
echo "${ECHO_T}$TIC" >&6

if test "x$prefix" != xNONE; then
	cf_path_syntax="$prefix"
else
	cf_path_syntax="$ac_default_prefix"
fi

case ".$TIC" in
(.\$\(*\)*|.\'*\'*)
	;;
(..|./*|.\\*)
	;;
(.[a-zA-Z]:[\\/]*) # OS/2 EMX
	;;
(.\$\{*prefix\}*|.\$\{*dir\}*)
	eval TIC="$TIC"
	case ".$TIC" in
	(.NONE/*)
		TIC=`echo "$TIC" | sed -e s%NONE%$cf_path_syntax%`
		;;
	esac
	;;
(.no|.NONE/*)
	TIC=`echo "$TIC" | sed -e s%NONE%$cf_path_syntax%`
	;;
(*)
	{ { echo "$as_me:8657: error: expected a pathname, not \"$TIC\"" >&5
echo "$as_me: error: expected a pathname, not \"$TIC\"" >&2;}
   { (exit 1); exit 1; }; }
	;;
esac

else

test -z "$TIC" && TIC="tic"
for ac_prog in $TIC tic
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:8670: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_TIC+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  case $TIC in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_TIC="$TIC" # Let the user override the test with a path.
  ;;
  *)
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH:/usr/local/ncurses/bin"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  if $as_executable_p "$ac_dir/$ac_word"; then
   ac_cv_path_TIC="$ac_dir/$ac_word"
   echo "$as_me:8687: found $ac_dir/$ac_word" >&5
   break
fi
done

  ;;
esac
fi
TIC=$ac_cv_path_TIC

if test -n "$TIC"; then
  echo "$as_me:8698: result: $TIC" >&5
echo "${ECHO_T}$TIC" >&6
else
  echo "$as_me:8701: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  test -n "$TIC" && break
done
test -n "$TIC" || TIC="$TIC"

cf_path_prog=""
cf_path_args=""
IFS="${IFS:- 	}"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
for cf_temp in $ac_cv_path_TIC
do
	if test -z "$cf_path_prog" ; then
		if test "$with_full_paths" = yes ; then

if test "x$prefix" != xNONE; then
	cf_path_syntax="$prefix"
else
	cf_path_syntax="$ac_default_prefix"
fi

case ".$cf_temp" in
(.\$\(*\)*|.\'*\'*)
	;;
(..|./*|.\\*)
	;;
(.[a-zA-Z]:[\\/]*) # OS/2 EMX
	;;
(.\$\{*prefix\}*|.\$\{*dir\}*)
	eval cf_temp="$cf_temp"
	case ".$cf_temp" in
	(.NONE/*)
		cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
		;;
	esac
	;;
(.no|.NONE/*)
	cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
	;;
(*)
	break
	;;
esac

			cf_path_prog="$cf_temp"
		else
			cf_path_prog="`basename "$cf_temp"`"
		fi
	elif test -z "$cf_path_args" ; then
		cf_path_args="$cf_temp"
	else
		cf_path_args="$cf_path_args $cf_temp"
	fi
done
IFS="$cf_save_ifs"

if test -n "$cf_path_prog" ; then

echo "${as_me:-configure}:8760: testing defining path for ${cf_path_prog} ..." 1>&5

cat >>confdefs.h <<EOF
#define TIC_PATH "$cf_path_prog"
EOF

	test -n "$cf_path_args" &&
cat >>confdefs.h <<EOF
#define TIC_ARGS "$cf_path_args"
EOF

fi

		if test -z "$TIC"
		then
			{ echo "$as_me:8775: WARNING: no tic program found for fallbacks" >&5
echo "$as_me: WARNING: no tic program found for fallbacks" >&2;}
		fi

fi;

# Check whether --with-infocmp-path or --without-infocmp-path was given.
if test "${with_infocmp_path+set}" = set; then
  withval="$with_infocmp_path"
  echo "$as_me:8784: checking for infocmp program for fallbacks" >&5
echo $ECHO_N "checking for infocmp program for fallbacks... $ECHO_C" >&6
		INFOCMP=$withval
		echo "$as_me:8787: result: $INFOCMP" >&5
echo "${ECHO_T}$INFOCMP" >&6

if test "x$prefix" != xNONE; then
	cf_path_syntax="$prefix"
else
	cf_path_syntax="$ac_default_prefix"
fi

case ".$INFOCMP" in
(.\$\(*\)*|.\'*\'*)
	;;
(..|./*|.\\*)
	;;
(.[a-zA-Z]:[\\/]*) # OS/2 EMX
	;;
(.\$\{*prefix\}*|.\$\{*dir\}*)
	eval INFOCMP="$INFOCMP"
	case ".$INFOCMP" in
	(.NONE/*)
		INFOCMP=`echo "$INFOCMP" | sed -e s%NONE%$cf_path_syntax%`
		;;
	esac
	;;
(.no|.NONE/*)
	INFOCMP=`echo "$INFOCMP" | sed -e s%NONE%$cf_path_syntax%`
	;;
(*)
	{ { echo "$as_me:8815: error: expected a pathname, not \"$INFOCMP\"" >&5
echo "$as_me: error: expected a pathname, not \"$INFOCMP\"" >&2;}
   { (exit 1); exit 1; }; }
	;;
esac

else

test -z "$INFOCMP" && INFOCMP="infocmp"
for ac_prog in $INFOCMP infocmp
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo "$as_me:8828: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_INFOCMP+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  case $INFOCMP in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_INFOCMP="$INFOCMP" # Let the user override the test with a path.
  ;;
  *)
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH:/usr/local/ncurses/bin"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  if $as_executable_p "$ac_dir/$ac_word"; then
   ac_cv_path_INFOCMP="$ac_dir/$ac_word"
   echo "$as_me:8845: found $ac_dir/$ac_word" >&5
   break
fi
done

  ;;
esac
fi
INFOCMP=$ac_cv_path_INFOCMP

if test -n "$INFOCMP"; then
  echo "$as_me:8856: result: $INFOCMP" >&5
echo "${ECHO_T}$INFOCMP" >&6
else
  echo "$as_me:8859: result: no" >&5
echo "${ECHO_T}no" >&6
fi

  test -n "$INFOCMP" && break
done
test -n "$INFOCMP" || INFOCMP="$INFOCMP"

cf_path_prog=""
cf_path_args=""
IFS="${IFS:- 	}"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
for cf_temp in $ac_cv_path_INFOCMP
do
	if test -z "$cf_path_prog" ; then
		if test "$with_full_paths" = yes ; then

if test "x$prefix" != xNONE; then
	cf_path_syntax="$prefix"
else
	cf_path_syntax="$ac_default_prefix"
fi

case ".$cf_temp" in
(.\$\(*\)*|.\'*\'*)
	;;
(..|./*|.\\*)
	;;
(.[a-zA-Z]:[\\/]*) # OS/2 EMX
	;;
(.\$\{*prefix\}*|.\$\{*dir\}*)
	eval cf_temp="$cf_temp"
	case ".$cf_temp" in
	(.NONE/*)
		cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
		;;
	esac
	;;
(.no|.NONE/*)
	cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
	;;
(*)
	break
	;;
esac

			cf_path_prog="$cf_temp"
		else
			cf_path_prog="`basename "$cf_temp"`"
		fi
	elif test -z "$cf_path_args" ; then
		cf_path_args="$cf_temp"
	else
		cf_path_args="$cf_path_args $cf_temp"
	fi
done
IFS="$cf_save_ifs"

if test -n "$cf_path_prog" ; then

echo "${as_me:-configure}:8918: testing defining path for ${cf_path_prog} ..." 1>&5

cat >>confdefs.h <<EOF
#define INFOCMP_PATH "$cf_path_prog"
EOF

	test -n "$cf_path_args" &&
cat >>confdefs.h <<EOF
#define INFOCMP_ARGS "$cf_path_args"
EOF

fi

		if test -z "$INFOCMP"
		then
			{ echo "$as_me:8933: WARNING: no infocmp program found for fallbacks" >&5
echo "$as_me: WARNING: no infocmp program found for fallbacks" >&2;}
		fi

fi;

	test -z "$TIC" && FALLBACK_LIST=
	test -z "$INFOCMP" && FALLBACK_LIST=
	if test -z "$FALLBACK_LIST"
	then
		{ echo "$as_me:8943: WARNING: ignoring fallback option because tic/infocmp are not available" >&5
echo "$as_me: WARNING: ignoring fallback option because tic/infocmp are not available" >&2;}
	fi
fi

USE_FALLBACKS=
test -z "$FALLBACK_LIST" && USE_FALLBACKS="#"

echo "$as_me:8951: checking if you want modern xterm or antique" >&5
echo $ECHO_N "checking if you want modern xterm or antique... $ECHO_C" >&6

# Check whether --with-xterm-new or --without-xterm-new was given.
if test "${with_xterm_new+set}" = set; then
  withval="$with_xterm_new"
  with_xterm_new=$withval
else
  with_xterm_new=yes
fi;
case "$with_xterm_new" in
(no) with_xterm_new=xterm-old;;
(*)	 with_xterm_new=xterm-new;;
esac
echo "$as_me:8965: result: $with_xterm_new" >&5
echo "${ECHO_T}$with_xterm_new" >&6
WHICH_XTERM=$with_xterm_new

echo "$as_me:8969: checking if xterm backspace sends BS or DEL" >&5
echo $ECHO_N "checking if xterm backspace sends BS or DEL... $ECHO_C" >&6

# Check whether --with-xterm-kbs or --without-xterm-kbs was given.
if test "${with_xterm_kbs+set}" = set; then
  withval="$with_xterm_kbs"
  with_xterm_kbs=$withval
else
  with_xterm_kbs=BS
fi;
case x$with_xterm_kbs in
(xyes|xno|xBS|xbs|x8)
	with_xterm_kbs=BS
	;;
(xDEL|xdel|x127)
	with_xterm_kbs=DEL
	;;
(*)
	with_xterm_kbs=$withval
	;;
esac
echo "$as_me:8990: result: $with_xterm_kbs" >&5
echo "${ECHO_T}$with_xterm_kbs" >&6
XTERM_KBS=$with_xterm_kbs

MAKE_TERMINFO=
if test "$use_database" = no ; then
	TERMINFO="${datadir}/terminfo"
	MAKE_TERMINFO="#"
else

echo "$as_me:9000: checking for list of terminfo directories" >&5
echo $ECHO_N "checking for list of terminfo directories... $ECHO_C" >&6

# Check whether --with-terminfo-dirs or --without-terminfo-dirs was given.
if test "${with_terminfo_dirs+set}" = set; then
  withval="$with_terminfo_dirs"

else
  withval=${TERMINFO_DIRS:-${datadir}/terminfo}
fi;
IFS="${IFS:- 	}"; ac_save_ifs="$IFS"; IFS="${PATH_SEPARATOR}"
cf_dst_path=
for cf_src_path in $withval
do

if test "x$prefix" != xNONE; then
	cf_path_syntax="$prefix"
else
	cf_path_syntax="$ac_default_prefix"
fi

case ".$cf_src_path" in
(.\$\(*\)*|.\'*\'*)
	;;
(..|./*|.\\*)
	;;
(.[a-zA-Z]:[\\/]*) # OS/2 EMX
	;;
(.\$\{*prefix\}*|.\$\{*dir\}*)
	eval cf_src_path="$cf_src_path"
	case ".$cf_src_path" in
	(.NONE/*)
		cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%`
		;;
	esac
	;;
(.no|.NONE/*)
	cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%`
	;;
(*)
	{ { echo "$as_me:9040: error: expected a pathname, not \"$cf_src_path\"" >&5
echo "$as_me: error: expected a pathname, not \"$cf_src_path\"" >&2;}
   { (exit 1); exit 1; }; }
	;;
esac

  test -n "$cf_dst_path" && cf_dst_path="${cf_dst_path}$PATH_SEPARATOR"
  cf_dst_path="${cf_dst_path}${cf_src_path}"
done
IFS="$ac_save_ifs"

# This may use the prefix/exec_prefix symbols which will only yield "NONE"
# so we have to check/work around.  We do prefer the result of "eval"...
eval cf_dst_eval="$cf_dst_path"
case "x$cf_dst_eval" in
(xNONE*)
	TERMINFO_DIRS=$cf_dst_path
	;;
(*)
	TERMINFO_DIRS="$cf_dst_eval"
	;;
esac

echo "$as_me:9063: result: $TERMINFO_DIRS" >&5
echo "${ECHO_T}$TERMINFO_DIRS" >&6
test -n "$TERMINFO_DIRS" &&
cat >>confdefs.h <<EOF
#define TERMINFO_DIRS "$TERMINFO_DIRS"
EOF

case "x$TERMINFO" in
x???:*)
	{ echo "$as_me:9072: WARNING: ignoring non-directory/file TERMINFO value" >&5
echo "$as_me: WARNING: ignoring non-directory/file TERMINFO value" >&2;}
	unset TERMINFO
	;;
esac

echo "$as_me:9078: checking for default terminfo directory" >&5
echo $ECHO_N "checking for default terminfo directory... $ECHO_C" >&6

# Check whether --with-default-terminfo-dir or --without-default-terminfo-dir was given.
if test "${with_default_terminfo_dir+set}" = set; then
  withval="$with_default_terminfo_dir"

else
  withval="${TERMINFO:-${datadir}/terminfo}"
fi; if test -n "${datadir}/terminfo" ; then

if test "x$prefix" != xNONE; then
	cf_path_syntax="$prefix"
else
	cf_path_syntax="$ac_default_prefix"
fi

case ".$withval" in
(.\$\(*\)*|.\'*\'*)
	;;
(..|./*|.\\*)
	;;
(.[a-zA-Z]:[\\/]*) # OS/2 EMX
	;;
(.\$\{*prefix\}*|.\$\{*dir\}*)
	eval withval="$withval"
	case ".$withval" in
	(.NONE/*)
		withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
		;;
	esac
	;;
(.no|.NONE/*)
	withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
	;;
(*)
	{ { echo "$as_me:9114: error: expected a pathname, not \"$withval\"" >&5
echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
   { (exit 1); exit 1; }; }
	;;
esac

fi
eval TERMINFO="$withval"

echo "$as_me:9123: result: $TERMINFO" >&5
echo "${ECHO_T}$TERMINFO" >&6

cat >>confdefs.h <<EOF
#define TERMINFO "$TERMINFO"
EOF

fi

###	use option --disable-big-core to make tic run on small machines
###	We need 4Mb, check if we can allocate 50% more than that.
echo "$as_me:9134: checking if big-core option selected" >&5
echo $ECHO_N "checking if big-core option selected... $ECHO_C" >&6

# Check whether --enable-big-core or --disable-big-core was given.
if test "${enable_big_core+set}" = set; then
  enableval="$enable_big_core"
  with_big_core=$enableval
else
  if test "$cross_compiling" = yes; then
  with_big_core=no
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 9146 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <string.h>
int main() {
	unsigned long n = 6000000L;
	char *s = malloc(n);
	if (s != 0)
		s[0] = s[n-1] = 0;
	${cf_cv_main_return:-return}(s == 0);
}
_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:9160: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:9163: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:9165: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:9168: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  with_big_core=yes
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
with_big_core=no
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
fi;
echo "$as_me:9180: result: $with_big_core" >&5
echo "${ECHO_T}$with_big_core" >&6
test "x$with_big_core" = "xyes" &&
cat >>confdefs.h <<\EOF
#define HAVE_BIG_CORE 1
EOF

### ISO C only guarantees 512-char strings, we have tables which load faster
### when constructed using "big" strings.  More than the C compiler, the awk
### program is a limit on most vendor UNIX systems.  Check that we can build.
echo "$as_me:9190: checking if big-strings option selected" >&5
echo $ECHO_N "checking if big-strings option selected... $ECHO_C" >&6

# Check whether --enable-big-strings or --disable-big-strings was given.
if test "${enable_big_strings+set}" = set; then
  enableval="$enable_big_strings"
  with_big_strings=$enableval
else

	case x$AWK in
	(x)
		eval with_big_strings=no
		;;
	(*)
		if ( ${AWK} 'BEGIN { xx = "x"; while (length(xx) < 12000) { xx = xx "x"; }; printf("%s\n", xx); }' 2>/dev/null \
			| $AWK '{ printf "%d\n", length($0); }' 2>/dev/null | $AWK 'BEGIN { eqls=0; recs=0; } { recs++; if ($0 == 12000) eqls++; } END { if (recs != 1 || eqls != 1) exit 1; }' 2>/dev/null >/dev/null ) ; then
			eval with_big_strings=yes
		else
			eval with_big_strings=no
		fi
		;;
	esac

fi;
echo "$as_me:9214: result: $with_big_strings" >&5
echo "${ECHO_T}$with_big_strings" >&6

USE_BIG_STRINGS=0
test "x$with_big_strings" = "xyes" && USE_BIG_STRINGS=1

###	use option --enable-termcap to compile in the termcap fallback support
echo "$as_me:9221: checking if you want termcap-fallback support" >&5
echo $ECHO_N "checking if you want termcap-fallback support... $ECHO_C" >&6

# Check whether --enable-termcap or --disable-termcap was given.
if test "${enable_termcap+set}" = set; then
  enableval="$enable_termcap"
  with_termcap=$enableval
else
  with_termcap=no
fi;
echo "$as_me:9231: result: $with_termcap" >&5
echo "${ECHO_T}$with_termcap" >&6

NCURSES_USE_TERMCAP=0
if test "x$with_termcap" != "xyes" ; then
	if test "$use_database" = no ; then
		if test -z "$with_fallback" ; then
			{ { echo "$as_me:9238: error: You have disabled the database w/o specifying fallbacks" >&5
echo "$as_me: error: You have disabled the database w/o specifying fallbacks" >&2;}
   { (exit 1); exit 1; }; }
		fi
	fi

cat >>confdefs.h <<\EOF
#define PURE_TERMINFO 1
EOF

else

	if test "$with_ticlib" != no ; then
		{ { echo "$as_me:9251: error: Options --with-ticlib and --enable-termcap cannot be combined" >&5
echo "$as_me: error: Options --with-ticlib and --enable-termcap cannot be combined" >&2;}
   { (exit 1); exit 1; }; }
	fi

	NCURSES_USE_TERMCAP=1
	echo "$as_me:9257: checking for list of termcap files" >&5
echo $ECHO_N "checking for list of termcap files... $ECHO_C" >&6

# Check whether --with-termpath or --without-termpath was given.
if test "${with_termpath+set}" = set; then
  withval="$with_termpath"

else
  withval=${TERMPATH:-/etc/termcap:/usr/share/misc/termcap}
fi;
IFS="${IFS:- 	}"; ac_save_ifs="$IFS"; IFS="${PATH_SEPARATOR}"
cf_dst_path=
for cf_src_path in $withval
do

if test "x$prefix" != xNONE; then
	cf_path_syntax="$prefix"
else
	cf_path_syntax="$ac_default_prefix"
fi

case ".$cf_src_path" in
(.\$\(*\)*|.\'*\'*)
	;;
(..|./*|.\\*)
	;;
(.[a-zA-Z]:[\\/]*) # OS/2 EMX
	;;
(.\$\{*prefix\}*|.\$\{*dir\}*)
	eval cf_src_path="$cf_src_path"
	case ".$cf_src_path" in
	(.NONE/*)
		cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%`
		;;
	esac
	;;
(.no|.NONE/*)
	cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%`
	;;
(*)
	{ { echo "$as_me:9297: error: expected a pathname, not \"$cf_src_path\"" >&5
echo "$as_me: error: expected a pathname, not \"$cf_src_path\"" >&2;}
   { (exit 1); exit 1; }; }
	;;
esac

  test -n "$cf_dst_path" && cf_dst_path="${cf_dst_path}$PATH_SEPARATOR"
  cf_dst_path="${cf_dst_path}${cf_src_path}"
done
IFS="$ac_save_ifs"

# This may use the prefix/exec_prefix symbols which will only yield "NONE"
# so we have to check/work around.  We do prefer the result of "eval"...
eval cf_dst_eval="$cf_dst_path"
case "x$cf_dst_eval" in
(xNONE*)
	TERMPATH=$cf_dst_path
	;;
(*)
	TERMPATH="$cf_dst_eval"
	;;
esac

	echo "$as_me:9320: result: $TERMPATH" >&5
echo "${ECHO_T}$TERMPATH" >&6
	test -n "$TERMPATH" &&
cat >>confdefs.h <<EOF
#define TERMPATH "$TERMPATH"
EOF

	###	use option --enable-getcap to use a hacked getcap for reading termcaps
	echo "$as_me:9328: checking if fast termcap-loader is needed" >&5
echo $ECHO_N "checking if fast termcap-loader is needed... $ECHO_C" >&6

# Check whether --enable-getcap or --disable-getcap was given.
if test "${enable_getcap+set}" = set; then
  enableval="$enable_getcap"
  with_getcap=$enableval
else
  with_getcap=no
fi;
	echo "$as_me:9338: result: $with_getcap" >&5
echo "${ECHO_T}$with_getcap" >&6
	test "x$with_getcap" = "xyes" &&
cat >>confdefs.h <<\EOF
#define USE_GETCAP 1
EOF

	echo "$as_me:9345: checking if translated termcaps will be cached in ~/.terminfo" >&5
echo $ECHO_N "checking if translated termcaps will be cached in ~/.terminfo... $ECHO_C" >&6

# Check whether --enable-getcap-cache or --disable-getcap-cache was given.
if test "${enable_getcap_cache+set}" = set; then
  enableval="$enable_getcap_cache"
  with_getcap_cache=$enableval
else
  with_getcap_cache=no
fi;
	echo "$as_me:9355: result: $with_getcap_cache" >&5
echo "${ECHO_T}$with_getcap_cache" >&6
	test "x$with_getcap_cache" = "xyes" &&
cat >>confdefs.h <<\EOF
#define USE_GETCAP_CACHE 1
EOF

fi

###   Use option --disable-home-terminfo to completely remove ~/.terminfo
echo "$as_me:9365: checking if ~/.terminfo is wanted" >&5
echo $ECHO_N "checking if ~/.terminfo is wanted... $ECHO_C" >&6

# Check whether --enable-home-terminfo or --disable-home-terminfo was given.
if test "${enable_home_terminfo+set}" = set; then
  enableval="$enable_home_terminfo"
  with_home_terminfo=$enableval
else
  with_home_terminfo=yes
fi;
echo "$as_me:9375: result: $with_home_terminfo" >&5
echo "${ECHO_T}$with_home_terminfo" >&6
test "x$with_home_terminfo" = "xyes" &&
cat >>confdefs.h <<\EOF
#define USE_HOME_TERMINFO 1
EOF

echo "$as_me:9382: checking if you want to permit root to use ncurses environment variables" >&5
echo $ECHO_N "checking if you want to permit root to use ncurses environment variables... $ECHO_C" >&6

# Check whether --enable-root-environ or --disable-root-environ was given.
if test "${enable_root_environ+set}" = set; then
  enableval="$enable_root_environ"
  with_root_environ=$enableval
else
  with_root_environ=yes
fi;
echo "$as_me:9392: result: $with_root_environ" >&5
echo "${ECHO_T}$with_root_environ" >&6
test "x$with_root_environ" = xyes &&
cat >>confdefs.h <<\EOF
#define USE_ROOT_ENVIRON 1
EOF

echo "$as_me:9399: checking if you want to permit setuid programs to access all files" >&5
echo $ECHO_N "checking if you want to permit setuid programs to access all files... $ECHO_C" >&6

# Check whether --enable-root-environ or --disable-root-environ was given.
if test "${enable_root_environ+set}" = set; then
  enableval="$enable_root_environ"
  with_root_access=$enableval
else
  with_root_access=yes
fi;
echo "$as_me:9409: result: $with_root_access" >&5
echo "${ECHO_T}$with_root_access" >&6
test "x$with_root_access" = xyes &&
cat >>confdefs.h <<\EOF
#define USE_ROOT_ACCESS 1
EOF

###   Use option --enable-symlinks to make tic use symlinks, not hard links
###   to reduce storage requirements for the terminfo database.

for ac_header in \
unistd.h \

do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
echo "$as_me:9424: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 9430 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:9434: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:9440: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  eval "$as_ac_Header=yes"
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  eval "$as_ac_Header=no"
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:9459: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
EOF

fi
done

for ac_func in \
	remove \
	unlink
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
echo "$as_me:9474: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 9480 "configure"
#include "confdefs.h"
#define $ac_func autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef $ac_func

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char $ac_func (void);

int
main (void)
{

/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func)
#error found stub for $ac_func
#endif

	return $ac_func ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:9511: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:9514: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:9517: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:9520: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  eval "$as_ac_var=yes"
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
eval "$as_ac_var=no"
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:9530: result: `eval echo '${'"$as_ac_var"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
EOF

fi
done

if test "$cross_compiling" = yes ; then

for ac_func in \
		link \
		symlink
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
echo "$as_me:9547: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 9553 "configure"
#include "confdefs.h"
#define $ac_func autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef $ac_func

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char $ac_func (void);

int
main (void)
{

/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func)
#error found stub for $ac_func
#endif

	return $ac_func ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:9584: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:9587: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:9590: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:9593: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  eval "$as_ac_var=yes"
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
eval "$as_ac_var=no"
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:9603: result: `eval echo '${'"$as_ac_var"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
EOF

fi
done

else
	echo "$as_me:9614: checking if link/symlink functions work" >&5
echo $ECHO_N "checking if link/symlink functions work... $ECHO_C" >&6
if test "${cf_cv_link_funcs+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

		cf_cv_link_funcs=
		for cf_func in link symlink ; do
			if test "$cross_compiling" = yes; then

			eval 'ac_cv_func_'$cf_func'=error'
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 9627 "configure"
#include "confdefs.h"

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
int main(void)
{
	int fail = 0;
	char *src = "conftest.tmp";
	char *dst = "conftest.chk";
	struct stat src_sb, dst_sb;
	FILE *fp = fopen(src, "w");
	if (fp == 0) { fail = 3; } else {
		fclose(fp); stat(src, &src_sb);
		if ($cf_func(src, dst) < 0) {
			fail = 1;
		} else if (stat(dst, &dst_sb) < 0) {
			fail = 2;
		} else {
			long diff = (dst_sb.st_mtime - src_sb.st_mtime);
			if (diff < 0) diff = -diff;
			if (diff > 2) fail = 3;
		}
	}
#ifdef HAVE_UNLINK
	unlink(dst); unlink(src);
#else
	remove(dst); remove(src);
#endif
	${cf_cv_main_return:-return} (fail);
}

_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:9665: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:9668: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:9670: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:9673: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

			cf_cv_link_funcs="$cf_cv_link_funcs $cf_func"
			eval 'ac_cv_func_'$cf_func'=yes'
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

			eval 'ac_cv_func_'$cf_func'=no'
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
		done
		test -z "$cf_cv_link_funcs" && cf_cv_link_funcs=no

fi
echo "$as_me:9691: result: $cf_cv_link_funcs" >&5
echo "${ECHO_T}$cf_cv_link_funcs" >&6
	test "$ac_cv_func_link"    = yes &&
cat >>confdefs.h <<\EOF
#define HAVE_LINK 1
EOF

	test "$ac_cv_func_symlink" = yes &&
cat >>confdefs.h <<\EOF
#define HAVE_SYMLINK 1
EOF

fi

with_links=no
with_symlinks=no

# soft links (symbolic links) are useful for some systems where hard links do
# not work, or to make it simpler to copy terminfo trees around.
if test "x$ac_cv_func_symlink" = xyes ; then
	echo "$as_me:9711: checking if tic should use symbolic links" >&5
echo $ECHO_N "checking if tic should use symbolic links... $ECHO_C" >&6

# Check whether --enable-symlinks or --disable-symlinks was given.
if test "${enable_symlinks+set}" = set; then
  enableval="$enable_symlinks"
  with_symlinks=$enableval
else
  with_symlinks=no
fi;
	echo "$as_me:9721: result: $with_symlinks" >&5
echo "${ECHO_T}$with_symlinks" >&6
fi

# If we have hard links and did not choose to use soft links instead, there is
# no reason to make this choice optional - use the hard links.
if test "$with_symlinks" = no ; then
	echo "$as_me:9728: checking if tic should use hard links" >&5
echo $ECHO_N "checking if tic should use hard links... $ECHO_C" >&6
	if test "x$ac_cv_func_link" = xyes ; then
		with_links=yes
	else
		with_links=no
	fi
	echo "$as_me:9735: result: $with_links" >&5
echo "${ECHO_T}$with_links" >&6
fi

test "x$with_links" = xyes &&
cat >>confdefs.h <<\EOF
#define USE_LINKS 1
EOF

test "x$with_symlinks" = xyes &&
cat >>confdefs.h <<\EOF
#define USE_SYMLINKS 1
EOF

###   use option --enable-broken-linker to force on use of broken-linker support

echo "$as_me:9751: checking if you want broken-linker support code" >&5
echo $ECHO_N "checking if you want broken-linker support code... $ECHO_C" >&6

# Check whether --enable-broken_linker or --disable-broken_linker was given.
if test "${enable_broken_linker+set}" = set; then
  enableval="$enable_broken_linker"
  with_broken_linker=$enableval
else
  with_broken_linker=no
fi;
echo "$as_me:9761: result: $with_broken_linker" >&5
echo "${ECHO_T}$with_broken_linker" >&6

: "${BROKEN_LINKER:=0}"
if test "x$with_broken_linker" = xyes ; then

cat >>confdefs.h <<\EOF
#define BROKEN_LINKER 1
EOF

	BROKEN_LINKER=1
fi

###   use option --enable-bsdpad to have tputs process BSD-style prefix padding
echo "$as_me:9775: checking if tputs should process BSD-style prefix padding" >&5
echo $ECHO_N "checking if tputs should process BSD-style prefix padding... $ECHO_C" >&6

# Check whether --enable-bsdpad or --disable-bsdpad was given.
if test "${enable_bsdpad+set}" = set; then
  enableval="$enable_bsdpad"
  with_bsdpad=$enableval
else
  with_bsdpad=no
fi;
echo "$as_me:9785: result: $with_bsdpad" >&5
echo "${ECHO_T}$with_bsdpad" >&6
test "x$with_bsdpad" = xyes &&
cat >>confdefs.h <<\EOF
#define BSD_TPUTS 1
EOF

###   use option --enable-widec to turn on use of wide-character support
NCURSES_CH_T=chtype
NCURSES_LIBUTF8=0

NEED_WCHAR_H=0
NCURSES_MBSTATE_T=0
NCURSES_WCHAR_T=0
NCURSES_WINT_T=0

# Check to define _XOPEN_SOURCE "automatically"
CPPFLAGS_before_XOPEN="$CPPFLAGS"

echo "$as_me:9804: checking if the POSIX test-macros are already defined" >&5
echo $ECHO_N "checking if the POSIX test-macros are already defined... $ECHO_C" >&6
if test "${cf_cv_posix_visible+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 9811 "configure"
#include "confdefs.h"
#include <stdio.h>
int
main (void)
{

#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \
	&& defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \
	&& defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \
	&& defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0)
#error conflicting symbols found
#endif

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:9830: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:9833: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:9836: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:9839: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_posix_visible=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_posix_visible=yes
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:9850: result: $cf_cv_posix_visible" >&5
echo "${ECHO_T}$cf_cv_posix_visible" >&6

if test "$cf_cv_posix_visible" = no; then

cf_XOPEN_SOURCE=600
cf_POSIX_C_SOURCE=199506L
cf_xopen_source=

case "$host_os" in
(aix[4-7]*)
	cf_xopen_source="-D_ALL_SOURCE"
	;;
(msys)
	cf_XOPEN_SOURCE=600
	;;
(darwin[0-8].*)
	cf_xopen_source="-D_APPLE_C_SOURCE"
	;;
(darwin*)
	cf_xopen_source="-D_DARWIN_C_SOURCE"
	cf_XOPEN_SOURCE=
	;;
(freebsd*|dragonfly*|midnightbsd*)
	# 5.x headers associate
	#	_XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L
	#	_XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L
	cf_POSIX_C_SOURCE=200112L
	cf_XOPEN_SOURCE=600
	cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
	;;
(hpux11*)
	cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500"
	;;
(hpux*)
	cf_xopen_source="-D_HPUX_SOURCE"
	;;
(irix[56].*)
	cf_xopen_source="-D_SGI_SOURCE"
	cf_XOPEN_SOURCE=
	;;
(linux*|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin)

cf_gnu_xopen_source=$cf_XOPEN_SOURCE

echo "$as_me:9895: checking if this is the GNU C library" >&5
echo $ECHO_N "checking if this is the GNU C library... $ECHO_C" >&6
if test "${cf_cv_gnu_library+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 9902 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
main (void)
{

	#if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0
		return 0;
	#elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0
		return 0;
	#else
	#	error not GNU C library
	#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:9921: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:9924: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:9927: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:9930: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_gnu_library=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_gnu_library=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:9941: result: $cf_cv_gnu_library" >&5
echo "${ECHO_T}$cf_cv_gnu_library" >&6

if test x$cf_cv_gnu_library = xyes; then

	# With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE
	# was changed to help a little.  newlib incorporated the change about 4
	# years later.
	echo "$as_me:9949: checking if _DEFAULT_SOURCE can be used as a basis" >&5
echo $ECHO_N "checking if _DEFAULT_SOURCE can be used as a basis... $ECHO_C" >&6
if test "${cf_cv_gnu_library_219+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

		cf_save="$CPPFLAGS"

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE"

		cat >"conftest.$ac_ext" <<_ACEOF
#line 9961 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
main (void)
{

			#if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2)
				return 0;
			#elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3)
				return 0;
			#else
			#	error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old
			#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:9980: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:9983: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:9986: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:9989: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_gnu_library_219=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_gnu_library_219=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
		CPPFLAGS="$cf_save"

fi
echo "$as_me:10001: result: $cf_cv_gnu_library_219" >&5
echo "${ECHO_T}$cf_cv_gnu_library_219" >&6

	if test "x$cf_cv_gnu_library_219" = xyes; then
		cf_save="$CPPFLAGS"
		echo "$as_me:10006: checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE" >&5
echo $ECHO_N "checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE... $ECHO_C" >&6
if test "${cf_cv_gnu_dftsrc_219+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

			cat >"conftest.$ac_ext" <<_ACEOF
#line 10111 "configure"
#include "confdefs.h"

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

int
main (void)
{

				#if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1)
					return 0;
				#else
				#	error GNU C library is too old
				#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:10131: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:10134: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:10137: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:10140: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_gnu_dftsrc_219=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_gnu_dftsrc_219=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:10151: result: $cf_cv_gnu_dftsrc_219" >&5
echo "${ECHO_T}$cf_cv_gnu_dftsrc_219" >&6
		test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save"
	else
		cf_cv_gnu_dftsrc_219=maybe
	fi

	if test "x$cf_cv_gnu_dftsrc_219" != xyes; then

		echo "$as_me:10160: checking if we must define _GNU_SOURCE" >&5
echo $ECHO_N "checking if we must define _GNU_SOURCE... $ECHO_C" >&6
if test "${cf_cv_gnu_source+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

		cat >"conftest.$ac_ext" <<_ACEOF
#line 10167 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
main (void)
{

			#ifndef _XOPEN_SOURCE
			#error	expected _XOPEN_SOURCE to be defined
			#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:10182: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:10185: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:10188: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:10191: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_gnu_source=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_save="$CPPFLAGS"

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in -D_GNU_SOURCE
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

			 cat >"conftest.$ac_ext" <<_ACEOF
#line 10298 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
main (void)
{

				#ifdef _XOPEN_SOURCE
				#error	expected _XOPEN_SOURCE to be undefined
				#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:10313: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:10316: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:10319: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:10322: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_gnu_source=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_gnu_source=yes
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
			CPPFLAGS="$cf_save"

fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:10337: result: $cf_cv_gnu_source" >&5
echo "${ECHO_T}$cf_cv_gnu_source" >&6

		if test "$cf_cv_gnu_source" = yes
		then
		echo "$as_me:10342: checking if we should also define _DEFAULT_SOURCE" >&5
echo $ECHO_N "checking if we should also define _DEFAULT_SOURCE... $ECHO_C" >&6
if test "${cf_cv_default_source+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}-D_GNU_SOURCE"

			cat >"conftest.$ac_ext" <<_ACEOF
#line 10352 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
main (void)
{

				#ifdef _DEFAULT_SOURCE
				#error	expected _DEFAULT_SOURCE to be undefined
				#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:10367: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:10370: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:10373: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:10376: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_default_source=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_default_source=yes
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:10387: result: $cf_cv_default_source" >&5
echo "${ECHO_T}$cf_cv_default_source" >&6
			if test "$cf_cv_default_source" = yes
			then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE"

			fi
		fi
	fi

fi

	;;
(minix*)
	cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this...
	;;
(mirbsd*)
	# setting _XOPEN_SOURCE or _POSIX_SOURCE breaks <sys/select.h> and other headers which use u_int / u_short types
	cf_XOPEN_SOURCE=

if test "$cf_cv_posix_visible" = no; then

cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE

cf_save_CFLAGS="$CFLAGS"
cf_save_CPPFLAGS="$CPPFLAGS"

cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \
	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`

cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \
	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`

echo "$as_me:10424: checking if we should define _POSIX_C_SOURCE" >&5
echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6
if test "${cf_cv_posix_c_source+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

echo "${as_me:-configure}:10430: testing if the symbol is already defined go no further ..." 1>&5

	cat >"conftest.$ac_ext" <<_ACEOF
#line 10433 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
main (void)
{

#ifndef _POSIX_C_SOURCE
make an error
#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:10448: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:10451: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:10454: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:10457: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_posix_c_source=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_want_posix_source=no
	 case .$cf_POSIX_C_SOURCE in
	 (.[12]??*)
		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
		;;
	 (.2)
		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
		cf_want_posix_source=yes
		;;
	 (.*)
		cf_want_posix_source=yes
		;;
	 esac
	 if test "$cf_want_posix_source" = yes ; then
		cat >"conftest.$ac_ext" <<_ACEOF
#line 10478 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
main (void)
{

#ifdef _POSIX_SOURCE
make an error
#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:10493: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:10496: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:10499: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:10502: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  :
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE"
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
	 fi

echo "${as_me:-configure}:10513: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5

	 CFLAGS="$cf_trim_CFLAGS"
	 CPPFLAGS="$cf_trim_CPPFLAGS"

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source"

echo "${as_me:-configure}:10521: testing if the second compile does not leave our definition intact error ..." 1>&5

	 cat >"conftest.$ac_ext" <<_ACEOF
#line 10524 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
main (void)
{

#ifndef _POSIX_C_SOURCE
make an error
#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:10539: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:10542: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:10545: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:10548: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  :
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_posix_c_source=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
	 CFLAGS="$cf_save_CFLAGS"
	 CPPFLAGS="$cf_save_CPPFLAGS"

fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:10564: result: $cf_cv_posix_c_source" >&5
echo "${ECHO_T}$cf_cv_posix_c_source" >&6

if test "$cf_cv_posix_c_source" != no ; then
	CFLAGS="$cf_trim_CFLAGS"
	CPPFLAGS="$cf_trim_CPPFLAGS"

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in $cf_cv_posix_c_source
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

fi

fi # cf_cv_posix_visible

	;;
(netbsd*)
	cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw
	;;
(openbsd[6-9]*)
	# OpenBSD 6.x has broken locale support, both compile-time and runtime.
	# see https://www.mail-archive.com/bugs@openbsd.org/msg13200.html
	# Abusing the conformance level is a workaround.
	{ echo "$as_me:10681: WARNING: this system does not provide usable locale support" >&5
echo "$as_me: WARNING: this system does not provide usable locale support" >&2;}
	cf_xopen_source="-D_BSD_SOURCE"
	cf_XOPEN_SOURCE=700
	;;
(openbsd[4-5]*)
	# setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw
	cf_xopen_source="-D_BSD_SOURCE"
	cf_XOPEN_SOURCE=600
	;;
(openbsd*)
	# setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw
	;;
(osf[45]*)
	cf_xopen_source="-D_OSF_SOURCE"
	;;
(nto-qnx*)
	cf_xopen_source="-D_QNX_SOURCE"
	;;
(sco*)
	# setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer
	;;
(solaris2.*)
	cf_xopen_source="-D__EXTENSIONS__"
	cf_cv_xopen_source=broken
	;;
(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2)
	cf_XOPEN_SOURCE=
	cf_POSIX_C_SOURCE=
	;;
(*)

echo "$as_me:10713: checking if we should define _XOPEN_SOURCE" >&5
echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6
if test "${cf_cv_xopen_source+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cat >"conftest.$ac_ext" <<_ACEOF
#line 10720 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

int
main (void)
{

#ifndef _XOPEN_SOURCE
make an error
#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:10739: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:10742: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:10745: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:10748: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_xopen_source=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_save="$CPPFLAGS"

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"

	 cat >"conftest.$ac_ext" <<_ACEOF
#line 10760 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

int
main (void)
{

#ifdef _XOPEN_SOURCE
make an error
#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:10779: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:10782: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:10785: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:10788: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_xopen_source=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_xopen_source=$cf_XOPEN_SOURCE
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
	CPPFLAGS="$cf_save"

fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:10803: result: $cf_cv_xopen_source" >&5
echo "${ECHO_T}$cf_cv_xopen_source" >&6

if test "$cf_cv_xopen_source" != no ; then

CFLAGS=`echo "$CFLAGS" | \
	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`

	cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source"

for cf_add_cflags in $cf_temp_xopen_source
do
	case "x$cf_add_cflags" in
	(x-[DU]*)

cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
while true
do
	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
	test "$CFLAGS" != "$cf_old_cflag" || break

	CFLAGS="$cf_old_cflag"
done

cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
while true
do
	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
	test "$CPPFLAGS" != "$cf_old_cflag" || break

	CPPFLAGS="$cf_old_cflag"
done

		;;
	esac

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in $cf_add_cflags
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

done

fi

if test "$cf_cv_posix_visible" = no; then

cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE

cf_save_CFLAGS="$CFLAGS"
cf_save_CPPFLAGS="$CPPFLAGS"

cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \
	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`

cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \
	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`

echo "$as_me:10961: checking if we should define _POSIX_C_SOURCE" >&5
echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6
if test "${cf_cv_posix_c_source+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

echo "${as_me:-configure}:10967: testing if the symbol is already defined go no further ..." 1>&5

	cat >"conftest.$ac_ext" <<_ACEOF
#line 10970 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
main (void)
{

#ifndef _POSIX_C_SOURCE
make an error
#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:10985: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:10988: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:10991: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:10994: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_posix_c_source=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_want_posix_source=no
	 case .$cf_POSIX_C_SOURCE in
	 (.[12]??*)
		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
		;;
	 (.2)
		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
		cf_want_posix_source=yes
		;;
	 (.*)
		cf_want_posix_source=yes
		;;
	 esac
	 if test "$cf_want_posix_source" = yes ; then
		cat >"conftest.$ac_ext" <<_ACEOF
#line 11015 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
main (void)
{

#ifdef _POSIX_SOURCE
make an error
#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:11030: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:11033: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:11036: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:11039: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  :
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE"
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
	 fi

echo "${as_me:-configure}:11050: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5

	 CFLAGS="$cf_trim_CFLAGS"
	 CPPFLAGS="$cf_trim_CPPFLAGS"

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source"

echo "${as_me:-configure}:11058: testing if the second compile does not leave our definition intact error ..." 1>&5

	 cat >"conftest.$ac_ext" <<_ACEOF
#line 11061 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
main (void)
{

#ifndef _POSIX_C_SOURCE
make an error
#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:11076: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:11079: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:11082: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:11085: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  :
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_posix_c_source=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
	 CFLAGS="$cf_save_CFLAGS"
	 CPPFLAGS="$cf_save_CPPFLAGS"

fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:11101: result: $cf_cv_posix_c_source" >&5
echo "${ECHO_T}$cf_cv_posix_c_source" >&6

if test "$cf_cv_posix_c_source" != no ; then
	CFLAGS="$cf_trim_CFLAGS"
	CPPFLAGS="$cf_trim_CPPFLAGS"

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in $cf_cv_posix_c_source
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

fi

fi # cf_cv_posix_visible

	;;
esac

if test -n "$cf_xopen_source" ; then

for cf_add_cflags in $cf_xopen_source
do
	case "x$cf_add_cflags" in
	(x-[DU]*)

cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
while true
do
	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
	test "$CFLAGS" != "$cf_old_cflag" || break
	test -n "$verbose" && echo "	removing old option $cf_add_cflags from CFLAGS" 1>&6

echo "${as_me:-configure}:11227: testing removing old option $cf_add_cflags from CFLAGS ..." 1>&5

	CFLAGS="$cf_old_cflag"
done

cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
while true
do
	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
	test "$CPPFLAGS" != "$cf_old_cflag" || break
	test -n "$verbose" && echo "	removing old option $cf_add_cflags from CPPFLAGS" 1>&6

echo "${as_me:-configure}:11239: testing removing old option $cf_add_cflags from CPPFLAGS ..." 1>&5

	CPPFLAGS="$cf_old_cflag"
done

		;;
	esac

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in $cf_add_cflags
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then
	test -n "$verbose" && echo "	add to \$CFLAGS $cf_new_cflags" 1>&6

echo "${as_me:-configure}:11327: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then
	test -n "$verbose" && echo "	add to \$CPPFLAGS $cf_new_cppflags" 1>&6

echo "${as_me:-configure}:11337: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then
	test -n "$verbose" && echo "	add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6

echo "${as_me:-configure}:11347: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

done

fi

if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then
	echo "$as_me:11359: checking if _XOPEN_SOURCE really is set" >&5
echo $ECHO_N "checking if _XOPEN_SOURCE really is set... $ECHO_C" >&6
	cat >"conftest.$ac_ext" <<_ACEOF
#line 11362 "configure"
#include "confdefs.h"
#include <stdlib.h>
int
main (void)
{

#ifndef _XOPEN_SOURCE
make an error
#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:11377: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:11380: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:11383: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:11386: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_XOPEN_SOURCE_set=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_XOPEN_SOURCE_set=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
	echo "$as_me:11395: result: $cf_XOPEN_SOURCE_set" >&5
echo "${ECHO_T}$cf_XOPEN_SOURCE_set" >&6
	if test "$cf_XOPEN_SOURCE_set" = yes
	then
		cat >"conftest.$ac_ext" <<_ACEOF
#line 11400 "configure"
#include "confdefs.h"
#include <stdlib.h>
int
main (void)
{

#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE
make an error
#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:11415: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:11418: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:11421: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:11424: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_XOPEN_SOURCE_set_ok=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_XOPEN_SOURCE_set_ok=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
		if test "$cf_XOPEN_SOURCE_set_ok" = no
		then
			{ echo "$as_me:11435: WARNING: _XOPEN_SOURCE is lower than requested" >&5
echo "$as_me: WARNING: _XOPEN_SOURCE is lower than requested" >&2;}
		fi
	else

echo "$as_me:11440: checking if we should define _XOPEN_SOURCE" >&5
echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6
if test "${cf_cv_xopen_source+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cat >"conftest.$ac_ext" <<_ACEOF
#line 11447 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

int
main (void)
{

#ifndef _XOPEN_SOURCE
make an error
#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:11466: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:11469: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:11472: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:11475: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_xopen_source=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_save="$CPPFLAGS"

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"

	 cat >"conftest.$ac_ext" <<_ACEOF
#line 11487 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

int
main (void)
{

#ifdef _XOPEN_SOURCE
make an error
#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:11506: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:11509: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:11512: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:11515: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_xopen_source=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_xopen_source=$cf_XOPEN_SOURCE
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
	CPPFLAGS="$cf_save"

fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:11530: result: $cf_cv_xopen_source" >&5
echo "${ECHO_T}$cf_cv_xopen_source" >&6

if test "$cf_cv_xopen_source" != no ; then

CFLAGS=`echo "$CFLAGS" | \
	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`

	cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source"

for cf_add_cflags in $cf_temp_xopen_source
do
	case "x$cf_add_cflags" in
	(x-[DU]*)

cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
while true
do
	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
	test "$CFLAGS" != "$cf_old_cflag" || break

	CFLAGS="$cf_old_cflag"
done

cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
while true
do
	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
	test "$CPPFLAGS" != "$cf_old_cflag" || break

	CPPFLAGS="$cf_old_cflag"
done

		;;
	esac

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in $cf_add_cflags
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

done

fi

	fi
fi
fi # cf_cv_posix_visible

CPPFLAGS_after_XOPEN="$CPPFLAGS"

# Work around breakage on OS X

echo "$as_me:11681: checking if SIGWINCH is defined" >&5
echo $ECHO_N "checking if SIGWINCH is defined... $ECHO_C" >&6
if test "${cf_cv_define_sigwinch+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cat >"conftest.$ac_ext" <<_ACEOF
#line 11688 "configure"
#include "confdefs.h"

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

int
main (void)
{
int x = SIGWINCH; (void)x
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:11703: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:11706: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:11709: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:11712: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_define_sigwinch=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cat >"conftest.$ac_ext" <<_ACEOF
#line 11719 "configure"
#include "confdefs.h"

#undef _XOPEN_SOURCE
#undef _POSIX_SOURCE
#undef _POSIX_C_SOURCE
#include <sys/types.h>
#include <sys/signal.h>

int
main (void)
{
int x = SIGWINCH; (void)x
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:11737: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:11740: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:11743: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:11746: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_define_sigwinch=maybe
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_define_sigwinch=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:11760: result: $cf_cv_define_sigwinch" >&5
echo "${ECHO_T}$cf_cv_define_sigwinch" >&6

if test "$cf_cv_define_sigwinch" = maybe ; then
echo "$as_me:11764: checking for actual SIGWINCH definition" >&5
echo $ECHO_N "checking for actual SIGWINCH definition... $ECHO_C" >&6
if test "${cf_cv_fixup_sigwinch+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cf_cv_fixup_sigwinch=unknown
cf_sigwinch=32
while test "$cf_sigwinch" != 1
do
	cat >"conftest.$ac_ext" <<_ACEOF
#line 11775 "configure"
#include "confdefs.h"

#undef _XOPEN_SOURCE
#undef _POSIX_SOURCE
#undef _POSIX_C_SOURCE
#include <sys/types.h>
#include <sys/signal.h>

int
main (void)
{

#if SIGWINCH != $cf_sigwinch
make an error
#endif
int x = SIGWINCH; (void)x
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:11797: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:11800: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:11803: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:11806: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_fixup_sigwinch=$cf_sigwinch
	 break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

cf_sigwinch="`expr "$cf_sigwinch" - 1`"
done

fi
echo "$as_me:11820: result: $cf_cv_fixup_sigwinch" >&5
echo "${ECHO_T}$cf_cv_fixup_sigwinch" >&6

	if test "$cf_cv_fixup_sigwinch" != unknown ; then
		CPPFLAGS="$CPPFLAGS -DSIGWINCH=$cf_cv_fixup_sigwinch"
	fi
fi

# Checks for CODESET support.

echo "$as_me:11830: checking for nl_langinfo and CODESET" >&5
echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6
if test "${am_cv_langinfo_codeset+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 11836 "configure"
#include "confdefs.h"
#include <langinfo.h>
int
main (void)
{
char* cs = nl_langinfo(CODESET); (void)cs
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:11848: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:11851: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:11854: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:11857: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  am_cv_langinfo_codeset=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
am_cv_langinfo_codeset=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"

fi
echo "$as_me:11868: result: $am_cv_langinfo_codeset" >&5
echo "${ECHO_T}$am_cv_langinfo_codeset" >&6
	if test "$am_cv_langinfo_codeset" = yes; then

cat >>confdefs.h <<\EOF
#define HAVE_LANGINFO_CODESET 1
EOF

	fi

# use these variables to work around a defect in gcc's fixincludes.
NCURSES_OK_WCHAR_T=
NCURSES_OK_WINT_T=

echo "$as_me:11882: checking if you want wide-character code" >&5
echo $ECHO_N "checking if you want wide-character code... $ECHO_C" >&6

# Check whether --enable-widec or --disable-widec was given.
if test "${enable_widec+set}" = set; then
  enableval="$enable_widec"
  with_widec=$enableval
else
  with_widec=no
fi;
echo "$as_me:11892: result: $with_widec" >&5
echo "${ECHO_T}$with_widec" >&6

NCURSES_WCWIDTH_GRAPHICS=1

if test "x$with_widec" = xyes ; then
	if test "x$disable_lib_suffixes" = xno ; then
		LIB_SUFFIX="w${LIB_SUFFIX}"
	fi

cat >>confdefs.h <<\EOF
#define USE_WIDEC_SUPPORT 1
EOF

cat >>confdefs.h <<\EOF
#define NCURSES_WIDECHAR 1
EOF

for ac_header in \
wchar.h \
wctype.h \

do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
echo "$as_me:11916: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 11922 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:11926: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:11932: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  eval "$as_ac_Header=yes"
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  eval "$as_ac_Header=no"
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:11951: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
EOF

fi
done

echo "$as_me:11961: checking if wchar.h can be used as is" >&5
echo $ECHO_N "checking if wchar.h can be used as is... $ECHO_C" >&6
if test "${cf_cv_wchar_h_okay+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 11968 "configure"
#include "confdefs.h"

#include <stdlib.h>
#ifdef HAVE_WCHAR_H
#include <wchar.h>
#endif
#ifdef HAVE_WCTYPE_H
#include <wctype.h>
#endif

int
main (void)
{

	wint_t foo = 0;
	int bar = iswpunct(foo)
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:11990: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:11993: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:11996: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:11999: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_wchar_h_okay=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_wchar_h_okay=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:12009: result: $cf_cv_wchar_h_okay" >&5
echo "${ECHO_T}$cf_cv_wchar_h_okay" >&6

if test "$cf_cv_wchar_h_okay" = no
then

echo "$as_me:12015: checking if we must define _XOPEN_SOURCE_EXTENDED" >&5
echo $ECHO_N "checking if we must define _XOPEN_SOURCE_EXTENDED... $ECHO_C" >&6
cat >"conftest.$ac_ext" <<_ACEOF
#line 12018 "configure"
#include "confdefs.h"
#include <sys/types.h>

int
main (void)
{

#ifndef _XOPEN_SOURCE_EXTENDED
make an error
#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:12034: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:12037: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:12040: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:12043: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_result=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_result=yes
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
echo "$as_me:12052: result: $cf_result" >&5
echo "${ECHO_T}$cf_result" >&6

if test "$cf_result" = yes ; then
	CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED"
elif test "x" != "x" ; then
	echo "$as_me:12058: checking checking for compatible value versus " >&5
echo $ECHO_N "checking checking for compatible value versus ... $ECHO_C" >&6
	cat >"conftest.$ac_ext" <<_ACEOF
#line 12061 "configure"
#include "confdefs.h"
#include <sys/types.h>

int
main (void)
{

#if _XOPEN_SOURCE_EXTENDED- < 0
make an error
#endif
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:12077: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:12080: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:12083: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:12086: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_result=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_result=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
	echo "$as_me:12095: result: $cf_result" >&5
echo "${ECHO_T}$cf_result" >&6
	if test "$cf_result" = no ; then
		# perhaps we can override it - try...
		CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED="
	fi
fi

fi

echo "$as_me:12105: checking if wcwidth agrees graphics are single-width" >&5
echo $ECHO_N "checking if wcwidth agrees graphics are single-width... $ECHO_C" >&6
if test "${cf_cv_wcwidth_graphics+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >conftest.in <<CF_EOF
-	VT100 symbols
0x250c	upper left corner
0x2514	lower left corner
0x2510	upper right corner
0x2518	lower right corner
0x251c	tee pointing left
0x2524	tee pointing right
0x2534	tee pointing up
0x252c	tee pointing down
0x2500	horizontal line
0x2502	vertical line
0x253c	large plus or crossover
0x23ba	scan line 1
0x23bd	scan line 9
0x25c6	diamond
0x2592	checker board (stipple)
0x00b0	degree symbol
0x00b1	plus/minus
0x00b7	bullet
-	Teletype 5410v1 symbols
0x2190	arrow pointing left
0x2192	arrow pointing right
0x2193	arrow pointing down
0x2191	arrow pointing up
0x2592	board of squares
0x2603	lantern symbol
0x25ae	solid square block
-	these defaults were invented for ncurses
0x23bb	scan line 3
0x23bc	scan line 7
0x2264	less-than-or-equal-to
0x2265	greater-than-or-equal-to
0x03c0	greek pi
0x2260	not-equal
0x00a3	pound-sterling symbol
-	thick-line-drawing
0x250f	upper left corner
0x2517	lower left corner
0x2513	upper right corner
0x251b	lower right corner
0x2523	tee pointing left
0x252b	tee pointing right
0x253b	tee pointing up
0x2533	tee pointing down
0x2501	horizontal line
0x2503	vertical line
0x254b	large plus or crossover
-	double-line-drawing
0x2554	upper left corner
0x255a	lower left corner
0x2557	upper right corner
0x255d	lower right corner
0x2563	tee pointing left
0x2560	tee pointing right
0x2569	tee pointing up
0x2566	tee pointing down
0x2550	horizontal line
0x2551	vertical line
0x256c	large plus or crossover
CF_EOF
if test "$cross_compiling" = yes; then
  cf_cv_wcwidth_graphics=unknown
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 12176 "configure"
#include "confdefs.h"

#include <locale.h>
#include <stdio.h>
#include <wchar.h>

#define MY_LEN 80

int
main(void)
{
	FILE *fp;
	int value;
	char buffer[MY_LEN + 1];
	char notes[MY_LEN + 1];
	int totals = 0;
	int passed = 0;

	if (setlocale(LC_ALL, "en_US.UTF8") ||
		setlocale(LC_ALL, "en_US.UTF-8") ||
		setlocale(LC_ALL, "en_US.utf8") ||
		setlocale(LC_ALL, "en_US.utf-8")) {
		if ((fp = fopen("conftest.in", "r")) != 0) {
			while (fgets(buffer, MY_LEN, fp) != 0) {
				if (*buffer == '-') {
					fprintf(stderr, "\\t%s", buffer);
				} else if (sscanf(buffer, "%x %s", &value, notes) == 2) {
					++totals;
					if (wcwidth(value) == 1)
						++passed;
					fprintf(stderr, "%d\\t%s", wcwidth(value), buffer);
				} else {
					fprintf(stderr, "?\\t%s", buffer);
				}
			}
		}
	}
	fprintf(stderr, "%d/%d passed wcwidth/graphics check\\n", passed, totals);
	return (totals == passed) ? 0 : 1;
}

_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:12220: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:12223: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:12225: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:12228: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_wcwidth_graphics=yes
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_wcwidth_graphics=no
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi

fi
echo "$as_me:12241: result: $cf_cv_wcwidth_graphics" >&5
echo "${ECHO_T}$cf_cv_wcwidth_graphics" >&6

	test "$cf_cv_wcwidth_graphics" = no && NCURSES_WCWIDTH_GRAPHICS=0

	# with_overwrite=no
	NCURSES_CH_T=cchar_t

for ac_func in putwc btowc wctob mbtowc wctomb mblen mbrlen mbrtowc wcsrtombs mbsrtowcs wcstombs mbstowcs
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
echo "$as_me:12252: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 12258 "configure"
#include "confdefs.h"
#define $ac_func autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef $ac_func

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char $ac_func (void);

int
main (void)
{

/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func)
#error found stub for $ac_func
#endif

	return $ac_func ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:12289: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:12292: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:12295: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:12298: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  eval "$as_ac_var=yes"
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
eval "$as_ac_var=no"
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:12308: result: `eval echo '${'"$as_ac_var"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
EOF

fi
done

	if test "x$ac_cv_func_putwc" != xyes ; then

for ac_header in wchar.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
echo "$as_me:12323: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 12329 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:12333: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:12339: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  eval "$as_ac_Header=yes"
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  eval "$as_ac_Header=no"
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:12358: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
EOF

fi
done

echo "$as_me:12368: checking for multibyte character support" >&5
echo $ECHO_N "checking for multibyte character support... $ECHO_C" >&6
if test "${cf_cv_utf8_lib+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cf_save_LIBS="$LIBS"
	cat >"conftest.$ac_ext" <<_ACEOF
#line 12376 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>
#ifdef HAVE_WCHAR_H
#include <wchar.h>
#endif

int
main (void)
{
putwc(0,0);
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:12394: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:12397: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:12400: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:12403: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_utf8_lib=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
# will be set on completion of the AC_TRY_LINK below.
cf_cv_header_path_utf8=
cf_cv_library_path_utf8=

echo "${as_me:-configure}:12415: testing Starting FIND_LINKAGE(utf8,) ..." 1>&5

cf_save_LIBS="$LIBS"

cat >"conftest.$ac_ext" <<_ACEOF
#line 12420 "configure"
#include "confdefs.h"

#include <libutf8.h>
int
main (void)
{
putwc(0,0);
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:12433: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:12436: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:12439: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:12442: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

	cf_cv_find_linkage_utf8=yes
	cf_cv_header_path_utf8=/usr/include
	cf_cv_library_path_utf8=/usr/lib

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

LIBS="-lutf8  $cf_save_LIBS"

cat >"conftest.$ac_ext" <<_ACEOF
#line 12456 "configure"
#include "confdefs.h"

#include <libutf8.h>
int
main (void)
{
putwc(0,0);
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:12469: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:12472: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:12475: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:12478: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

	cf_cv_find_linkage_utf8=yes
	cf_cv_header_path_utf8=/usr/include
	cf_cv_library_path_utf8=/usr/lib
	cf_cv_library_file_utf8="-lutf8"

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

	cf_cv_find_linkage_utf8=no
	LIBS="$cf_save_LIBS"

	test -n "$verbose" && echo "	find linkage for utf8 library" 1>&6

echo "${as_me:-configure}:12495: testing find linkage for utf8 library ..." 1>&5

echo "${as_me:-configure}:12497: testing Searching for headers in FIND_LINKAGE(utf8,) ..." 1>&5

	cf_save_CPPFLAGS="$CPPFLAGS"
	cf_test_CPPFLAGS="$CPPFLAGS"

cf_search=

# collect the current set of include-directories from compiler flags
cf_header_path_list=""
if test -n "${CFLAGS}${CPPFLAGS}" ; then
	for cf_header_path in $CPPFLAGS $CFLAGS
	do
		case "$cf_header_path" in
		(-I*)
			cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`

test "x$cf_header_path" != "xNONE" && \
test -d "$cf_header_path" && \
 {
	test -n "$verbose" && echo "	... testing for include-directories under $cf_header_path"
	test -d "$cf_header_path/include" &&          cf_search="$cf_search $cf_header_path/include"
	test -d "$cf_header_path/include/utf8" &&       cf_search="$cf_search $cf_header_path/include/utf8"
	test -d "$cf_header_path/include/utf8/include" &&    cf_search="$cf_search $cf_header_path/include/utf8/include"
	test -d "$cf_header_path/utf8/include" &&       cf_search="$cf_search $cf_header_path/utf8/include"
	test -d "$cf_header_path/utf8/include/utf8" &&    cf_search="$cf_search $cf_header_path/utf8/include/utf8"
}

			cf_header_path_list="$cf_header_path_list $cf_search"
			;;
		esac
	done
fi

# add the variations for the package we are looking for

cf_search=

test "x$prefix" != "xNONE" && \
test -d "$prefix" && \
 {
	test -n "$verbose" && echo "	... testing for include-directories under $prefix"
	test -d "$prefix/include" &&          cf_search="$cf_search $prefix/include"
	test -d "$prefix/include/utf8" &&       cf_search="$cf_search $prefix/include/utf8"
	test -d "$prefix/include/utf8/include" &&    cf_search="$cf_search $prefix/include/utf8/include"
	test -d "$prefix/utf8/include" &&       cf_search="$cf_search $prefix/utf8/include"
	test -d "$prefix/utf8/include/utf8" &&    cf_search="$cf_search $prefix/utf8/include/utf8"
}

for cf_subdir_prefix in \
	/usr \
	/usr/local \
	/usr/pkg \
	/opt \
	/opt/local \
	$HOME
do

test "x$cf_subdir_prefix" != "x$prefix" && \
test -d "$cf_subdir_prefix" && \
{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
	test -n "$verbose" && echo "	... testing for include-directories under $cf_subdir_prefix"
	test -d "$cf_subdir_prefix/include" &&          cf_search="$cf_search $cf_subdir_prefix/include"
	test -d "$cf_subdir_prefix/include/utf8" &&       cf_search="$cf_search $cf_subdir_prefix/include/utf8"
	test -d "$cf_subdir_prefix/include/utf8/include" &&    cf_search="$cf_search $cf_subdir_prefix/include/utf8/include"
	test -d "$cf_subdir_prefix/utf8/include" &&       cf_search="$cf_search $cf_subdir_prefix/utf8/include"
	test -d "$cf_subdir_prefix/utf8/include/utf8" &&    cf_search="$cf_search $cf_subdir_prefix/utf8/include/utf8"
}

done

test "$includedir" != NONE && \
test "$includedir" != "/usr/include" && \
test -d "$includedir" && {
	test -d "$includedir" &&    cf_search="$cf_search $includedir"
	test -d "$includedir/utf8" && cf_search="$cf_search $includedir/utf8"
}

test "$oldincludedir" != NONE && \
test "$oldincludedir" != "/usr/include" && \
test -d "$oldincludedir" && {
	test -d "$oldincludedir"    && cf_search="$cf_search $oldincludedir"
	test -d "$oldincludedir/utf8" && cf_search="$cf_search $oldincludedir/utf8"
}

cf_search="$cf_search $cf_header_path_list"

	for cf_cv_header_path_utf8 in $cf_search
	do
		if test -d "$cf_cv_header_path_utf8" ; then
			test -n "$verbose" && echo "	... testing $cf_cv_header_path_utf8" 1>&6

echo "${as_me:-configure}:12588: testing ... testing $cf_cv_header_path_utf8 ..." 1>&5

			CPPFLAGS="$cf_save_CPPFLAGS"

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_utf8"

			cat >"conftest.$ac_ext" <<_ACEOF
#line 12596 "configure"
#include "confdefs.h"

#include <libutf8.h>
int
main (void)
{
putwc(0,0);
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:12609: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:12612: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:12615: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:12618: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

				test -n "$verbose" && echo "	... found utf8 headers in $cf_cv_header_path_utf8" 1>&6

echo "${as_me:-configure}:12623: testing ... found utf8 headers in $cf_cv_header_path_utf8 ..." 1>&5

				cf_cv_find_linkage_utf8=maybe
				cf_test_CPPFLAGS="$CPPFLAGS"
				break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

				CPPFLAGS="$cf_save_CPPFLAGS"

fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
		fi
	done

	if test "$cf_cv_find_linkage_utf8" = maybe ; then

echo "${as_me:-configure}:12641: testing Searching for utf8 library in FIND_LINKAGE(utf8,) ..." 1>&5

		cf_save_LIBS="$LIBS"
		cf_save_LDFLAGS="$LDFLAGS"

		if test "$cf_cv_find_linkage_utf8" != yes ; then

cf_search=
cf_library_path_list=""
if test -n "${LDFLAGS}${LIBS}" ; then
	for cf_library_path in $LDFLAGS $LIBS
	do
		case "$cf_library_path" in
		(-L*)
			cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`

test "x$cf_library_path" != "xNONE" && \
test -d "$cf_library_path" && \
 {
	test -n "$verbose" && echo "	... testing for lib-directories under $cf_library_path"
	test -d "$cf_library_path/lib" &&          cf_search="$cf_search $cf_library_path/lib"
	test -d "$cf_library_path/lib/utf8" &&       cf_search="$cf_search $cf_library_path/lib/utf8"
	test -d "$cf_library_path/lib/utf8/lib" &&    cf_search="$cf_search $cf_library_path/lib/utf8/lib"
	test -d "$cf_library_path/utf8/lib" &&       cf_search="$cf_search $cf_library_path/utf8/lib"
	test -d "$cf_library_path/utf8/lib/utf8" &&    cf_search="$cf_search $cf_library_path/utf8/lib/utf8"
}

			cf_library_path_list="$cf_library_path_list $cf_search"
			;;
		esac
	done
fi

cf_search=

test "x$prefix" != "xNONE" && \
test -d "$prefix" && \
 {
	test -n "$verbose" && echo "	... testing for lib-directories under $prefix"
	test -d "$prefix/lib" &&          cf_search="$cf_search $prefix/lib"
	test -d "$prefix/lib/utf8" &&       cf_search="$cf_search $prefix/lib/utf8"
	test -d "$prefix/lib/utf8/lib" &&    cf_search="$cf_search $prefix/lib/utf8/lib"
	test -d "$prefix/utf8/lib" &&       cf_search="$cf_search $prefix/utf8/lib"
	test -d "$prefix/utf8/lib/utf8" &&    cf_search="$cf_search $prefix/utf8/lib/utf8"
}

for cf_subdir_prefix in \
	/usr \
	/usr/local \
	/usr/pkg \
	/opt \
	/opt/local \
	$HOME
do

test "x$cf_subdir_prefix" != "x$prefix" && \
test -d "$cf_subdir_prefix" && \
{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
	test -n "$verbose" && echo "	... testing for lib-directories under $cf_subdir_prefix"
	test -d "$cf_subdir_prefix/lib" &&          cf_search="$cf_search $cf_subdir_prefix/lib"
	test -d "$cf_subdir_prefix/lib/utf8" &&       cf_search="$cf_search $cf_subdir_prefix/lib/utf8"
	test -d "$cf_subdir_prefix/lib/utf8/lib" &&    cf_search="$cf_search $cf_subdir_prefix/lib/utf8/lib"
	test -d "$cf_subdir_prefix/utf8/lib" &&       cf_search="$cf_search $cf_subdir_prefix/utf8/lib"
	test -d "$cf_subdir_prefix/utf8/lib/utf8" &&    cf_search="$cf_search $cf_subdir_prefix/utf8/lib/utf8"
}

done

cf_search="$cf_library_path_list $cf_search"

			for cf_cv_library_path_utf8 in $cf_search
			do
				if test -d "$cf_cv_library_path_utf8" ; then
					test -n "$verbose" && echo "	... testing $cf_cv_library_path_utf8" 1>&6

echo "${as_me:-configure}:12716: testing ... testing $cf_cv_library_path_utf8 ..." 1>&5

					CPPFLAGS="$cf_test_CPPFLAGS"
					LIBS="-lutf8  $cf_save_LIBS"
					LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_utf8"
					cat >"conftest.$ac_ext" <<_ACEOF
#line 12722 "configure"
#include "confdefs.h"

#include <libutf8.h>
int
main (void)
{
putwc(0,0);
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:12735: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:12738: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:12741: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:12744: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

					test -n "$verbose" && echo "	... found utf8 library in $cf_cv_library_path_utf8" 1>&6

echo "${as_me:-configure}:12749: testing ... found utf8 library in $cf_cv_library_path_utf8 ..." 1>&5

					cf_cv_find_linkage_utf8=yes
					cf_cv_library_file_utf8="-lutf8"
					break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

					CPPFLAGS="$cf_save_CPPFLAGS"
					LIBS="$cf_save_LIBS"
					LDFLAGS="$cf_save_LDFLAGS"

fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
				fi
			done
			CPPFLAGS="$cf_save_CPPFLAGS"
			LDFLAGS="$cf_save_LDFLAGS"
		fi

	else
		cf_cv_find_linkage_utf8=no
	fi

fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"

fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"

LIBS="$cf_save_LIBS"

if test "$cf_cv_find_linkage_utf8" = yes ; then
cf_cv_utf8_lib=add-on
else
cf_cv_utf8_lib=no
fi

fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:12791: result: $cf_cv_utf8_lib" >&5
echo "${ECHO_T}$cf_cv_utf8_lib" >&6

# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between
# ncurses/ncursesw:
if test "$cf_cv_utf8_lib" = "add-on" ; then

cat >>confdefs.h <<\EOF
#define HAVE_LIBUTF8_H 1
EOF

if test -n "$cf_cv_header_path_utf8" ; then
  for cf_add_incdir in $cf_cv_header_path_utf8
  do
	while test "$cf_add_incdir" != /usr/include
	do
	  if test -d "$cf_add_incdir"
	  then
		cf_have_incdir=no
		if test -n "$CFLAGS$CPPFLAGS" ; then
		  # a loop is needed to ensure we can add subdirs of existing dirs
		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
			  cf_have_incdir=yes; break
			fi
		  done
		fi

		if test "$cf_have_incdir" = no ; then
		  if test "$cf_add_incdir" = /usr/local/include ; then
			if test "$GCC" = yes
			then
			  cf_save_CPPFLAGS=$CPPFLAGS

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"

			  cat >"conftest.$ac_ext" <<_ACEOF
#line 12829 "configure"
#include "confdefs.h"
#include <stdio.h>
int
main (void)
{
printf("Hello")
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:12841: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:12844: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:12847: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:12850: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  :
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_have_incdir=yes
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
			  CPPFLAGS=$cf_save_CPPFLAGS
			fi
		  fi
		fi

		if test "$cf_have_incdir" = no ; then
		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6

echo "${as_me:-configure}:12867: testing adding $cf_add_incdir to include-path ..." 1>&5

		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"

		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
		  test "$cf_top_incdir" = "$cf_add_incdir" && break
		  cf_add_incdir="$cf_top_incdir"
		else
		  break
		fi
	  else
		break
	  fi
	done
  done
fi

if test -n "$cf_cv_library_path_utf8" ; then
	for cf_add_libdir in $cf_cv_library_path_utf8
	do
		if test "$cf_add_libdir" = /usr/lib ; then
			:
		elif test -d "$cf_add_libdir"
		then
			cf_have_libdir=no
			if test -n "$LDFLAGS$LIBS" ; then
				# a loop is needed to ensure we can add subdirs of existing dirs
				for cf_test_libdir in $LDFLAGS $LIBS ; do
					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
						cf_have_libdir=yes; break
					fi
				done
			fi
			if test "$cf_have_libdir" = no ; then
				test -n "$verbose" && echo "	adding $cf_add_libdir to library-path" 1>&6

echo "${as_me:-configure}:12903: testing adding $cf_add_libdir to library-path ..." 1>&5

				LDFLAGS="-L$cf_add_libdir $LDFLAGS"
			fi
		fi
	done
fi

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in $cf_cv_library_file_utf8; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

fi

		if test "$cf_cv_utf8_lib" != no ; then
			NCURSES_LIBUTF8=1
		fi
	fi

# This is needed on Tru64 5.0 to declare mbstate_t
echo "$as_me:12935: checking if we must include wchar.h to declare mbstate_t" >&5
echo $ECHO_N "checking if we must include wchar.h to declare mbstate_t... $ECHO_C" >&6
if test "${cf_cv_mbstate_t+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 12942 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#ifdef HAVE_LIBUTF8_H
#include <libutf8.h>
#endif
int
main (void)
{
mbstate_t state
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:12960: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:12963: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:12966: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:12969: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_mbstate_t=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cat >"conftest.$ac_ext" <<_ACEOF
#line 12976 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <wchar.h>
#ifdef HAVE_LIBUTF8_H
#include <libutf8.h>
#endif
int
main (void)
{
mbstate_t value
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:12995: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:12998: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:13001: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:13004: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_mbstate_t=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_mbstate_t=unknown
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:13016: result: $cf_cv_mbstate_t" >&5
echo "${ECHO_T}$cf_cv_mbstate_t" >&6

if test "$cf_cv_mbstate_t" = yes ; then

cat >>confdefs.h <<\EOF
#define NEED_WCHAR_H 1
EOF

	NEED_WCHAR_H=1
fi

# if we do not find mbstate_t in either place, use substitution to provide a fallback.
if test "$cf_cv_mbstate_t" = unknown ; then
	NCURSES_MBSTATE_T=1
fi

# This is needed on Tru64 5.0 to declare wchar_t
echo "$as_me:13034: checking if we must include wchar.h to declare wchar_t" >&5
echo $ECHO_N "checking if we must include wchar.h to declare wchar_t... $ECHO_C" >&6
if test "${cf_cv_wchar_t+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 13041 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#ifdef HAVE_LIBUTF8_H
#include <libutf8.h>
#endif
int
main (void)
{
wchar_t state
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:13059: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:13062: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:13065: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:13068: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_wchar_t=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cat >"conftest.$ac_ext" <<_ACEOF
#line 13075 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <wchar.h>
#ifdef HAVE_LIBUTF8_H
#include <libutf8.h>
#endif
int
main (void)
{
wchar_t value
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:13094: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:13097: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:13100: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:13103: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_wchar_t=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_wchar_t=unknown
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:13115: result: $cf_cv_wchar_t" >&5
echo "${ECHO_T}$cf_cv_wchar_t" >&6

if test "$cf_cv_wchar_t" = yes ; then

cat >>confdefs.h <<\EOF
#define NEED_WCHAR_H 1
EOF

	NEED_WCHAR_H=1
fi

# if we do not find wchar_t in either place, use substitution to provide a fallback.
if test "$cf_cv_wchar_t" = unknown ; then
	NCURSES_WCHAR_T=1
fi

# if we find wchar_t in either place, use substitution to provide a fallback.
if test "$cf_cv_wchar_t" != unknown ; then
	NCURSES_OK_WCHAR_T=1
fi

# This is needed on Tru64 5.0 to declare wint_t
echo "$as_me:13138: checking if we must include wchar.h to declare wint_t" >&5
echo $ECHO_N "checking if we must include wchar.h to declare wint_t... $ECHO_C" >&6
if test "${cf_cv_wint_t+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 13145 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#ifdef HAVE_LIBUTF8_H
#include <libutf8.h>
#endif
int
main (void)
{
wint_t state
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:13163: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:13166: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:13169: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:13172: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_wint_t=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cat >"conftest.$ac_ext" <<_ACEOF
#line 13179 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <wchar.h>
#ifdef HAVE_LIBUTF8_H
#include <libutf8.h>
#endif
int
main (void)
{
wint_t value
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:13198: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:13201: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:13204: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:13207: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_wint_t=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_wint_t=unknown
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:13219: result: $cf_cv_wint_t" >&5
echo "${ECHO_T}$cf_cv_wint_t" >&6

if test "$cf_cv_wint_t" = yes ; then

cat >>confdefs.h <<\EOF
#define NEED_WCHAR_H 1
EOF

	NEED_WCHAR_H=1
fi

# if we do not find wint_t in either place, use substitution to provide a fallback.
if test "$cf_cv_wint_t" = unknown ; then
	NCURSES_WINT_T=1
fi

# if we find wint_t in either place, use substitution to provide a fallback.
if test "$cf_cv_wint_t" != unknown ; then
	NCURSES_OK_WINT_T=1
fi

	if test "$NCURSES_MBSTATE_T" != 0; then

cat >>confdefs.h <<\EOF
#define NEED_MBSTATE_T_DEF 1
EOF

	fi
fi

###   use option --disable-lp64 to allow long chtype
echo "$as_me:13251: checking whether to enable _LP64 definition in curses.h" >&5
echo $ECHO_N "checking whether to enable _LP64 definition in curses.h... $ECHO_C" >&6

# Check whether --enable-lp64 or --disable-lp64 was given.
if test "${enable_lp64+set}" = set; then
  enableval="$enable_lp64"
  with_lp64=$enableval
else
  with_lp64=$cf_dft_with_lp64
fi;
echo "$as_me:13261: result: $with_lp64" >&5
echo "${ECHO_T}$with_lp64" >&6

if test "x$with_lp64" = xyes ; then
	cf_cv_enable_lp64=1
else
	cf_cv_enable_lp64=0
fi

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

fi;
if test "$enable_largefile" != no; then

  echo "$as_me:13277: checking for special C compiler options needed for large files" >&5
echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6
if test "${ac_cv_sys_largefile_CC+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&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 >"conftest.$ac_ext" <<_ACEOF
#line 13289 "configure"
#include "confdefs.h"
#include <sys/types.h>
 /* Check that off_t can represent 2**63 - 1 correctly.
    We can't simply define LARGE_OFF_T to be 9223372036854775807,
    since some C++ compilers masquerading as C compilers
    incorrectly reject 9223372036854775807.  */
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
		       && LARGE_OFF_T % 2147483647 == 1)
		      ? 1 : -1];
int
main (void)
{

  ;
  return 0;
}
_ACEOF
     	 rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:13309: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:13312: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:13315: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:13318: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext"
     	 CC="$CC -n32"
     	 rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:13328: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:13331: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:13334: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:13337: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_sys_largefile_CC=' -n32'; break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext"
         break
       done
       CC=$ac_save_CC
       rm -f "conftest.$ac_ext"
    fi
fi
echo "$as_me:13351: result: $ac_cv_sys_largefile_CC" >&5
echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6
  if test "$ac_cv_sys_largefile_CC" != no; then
    CC=$CC$ac_cv_sys_largefile_CC
  fi

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

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:13385: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:13388: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:13391: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:13394: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  cat >"conftest.$ac_ext" <<_ACEOF
#line 13403 "configure"
#include "confdefs.h"
#define _FILE_OFFSET_BITS 64
#include <sys/types.h>
 /* Check that off_t can represent 2**63 - 1 correctly.
    We can't simply define LARGE_OFF_T to be 9223372036854775807,
    since some C++ compilers masquerading as C compilers
    incorrectly reject 9223372036854775807.  */
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
		       && LARGE_OFF_T % 2147483647 == 1)
		      ? 1 : -1];
int
main (void)
{

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:13424: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:13427: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:13430: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:13433: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_sys_file_offset_bits=64; break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  break
done
fi
echo "$as_me:13444: result: $ac_cv_sys_file_offset_bits" >&5
echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6
if test "$ac_cv_sys_file_offset_bits" != no; then

cat >>confdefs.h <<EOF
#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
EOF

fi
rm -rf conftest*
  echo "$as_me:13454: checking for _LARGE_FILES value needed for large files" >&5
echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6
if test "${ac_cv_sys_large_files+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  while :; do
  ac_cv_sys_large_files=no
  cat >"conftest.$ac_ext" <<_ACEOF
#line 13462 "configure"
#include "confdefs.h"
#include <sys/types.h>
 /* Check that off_t can represent 2**63 - 1 correctly.
    We can't simply define LARGE_OFF_T to be 9223372036854775807,
    since some C++ compilers masquerading as C compilers
    incorrectly reject 9223372036854775807.  */
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
		       && LARGE_OFF_T % 2147483647 == 1)
		      ? 1 : -1];
int
main (void)
{

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:13482: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:13485: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:13488: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:13491: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  cat >"conftest.$ac_ext" <<_ACEOF
#line 13500 "configure"
#include "confdefs.h"
#define _LARGE_FILES 1
#include <sys/types.h>
 /* Check that off_t can represent 2**63 - 1 correctly.
    We can't simply define LARGE_OFF_T to be 9223372036854775807,
    since some C++ compilers masquerading as C compilers
    incorrectly reject 9223372036854775807.  */
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
		       && LARGE_OFF_T % 2147483647 == 1)
		      ? 1 : -1];
int
main (void)
{

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:13521: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:13524: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:13527: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:13530: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_sys_large_files=1; break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  break
done
fi
echo "$as_me:13541: result: $ac_cv_sys_large_files" >&5
echo "${ECHO_T}$ac_cv_sys_large_files" >&6
if test "$ac_cv_sys_large_files" != no; then

cat >>confdefs.h <<EOF
#define _LARGE_FILES $ac_cv_sys_large_files
EOF

fi
rm -rf conftest*
fi

	if test "$enable_largefile" != no ; then
	echo "$as_me:13554: checking for _LARGEFILE_SOURCE value needed for large files" >&5
echo $ECHO_N "checking for _LARGEFILE_SOURCE value needed for large files... $ECHO_C" >&6
if test "${ac_cv_sys_largefile_source+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  while :; do
  ac_cv_sys_largefile_source=no
  cat >"conftest.$ac_ext" <<_ACEOF
#line 13562 "configure"
#include "confdefs.h"
#include <stdio.h>
int
main (void)
{
return !fseeko;
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:13574: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:13577: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:13580: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:13583: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  cat >"conftest.$ac_ext" <<_ACEOF
#line 13592 "configure"
#include "confdefs.h"
#define _LARGEFILE_SOURCE 1
#include <stdio.h>
int
main (void)
{
return !fseeko;
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:13605: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:13608: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:13611: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:13614: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_sys_largefile_source=1; break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  break
done
fi
echo "$as_me:13625: result: $ac_cv_sys_largefile_source" >&5
echo "${ECHO_T}$ac_cv_sys_largefile_source" >&6
if test "$ac_cv_sys_largefile_source" != no; then

cat >>confdefs.h <<EOF
#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source
EOF

fi
rm -rf conftest*

# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
# in glibc 2.1.3, but that breaks too many other things.
# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
echo "$as_me:13639: checking for fseeko" >&5
echo $ECHO_N "checking for fseeko... $ECHO_C" >&6
if test "${ac_cv_func_fseeko+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 13645 "configure"
#include "confdefs.h"
#include <stdio.h>
int
main (void)
{
return fseeko && fseeko (stdin, 0, 0);
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:13657: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:13660: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:13663: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:13666: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_func_fseeko=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_func_fseeko=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:13676: result: $ac_cv_func_fseeko" >&5
echo "${ECHO_T}$ac_cv_func_fseeko" >&6
if test $ac_cv_func_fseeko = yes; then

cat >>confdefs.h <<\EOF
#define HAVE_FSEEKO 1
EOF

fi

	# Normally we would collect these definitions in the config.h,
	# but (like _XOPEN_SOURCE), some environments rely on having these
	# defined before any of the system headers are included.  Another
	# case comes up with C++, e.g., on AIX the compiler compiles the
	# header files by themselves before looking at the body files it is
	# told to compile.  For ncurses, those header files do not include
	# the config.h
	if test "$ac_cv_sys_large_files" != no
	then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}-D_LARGE_FILES"

	fi
	if test "$ac_cv_sys_largefile_source" != no
	then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}-D_LARGEFILE_SOURCE"

	fi
	if test "$ac_cv_sys_file_offset_bits" != no
	then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}-D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits"

	fi

	echo "$as_me:13715: checking whether to use struct dirent64" >&5
echo $ECHO_N "checking whether to use struct dirent64... $ECHO_C" >&6
if test "${cf_cv_struct_dirent64+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

		cat >"conftest.$ac_ext" <<_ACEOF
#line 13722 "configure"
#include "confdefs.h"

#pragma GCC diagnostic error "-Wincompatible-pointer-types"
#include <sys/types.h>
#include <dirent.h>

int
main (void)
{

		/* if transitional largefile support is setup, this is true */
		extern struct dirent64 * readdir(DIR *);
		struct dirent64 *x = readdir((DIR *)0);
		struct dirent *y = readdir((DIR *)0);
		int z = x - y;
		(void)z;

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:13745: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:13748: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:13751: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:13754: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_struct_dirent64=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_struct_dirent64=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:13765: result: $cf_cv_struct_dirent64" >&5
echo "${ECHO_T}$cf_cv_struct_dirent64" >&6
	test "$cf_cv_struct_dirent64" = yes &&
cat >>confdefs.h <<\EOF
#define HAVE_STRUCT_DIRENT64 1
EOF

	fi

###   use option --disable-tparm-varargs to make tparm() conform to X/Open
echo "$as_me:13775: checking if you want tparm not to use X/Open fixed-parameter list" >&5
echo $ECHO_N "checking if you want tparm not to use X/Open fixed-parameter list... $ECHO_C" >&6

# Check whether --enable-tparm-varargs or --disable-tparm-varargs was given.
if test "${enable_tparm_varargs+set}" = set; then
  enableval="$enable_tparm_varargs"
  with_tparm_varargs=$enableval
else
  with_tparm_varargs=yes
fi;
echo "$as_me:13785: result: $with_tparm_varargs" >&5
echo "${ECHO_T}$with_tparm_varargs" >&6
NCURSES_TPARM_VARARGS=0
test "x$with_tparm_varargs" = xyes && NCURSES_TPARM_VARARGS=1

###   use option --disable-tic-depends to make libtic not explicitly depend on ncurses/ncursesw
if test "$with_ticlib" != no ; then
echo "$as_me:13792: checking if you want tic library to use explicit dependency on ncurses$LIB_SUFFIX library" >&5
echo $ECHO_N "checking if you want tic library to use explicit dependency on ncurses$LIB_SUFFIX library... $ECHO_C" >&6

# Check whether --enable-tic-depends or --disable-tic-depends was given.
if test "${enable_tic_depends+set}" = set; then
  enableval="$enable_tic_depends"
  with_tic_depends=$enableval
else
  with_tic_depends=yes
fi;
echo "$as_me:13802: result: $with_tic_depends" >&5
echo "${ECHO_T}$with_tic_depends" >&6
else
	with_tic_depends=no
fi

###   use option --enable-wattr-macros to enable wattr* macros in curses.h
echo "$as_me:13809: checking if you want to enable wattr* macros" >&5
echo $ECHO_N "checking if you want to enable wattr* macros... $ECHO_C" >&6

# Check whether --enable-wattr-macros or --disable-wattr-macros was given.
if test "${enable_wattr_macros+set}" = set; then
  enableval="$enable_wattr_macros"
  with_wattr_macros=$enableval
else
  with_wattr_macros=no
fi;
if [ "x$with_wattr_macros" != xyes ]; then
	NCURSES_WATTR_MACROS=0
	echo "$as_me:13821: result: no" >&5
echo "${ECHO_T}no" >&6
else
	NCURSES_WATTR_MACROS=1
	echo "$as_me:13825: result: yes" >&5
echo "${ECHO_T}yes" >&6
fi

echo "$as_me:13829: checking for X11 rgb file" >&5
echo $ECHO_N "checking for X11 rgb file... $ECHO_C" >&6

# Check whether --with-x11-rgb or --without-x11-rgb was given.
if test "${with_x11_rgb+set}" = set; then
  withval="$with_x11_rgb"
  RGB_PATH=$withval
else
  RGB_PATH=auto
fi;

if test "x$RGB_PATH" = xauto
then
	RGB_PATH='${exec_prefix}/lib/X11/rgb.txt'
	for cf_path in \
		/opt/local/share/X11/rgb.txt \
		/opt/X11/share/X11/rgb.txt \
		/usr/share/X11/rgb.txt \
		/usr/X11/share/X11/rgb.txt \
		/usr/X11/lib/X11/rgb.txt \
		/usr/lib/X11/rgb.txt \
		/etc/X11/rgb.txt \
		/usr/pkg/lib/X11/rgb.txt \
		/usr/X11R7/lib/X11/rgb.txt \
		/usr/X11R6/lib/X11/rgb.txt \
		/usr/X11R5/lib/X11/rgb.txt \
		/usr/X11R4/lib/X11/rgb.txt \
		/usr/local/lib/X11/rgb.txt \
		/usr/local/share/X11/rgb.txt \
		/usr/lib64/X11/rgb.txt
	do
		if test -f "$cf_path" ; then
			RGB_PATH="$cf_path"
			break
		fi
	done
else
	cf_path=$RGB_PATH

if test "x$prefix" != xNONE; then
	cf_path_syntax="$prefix"
else
	cf_path_syntax="$ac_default_prefix"
fi

case ".$cf_path" in
(.\$\(*\)*|.\'*\'*)
	;;
(..|./*|.\\*)
	;;
(.[a-zA-Z]:[\\/]*) # OS/2 EMX
	;;
(.\$\{*prefix\}*|.\$\{*dir\}*)
	eval cf_path="$cf_path"
	case ".$cf_path" in
	(.NONE/*)
		cf_path=`echo "$cf_path" | sed -e s%NONE%$cf_path_syntax%`
		;;
	esac
	;;
(.no|.NONE/*)
	cf_path=`echo "$cf_path" | sed -e s%NONE%$cf_path_syntax%`
	;;
(*)
	{ { echo "$as_me:13893: error: expected a pathname, not \"$cf_path\"" >&5
echo "$as_me: error: expected a pathname, not \"$cf_path\"" >&2;}
   { (exit 1); exit 1; }; }
	;;
esac

fi

echo "$as_me:13901: result: $RGB_PATH" >&5
echo "${ECHO_T}$RGB_PATH" >&6

cat >>confdefs.h <<EOF
#define RGB_PATH "$cf_path"
EOF

no_x11_rgb=
if test "$RGB_PATH" = no
then
	no_x11_rgb="#"
fi

###   use option --with-bool to override bool's type
echo "$as_me:13915: checking for type of bool" >&5
echo $ECHO_N "checking for type of bool... $ECHO_C" >&6

# Check whether --with-bool or --without-bool was given.
if test "${with_bool+set}" = set; then
  withval="$with_bool"
  NCURSES_BOOL="$withval"
else
  NCURSES_BOOL=auto
fi;
echo "$as_me:13925: result: $NCURSES_BOOL" >&5
echo "${ECHO_T}$NCURSES_BOOL" >&6

echo "$as_me:13928: checking for alternate terminal capabilities file" >&5
echo $ECHO_N "checking for alternate terminal capabilities file... $ECHO_C" >&6

# Check whether --with-caps or --without-caps was given.
if test "${with_caps+set}" = set; then
  withval="$with_caps"
  TERMINFO_CAPS=Caps.$withval
else
  TERMINFO_CAPS=Caps
fi;
test -f "${srcdir}/include/${TERMINFO_CAPS}" || TERMINFO_CAPS=Caps
echo "$as_me:13939: result: $TERMINFO_CAPS" >&5
echo "${ECHO_T}$TERMINFO_CAPS" >&6

###   use option --with-chtype to override chtype's type
echo "$as_me:13943: checking for type of chtype" >&5
echo $ECHO_N "checking for type of chtype... $ECHO_C" >&6

# Check whether --with-chtype or --without-chtype was given.
if test "${with_chtype+set}" = set; then
  withval="$with_chtype"
  NCURSES_CHTYPE="$withval"
else
  NCURSES_CHTYPE=$cf_dft_chtype
fi;
echo "$as_me:13953: result: $NCURSES_CHTYPE" >&5
echo "${ECHO_T}$NCURSES_CHTYPE" >&6

###   use option --with-ospeed to override ospeed's type
echo "$as_me:13957: checking for type of ospeed" >&5
echo $ECHO_N "checking for type of ospeed... $ECHO_C" >&6

# Check whether --with-ospeed or --without-ospeed was given.
if test "${with_ospeed+set}" = set; then
  withval="$with_ospeed"
  NCURSES_OSPEED="$withval"
else
  NCURSES_OSPEED=short
fi;
echo "$as_me:13967: result: $NCURSES_OSPEED" >&5
echo "${ECHO_T}$NCURSES_OSPEED" >&6

###   use option --with-mmask-t to override mmask_t's type
echo "$as_me:13971: checking for type of mmask_t" >&5
echo $ECHO_N "checking for type of mmask_t... $ECHO_C" >&6

# Check whether --with-mmask-t or --without-mmask-t was given.
if test "${with_mmask_t+set}" = set; then
  withval="$with_mmask_t"
  NCURSES_MMASK_T="$withval"
else
  NCURSES_MMASK_T=$cf_dft_mmask_t
fi;
echo "$as_me:13981: result: $NCURSES_MMASK_T" >&5
echo "${ECHO_T}$NCURSES_MMASK_T" >&6

###   use option --with-ccharw-max to override CCHARW_MAX size
echo "$as_me:13985: checking for size CCHARW_MAX" >&5
echo $ECHO_N "checking for size CCHARW_MAX... $ECHO_C" >&6

# Check whether --with-ccharw-max or --without-ccharw-max was given.
if test "${with_ccharw_max+set}" = set; then
  withval="$with_ccharw_max"
  NCURSES_CCHARW_MAX="$withval"
else
  NCURSES_CCHARW_MAX=5
fi;
echo "$as_me:13995: result: $NCURSES_CCHARW_MAX" >&5
echo "${ECHO_T}$NCURSES_CCHARW_MAX" >&6

echo "$as_me:13998: checking for ANSI C header files" >&5
echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
if test "${ac_cv_header_stdc+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 14004 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <float.h>

_ACEOF
if { (eval echo "$as_me:14012: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:14018: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  ac_cv_header_stdc=yes
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  ac_cv_header_stdc=no
fi
rm -f conftest.err "conftest.$ac_ext"

if test $ac_cv_header_stdc = yes; then
  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
  cat >"conftest.$ac_ext" <<_ACEOF
#line 14040 "configure"
#include "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 -rf conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
  cat >"conftest.$ac_ext" <<_ACEOF
#line 14058 "configure"
#include "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 -rf 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 >"conftest.$ac_ext" <<_ACEOF
#line 14079 "configure"
#include "confdefs.h"
#include <ctype.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 (void)
{
  int i;
  for (i = 0; i < 256; i++)
    if (XOR (islower (i), ISLOWER (i))
        || toupper (i) != TOUPPER (i))
      $ac_main_return(2);
  $ac_main_return (0);
}
_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:14105: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:14108: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:14110: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:14113: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  :
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_header_stdc=no
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
fi
fi
echo "$as_me:14126: result: $ac_cv_header_stdc" >&5
echo "${ECHO_T}$ac_cv_header_stdc" >&6
if test $ac_cv_header_stdc = yes; then

cat >>confdefs.h <<\EOF
#define STDC_HEADERS 1
EOF

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=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
echo "$as_me:14142: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 14148 "configure"
#include "confdefs.h"
$ac_includes_default
#include <$ac_header>
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:14154: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:14157: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:14160: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:14163: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  eval "$as_ac_Header=yes"
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
eval "$as_ac_Header=no"
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:14173: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
EOF

fi
done

echo "$as_me:14183: checking for signed char" >&5
echo $ECHO_N "checking for signed char... $ECHO_C" >&6
if test "${ac_cv_type_signed_char+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 14189 "configure"
#include "confdefs.h"
$ac_includes_default
int
main (void)
{
if ((signed char *) 0)
  return 0;
if (sizeof (signed char))
  return 0;
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:14204: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:14207: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:14210: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:14213: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_type_signed_char=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_type_signed_char=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:14223: result: $ac_cv_type_signed_char" >&5
echo "${ECHO_T}$ac_cv_type_signed_char" >&6

echo "$as_me:14226: checking size of signed char" >&5
echo $ECHO_N "checking size of signed char... $ECHO_C" >&6
if test "${ac_cv_sizeof_signed_char+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test "$ac_cv_type_signed_char" = yes; then
  if test "$cross_compiling" = yes; then
  # Depending upon the size, compute the lo and hi bounds.
cat >"conftest.$ac_ext" <<_ACEOF
#line 14235 "configure"
#include "confdefs.h"
$ac_includes_default
int
main (void)
{
int _array_ [1 - 2 * !((sizeof (signed char)) >= 0)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:14247: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:14250: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:14253: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:14256: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_lo=0 ac_mid=0
  while :; do
    cat >"conftest.$ac_ext" <<_ACEOF
#line 14261 "configure"
#include "confdefs.h"
$ac_includes_default
int
main (void)
{
int _array_ [1 - 2 * !((sizeof (signed char)) <= $ac_mid)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:14273: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:14276: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:14279: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:14282: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_hi=$ac_mid; break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1`
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  done
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_hi=-1 ac_mid=-1
  while :; do
    cat >"conftest.$ac_ext" <<_ACEOF
#line 14298 "configure"
#include "confdefs.h"
$ac_includes_default
int
main (void)
{
int _array_ [1 - 2 * !((sizeof (signed char)) >= $ac_mid)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:14310: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:14313: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:14316: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:14319: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_lo=$ac_mid; break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"`
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  done
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
# Binary search between lo and hi bounds.
while test "x$ac_lo" != "x$ac_hi"; do
  ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"`
  cat >"conftest.$ac_ext" <<_ACEOF
#line 14335 "configure"
#include "confdefs.h"
$ac_includes_default
int
main (void)
{
int _array_ [1 - 2 * !((sizeof (signed char)) <= $ac_mid)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:14347: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:14350: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:14353: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:14356: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_hi=$ac_mid
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_lo=`expr "$ac_mid" + 1`
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
done
ac_cv_sizeof_signed_char=$ac_lo
else
  if test "$cross_compiling" = yes; then
  { { echo "$as_me:14369: error: cannot run test program while cross compiling" >&5
echo "$as_me: error: cannot run test program while cross compiling" >&2;}
   { (exit 1); exit 1; }; }
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 14374 "configure"
#include "confdefs.h"
$ac_includes_default
int
main (void)
{
FILE *f = fopen ("conftest.val", "w");
if (!f)
  $ac_main_return (1);
fprintf (f, "%ld", (long)(sizeof (signed char)));
fclose (f);
  ;
  return 0;
}
_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:14390: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:14393: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:14395: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:14398: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_sizeof_signed_char=`cat conftest.val`
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
fi
rm -f conftest.val
else
  ac_cv_sizeof_signed_char=0
fi
fi
echo "$as_me:14414: result: $ac_cv_sizeof_signed_char" >&5
echo "${ECHO_T}$ac_cv_sizeof_signed_char" >&6
cat >>confdefs.h <<EOF
#define SIZEOF_SIGNED_CHAR $ac_cv_sizeof_signed_char
EOF

if test "$ac_cv_sizeof_signed_char" = 1 ; then
	NCURSES_SBOOL="signed char"
else
	NCURSES_SBOOL="char"
fi
echo "$as_me:14425: checking if you want to use signed Boolean array in term.h" >&5
echo $ECHO_N "checking if you want to use signed Boolean array in term.h... $ECHO_C" >&6

# Check whether --enable-signed-char or --disable-signed-char was given.
if test "${enable_signed_char+set}" = set; then
  enableval="$enable_signed_char"
  with_signed_char=$enableval
else
  with_signed_char=no
fi;
echo "$as_me:14435: result: $with_signed_char" >&5
echo "${ECHO_T}$with_signed_char" >&6
test "x$with_signed_char" != xyes && NCURSES_SBOOL="char"

###   use option --with-tparm-arg to override tparm's argument type
echo "$as_me:14440: checking for type of tparm args" >&5
echo $ECHO_N "checking for type of tparm args... $ECHO_C" >&6

# Check whether --with-tparm-arg or --without-tparm-arg was given.
if test "${with_tparm_arg+set}" = set; then
  withval="$with_tparm_arg"
  NCURSES_TPARM_ARG="$withval"
else
  NCURSES_TPARM_ARG=$cf_dft_tparm_arg
fi;
echo "$as_me:14450: result: $NCURSES_TPARM_ARG" >&5
echo "${ECHO_T}$NCURSES_TPARM_ARG" >&6

### Enable compiling-in rcs id's
echo "$as_me:14454: checking if RCS identifiers should be compiled-in" >&5
echo $ECHO_N "checking if RCS identifiers should be compiled-in... $ECHO_C" >&6

# Check whether --with-rcs-ids or --without-rcs-ids was given.
if test "${with_rcs_ids+set}" = set; then
  withval="$with_rcs_ids"
  with_rcs_ids=$withval
else
  with_rcs_ids=no
fi;
echo "$as_me:14464: result: $with_rcs_ids" >&5
echo "${ECHO_T}$with_rcs_ids" >&6
test "x$with_rcs_ids" = xyes &&
cat >>confdefs.h <<\EOF
#define USE_RCS_IDS 1
EOF

###############################################################################

echo "$as_me:14473: checking format of man-pages" >&5
echo $ECHO_N "checking format of man-pages... $ECHO_C" >&6

# Check whether --with-manpage-format or --without-manpage-format was given.
if test "${with_manpage_format+set}" = set; then
  withval="$with_manpage_format"
  MANPAGE_FORMAT=$withval
else
  MANPAGE_FORMAT=unknown
fi;

test -z "$MANPAGE_FORMAT" && MANPAGE_FORMAT=unknown
MANPAGE_FORMAT=`echo "$MANPAGE_FORMAT" | sed -e 's/,/ /g'`

cf_unknown=

case "$MANPAGE_FORMAT" in
(unknown)
	if test -z "$MANPATH" ; then
		MANPATH="/usr/man:/usr/share/man"
	fi

	# look for the 'date' man-page (it is most likely to be installed!)
	MANPAGE_FORMAT=
	cf_preform="no"
	cf_catonly="yes"
	cf_example="date"

	IFS="${IFS:- 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
	for cf_dir in $MANPATH; do
		test -z "$cf_dir" && cf_dir=/usr/man
		for cf_name in $cf_dir/man*/$cf_example.[01]* $cf_dir/cat*/$cf_example.[01]* $cf_dir/man*/$cf_example $cf_dir/cat*/$cf_example
		do
			cf_test=`echo "$cf_name" | sed -e 's/*//'`
			if test "x$cf_test" = "x$cf_name" ; then

				case "$cf_name" in
				(*.gz) MANPAGE_FORMAT="$MANPAGE_FORMAT gzip";;
				(*.Z)  MANPAGE_FORMAT="$MANPAGE_FORMAT compress";;
				(*.0)  MANPAGE_FORMAT="$MANPAGE_FORMAT BSDI";;
				(*)    MANPAGE_FORMAT="$MANPAGE_FORMAT normal";;
				esac

				case "$cf_name" in
				($cf_dir/man*)
					cf_catonly=no
					;;
				($cf_dir/cat*)
					cf_preform=yes
					;;
				esac
				break
			fi

			# if we found a match in either man* or cat*, stop looking
			if test -n "$MANPAGE_FORMAT" ; then
				cf_found=no
				test "$cf_preform" = yes && MANPAGE_FORMAT="$MANPAGE_FORMAT formatted"
				test "$cf_catonly" = yes && MANPAGE_FORMAT="$MANPAGE_FORMAT catonly"
				case "$cf_name" in
				($cf_dir/cat*)
					cf_found=yes
					;;
				esac
				test "$cf_found" = yes && break
			fi
		done
		# only check the first directory in $MANPATH where we find manpages
		if test -n "$MANPAGE_FORMAT" ; then
			break
		fi
	done
	# if we did not find the example, just assume it is normal
	test -z "$MANPAGE_FORMAT" && MANPAGE_FORMAT=normal
	IFS="$ac_save_ifs"
	;;
(*)
	for cf_option in $MANPAGE_FORMAT; do
	case "$cf_option" in
	(gzip|compress|BSDI|normal|formatted|catonly)
		;;
	(*)
		cf_unknown="$cf_unknown $cf_option"
		;;
	esac
	done
	;;
esac

echo "$as_me:14562: result: $MANPAGE_FORMAT" >&5
echo "${ECHO_T}$MANPAGE_FORMAT" >&6
if test -n "$cf_unknown" ; then
	{ echo "$as_me:14565: WARNING: Unexpected manpage-format $cf_unknown" >&5
echo "$as_me: WARNING: Unexpected manpage-format $cf_unknown" >&2;}
fi

echo "$as_me:14569: checking for manpage renaming" >&5
echo $ECHO_N "checking for manpage renaming... $ECHO_C" >&6

# Check whether --with-manpage-renames or --without-manpage-renames was given.
if test "${with_manpage_renames+set}" = set; then
  withval="$with_manpage_renames"
  MANPAGE_RENAMES=$withval
else
  MANPAGE_RENAMES=yes
fi;

case ".$MANPAGE_RENAMES" in
(.no)
	;;
(.|.yes)
	# Debian 'man' program?
	if test -f /etc/debian_version ; then
		MANPAGE_RENAMES=`cd "$srcdir" && pwd`/man/man_db.renames
	else
		MANPAGE_RENAMES=no
	fi
	;;
esac

if test "$MANPAGE_RENAMES" != no ; then
	if test -f "$srcdir/man/$MANPAGE_RENAMES" ; then
		MANPAGE_RENAMES=`cd "$srcdir/man" && pwd`/$MANPAGE_RENAMES
	elif test ! -f "$MANPAGE_RENAMES" ; then
		{ { echo "$as_me:14597: error: not a filename: $MANPAGE_RENAMES" >&5
echo "$as_me: error: not a filename: $MANPAGE_RENAMES" >&2;}
   { (exit 1); exit 1; }; }
	fi

	test ! -d man && mkdir man

	# Construct a sed-script to perform renaming within man-pages
	if test -n "$MANPAGE_RENAMES" ; then
		test ! -d man && mkdir man
		$SHELL "$srcdir/man/make_sed.sh" "$MANPAGE_RENAMES" >./edit_man.sed
	fi
fi

echo "$as_me:14611: result: $MANPAGE_RENAMES" >&5
echo "${ECHO_T}$MANPAGE_RENAMES" >&6

echo "$as_me:14614: checking if manpage aliases will be installed" >&5
echo $ECHO_N "checking if manpage aliases will be installed... $ECHO_C" >&6

# Check whether --with-manpage-aliases or --without-manpage-aliases was given.
if test "${with_manpage_aliases+set}" = set; then
  withval="$with_manpage_aliases"
  MANPAGE_ALIASES=$withval
else
  MANPAGE_ALIASES=yes
fi;

echo "$as_me:14625: result: $MANPAGE_ALIASES" >&5
echo "${ECHO_T}$MANPAGE_ALIASES" >&6

case "x$LN_S" in
(xln*)
	cf_use_symlinks=yes
	;;
(*)
	cf_use_symlinks=no
	;;
esac

MANPAGE_SYMLINKS=no
if test "$MANPAGE_ALIASES" = yes ; then
echo "$as_me:14639: checking if manpage symlinks should be used" >&5
echo $ECHO_N "checking if manpage symlinks should be used... $ECHO_C" >&6

# Check whether --with-manpage-symlinks or --without-manpage-symlinks was given.
if test "${with_manpage_symlinks+set}" = set; then
  withval="$with_manpage_symlinks"
  MANPAGE_SYMLINKS=$withval
else
  MANPAGE_SYMLINKS=$cf_use_symlinks
fi;

if test "$$cf_use_symlinks" = no; then
if test "$MANPAGE_SYMLINKS" = yes ; then
	{ echo "$as_me:14652: WARNING: cannot make symlinks" >&5
echo "$as_me: WARNING: cannot make symlinks" >&2;}
	MANPAGE_SYMLINKS=no
fi
fi

echo "$as_me:14658: result: $MANPAGE_SYMLINKS" >&5
echo "${ECHO_T}$MANPAGE_SYMLINKS" >&6
fi

echo "$as_me:14662: checking for manpage tbl" >&5
echo $ECHO_N "checking for manpage tbl... $ECHO_C" >&6

# Check whether --with-manpage-tbl or --without-manpage-tbl was given.
if test "${with_manpage_tbl+set}" = set; then
  withval="$with_manpage_tbl"
  MANPAGE_TBL=$withval
else
  MANPAGE_TBL=no
fi;

echo "$as_me:14673: result: $MANPAGE_TBL" >&5
echo "${ECHO_T}$MANPAGE_TBL" >&6

if test "$prefix" = "NONE" ; then
	cf_prefix="$ac_default_prefix"
else
	cf_prefix="$prefix"
fi

case "$MANPAGE_FORMAT" in
(*catonly*)
	cf_format=yes
	cf_inboth=no
	;;
(*formatted*)
	cf_format=yes
	cf_inboth=yes
	;;
(*)
	cf_format=no
	cf_inboth=no
	;;
esac

test ! -d man && mkdir man

cf_so_strip=
cf_compress=
case "$MANPAGE_FORMAT" in
(*compress*)
	cf_so_strip="Z"
	cf_compress=compress
	;;
(*gzip*)
	cf_so_strip="gz"
	cf_compress=gzip
	;;
esac

cf_edit_man=./edit_man.sh
cf_man_alias=`pwd`/man_alias.sed

cat >$cf_edit_man <<CF_EOF
#! $SHELL
# this script is generated by the configure-script CF_MAN_PAGES macro.

prefix="$cf_prefix"
datarootdir="$datarootdir"
datadir="$datadir"

NCURSES_MAJOR="$NCURSES_MAJOR"
NCURSES_MINOR="$NCURSES_MINOR"
NCURSES_PATCH="$NCURSES_PATCH"

NCURSES_OSPEED="$NCURSES_OSPEED"
TERMINFO="$TERMINFO"

INSTALL="$INSTALL"
INSTALL_DATA="$INSTALL_DATA"

transform="$program_transform_name"

TMP=\${TMPDIR:=/tmp}/man\$\$
trap "rm -f \$TMP" 0 1 2 3 15

form=\$1
shift || exit 1

verb=\$1
shift || exit 1

mandir=\$1
shift || exit 1

srcdir=\$1
top_srcdir=\$srcdir/..
shift || exit 1

if test "\$form" = normal ; then
	if test "$cf_format" = yes ; then
	if test "$cf_inboth" = no ; then
		$SHELL "\$0" format "\$verb" "\$mandir" "\$srcdir" "\$@"
		exit $?
	fi
	fi
	cf_subdir=\$mandir/man
	cf_tables=$MANPAGE_TBL
else
	cf_subdir=\$mandir/cat
	cf_tables=yes
fi

# process the list of source-files
for i in "\$@" ; do
case \$i in
(*.orig|*.rej) ;;
(*.[0-9]*)
	section=\`expr "\$i" : '.*\\.\\([0-9]\\)[xm]*'\`;
	if test "\$verb" = installing ; then
	if test ! -d "\$cf_subdir\${section}" ; then
		mkdir -p "\$cf_subdir\$section"
	fi
	fi

	# replace variables in man page
	if test ! -f "$cf_man_alias" ; then
cat >>$cf_man_alias <<-CF_EOF2
		s,@DATADIR@,\$datadir,g
		s,@TERMINFO@,\${TERMINFO:="no default value"},g
		s,@TERMINFO_DIRS@,\${TERMINFO_DIRS:="no default value"},g
		s,@NCURSES_MAJOR@,\${NCURSES_MAJOR:="no default value"},g
		s,@NCURSES_MINOR@,\${NCURSES_MINOR:="no default value"},g
		s,@NCURSES_PATCH@,\${NCURSES_PATCH:="no default value"},g
		s,@NCURSES_OSPEED@,\${NCURSES_OSPEED:="no default value"},g
CF_EOF

	for cf_name in  captoinfo clear infocmp infotocap reset tabs tic toe tput tset
	do
		cf_NAME=`echo "$cf_name" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
		cf_name=`echo "$cf_name" | sed "$program_transform_name"`
cat >>$cf_edit_man <<-CF_EOF
		s,@$cf_NAME@,$cf_name,g
CF_EOF
	done

cat >>$cf_edit_man <<CF_EOF
CF_EOF2
		echo "...made $cf_man_alias"
	fi

	aliases=
	cf_source=\`basename "\$i"\`
	inalias=\$cf_source
	test ! -f "\$inalias" && inalias="\$srcdir/\$inalias"
	if test ! -f "\$inalias" ; then
		echo ".. skipped \$cf_source"
		continue
	fi
CF_EOF

if test "$MANPAGE_ALIASES" != no ; then
cat >>$cf_edit_man <<CF_EOF
	nCurses=ignore.3x
	test "$with_curses_h" = yes && nCurses=ncurses.3x
	aliases=\`sed -f "\$top_srcdir/man/manlinks.sed" "\$inalias" |sed -f "$cf_man_alias" | sort -u; test "\$inalias" = "\$nCurses" && echo curses\`
CF_EOF
fi

if test "$MANPAGE_RENAMES" = no ; then
cat >>$cf_edit_man <<CF_EOF
	# perform program transformations for section 1 man pages
	if test \$section = 1 ; then
		cf_target=\$cf_subdir\${section}/\`echo \$cf_source|sed "\${transform}"\`
	else
		cf_target=\$cf_subdir\${section}/\$cf_source
	fi
CF_EOF
else
cat >>$cf_edit_man <<CF_EOF
	cf_target=\`grep "^\$cf_source" $MANPAGE_RENAMES | $AWK '{print \$2}'\`
	if test -z "\$cf_target" ; then
		echo "? missing rename for \$cf_source"
		cf_target="\$cf_source"
	fi
	cf_target="\$cf_subdir\${section}/\${cf_target}"

CF_EOF
fi

cat >>$cf_edit_man <<CF_EOF
	sed	-f "$cf_man_alias" \\
CF_EOF

if test -f "$MANPAGE_RENAMES" ; then
cat >>$cf_edit_man <<CF_EOF
		< "\$i" | sed -f `pwd`/edit_man.sed >\$TMP
CF_EOF
else
cat >>$cf_edit_man <<CF_EOF
		< "\$i" >\$TMP
CF_EOF
fi

cat >>$cf_edit_man <<CF_EOF
if test \$cf_tables = yes ; then
	tbl \$TMP >\$TMP.out
	mv \$TMP.out \$TMP
fi
CF_EOF

if test "$with_overwrite" != yes ; then
cat >>$cf_edit_man <<CF_EOF
	sed -e "/\\#[    ]*include/s,<curses.h,<ncurses$LIB_SUFFIX/curses.h," < \$TMP >\$TMP.out
	mv \$TMP.out \$TMP
CF_EOF
fi

if test "$with_curses_h" != yes ; then
cat >>$cf_edit_man <<CF_EOF
	sed -e "/\\#[    ]*include/s,curses.h,ncurses.h," < \$TMP >\$TMP.out
	mv \$TMP.out \$TMP
CF_EOF
fi

cat >>$cf_edit_man <<CF_EOF
	if test "\$form" = format ; then
		nroff -man \$TMP >\$TMP.out
		mv \$TMP.out \$TMP
	fi
CF_EOF

if test -n "$cf_compress" ; then
cat >>$cf_edit_man <<CF_EOF
	if test "\$verb" = installing ; then
	if ( "$cf_compress" -f \$TMP )
	then
		mv \$TMP.$cf_so_strip \$TMP
	fi
	fi
	cf_target="\$cf_target.$cf_so_strip"
CF_EOF
fi

case "$MANPAGE_FORMAT" in
(*BSDI*)
cat >>$cf_edit_man <<CF_EOF
	if test "\$form" = format ; then
		# BSDI installs only .0 suffixes in the cat directories
		cf_target="\`echo \$cf_target|sed -e 's/\\.[1-9]\\+[a-z]*/.0/'\`"
	fi
CF_EOF
  ;;
esac

cat >>$cf_edit_man <<CF_EOF
	suffix=\`basename "\$cf_target" | sed -e 's%^[^.]*%%'\`
	if test "\$verb" = installing ; then
		echo "\$verb \$cf_target"
		\$INSTALL_DATA \$TMP "\$cf_target"
		test -d "\$cf_subdir\${section}" &&
		test -n "\$aliases" && (
			cd "\$cf_subdir\${section}" && (
				cf_source=\`echo "\$cf_target" |sed -e 's%^.*/\\([^/][^/]*/[^/][^/]*$\\)%\\1%'\`
				test -n "$cf_so_strip" && cf_source=\`echo "\$cf_source" |sed -e 's%\\.$cf_so_strip\$%%'\`
				cf_target=\`basename "\$cf_target"\`
				for cf_alias in \$aliases
				do
					if test "\$section" = 1 ; then
						cf_alias=\`echo "\$cf_alias" |sed "\${transform}"\`
					fi

					if test "$MANPAGE_SYMLINKS" = yes ; then
						if test -f "\$cf_alias\${suffix}" ; then
							if ( cmp -s "\$cf_target" "\$cf_alias\${suffix}" )
							then
								continue
							fi
						fi
						echo ".. \$verb alias \$cf_alias\${suffix}"
CF_EOF
case "x$LN_S" in
(*-f)
cat >>$cf_edit_man <<CF_EOF
						$LN_S "\$cf_target" "\$cf_alias\${suffix}"
CF_EOF
	;;
(*)
cat >>$cf_edit_man <<CF_EOF
						rm -f "\$cf_alias\${suffix}"
						$LN_S "\$cf_target" "\$cf_alias\${suffix}"
CF_EOF
	;;
esac
cat >>$cf_edit_man <<CF_EOF
					elif test "\$cf_target" != "\$cf_alias\${suffix}" ; then
						echo ".so \$cf_source" >\$TMP
CF_EOF
if test -n "$cf_compress" ; then
cat >>$cf_edit_man <<CF_EOF
						if test -n "$cf_so_strip" ; then
							"$cf_compress" -f \$TMP
							mv \$TMP.$cf_so_strip \$TMP
						fi
CF_EOF
fi
cat >>$cf_edit_man <<CF_EOF
						echo ".. \$verb alias \$cf_alias\${suffix}"
						rm -f "\$cf_alias\${suffix}"
						\$INSTALL_DATA \$TMP "\$cf_alias\${suffix}"
					fi
				done
			)
		)
	elif test "\$verb" = removing ; then
		test -f "\$cf_target" && (
			echo "\$verb \$cf_target"
			rm -f "\$cf_target"
		)
		test -d "\$cf_subdir\${section}" &&
		test -n "\$aliases" && (
			cd "\$cf_subdir\${section}" && (
				for cf_alias in \$aliases
				do
					if test "\$section" = 1 ; then
						cf_alias=\`echo "\$cf_alias" |sed "\${transform}"\`
					fi

					echo ".. \$verb alias \$cf_alias\${suffix}"
					rm -f "\$cf_alias\${suffix}"
				done
			)
		)
	else
#		echo ".hy 0"
		cat \$TMP
	fi
	;;
esac
done

if test "$cf_inboth" = yes ; then
if test "\$form" != format ; then
	$SHELL "\$0" format "\$verb" "\$mandir" "\$srcdir" "\$@"
fi
fi

exit 0
CF_EOF
chmod 755 "$cf_edit_man"

###############################################################################

### Note that some functions (such as const) are normally disabled anyway.
echo "$as_me:15006: checking if you want to build with function extensions" >&5
echo $ECHO_N "checking if you want to build with function extensions... $ECHO_C" >&6

# Check whether --enable-ext-funcs or --disable-ext-funcs was given.
if test "${enable_ext_funcs+set}" = set; then
  enableval="$enable_ext_funcs"
  with_ext_funcs=$enableval
else
  with_ext_funcs=yes
fi;
echo "$as_me:15016: result: $with_ext_funcs" >&5
echo "${ECHO_T}$with_ext_funcs" >&6
if test "x$with_ext_funcs" = xyes ; then
	NCURSES_EXT_FUNCS=1

cat >>confdefs.h <<\EOF
#define NCURSES_EXT_FUNCS 1
EOF

cat >>confdefs.h <<\EOF
#define HAVE_ASSUME_DEFAULT_COLORS 1
EOF

cat >>confdefs.h <<\EOF
#define HAVE_CURSES_VERSION 1
EOF

cat >>confdefs.h <<\EOF
#define HAVE_HAS_KEY 1
EOF

cat >>confdefs.h <<\EOF
#define HAVE_RESIZETERM 1
EOF

cat >>confdefs.h <<\EOF
#define HAVE_RESIZE_TERM 1
EOF

cat >>confdefs.h <<\EOF
#define HAVE_TERM_ENTRY_H 1
EOF

cat >>confdefs.h <<\EOF
#define HAVE_USE_DEFAULT_COLORS 1
EOF

cat >>confdefs.h <<\EOF
#define HAVE_USE_EXTENDED_NAMES 1
EOF

cat >>confdefs.h <<\EOF
#define HAVE_USE_SCREEN 1
EOF

cat >>confdefs.h <<\EOF
#define HAVE_USE_WINDOW 1
EOF

cat >>confdefs.h <<\EOF
#define HAVE_WRESIZE 1
EOF

	GENERATED_EXT_FUNCS=generated
	test "x$with_ext_funcs" = xyes || cf_dft_ext_spfuncs=no
else
	NCURSES_EXT_FUNCS=0
	GENERATED_EXT_FUNCS=
fi

echo "$as_me:15076: checking if you want to build with SCREEN extensions" >&5
echo $ECHO_N "checking if you want to build with SCREEN extensions... $ECHO_C" >&6

# Check whether --enable-sp-funcs or --disable-sp-funcs was given.
if test "${enable_sp_funcs+set}" = set; then
  enableval="$enable_sp_funcs"
  with_sp_funcs=$enableval
else
  with_sp_funcs=$cf_dft_ext_spfuncs
fi;
echo "$as_me:15086: result: $with_sp_funcs" >&5
echo "${ECHO_T}$with_sp_funcs" >&6
if test "x$with_sp_funcs" = xyes ; then
	NCURSES_SP_FUNCS=1

cat >>confdefs.h <<\EOF
#define NCURSES_SP_FUNCS 1
EOF

cat >>confdefs.h <<\EOF
#define HAVE_TPUTS_SP 1
EOF

	GENERATED_SP_FUNCS=generated
else
	NCURSES_SP_FUNCS=0
	GENERATED_SP_FUNCS=
fi

echo "$as_me:15105: checking if you want to build with terminal-driver" >&5
echo $ECHO_N "checking if you want to build with terminal-driver... $ECHO_C" >&6

# Check whether --enable-term-driver or --disable-term-driver was given.
if test "${enable_term_driver+set}" = set; then
  enableval="$enable_term_driver"
  with_term_driver=$enableval
else
  with_term_driver=no
fi;
echo "$as_me:15115: result: $with_term_driver" >&5
echo "${ECHO_T}$with_term_driver" >&6
if test "x$with_term_driver" = xyes ; then

cat >>confdefs.h <<\EOF
#define USE_TERM_DRIVER 1
EOF

	if test "x$with_termlib" != xno ; then
		{ { echo "$as_me:15124: error: The term-driver option conflicts with the termlib option" >&5
echo "$as_me: error: The term-driver option conflicts with the termlib option" >&2;}
   { (exit 1); exit 1; }; }
	fi
	if test "x$with_sp_funcs" != xyes ; then
		{ { echo "$as_me:15129: error: The term-driver option relies upon sp-funcs" >&5
echo "$as_me: error: The term-driver option relies upon sp-funcs" >&2;}
   { (exit 1); exit 1; }; }
	fi
fi

###   use option --enable-const to turn on use of const beyond that in XSI.
echo "$as_me:15136: checking for extended use of const keyword" >&5
echo $ECHO_N "checking for extended use of const keyword... $ECHO_C" >&6

# Check whether --enable-const or --disable-const was given.
if test "${enable_const+set}" = set; then
  enableval="$enable_const"
  with_ext_const=$enableval
else
  with_ext_const=$cf_dft_ext_const
fi;
echo "$as_me:15146: result: $with_ext_const" >&5
echo "${ECHO_T}$with_ext_const" >&6
NCURSES_CONST='/*nothing*/'
if test "x$with_ext_const" = xyes ; then
	NCURSES_CONST=const
fi

###   use option --enable-ext-colors to turn on use of colors beyond 16.
echo "$as_me:15154: checking if you want to use extended colors" >&5
echo $ECHO_N "checking if you want to use extended colors... $ECHO_C" >&6

# Check whether --enable-ext-colors or --disable-ext-colors was given.
if test "${enable_ext_colors+set}" = set; then
  enableval="$enable_ext_colors"
  with_ext_colors=$enableval
else
  with_ext_colors=$cf_dft_ext_colors
fi;
echo "$as_me:15164: result: $with_ext_colors" >&5
echo "${ECHO_T}$with_ext_colors" >&6
NCURSES_EXT_COLORS=0
if test "x$with_ext_colors" = xyes ; then
	if test "x$with_widec" != xyes ; then
		{ echo "$as_me:15169: WARNING: This option applies only to wide-character library" >&5
echo "$as_me: WARNING: This option applies only to wide-character library" >&2;}
	else
		# cannot be ABI 5 since it changes sizeof(cchar_t)

if test "${with_abi_version+set}" != set; then
	case "$cf_cv_rel_version" in
	(5.*)
		cf_cv_rel_version=6.0
		cf_cv_abi_version=6
		{ echo "$as_me:15179: WARNING: overriding ABI version to $cf_cv_abi_version" >&5
echo "$as_me: WARNING: overriding ABI version to $cf_cv_abi_version" >&2;}
		;;
	esac
fi

		NCURSES_EXT_COLORS=1

cat >>confdefs.h <<\EOF
#define NCURSES_EXT_COLORS 1
EOF

cat >>confdefs.h <<\EOF
#define HAVE_ALLOC_PAIR 1
EOF

cat >>confdefs.h <<\EOF
#define HAVE_INIT_EXTENDED_COLOR 1
EOF

cat >>confdefs.h <<\EOF
#define HAVE_RESET_COLOR_PAIRS 1
EOF

	fi
fi

###   use option --enable-ext-mouse to modify coding to support 5-button mice
echo "$as_me:15207: checking if you want to use extended mouse encoding" >&5
echo $ECHO_N "checking if you want to use extended mouse encoding... $ECHO_C" >&6

# Check whether --enable-ext-mouse or --disable-ext-mouse was given.
if test "${enable_ext_mouse+set}" = set; then
  enableval="$enable_ext_mouse"
  with_ext_mouse=$enableval
else
  with_ext_mouse=$cf_dft_ext_mouse
fi;
echo "$as_me:15217: result: $with_ext_mouse" >&5
echo "${ECHO_T}$with_ext_mouse" >&6
NCURSES_MOUSE_VERSION=1
if test "x$with_ext_mouse" = xyes ; then
	NCURSES_MOUSE_VERSION=2

if test "${with_abi_version+set}" != set; then
	case "$cf_cv_rel_version" in
	(5.*)
		cf_cv_rel_version=6.0
		cf_cv_abi_version=6
		{ echo "$as_me:15228: WARNING: overriding ABI version to $cf_cv_abi_version" >&5
echo "$as_me: WARNING: overriding ABI version to $cf_cv_abi_version" >&2;}
		;;
	esac
fi

fi

###   use option --enable-ext-putwin to turn on extended screendumps
echo "$as_me:15237: checking if you want to use extended putwin/screendump" >&5
echo $ECHO_N "checking if you want to use extended putwin/screendump... $ECHO_C" >&6

# Check whether --enable-ext-putwin or --disable-ext-putwin was given.
if test "${enable_ext_putwin+set}" = set; then
  enableval="$enable_ext_putwin"
  with_ext_putwin=$enableval
else
  with_ext_putwin=$cf_dft_ext_putwin
fi;
echo "$as_me:15247: result: $with_ext_putwin" >&5
echo "${ECHO_T}$with_ext_putwin" >&6
if test "x$with_ext_putwin" = xyes ; then

cat >>confdefs.h <<\EOF
#define NCURSES_EXT_PUTWIN 1
EOF

fi

echo "$as_me:15257: checking if you want \$NCURSES_NO_PADDING code" >&5
echo $ECHO_N "checking if you want \$NCURSES_NO_PADDING code... $ECHO_C" >&6

# Check whether --enable-no-padding or --disable-no-padding was given.
if test "${enable_no_padding+set}" = set; then
  enableval="$enable_no_padding"
  with_no_padding=$enableval
else
  with_no_padding=$with_ext_funcs
fi;
echo "$as_me:15267: result: $with_no_padding" >&5
echo "${ECHO_T}$with_no_padding" >&6
test "x$with_no_padding" = xyes &&
cat >>confdefs.h <<\EOF
#define NCURSES_NO_PADDING 1
EOF

###   use option --enable-sigwinch to turn on use of SIGWINCH logic
echo "$as_me:15275: checking if you want SIGWINCH handler" >&5
echo $ECHO_N "checking if you want SIGWINCH handler... $ECHO_C" >&6

# Check whether --enable-sigwinch or --disable-sigwinch was given.
if test "${enable_sigwinch+set}" = set; then
  enableval="$enable_sigwinch"
  with_sigwinch=$enableval
else
  with_sigwinch=$with_ext_funcs
fi;
echo "$as_me:15285: result: $with_sigwinch" >&5
echo "${ECHO_T}$with_sigwinch" >&6
test "x$with_sigwinch" = xyes &&
cat >>confdefs.h <<\EOF
#define USE_SIGWINCH 1
EOF

###   use option --enable-tcap-names to allow user to define new capabilities
echo "$as_me:15293: checking if you want user-definable terminal capabilities like termcap" >&5
echo $ECHO_N "checking if you want user-definable terminal capabilities like termcap... $ECHO_C" >&6

# Check whether --enable-tcap-names or --disable-tcap-names was given.
if test "${enable_tcap_names+set}" = set; then
  enableval="$enable_tcap_names"
  with_tcap_names=$enableval
else
  with_tcap_names=$with_ext_funcs
fi;
echo "$as_me:15303: result: $with_tcap_names" >&5
echo "${ECHO_T}$with_tcap_names" >&6
NCURSES_XNAMES=0
test "x$with_tcap_names" = xyes && NCURSES_XNAMES=1

##############################################################################

echo "$as_me:15310: checking if you want to link with the pthread library" >&5
echo $ECHO_N "checking if you want to link with the pthread library... $ECHO_C" >&6

# Check whether --with-pthread or --without-pthread was given.
if test "${with_pthread+set}" = set; then
  withval="$with_pthread"
  with_pthread=$withval
else
  with_pthread=no
fi;
echo "$as_me:15320: result: $with_pthread" >&5
echo "${ECHO_T}$with_pthread" >&6

if test "$with_pthread" != no ; then
	echo "$as_me:15324: checking for pthread.h" >&5
echo $ECHO_N "checking for pthread.h... $ECHO_C" >&6
if test "${ac_cv_header_pthread_h+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 15330 "configure"
#include "confdefs.h"
#include <pthread.h>
_ACEOF
if { (eval echo "$as_me:15334: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:15340: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  ac_cv_header_pthread_h=yes
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  ac_cv_header_pthread_h=no
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:15359: result: $ac_cv_header_pthread_h" >&5
echo "${ECHO_T}$ac_cv_header_pthread_h" >&6
if test "$ac_cv_header_pthread_h" = yes; then

cat >>confdefs.h <<\EOF
#define HAVE_PTHREADS_H 1
EOF

	for cf_lib_pthread in pthread c_r
	do
	    echo "$as_me:15369: checking if we can link with the $cf_lib_pthread library" >&5
echo $ECHO_N "checking if we can link with the $cf_lib_pthread library... $ECHO_C" >&6
	    cf_save_LIBS="$LIBS"

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -l$cf_lib_pthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

	    cat >"conftest.$ac_ext" <<_ACEOF
#line 15390 "configure"
#include "confdefs.h"

#include <pthread.h>

int
main (void)
{

		int rc = pthread_create(0,0,0,0);
		int r2 = pthread_mutexattr_settype(0, 0);

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:15407: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:15410: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:15413: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:15416: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  with_pthread=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
with_pthread=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
	    LIBS="$cf_save_LIBS"
	    echo "$as_me:15426: result: $with_pthread" >&5
echo "${ECHO_T}$with_pthread" >&6
	    test "$with_pthread" = yes && break
	done

	if test "$with_pthread" = yes ; then

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -l$cf_lib_pthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

cat >>confdefs.h <<\EOF
#define HAVE_LIBPTHREADS 1
EOF

	else
	    { { echo "$as_me:15454: error: Cannot link with pthread library" >&5
echo "$as_me: error: Cannot link with pthread library" >&2;}
   { (exit 1); exit 1; }; }
	fi

fi

fi

if test "x$with_pthread" != xno; then
	echo "$as_me:15464: checking for pthread_kill" >&5
echo $ECHO_N "checking for pthread_kill... $ECHO_C" >&6
if test "${ac_cv_func_pthread_kill+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 15470 "configure"
#include "confdefs.h"
#define pthread_kill autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef pthread_kill

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char pthread_kill (void);

int
main (void)
{

/* The GNU C library defines stubs 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_pthread_kill) || defined (__stub___pthread_kill)
#error found stub for pthread_kill
#endif

	return pthread_kill ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:15501: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:15504: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:15507: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:15510: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_func_pthread_kill=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_func_pthread_kill=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:15520: result: $ac_cv_func_pthread_kill" >&5
echo "${ECHO_T}$ac_cv_func_pthread_kill" >&6
if test "$ac_cv_func_pthread_kill" = yes; then

		echo "$as_me:15524: checking if you want to allow EINTR in wgetch with pthreads" >&5
echo $ECHO_N "checking if you want to allow EINTR in wgetch with pthreads... $ECHO_C" >&6

# Check whether --enable-pthreads-eintr or --disable-pthreads-eintr was given.
if test "${enable_pthreads_eintr+set}" = set; then
  enableval="$enable_pthreads_eintr"
  use_pthreads_eintr=$enableval
else
  use_pthreads_eintr=no
fi;
		echo "$as_me:15534: result: $use_pthreads_eintr" >&5
echo "${ECHO_T}$use_pthreads_eintr" >&6
		if test "x$use_pthreads_eintr" = xyes ; then

cat >>confdefs.h <<\EOF
#define USE_PTHREADS_EINTR 1
EOF

		fi
fi

	echo "$as_me:15545: checking if you want to use weak-symbols for pthreads" >&5
echo $ECHO_N "checking if you want to use weak-symbols for pthreads... $ECHO_C" >&6

# Check whether --enable-weak-symbols or --disable-weak-symbols was given.
if test "${enable_weak_symbols+set}" = set; then
  enableval="$enable_weak_symbols"
  use_weak_symbols=$enableval
else
  use_weak_symbols=no
fi;
	echo "$as_me:15555: result: $use_weak_symbols" >&5
echo "${ECHO_T}$use_weak_symbols" >&6
	if test "x$use_weak_symbols" = xyes ; then

echo "$as_me:15559: checking if $CC supports weak symbols" >&5
echo $ECHO_N "checking if $CC supports weak symbols... $ECHO_C" >&6
if test "${cf_cv_weak_symbols+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 15566 "configure"
#include "confdefs.h"

#include <stdio.h>
int
main (void)
{

#if defined(__GNUC__)
#  if defined __USE_ISOC99
#    define _cat_pragma(exp)	_Pragma(#exp)
#    define _weak_pragma(exp)	_cat_pragma(weak name)
#  else
#    define _weak_pragma(exp)
#  endif
#  define _declare(name)	__extension__ extern __typeof__(name) name
#  define weak_symbol(name)	_weak_pragma(name) _declare(name) __attribute__((weak))
#endif

weak_symbol(fopen);

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:15592: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:15595: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:15598: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:15601: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_weak_symbols=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_weak_symbols=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:15612: result: $cf_cv_weak_symbols" >&5
echo "${ECHO_T}$cf_cv_weak_symbols" >&6

	else
		cf_cv_weak_symbols=no
	fi

	if test "x$cf_cv_weak_symbols" = xyes ; then

cat >>confdefs.h <<\EOF
#define USE_WEAK_SYMBOLS 1
EOF

	fi
fi

PTHREAD=
if test "x$with_pthread" = "xyes" ; then

cat >>confdefs.h <<\EOF
#define USE_PTHREADS 1
EOF

	enable_reentrant=yes
	if test "x$cf_cv_weak_symbols" = xyes ; then
		PTHREAD=-lpthread

cf_add_libs="$PRIVATE_LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lpthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
PRIVATE_LIBS="$cf_add_libs"

	fi
fi

# Reentrant code has to be opaque; there's little advantage to making ncurses
# opaque outside of that, so there is no --enable-opaque option.  We can use
# this option without --with-pthreads, but this will be always set for
# pthreads.
echo "$as_me:15662: checking if you want reentrant code" >&5
echo $ECHO_N "checking if you want reentrant code... $ECHO_C" >&6

# Check whether --enable-reentrant or --disable-reentrant was given.
if test "${enable_reentrant+set}" = set; then
  enableval="$enable_reentrant"
  with_reentrant=$enableval
else
  with_reentrant=no
fi;
echo "$as_me:15672: result: $with_reentrant" >&5
echo "${ECHO_T}$with_reentrant" >&6
if test "x$with_reentrant" = xyes ; then
	cf_cv_enable_reentrant=1
	cf_cv_enable_opaque="NCURSES_INTERNALS"
	NCURSES_SIZE_T=int
	if test "x$cf_cv_weak_symbols" = xyes ; then

# remove pthread library from $LIBS
LIBS=`echo "$LIBS" | sed -e 's/-lpthread[ 	]//g' -e 's/-lpthread$//'`

cf_add_libs="$TEST_LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lpthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
TEST_LIBS="$cf_add_libs"

cf_add_libs="$TEST_LIBS2"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lpthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
TEST_LIBS2="$cf_add_libs"

cf_add_libs="$PRIVATE_LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lpthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
PRIVATE_LIBS="$cf_add_libs"

	else
		# when not using weak symbols but with_reentrant,
		# add 't' to the library suffix on all platforms
		# except cygwin, where we only do that if ALSO
		# compiling with full thread support.
		case "$host" in
		(*cygwin* | *msys*)
			if test "$with_pthread" = "yes" ; then
				if test "x$disable_lib_suffixes" = "xno" ; then
					LIB_SUFFIX="t${LIB_SUFFIX}"
				fi
			fi ;;
		(*)
			if test "x$disable_lib_suffixes" = "xno" ; then
				LIB_SUFFIX="t${LIB_SUFFIX}"
			fi
			;;
		esac
	fi

cat >>confdefs.h <<\EOF
#define USE_REENTRANT 1
EOF

if test "${with_abi_version+set}" != set; then
	case "$cf_cv_rel_version" in
	(5.*)
		cf_cv_rel_version=6.0
		cf_cv_abi_version=6
		{ echo "$as_me:15760: WARNING: overriding ABI version to $cf_cv_abi_version" >&5
echo "$as_me: WARNING: overriding ABI version to $cf_cv_abi_version" >&2;}
		;;
	esac
fi

else
	cf_cv_enable_reentrant=0
	cf_cv_enable_opaque="NCURSES_OPAQUE"
	NCURSES_SIZE_T=short
fi

echo "$as_me:15772: checking if you want opaque curses-library structures" >&5
echo $ECHO_N "checking if you want opaque curses-library structures... $ECHO_C" >&6

# Check whether --enable-opaque-curses or --disable-opaque-curses was given.
if test "${enable_opaque_curses+set}" = set; then
  enableval="$enable_opaque_curses"
  test "$enableval" != yes && enableval=no
	if test "$enableval" != "no" ; then
    enable_opaque_curses=yes
	else

	 test "$cf_cv_enable_reentrant" = 1 && enable_opaque_curses=yes
	 test "$cf_cv_enable_reentrant" = 1 || enable_opaque_curses=no

	fi
else
  enableval=no

	 test "$cf_cv_enable_reentrant" = 1 && enable_opaque_curses=yes
	 test "$cf_cv_enable_reentrant" = 1 || enable_opaque_curses=no

fi;
echo "$as_me:15794: result: $enable_opaque_curses" >&5
echo "${ECHO_T}$enable_opaque_curses" >&6

test "$cf_cv_enable_reentrant" = 1 && \
test "$enable_opaque_curses" = no && \
{ { echo "$as_me:15799: error: reentrant configuration requires opaque library" >&5
echo "$as_me: error: reentrant configuration requires opaque library" >&2;}
   { (exit 1); exit 1; }; }

echo "$as_me:15803: checking if you want opaque form-library structures" >&5
echo $ECHO_N "checking if you want opaque form-library structures... $ECHO_C" >&6

# Check whether --enable-opaque-form or --disable-opaque-form was given.
if test "${enable_opaque_form+set}" = set; then
  enableval="$enable_opaque_form"
  enable_opaque_form=yes
else
  enable_opaque_form=no
fi;
echo "$as_me:15813: result: $enable_opaque_form" >&5
echo "${ECHO_T}$enable_opaque_form" >&6

echo "$as_me:15816: checking if you want opaque menu-library structures" >&5
echo $ECHO_N "checking if you want opaque menu-library structures... $ECHO_C" >&6

# Check whether --enable-opaque-menu or --disable-opaque-menu was given.
if test "${enable_opaque_menu+set}" = set; then
  enableval="$enable_opaque_menu"
  enable_opaque_menu=yes
else
  enable_opaque_menu=no
fi;
echo "$as_me:15826: result: $enable_opaque_menu" >&5
echo "${ECHO_T}$enable_opaque_menu" >&6

echo "$as_me:15829: checking if you want opaque panel-library structures" >&5
echo $ECHO_N "checking if you want opaque panel-library structures... $ECHO_C" >&6

# Check whether --enable-opaque-panel or --disable-opaque-panel was given.
if test "${enable_opaque_panel+set}" = set; then
  enableval="$enable_opaque_panel"
  enable_opaque_panel=yes
else
  enable_opaque_panel=no
fi;
echo "$as_me:15839: result: $enable_opaque_panel" >&5
echo "${ECHO_T}$enable_opaque_panel" >&6

NCURSES_OPAQUE=0;		test "$enable_opaque_curses" = yes && NCURSES_OPAQUE=1
NCURSES_OPAQUE_FORM=0;	test "$enable_opaque_form"   = yes && NCURSES_OPAQUE_FORM=1
NCURSES_OPAQUE_MENU=0;	test "$enable_opaque_menu"   = yes && NCURSES_OPAQUE_MENU=1
NCURSES_OPAQUE_PANEL=0;	test "$enable_opaque_panel"  = yes && NCURSES_OPAQUE_PANEL=1

### Allow using a different wrap-prefix
if test "$cf_cv_enable_reentrant" != 0 || test "$BROKEN_LINKER" = 1 ; then
	echo "$as_me:15849: checking for prefix used to wrap public variables" >&5
echo $ECHO_N "checking for prefix used to wrap public variables... $ECHO_C" >&6

# Check whether --with-wrap-prefix or --without-wrap-prefix was given.
if test "${with_wrap_prefix+set}" = set; then
  withval="$with_wrap_prefix"
  NCURSES_WRAP_PREFIX=$withval
else
  NCURSES_WRAP_PREFIX=_nc_
fi;
	echo "$as_me:15859: result: $NCURSES_WRAP_PREFIX" >&5
echo "${ECHO_T}$NCURSES_WRAP_PREFIX" >&6
else
	NCURSES_WRAP_PREFIX=_nc_
fi

cat >>confdefs.h <<EOF
#define NCURSES_WRAP_PREFIX "$NCURSES_WRAP_PREFIX"
EOF

###############################################################################
# These options are relatively safe to experiment with.

echo "$as_me:15872: checking if you want all development code" >&5
echo $ECHO_N "checking if you want all development code... $ECHO_C" >&6

# Check whether --with-develop or --without-develop was given.
if test "${with_develop+set}" = set; then
  withval="$with_develop"
  with_develop=$withval
else
  with_develop=no
fi;
echo "$as_me:15882: result: $with_develop" >&5
echo "${ECHO_T}$with_develop" >&6

###   use option --enable-hard-tabs to turn on use of hard-tabs optimize
echo "$as_me:15886: checking if you want hard-tabs code" >&5
echo $ECHO_N "checking if you want hard-tabs code... $ECHO_C" >&6

# Check whether --enable-hard-tabs or --disable-hard-tabs was given.
if test "${enable_hard_tabs+set}" = set; then
  enableval="$enable_hard_tabs"

else
  enable_hard_tabs=$with_develop
fi;
echo "$as_me:15896: result: $enable_hard_tabs" >&5
echo "${ECHO_T}$enable_hard_tabs" >&6
test "x$enable_hard_tabs" = xyes &&
cat >>confdefs.h <<\EOF
#define USE_HARD_TABS 1
EOF

###   use option --enable-xmc-glitch to turn on use of magic-cookie optimize
echo "$as_me:15904: checking if you want limited support for xmc" >&5
echo $ECHO_N "checking if you want limited support for xmc... $ECHO_C" >&6

# Check whether --enable-xmc-glitch or --disable-xmc-glitch was given.
if test "${enable_xmc_glitch+set}" = set; then
  enableval="$enable_xmc_glitch"

else
  enable_xmc_glitch=$with_develop
fi;
echo "$as_me:15914: result: $enable_xmc_glitch" >&5
echo "${ECHO_T}$enable_xmc_glitch" >&6
test "x$enable_xmc_glitch" = xyes &&
cat >>confdefs.h <<\EOF
#define USE_XMC_SUPPORT 1
EOF

###############################################################################
# These are just experimental, probably should not be in a package:

echo "$as_me:15924: checking if you do not want to assume colors are white-on-black" >&5
echo $ECHO_N "checking if you do not want to assume colors are white-on-black... $ECHO_C" >&6

# Check whether --enable-assumed-color or --disable-assumed-color was given.
if test "${enable_assumed_color+set}" = set; then
  enableval="$enable_assumed_color"
  with_assumed_color=$enableval
else
  with_assumed_color=yes
fi;
echo "$as_me:15934: result: $with_assumed_color" >&5
echo "${ECHO_T}$with_assumed_color" >&6
test "x$with_assumed_color" = xyes &&
cat >>confdefs.h <<\EOF
#define USE_ASSUMED_COLOR 1
EOF

###   use option --enable-hashmap to turn on use of hashmap scrolling logic
echo "$as_me:15942: checking if you want hashmap scrolling-optimization code" >&5
echo $ECHO_N "checking if you want hashmap scrolling-optimization code... $ECHO_C" >&6

# Check whether --enable-hashmap or --disable-hashmap was given.
if test "${enable_hashmap+set}" = set; then
  enableval="$enable_hashmap"
  with_hashmap=$enableval
else
  with_hashmap=yes
fi;
echo "$as_me:15952: result: $with_hashmap" >&5
echo "${ECHO_T}$with_hashmap" >&6
test "x$with_hashmap" = xyes &&
cat >>confdefs.h <<\EOF
#define USE_HASHMAP 1
EOF

###   use option --enable-colorfgbg to turn on use of $COLORFGBG environment
echo "$as_me:15960: checking if you want colorfgbg code" >&5
echo $ECHO_N "checking if you want colorfgbg code... $ECHO_C" >&6

# Check whether --enable-colorfgbg or --disable-colorfgbg was given.
if test "${enable_colorfgbg+set}" = set; then
  enableval="$enable_colorfgbg"
  with_colorfgbg=$enableval
else
  with_colorfgbg=no
fi;
echo "$as_me:15970: result: $with_colorfgbg" >&5
echo "${ECHO_T}$with_colorfgbg" >&6
test "x$with_colorfgbg" = xyes &&
cat >>confdefs.h <<\EOF
#define USE_COLORFGBG 1
EOF

###   use option --enable-fvisibility to turn on use of gcc-specific feature
echo "$as_me:15978: checking if you want to use gcc -fvisibility option" >&5
echo $ECHO_N "checking if you want to use gcc -fvisibility option... $ECHO_C" >&6

# Check whether --enable-fvisibility or --disable-fvisibility was given.
if test "${enable_fvisibility+set}" = set; then
  enableval="$enable_fvisibility"
  cf_with_fvisibility=$enableval
else
  cf_with_fvisibility=no
fi;
echo "$as_me:15988: result: $cf_with_fvisibility" >&5
echo "${ECHO_T}$cf_with_fvisibility" >&6

NCURSES_IMPEXP=
NCURSES_CXX_IMPEXP=
if test "x$cf_with_fvisibility" = xyes; then

echo "$as_me:15995: checking if $CC -fvisibility=hidden option works" >&5
echo $ECHO_N "checking if $CC -fvisibility=hidden option works... $ECHO_C" >&6
if test "${cf_cv_fvisibility_hidden+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

    cf_save_cflags="$CFLAGS"
    CFLAGS="$CFLAGS -fvisibility=hidden"
    cat >"conftest.$ac_ext" <<_ACEOF
#line 16004 "configure"
#include "confdefs.h"

__attribute__ ((visibility("default"))) int somefunc() {return 42;}

int
main (void)
{

	if (somefunc()) return 1;

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:16020: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:16023: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:16026: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:16029: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_fvisibility_hidden=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_fvisibility_hidden=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
    CFLAGS=$cf_save_cflags

fi
echo "$as_me:16041: result: $cf_cv_fvisibility_hidden" >&5
echo "${ECHO_T}$cf_cv_fvisibility_hidden" >&6

	if test "x$cf_cv_fvisibility_hidden" = xyes
	then

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in -fvisibility=hidden
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

		NCURSES_IMPEXP="__attribute__ ((visibility(\"default\")))"
	fi
	if test -n "$CXX"
	then
		ac_ext=cc
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
ac_main_return="return"

echo "$as_me:16156: checking if $CXX -fvisibility=hidden option works" >&5
echo $ECHO_N "checking if $CXX -fvisibility=hidden option works... $ECHO_C" >&6
if test "${cf_cv_fvisibility_hidden2+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

    cf_save_cflags="$CXXFLAGS"
    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
    cat >"conftest.$ac_ext" <<_ACEOF
#line 16165 "configure"
#include "confdefs.h"

__attribute__ ((visibility("default"))) int somefunc() {return 42;}

int
main (void)
{

	if (somefunc()) return 1;

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:16181: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:16184: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:16187: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:16190: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_fvisibility_hidden2=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_fvisibility_hidden2=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
    CXXFLAGS=$cf_save_cflags

fi
echo "$as_me:16202: result: $cf_cv_fvisibility_hidden2" >&5
echo "${ECHO_T}$cf_cv_fvisibility_hidden2" >&6

		if test "x$cf_cv_fvisibility_hidden2" = xyes
		then

cf_save_CXXFLAGS="$CFLAGS"
CFLAGS="$CXXFLAGS"

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in -fvisibility=hidden
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

CXXFLAGS="$CFLAGS"
CFLAGS="$cf_save_CXXFLAGS"

			NCURSES_CXX_IMPEXP="__attribute__ ((visibility(\"default\")))"
		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
ac_main_return="return"

	fi
fi

###   use option --enable-interop to turn on use of bindings used for interop
echo "$as_me:16325: checking if you want interop bindings" >&5
echo $ECHO_N "checking if you want interop bindings... $ECHO_C" >&6

# Check whether --enable-interop or --disable-interop was given.
if test "${enable_interop+set}" = set; then
  enableval="$enable_interop"
  with_exp_interop=$enableval
else
  with_exp_interop=$cf_dft_interop
fi;
echo "$as_me:16335: result: $with_exp_interop" >&5
echo "${ECHO_T}$with_exp_interop" >&6

NCURSES_INTEROP_FUNCS=0
test "x$with_exp_interop" = xyes && NCURSES_INTEROP_FUNCS=1

echo "$as_me:16341: checking if you want experimental safe-sprintf code" >&5
echo $ECHO_N "checking if you want experimental safe-sprintf code... $ECHO_C" >&6

# Check whether --enable-safe-sprintf or --disable-safe-sprintf was given.
if test "${enable_safe_sprintf+set}" = set; then
  enableval="$enable_safe_sprintf"
  with_safe_sprintf=$enableval
else
  with_safe_sprintf=no
fi;
echo "$as_me:16351: result: $with_safe_sprintf" >&5
echo "${ECHO_T}$with_safe_sprintf" >&6

###   use option --disable-scroll-hints to turn off use of scroll-hints scrolling logic
# when hashmap is used scroll hints are useless
if test "$with_hashmap" = no ; then
echo "$as_me:16357: checking if you want to experiment without scrolling-hints code" >&5
echo $ECHO_N "checking if you want to experiment without scrolling-hints code... $ECHO_C" >&6

# Check whether --enable-scroll-hints or --disable-scroll-hints was given.
if test "${enable_scroll_hints+set}" = set; then
  enableval="$enable_scroll_hints"
  with_scroll_hints=$enableval
else
  with_scroll_hints=yes
fi;
echo "$as_me:16367: result: $with_scroll_hints" >&5
echo "${ECHO_T}$with_scroll_hints" >&6
test "x$with_scroll_hints" = xyes &&
cat >>confdefs.h <<\EOF
#define USE_SCROLL_HINTS 1
EOF

fi

echo "$as_me:16376: checking if you want wgetch-events code" >&5
echo $ECHO_N "checking if you want wgetch-events code... $ECHO_C" >&6

# Check whether --enable-wgetch-events or --disable-wgetch-events was given.
if test "${enable_wgetch_events+set}" = set; then
  enableval="$enable_wgetch_events"
  with_wgetch_events=$enableval
else
  with_wgetch_events=no
fi;
echo "$as_me:16386: result: $with_wgetch_events" >&5
echo "${ECHO_T}$with_wgetch_events" >&6
if test "x$with_wgetch_events" = xyes ; then

cat >>confdefs.h <<\EOF
#define NCURSES_WGETCH_EVENTS 1
EOF

	NCURSES_WGETCH_EVENTS=1
else
	NCURSES_WGETCH_EVENTS=0
fi

case "$cf_cv_system_name" in
(*mingw32*|*mingw64*|*-msvc*)
	echo "$as_me:16401: checking if you want experimental-Windows driver" >&5
echo $ECHO_N "checking if you want experimental-Windows driver... $ECHO_C" >&6

# Check whether --enable-exp-win32 or --disable-exp-win32 was given.
if test "${enable_exp_win32+set}" = set; then
  enableval="$enable_exp_win32"
  with_exp_win32=$enableval
else
  with_exp_win32=no
fi;
	echo "$as_me:16411: result: $with_exp_win32" >&5
echo "${ECHO_T}$with_exp_win32" >&6
	if test "x$with_exp_win32" = xyes
	then

cat >>confdefs.h <<\EOF
#define EXP_WIN32_DRIVER 1
EOF

		EXP_WIN32_DRIVER=1
		INTERNALS_HDR='$(INCDIR)/nc_win32.h'
	else
		INTERNALS_HDR='$(INCDIR)/nc_mingw.h'
		EXP_WIN32_DRIVER=0
	fi
	;;
(*)
	EXP_WIN32_DRIVER=0
	INTERNALS_HDR=
	;;
esac

###############################################################################

###	use option --disable-echo to suppress full display compiling commands

echo "$as_me:16437: checking if you want to see long compiling messages" >&5
echo $ECHO_N "checking if you want to see long compiling messages... $ECHO_C" >&6

# Check whether --enable-echo or --disable-echo was given.
if test "${enable_echo+set}" = set; then
  enableval="$enable_echo"
  test "$enableval" != no && enableval=yes
	if test "$enableval" != "yes" ; then

	ECHO_LT='--silent'
	ECHO_LD='@echo linking $@;'
	RULE_CC='@echo compiling $<'
	SHOW_CC='@echo compiling $@'
	ECHO_CC='@'

	else

	ECHO_LT=''
	ECHO_LD=''
	RULE_CC=''
	SHOW_CC=''
	ECHO_CC=''

	fi
else
  enableval=yes

	ECHO_LT=''
	ECHO_LD=''
	RULE_CC=''
	SHOW_CC=''
	ECHO_CC=''

fi;
echo "$as_me:16471: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6

if test "x$enable_echo" = xyes; then
	ECHO_LINK=
else
	ECHO_LINK='@ echo linking $@ ... ;'
	test -n "$LIBTOOL" && LIBTOOL="$LIBTOOL --silent"
	test -n "$LIBTOOL_CXX" && LIBTOOL_CXX="$LIBTOOL_CXX --silent"
fi

# --disable-stripping is used for debugging

echo "$as_me:16484: checking if you want to install stripped executables" >&5
echo $ECHO_N "checking if you want to install stripped executables... $ECHO_C" >&6

# Check whether --enable-stripping or --disable-stripping was given.
if test "${enable_stripping+set}" = set; then
  enableval="$enable_stripping"
  test "$enableval" != no && enableval=yes
	if test "$enableval" != "yes" ; then
    enable_stripping=no
	else
		enable_stripping=yes
	fi
else
  enableval=yes
	enable_stripping=yes

fi;
echo "$as_me:16501: result: $enable_stripping" >&5
echo "${ECHO_T}$enable_stripping" >&6

if test "$enable_stripping" = yes
then
	INSTALL_OPT_S="-s"
else
	INSTALL_OPT_S=
fi

: "${INSTALL:=install}"
echo "$as_me:16512: checking if install accepts -p option" >&5
echo $ECHO_N "checking if install accepts -p option... $ECHO_C" >&6
if test "${cf_cv_install_p+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	rm -rf ./conftest*
	date >conftest.in
	mkdir conftest.out
	sleep 3
	if $INSTALL -p conftest.in conftest.out 2>/dev/null
	then
		if test -f conftest.out/conftest.in
		then
			test conftest.in -nt conftest.out/conftest.in 2>conftest.err && \
			test conftest.out/conftest.in -nt conftest.in 2>conftest.err
			if test -s conftest.err
			then
				cf_cv_install_p=no
			else
				cf_cv_install_p=yes
			fi
		else
			cf_cv_install_p=no
		fi
	else
		cf_cv_install_p=no
	fi
	rm -rf ./conftest*

fi
echo "$as_me:16543: result: $cf_cv_install_p" >&5
echo "${ECHO_T}$cf_cv_install_p" >&6

echo "$as_me:16546: checking if install needs to be told about ownership" >&5
echo $ECHO_N "checking if install needs to be told about ownership... $ECHO_C" >&6
case `$ac_config_guess` in
(*minix)
	with_install_o=yes
	;;
(*)
	with_install_o=no
	;;
esac

echo "$as_me:16557: result: $with_install_o" >&5
echo "${ECHO_T}$with_install_o" >&6
if test "x$with_install_o" = xyes
then
	INSTALL_OPT_O="`id root|sed -e 's/uid=[0-9]*(/ -o /' -e 's/gid=[0-9]*(/ -g /' -e 's/ [^=[:space:]][^=[:space:]]*=.*/ /' -e 's/)//g'`"
else
	INSTALL_OPT_O=
fi

# If we're avoiding relinking of shared libraries during install, that is to
# avoid modifying the build-tree.  For the same reason, avoid doing ranlib if
# the install program has "-p" (for preserving timestamps).
cf_cv_do_reranlib=yes
if test "x$cf_cv_install_p" = xyes
then
	if test "x$cf_cv_do_relink" != xyes
	then
		cf_cv_do_reranlib=no
		INSTALL_OPT_P="-p"
		INSTALL_LIB="$INSTALL_LIB $INSTALL_OPT_P"
	fi
fi

###	use option --enable-warnings to turn on all gcc warnings

echo "$as_me:16582: checking if you want to use C11 _Noreturn feature" >&5
echo $ECHO_N "checking if you want to use C11 _Noreturn feature... $ECHO_C" >&6

# Check whether --enable-stdnoreturn or --disable-stdnoreturn was given.
if test "${enable_stdnoreturn+set}" = set; then
  enableval="$enable_stdnoreturn"
  test "$enableval" != yes && enableval=no
	if test "$enableval" != "no" ; then
    enable_stdnoreturn=yes
	else
		enable_stdnoreturn=no
	fi
else
  enableval=no
	enable_stdnoreturn=no

fi;
echo "$as_me:16599: result: $enable_stdnoreturn" >&5
echo "${ECHO_T}$enable_stdnoreturn" >&6

if test $enable_stdnoreturn = yes; then
echo "$as_me:16603: checking for C11 _Noreturn feature" >&5
echo $ECHO_N "checking for C11 _Noreturn feature... $ECHO_C" >&6
if test "${cf_cv_c11_noreturn+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 16609 "configure"
#include "confdefs.h"

#include <stdio.h>
#include <stdlib.h>
#include <stdnoreturn.h>
static _Noreturn void giveup(void) { exit(0); }

int
main (void)
{
if (feof(stdin)) giveup()
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:16626: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:16629: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:16632: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:16635: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_c11_noreturn=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_c11_noreturn=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:16646: result: $cf_cv_c11_noreturn" >&5
echo "${ECHO_T}$cf_cv_c11_noreturn" >&6
else
	cf_cv_c11_noreturn=no,
fi

if test "$cf_cv_c11_noreturn" = yes; then

cat >>confdefs.h <<\EOF
#define HAVE_STDNORETURN_H 1
EOF

cat >>confdefs.h <<EOF
#define STDC_NORETURN _Noreturn
EOF

	HAVE_STDNORETURN_H=1
else
	HAVE_STDNORETURN_H=0
fi

if test "$GCC" = yes || test "$GXX" = yes
then

if test "$GCC" = yes || test "$GXX" = yes
then
	case $CFLAGS in
	(*-Werror=*)
		test -n "$verbose" && echo "	repairing CFLAGS: $CFLAGS" 1>&6

echo "${as_me:-configure}:16676: testing repairing CFLAGS: $CFLAGS ..." 1>&5

		cf_temp_flags=
		for cf_temp_scan in $CFLAGS
		do
			case "x$cf_temp_scan" in
			(x-Werror=*)

	test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS "
	EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan"

				;;
			(*)

	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"

				;;
			esac
		done
		CFLAGS="$cf_temp_flags"
		test -n "$verbose" && echo "	... fixed $CFLAGS" 1>&6

echo "${as_me:-configure}:16699: testing ... fixed $CFLAGS ..." 1>&5

		test -n "$verbose" && echo "	... extra $EXTRA_CFLAGS" 1>&6

echo "${as_me:-configure}:16703: testing ... extra $EXTRA_CFLAGS ..." 1>&5

		;;
	esac
fi

if test "$GCC" = yes || test "$GXX" = yes
then
	case $CPPFLAGS in
	(*-Werror=*)
		test -n "$verbose" && echo "	repairing CPPFLAGS: $CPPFLAGS" 1>&6

echo "${as_me:-configure}:16715: testing repairing CPPFLAGS: $CPPFLAGS ..." 1>&5

		cf_temp_flags=
		for cf_temp_scan in $CPPFLAGS
		do
			case "x$cf_temp_scan" in
			(x-Werror=*)

	test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS "
	EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan"

				;;
			(*)

	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"

				;;
			esac
		done
		CPPFLAGS="$cf_temp_flags"
		test -n "$verbose" && echo "	... fixed $CPPFLAGS" 1>&6

echo "${as_me:-configure}:16738: testing ... fixed $CPPFLAGS ..." 1>&5

		test -n "$verbose" && echo "	... extra $EXTRA_CFLAGS" 1>&6

echo "${as_me:-configure}:16742: testing ... extra $EXTRA_CFLAGS ..." 1>&5

		;;
	esac
fi

if test "$GCC" = yes || test "$GXX" = yes
then
	case $LDFLAGS in
	(*-Werror=*)
		test -n "$verbose" && echo "	repairing LDFLAGS: $LDFLAGS" 1>&6

echo "${as_me:-configure}:16754: testing repairing LDFLAGS: $LDFLAGS ..." 1>&5

		cf_temp_flags=
		for cf_temp_scan in $LDFLAGS
		do
			case "x$cf_temp_scan" in
			(x-Werror=*)

	test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS "
	EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan"

				;;
			(*)

	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"

				;;
			esac
		done
		LDFLAGS="$cf_temp_flags"
		test -n "$verbose" && echo "	... fixed $LDFLAGS" 1>&6

echo "${as_me:-configure}:16777: testing ... fixed $LDFLAGS ..." 1>&5

		test -n "$verbose" && echo "	... extra $EXTRA_CFLAGS" 1>&6

echo "${as_me:-configure}:16781: testing ... extra $EXTRA_CFLAGS ..." 1>&5

		;;
	esac
fi

echo "$as_me:16787: checking if you want to turn on gcc warnings" >&5
echo $ECHO_N "checking if you want to turn on gcc warnings... $ECHO_C" >&6

# Check whether --enable-warnings or --disable-warnings was given.
if test "${enable_warnings+set}" = set; then
  enableval="$enable_warnings"
  test "$enableval" != yes && enableval=no
	if test "$enableval" != "no" ; then
    enable_warnings=yes
	else
		enable_warnings=no
	fi
else
  enableval=no
	enable_warnings=no

fi;
echo "$as_me:16804: result: $enable_warnings" >&5
echo "${ECHO_T}$enable_warnings" >&6
if test "$enable_warnings" = "yes"
then

if test "x$have_x" = xyes; then

cf_save_LIBS_CF_CONST_X_STRING="$LIBS"
cf_save_CFLAGS_CF_CONST_X_STRING="$CFLAGS"
cf_save_CPPFLAGS_CF_CONST_X_STRING="$CPPFLAGS"
LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}"
for cf_X_CFLAGS in $X_CFLAGS
do
	case "x$cf_X_CFLAGS" in
	x-[IUD]*)
		CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS"
		;;
	*)
		CFLAGS="$CFLAGS $cf_X_CFLAGS"
		;;
	esac
done

cat >"conftest.$ac_ext" <<_ACEOF
#line 16828 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <X11/Intrinsic.h>

int
main (void)
{
String foo = malloc(1); free((void*)foo)
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:16843: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:16846: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:16849: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:16852: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

echo "$as_me:16855: checking for X11/Xt const-feature" >&5
echo $ECHO_N "checking for X11/Xt const-feature... $ECHO_C" >&6
if test "${cf_cv_const_x_string+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cat >"conftest.$ac_ext" <<_ACEOF
#line 16862 "configure"
#include "confdefs.h"

#define _CONST_X_STRING	/* X11R7.8 (perhaps) */
#undef  XTSTRINGDEFINES	/* X11R5 and later */
#include <stdlib.h>
#include <X11/Intrinsic.h>

int
main (void)
{
String foo = malloc(1); *foo = 0
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:16879: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:16882: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:16885: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:16888: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

			cf_cv_const_x_string=no

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

			cf_cv_const_x_string=yes

fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:16903: result: $cf_cv_const_x_string" >&5
echo "${ECHO_T}$cf_cv_const_x_string" >&6

LIBS="$cf_save_LIBS_CF_CONST_X_STRING"
CFLAGS="$cf_save_CFLAGS_CF_CONST_X_STRING"
CPPFLAGS="$cf_save_CPPFLAGS_CF_CONST_X_STRING"

case "$cf_cv_const_x_string" in
(no)

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}-DXTSTRINGDEFINES"

	;;
(*)

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}-D_CONST_X_STRING"

	;;
esac

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
 fi
cat > "conftest.$ac_ext" <<EOF
#line 16932 "${as_me:-configure}"
int main(int argc, char *argv[]) { return (argv[argc-1] == 0) ; }
EOF
if test "$INTEL_COMPILER" = yes
then
# The "-wdXXX" options suppress warnings:
# remark #1419: external declaration in primary source file
# remark #1683: explicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
# remark #1684: conversion from pointer to same-sized integral type (potential portability problem)
# remark #193: zero used for undefined preprocessing identifier
# remark #593: variable "curs_sb_left_arrow" was set but never used
# remark #810: conversion from "int" to "Dimension={unsigned short}" may lose significant bits
# remark #869: parameter "tw" was never referenced
# remark #981: operands are evaluated in unspecified order
# warning #279: controlling expression is constant

	{ echo "$as_me:16948: checking for $CC warning options..." >&5
echo "$as_me: checking for $CC warning options..." >&6;}
	cf_save_CFLAGS="$CFLAGS"
	EXTRA_CFLAGS="$EXTRA_CFLAGS -Wall"
	for cf_opt in \
		wd1419 \
		wd1683 \
		wd1684 \
		wd193 \
		wd593 \
		wd279 \
		wd810 \
		wd869 \
		wd981
	do
		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
		if { (eval echo "$as_me:16964: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:16967: \$? = $ac_status" >&5
  (exit "$ac_status"); }; then
			test -n "$verbose" && echo "$as_me:16969: result: ... -$cf_opt" >&5
echo "${ECHO_T}... -$cf_opt" >&6
			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
		fi
	done
	CFLAGS="$cf_save_CFLAGS"
elif test "$GCC" = yes && test "$GCC_VERSION" != "unknown"
then
	{ echo "$as_me:16977: checking for $CC warning options..." >&5
echo "$as_me: checking for $CC warning options..." >&6;}
	cf_save_CFLAGS="$CFLAGS"
	cf_warn_CONST=""
	test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings"
	cf_gcc_warnings="Wignored-qualifiers Wlogical-op Wvarargs"
	test "x$CLANG_COMPILER" = xyes && cf_gcc_warnings=
	for cf_opt in W Wall \
		Wbad-function-cast \
		Wcast-align \
		Wcast-qual \
		Wdeclaration-after-statement \
		Wextra \
		Winline \
		Wmissing-declarations \
		Wmissing-prototypes \
		Wnested-externs \
		Wpointer-arith \
		Wshadow \
		Wstrict-prototypes \
		Wundef Wno-inline $cf_gcc_warnings $cf_warn_CONST Wno-unknown-pragmas Wswitch-enum
	do
		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
		if { (eval echo "$as_me:17000: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:17003: \$? = $ac_status" >&5
  (exit "$ac_status"); }; then
			test -n "$verbose" && echo "$as_me:17005: result: ... -$cf_opt" >&5
echo "${ECHO_T}... -$cf_opt" >&6
			case "$cf_opt" in
			(Winline)
				case "$GCC_VERSION" in
				([34].*)
					test -n "$verbose" && echo "	feature is broken in gcc $GCC_VERSION" 1>&6

echo "${as_me:-configure}:17013: testing feature is broken in gcc $GCC_VERSION ..." 1>&5

					continue;;
				esac
				;;
			(Wpointer-arith)
				case "$GCC_VERSION" in
				([12].*)
					test -n "$verbose" && echo "	feature is broken in gcc $GCC_VERSION" 1>&6

echo "${as_me:-configure}:17023: testing feature is broken in gcc $GCC_VERSION ..." 1>&5

					continue;;
				esac
				;;
			esac
			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
		fi
	done
	CFLAGS="$cf_save_CFLAGS"
fi
rm -rf ./conftest*

fi

if test "$GCC" = yes || test "$GXX" = yes
then
cat > conftest.i <<EOF
#ifndef GCC_PRINTF
#define GCC_PRINTF 0
#endif
#ifndef GCC_SCANF
#define GCC_SCANF 0
#endif
#ifndef GCC_NORETURN
#define GCC_NORETURN /* nothing */
#endif
#ifndef GCC_UNUSED
#define GCC_UNUSED /* nothing */
#endif
EOF
if test "$GCC" = yes
then
	{ echo "$as_me:17056: checking for $CC __attribute__ directives..." >&5
echo "$as_me: checking for $CC __attribute__ directives..." >&6;}
cat > "conftest.$ac_ext" <<EOF
#line 17059 "${as_me:-configure}"
#include "confdefs.h"
#include "conftest.h"
#include "conftest.i"
#if	GCC_PRINTF
#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
#else
#define GCC_PRINTFLIKE(fmt,var) /*nothing*/
#endif
#if	GCC_SCANF
#define GCC_SCANFLIKE(fmt,var)  __attribute__((format(scanf,fmt,var)))
#else
#define GCC_SCANFLIKE(fmt,var)  /*nothing*/
#endif
extern void wow(char *,...) GCC_SCANFLIKE(1,2);
extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2);
extern GCC_NORETURN void foo(void);
int main(int argc GCC_UNUSED, char *argv[] GCC_UNUSED) { (void)argc; (void)argv; return 0; }
EOF
	cf_printf_attribute=no
	cf_scanf_attribute=no
	for cf_attribute in scanf printf unused noreturn
	do

cf_ATTRIBUTE=`echo "$cf_attribute" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`

		cf_directive="__attribute__(($cf_attribute))"
		echo "checking for $CC $cf_directive" 1>&5

		case "$cf_attribute" in
		(printf)
			cf_printf_attribute=yes
			cat >conftest.h <<EOF
#define GCC_$cf_ATTRIBUTE 1
EOF
			;;
		(scanf)
			cf_scanf_attribute=yes
			cat >conftest.h <<EOF
#define GCC_$cf_ATTRIBUTE 1
EOF
			;;
		(*)
			cat >conftest.h <<EOF
#define GCC_$cf_ATTRIBUTE $cf_directive
EOF
			;;
		esac

		if { (eval echo "$as_me:17108: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:17111: \$? = $ac_status" >&5
  (exit "$ac_status"); }; then
			test -n "$verbose" && echo "$as_me:17113: result: ... $cf_attribute" >&5
echo "${ECHO_T}... $cf_attribute" >&6
			cat conftest.h >>confdefs.h
			case "$cf_attribute" in
			(noreturn)

cat >>confdefs.h <<EOF
#define GCC_NORETURN $cf_directive
EOF

				;;
			(printf)
				cf_value='/* nothing */'
				if test "$cf_printf_attribute" != no ; then
					cf_value='__attribute__((format(printf,fmt,var)))'

cat >>confdefs.h <<\EOF
#define GCC_PRINTF 1
EOF

				fi

cat >>confdefs.h <<EOF
#define GCC_PRINTFLIKE(fmt,var) $cf_value
EOF

				;;
			(scanf)
				cf_value='/* nothing */'
				if test "$cf_scanf_attribute" != no ; then
					cf_value='__attribute__((format(scanf,fmt,var)))'

cat >>confdefs.h <<\EOF
#define GCC_SCANF 1
EOF

				fi

cat >>confdefs.h <<EOF
#define GCC_SCANFLIKE(fmt,var) $cf_value
EOF

				;;
			(unused)

cat >>confdefs.h <<EOF
#define GCC_UNUSED $cf_directive
EOF

				;;
			esac
		fi
	done
else
	${FGREP-fgrep} define conftest.i >>confdefs.h
fi
rm -rf ./conftest*
fi

fi

if test "x$enable_warnings" = "xyes"; then

 	ADAFLAGS="$ADAFLAGS -gnatg"

	if test "x$cf_with_cxx" = xyes ; then

INTEL_CPLUSPLUS=no

if test "$GCC" = yes ; then
	case "$host_os" in
	(linux*|gnu*)
		echo "$as_me:17185: checking if this is really Intel C++ compiler" >&5
echo $ECHO_N "checking if this is really Intel C++ compiler... $ECHO_C" >&6
		cf_save_CFLAGS="$CXXFLAGS"
		CXXFLAGS="$CXXFLAGS -no-gcc"
		cat >"conftest.$ac_ext" <<_ACEOF
#line 17190 "configure"
#include "confdefs.h"

int
main (void)
{

#ifdef __INTEL_COMPILER
#else
make an error
#endif

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:17207: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:17210: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:17213: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:17216: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  INTEL_CPLUSPLUS=yes
cf_save_CFLAGS="$cf_save_CFLAGS -we147"

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
		CXXFLAGS="$cf_save_CFLAGS"
		echo "$as_me:17227: result: $INTEL_CPLUSPLUS" >&5
echo "${ECHO_T}$INTEL_CPLUSPLUS" >&6
		;;
	esac
fi

CLANG_CPLUSPLUS=no

if test "$GCC" = yes ; then
	echo "$as_me:17236: checking if this is really Clang C++ compiler" >&5
echo $ECHO_N "checking if this is really Clang C++ compiler... $ECHO_C" >&6
	cf_save_CFLAGS="$CXXFLAGS"
	cat >"conftest.$ac_ext" <<_ACEOF
#line 17240 "configure"
#include "confdefs.h"

int
main (void)
{

#ifdef __clang__
#else
make an error
#endif

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:17257: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:17260: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:17263: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:17266: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  CLANG_CPLUSPLUS=yes

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
	CXXFLAGS="$cf_save_CFLAGS"
	echo "$as_me:17276: result: $CLANG_CPLUSPLUS" >&5
echo "${ECHO_T}$CLANG_CPLUSPLUS" >&6
fi

CLANG_VERSION=none

if test "x$CLANG_CPLUSPLUS" = "xyes" ; then
	case "$CC" in
	(c[1-9][0-9]|*/c[1-9][0-9])
		{ echo "$as_me:17285: WARNING: replacing broken compiler alias $CC" >&5
echo "$as_me: WARNING: replacing broken compiler alias $CC" >&2;}
		CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`"
		CC=clang
		;;
	esac

	echo "$as_me:17292: checking version of $CC" >&5
echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
	CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
	test -z "$CLANG_VERSION" && CLANG_VERSION=unknown
	echo "$as_me:17296: result: $CLANG_VERSION" >&5
echo "${ECHO_T}$CLANG_VERSION" >&6

	for cf_clang_opt in \
		-Qunused-arguments \
		-Wno-error=implicit-function-declaration
	do
		echo "$as_me:17303: checking if option $cf_clang_opt works" >&5
echo $ECHO_N "checking if option $cf_clang_opt works... $ECHO_C" >&6
		cf_save_CFLAGS="$CFLAGS"
		CFLAGS="$CFLAGS $cf_clang_opt"
		cat >"conftest.$ac_ext" <<_ACEOF
#line 17308 "configure"
#include "confdefs.h"

			#include <stdio.h>
int
main (void)
{

			printf("hello!\\n");
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:17322: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:17325: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:17328: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:17331: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

			cf_clang_optok=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

			cf_clang_optok=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
		echo "$as_me:17342: result: $cf_clang_optok" >&5
echo "${ECHO_T}$cf_clang_optok" >&6
		CFLAGS="$cf_save_CFLAGS"
		if test "$cf_clang_optok" = yes; then
			test -n "$verbose" && echo "	adding option $cf_clang_opt" 1>&6

echo "${as_me:-configure}:17348: testing adding option $cf_clang_opt ..." 1>&5

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_clang_opt"

		fi
	done
fi

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

cat > conftest.$ac_ext <<EOF
#line 17365 "configure"
int main(int argc, char *argv[]) { return (argv[argc-1] == 0) ; }
EOF

if test "$INTEL_CPLUSPLUS" = yes
then
# The "-wdXXX" options suppress warnings:
# remark #1419: external declaration in primary source file
# remark #1682: implicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
# remark #1683: explicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
# remark #1684: conversion from pointer to same-sized integral type (potential portability problem)
# remark #193: zero used for undefined preprocessing identifier
# remark #593: variable "curs_sb_left_arrow" was set but never used
# remark #810: conversion from "int" to "Dimension={unsigned short}" may lose significant bits
# remark #869: parameter "tw" was never referenced
# remark #981: operands are evaluated in unspecified order
# warning #269: invalid format string conversion

	{ echo "$as_me:17383: checking for $CC warning options..." >&5
echo "$as_me: checking for $CC warning options..." >&6;}
	cf_save_CXXFLAGS="$CXXFLAGS"
	EXTRA_CXXFLAGS="-Wall"
	for cf_opt in \
		wd1419 \
		wd1682 \
		wd1683 \
		wd1684 \
		wd193 \
		wd279 \
		wd593 \
		wd810 \
		wd869 \
		wd981
	do
		CXXFLAGS="$cf_save_CXXFLAGS $EXTRA_CXXFLAGS -$cf_opt"
		if { (eval echo "$as_me:17400: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:17403: \$? = $ac_status" >&5
  (exit "$ac_status"); }; then
			test -n "$verbose" && echo "$as_me:17405: result: ... -$cf_opt" >&5
echo "${ECHO_T}... -$cf_opt" >&6
			EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS -$cf_opt"
		fi
	done
	CXXFLAGS="$cf_save_CXXFLAGS"

elif test "$GXX" = yes
then
	{ echo "$as_me:17414: checking for $CXX warning options..." >&5
echo "$as_me: checking for $CXX warning options..." >&6;}
	cf_save_CXXFLAGS="$CXXFLAGS"
	EXTRA_CXXFLAGS="-W -Wall"
	cf_gxx_extra_warnings=""
	test "$with_ext_const" = yes && cf_gxx_extra_warnings="Wwrite-strings"
	case "$GXX_VERSION" in
	([1-2].*)
		;;
	(*)
		cf_gxx_extra_warnings="$cf_gxx_extra_warnings Weffc++"
		;;
	esac
	for cf_opt in \
		Wabi \
		fabi-version=0 \
		Wextra \
		Wignored-qualifiers \
		Wlogical-op \
		Woverloaded-virtual \
		Wsign-promo \
		Wsynth \
		Wold-style-cast \
		Wcast-align \
		Wcast-qual \
		Wpointer-arith \
		Wshadow \
		Wundef $cf_gxx_extra_warnings Wno-unused
	do
		CXXFLAGS="$cf_save_CXXFLAGS $EXTRA_CXXFLAGS -Werror -$cf_opt"
		if { (eval echo "$as_me:17444: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:17447: \$? = $ac_status" >&5
  (exit "$ac_status"); }; then
			test -n "$verbose" && echo "$as_me:17449: result: ... -$cf_opt" >&5
echo "${ECHO_T}... -$cf_opt" >&6
			EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS -$cf_opt"
		else
			test -n "$verbose" && echo "$as_me:17453: result: ... no -$cf_opt" >&5
echo "${ECHO_T}... no -$cf_opt" >&6
		fi
	done
	CXXFLAGS="$cf_save_CXXFLAGS"
fi

rm -rf ./conftest*
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_main_return="return"

	fi
fi

echo "$as_me:17471: checking if you want to work around bogus compiler/loader warnings" >&5
echo $ECHO_N "checking if you want to work around bogus compiler/loader warnings... $ECHO_C" >&6

# Check whether --enable-string-hacks or --disable-string-hacks was given.
if test "${enable_string_hacks+set}" = set; then
  enableval="$enable_string_hacks"
  enable_string_hacks=$enableval
else
  enable_string_hacks=no
fi;
echo "$as_me:17481: result: $enable_string_hacks" >&5
echo "${ECHO_T}$enable_string_hacks" >&6

if test "x$enable_string_hacks" = "xyes"; then

cat >>confdefs.h <<\EOF
#define USE_STRING_HACKS 1
EOF

	{ echo "$as_me:17490: WARNING: enabling string-hacks to work around bogus compiler/loader warnings" >&5
echo "$as_me: WARNING: enabling string-hacks to work around bogus compiler/loader warnings" >&2;}
	echo "$as_me:17492: checking for strlcat" >&5
echo $ECHO_N "checking for strlcat... $ECHO_C" >&6
if test "${ac_cv_func_strlcat+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 17498 "configure"
#include "confdefs.h"
#define strlcat autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef strlcat

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char strlcat (void);

int
main (void)
{

/* The GNU C library defines stubs 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_strlcat) || defined (__stub___strlcat)
#error found stub for strlcat
#endif

	return strlcat ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:17529: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:17532: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:17535: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:17538: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_func_strlcat=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_func_strlcat=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:17548: result: $ac_cv_func_strlcat" >&5
echo "${ECHO_T}$ac_cv_func_strlcat" >&6
if test "$ac_cv_func_strlcat" = yes; then

cat >>confdefs.h <<\EOF
#define HAVE_STRLCAT 1
EOF

else

		echo "$as_me:17558: checking for strlcat in -lbsd" >&5
echo $ECHO_N "checking for strlcat in -lbsd... $ECHO_C" >&6
if test "${ac_cv_lib_bsd_strlcat+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lbsd  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 17566 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char strlcat ();
int
main (void)
{
strlcat ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:17585: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:17588: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:17591: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:17594: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_bsd_strlcat=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_bsd_strlcat=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:17605: result: $ac_cv_lib_bsd_strlcat" >&5
echo "${ECHO_T}$ac_cv_lib_bsd_strlcat" >&6
if test "$ac_cv_lib_bsd_strlcat" = yes; then

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lbsd; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

for ac_header in bsd/string.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
echo "$as_me:17628: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 17634 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:17638: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:17644: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  eval "$as_ac_Header=yes"
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  eval "$as_ac_Header=no"
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:17663: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
EOF

fi
done

cat >>confdefs.h <<\EOF
#define HAVE_STRLCAT 1
EOF

fi

fi

for ac_func in strlcpy snprintf
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
echo "$as_me:17684: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 17690 "configure"
#include "confdefs.h"
#define $ac_func autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef $ac_func

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char $ac_func (void);

int
main (void)
{

/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func)
#error found stub for $ac_func
#endif

	return $ac_func ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:17721: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:17724: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:17727: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:17730: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  eval "$as_ac_var=yes"
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
eval "$as_ac_var=no"
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:17740: result: `eval echo '${'"$as_ac_var"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
EOF

fi
done

fi

###	use option --enable-assertions to turn on generation of assertion code
echo "$as_me:17753: checking if you want to enable runtime assertions" >&5
echo $ECHO_N "checking if you want to enable runtime assertions... $ECHO_C" >&6

# Check whether --enable-assertions or --disable-assertions was given.
if test "${enable_assertions+set}" = set; then
  enableval="$enable_assertions"
  with_assertions=$enableval
else
  with_assertions=no
fi;
echo "$as_me:17763: result: $with_assertions" >&5
echo "${ECHO_T}$with_assertions" >&6
if test -n "$GCC"
then
	if test "$with_assertions" = no
	then
		CPPFLAGS="$CPPFLAGS -DNDEBUG"
	else

 	ADAFLAGS="$ADAFLAGS -gnata"

	fi
fi

###	use option --disable-leaks to suppress "permanent" leaks, for testing

echo "$as_me:17779: checking if you want to use dmalloc for testing" >&5
echo $ECHO_N "checking if you want to use dmalloc for testing... $ECHO_C" >&6

# Check whether --with-dmalloc or --without-dmalloc was given.
if test "${with_dmalloc+set}" = set; then
  withval="$with_dmalloc"
  case "x$withval" in
	(x|xno) ;;
	(*)
		: "${with_cflags:=-g}"
		: "${enable_leaks:=no}"
		with_dmalloc=yes

cat >>confdefs.h <<EOF
#define USE_DMALLOC 1
EOF

		;;
	esac
else
  with_dmalloc=
fi;
echo "$as_me:17801: result: ${with_dmalloc:-no}" >&5
echo "${ECHO_T}${with_dmalloc:-no}" >&6

case ".$with_cflags" in
(.*-g*)
	case .$CFLAGS in
	(.*-g*)
		;;
	(*)

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in -g
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

		;;
	esac
	;;
esac

if test "$with_dmalloc" = yes ; then
	echo "$as_me:17915: checking for dmalloc.h" >&5
echo $ECHO_N "checking for dmalloc.h... $ECHO_C" >&6
if test "${ac_cv_header_dmalloc_h+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 17921 "configure"
#include "confdefs.h"
#include <dmalloc.h>
_ACEOF
if { (eval echo "$as_me:17925: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:17931: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  ac_cv_header_dmalloc_h=yes
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  ac_cv_header_dmalloc_h=no
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:17950: result: $ac_cv_header_dmalloc_h" >&5
echo "${ECHO_T}$ac_cv_header_dmalloc_h" >&6
if test "$ac_cv_header_dmalloc_h" = yes; then

echo "$as_me:17954: checking for dmalloc_debug in -ldmalloc" >&5
echo $ECHO_N "checking for dmalloc_debug in -ldmalloc... $ECHO_C" >&6
if test "${ac_cv_lib_dmalloc_dmalloc_debug+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldmalloc  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 17962 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char dmalloc_debug ();
int
main (void)
{
dmalloc_debug ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:17981: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:17984: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:17987: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:17990: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_dmalloc_dmalloc_debug=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_dmalloc_dmalloc_debug=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:18001: result: $ac_cv_lib_dmalloc_dmalloc_debug" >&5
echo "${ECHO_T}$ac_cv_lib_dmalloc_dmalloc_debug" >&6
if test "$ac_cv_lib_dmalloc_dmalloc_debug" = yes; then
  cat >>confdefs.h <<EOF
#define HAVE_LIBDMALLOC 1
EOF

  LIBS="-ldmalloc $LIBS"

fi

fi

fi

echo "$as_me:18016: checking if you want to use dbmalloc for testing" >&5
echo $ECHO_N "checking if you want to use dbmalloc for testing... $ECHO_C" >&6

# Check whether --with-dbmalloc or --without-dbmalloc was given.
if test "${with_dbmalloc+set}" = set; then
  withval="$with_dbmalloc"
  case "x$withval" in
	(x|xno) ;;
	(*)
		: "${with_cflags:=-g}"
		: "${enable_leaks:=no}"
		with_dbmalloc=yes

cat >>confdefs.h <<EOF
#define USE_DBMALLOC 1
EOF

		;;
	esac
else
  with_dbmalloc=
fi;
echo "$as_me:18038: result: ${with_dbmalloc:-no}" >&5
echo "${ECHO_T}${with_dbmalloc:-no}" >&6

case ".$with_cflags" in
(.*-g*)
	case .$CFLAGS in
	(.*-g*)
		;;
	(*)

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in -g
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

		;;
	esac
	;;
esac

if test "$with_dbmalloc" = yes ; then
	echo "$as_me:18152: checking for dbmalloc.h" >&5
echo $ECHO_N "checking for dbmalloc.h... $ECHO_C" >&6
if test "${ac_cv_header_dbmalloc_h+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 18158 "configure"
#include "confdefs.h"
#include <dbmalloc.h>
_ACEOF
if { (eval echo "$as_me:18162: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:18168: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  ac_cv_header_dbmalloc_h=yes
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  ac_cv_header_dbmalloc_h=no
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:18187: result: $ac_cv_header_dbmalloc_h" >&5
echo "${ECHO_T}$ac_cv_header_dbmalloc_h" >&6
if test "$ac_cv_header_dbmalloc_h" = yes; then

echo "$as_me:18191: checking for debug_malloc in -ldbmalloc" >&5
echo $ECHO_N "checking for debug_malloc in -ldbmalloc... $ECHO_C" >&6
if test "${ac_cv_lib_dbmalloc_debug_malloc+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldbmalloc  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 18199 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char debug_malloc ();
int
main (void)
{
debug_malloc ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:18218: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:18221: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:18224: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:18227: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_dbmalloc_debug_malloc=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_dbmalloc_debug_malloc=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:18238: result: $ac_cv_lib_dbmalloc_debug_malloc" >&5
echo "${ECHO_T}$ac_cv_lib_dbmalloc_debug_malloc" >&6
if test "$ac_cv_lib_dbmalloc_debug_malloc" = yes; then
  cat >>confdefs.h <<EOF
#define HAVE_LIBDBMALLOC 1
EOF

  LIBS="-ldbmalloc $LIBS"

fi

fi

fi

echo "$as_me:18253: checking if you want to use valgrind for testing" >&5
echo $ECHO_N "checking if you want to use valgrind for testing... $ECHO_C" >&6

# Check whether --with-valgrind or --without-valgrind was given.
if test "${with_valgrind+set}" = set; then
  withval="$with_valgrind"
  case "x$withval" in
	(x|xno) ;;
	(*)
		: "${with_cflags:=-g}"
		: "${enable_leaks:=no}"
		with_valgrind=yes

cat >>confdefs.h <<EOF
#define USE_VALGRIND 1
EOF

		;;
	esac
else
  with_valgrind=
fi;
echo "$as_me:18275: result: ${with_valgrind:-no}" >&5
echo "${ECHO_T}${with_valgrind:-no}" >&6

case ".$with_cflags" in
(.*-g*)
	case .$CFLAGS in
	(.*-g*)
		;;
	(*)

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in -g
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

		;;
	esac
	;;
esac

echo "$as_me:18388: checking if you want to perform memory-leak testing" >&5
echo $ECHO_N "checking if you want to perform memory-leak testing... $ECHO_C" >&6

# Check whether --enable-leaks or --disable-leaks was given.
if test "${enable_leaks+set}" = set; then
  enableval="$enable_leaks"
  enable_leaks=$enableval
else
  enable_leaks=yes
fi;
if test "x$enable_leaks" = xno; then with_no_leaks=yes; else with_no_leaks=no; fi
echo "$as_me:18399: result: $with_no_leaks" >&5
echo "${ECHO_T}$with_no_leaks" >&6

if test "$enable_leaks" = no ; then

cat >>confdefs.h <<\EOF
#define NO_LEAKS 1
EOF

cat >>confdefs.h <<\EOF
#define YY_NO_LEAKS 1
EOF

fi

cat >>confdefs.h <<\EOF
#define HAVE_NC_ALLOC_H 1
EOF

###	use option --enable-expanded to generate certain macros as functions

# Check whether --enable-expanded or --disable-expanded was given.
if test "${enable_expanded+set}" = set; then
  enableval="$enable_expanded"
  test "x$enableval" = xyes &&
cat >>confdefs.h <<\EOF
#define NCURSES_EXPANDED 1
EOF

fi;

###	use option --disable-macros to suppress macros in favor of functions

# Check whether --enable-macros or --disable-macros was given.
if test "${enable_macros+set}" = set; then
  enableval="$enable_macros"
  test "$enableval" = no &&
cat >>confdefs.h <<\EOF
#define NCURSES_NOMACROS 1
EOF

fi;

# Normally we only add trace() to the debug-library.  Allow this to be
# extended to all models of the ncurses library:
cf_all_traces=no
case "$CFLAGS $CPPFLAGS" in
(*-DTRACE*)
	cf_all_traces=yes
	;;
esac

echo "$as_me:18451: checking whether to add trace feature to all models" >&5
echo $ECHO_N "checking whether to add trace feature to all models... $ECHO_C" >&6

# Check whether --with-trace or --without-trace was given.
if test "${with_trace+set}" = set; then
  withval="$with_trace"
  cf_with_trace=$withval
else
  cf_with_trace=$cf_all_traces
fi;
echo "$as_me:18461: result: $cf_with_trace" >&5
echo "${ECHO_T}$cf_with_trace" >&6

if test "x$cf_with_trace" = xyes ; then
	LIB_TRACING=all
	ADA_TRACE=TRUE

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in -DTRACE
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

cat >>confdefs.h <<\EOF
#define HAVE__TRACEF 1
EOF

else
	LIB_TRACING=DEBUG
	ADA_TRACE=FALSE
fi

echo "$as_me:18575: checking if we want to use GNAT projects" >&5
echo $ECHO_N "checking if we want to use GNAT projects... $ECHO_C" >&6

# Check whether --enable-gnat-projects or --disable-gnat-projects was given.
if test "${enable_gnat_projects+set}" = set; then
  enableval="$enable_gnat_projects"
  test "$enableval" != no && enableval=yes
	if test "$enableval" != "yes" ; then
    enable_gnat_projects=no
	else
		enable_gnat_projects=yes
	fi
else
  enableval=yes
	enable_gnat_projects=yes

fi;
echo "$as_me:18592: result: $enable_gnat_projects" >&5
echo "${ECHO_T}$enable_gnat_projects" >&6

###	Checks for libraries.
case "$cf_cv_system_name" in
(*mingw32*|*mingw64*)
	if test "x$with_exp_win32" = xyes ; then
	CPPFLAGS="$CPPFLAGS -DWINVER=0x0600 -DWIN32_LEAN_AND_MEAN"
	else
	CPPFLAGS="$CPPFLAGS -DWINVER=0x0501 -DWIN32_LEAN_AND_MEAN"
	fi
	# Note: WINVER may be a problem with Windows 10
	;;
(*)
echo "$as_me:18606: checking for gettimeofday" >&5
echo $ECHO_N "checking for gettimeofday... $ECHO_C" >&6
if test "${ac_cv_func_gettimeofday+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 18612 "configure"
#include "confdefs.h"
#define gettimeofday autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef gettimeofday

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char gettimeofday (void);

int
main (void)
{

/* The GNU C library defines stubs 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_gettimeofday) || defined (__stub___gettimeofday)
#error found stub for gettimeofday
#endif

	return gettimeofday ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:18643: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:18646: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:18649: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:18652: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_func_gettimeofday=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_func_gettimeofday=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:18662: result: $ac_cv_func_gettimeofday" >&5
echo "${ECHO_T}$ac_cv_func_gettimeofday" >&6
if test "$ac_cv_func_gettimeofday" = yes; then

cat >>confdefs.h <<\EOF
#define HAVE_GETTIMEOFDAY 1
EOF

else

echo "$as_me:18672: checking for gettimeofday in -lbsd" >&5
echo $ECHO_N "checking for gettimeofday in -lbsd... $ECHO_C" >&6
if test "${ac_cv_lib_bsd_gettimeofday+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lbsd  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 18680 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char gettimeofday ();
int
main (void)
{
gettimeofday ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:18699: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:18702: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:18705: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:18708: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_bsd_gettimeofday=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_bsd_gettimeofday=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:18719: result: $ac_cv_lib_bsd_gettimeofday" >&5
echo "${ECHO_T}$ac_cv_lib_bsd_gettimeofday" >&6
if test "$ac_cv_lib_bsd_gettimeofday" = yes; then

cat >>confdefs.h <<\EOF
#define HAVE_GETTIMEOFDAY 1
EOF

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lbsd; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

fi

fi
	;;
esac

echo "$as_me:18749: checking if -lm needed for math functions" >&5
echo $ECHO_N "checking if -lm needed for math functions... $ECHO_C" >&6
if test "${cf_cv_need_libm+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cat >"conftest.$ac_ext" <<_ACEOF
#line 18756 "configure"
#include "confdefs.h"

	#include <stdio.h>
	#include <stdlib.h>
	#include <math.h>

int
main (void)
{
double x = rand(); printf("result = %g\\n", pow(sin(x),x))
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:18772: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:18775: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:18778: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:18781: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_need_libm=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_need_libm=yes
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:18791: result: $cf_cv_need_libm" >&5
echo "${ECHO_T}$cf_cv_need_libm" >&6
if test "$cf_cv_need_libm" = yes
then
MATH_LIB=-lm
fi

###	Checks for header files.
echo "$as_me:18799: checking for ANSI C header files" >&5
echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
if test "${ac_cv_header_stdc+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 18805 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <float.h>

_ACEOF
if { (eval echo "$as_me:18813: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:18819: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  ac_cv_header_stdc=yes
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  ac_cv_header_stdc=no
fi
rm -f conftest.err "conftest.$ac_ext"

if test $ac_cv_header_stdc = yes; then
  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
  cat >"conftest.$ac_ext" <<_ACEOF
#line 18841 "configure"
#include "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 -rf conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
  cat >"conftest.$ac_ext" <<_ACEOF
#line 18859 "configure"
#include "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 -rf 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 >"conftest.$ac_ext" <<_ACEOF
#line 18880 "configure"
#include "confdefs.h"
#include <ctype.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 (void)
{
  int i;
  for (i = 0; i < 256; i++)
    if (XOR (islower (i), ISLOWER (i))
        || toupper (i) != TOUPPER (i))
      $ac_main_return(2);
  $ac_main_return (0);
}
_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:18906: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:18909: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:18911: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:18914: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  :
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_header_stdc=no
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
fi
fi
echo "$as_me:18927: result: $ac_cv_header_stdc" >&5
echo "${ECHO_T}$ac_cv_header_stdc" >&6
if test $ac_cv_header_stdc = yes; then

cat >>confdefs.h <<\EOF
#define STDC_HEADERS 1
EOF

fi

ac_header_dirent=no
for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
  as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
echo "$as_me:18940: checking for $ac_hdr that defines DIR" >&5
echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 18946 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <$ac_hdr>

int
main (void)
{
if ((DIR *) 0)
return 0;
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:18961: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:18964: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:18967: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:18970: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  eval "$as_ac_Header=yes"
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
eval "$as_ac_Header=no"
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:18980: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
EOF

ac_header_dirent=$ac_hdr; break
fi

done
# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
if test $ac_header_dirent = dirent.h; then
  echo "$as_me:18993: checking for opendir in -ldir" >&5
echo $ECHO_N "checking for opendir in -ldir... $ECHO_C" >&6
if test "${ac_cv_lib_dir_opendir+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldir  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 19001 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char opendir ();
int
main (void)
{
opendir ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:19020: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:19023: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:19026: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:19029: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_dir_opendir=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_dir_opendir=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:19040: result: $ac_cv_lib_dir_opendir" >&5
echo "${ECHO_T}$ac_cv_lib_dir_opendir" >&6
if test "$ac_cv_lib_dir_opendir" = yes; then
  LIBS="$LIBS -ldir"
fi

else
  echo "$as_me:19047: checking for opendir in -lx" >&5
echo $ECHO_N "checking for opendir in -lx... $ECHO_C" >&6
if test "${ac_cv_lib_x_opendir+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lx  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 19055 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char opendir ();
int
main (void)
{
opendir ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:19074: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:19077: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:19080: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:19083: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_x_opendir=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_x_opendir=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:19094: result: $ac_cv_lib_x_opendir" >&5
echo "${ECHO_T}$ac_cv_lib_x_opendir" >&6
if test "$ac_cv_lib_x_opendir" = yes; then
  LIBS="$LIBS -lx"
fi

fi

echo "$as_me:19102: checking whether time.h and sys/time.h may both be included" >&5
echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6
if test "${ac_cv_header_time+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 19108 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/time.h>
#include <time.h>

int
main (void)
{
if ((struct tm *) 0)
return 0;
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:19124: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:19127: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:19130: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:19133: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_header_time=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_header_time=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:19143: result: $ac_cv_header_time" >&5
echo "${ECHO_T}$ac_cv_header_time" >&6
if test $ac_cv_header_time = yes; then

cat >>confdefs.h <<\EOF
#define TIME_WITH_SYS_TIME 1
EOF

fi

cf_regex_func=no
cf_regex_libs=
case "$host_os" in
(mingw*)
	# -lsystre -ltre -lintl -liconv
	echo "$as_me:19158: checking for regcomp in -lsystre" >&5
echo $ECHO_N "checking for regcomp in -lsystre... $ECHO_C" >&6
if test "${ac_cv_lib_systre_regcomp+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lsystre  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 19166 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char regcomp ();
int
main (void)
{
regcomp ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:19185: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:19188: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:19191: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:19194: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_systre_regcomp=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_systre_regcomp=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:19205: result: $ac_cv_lib_systre_regcomp" >&5
echo "${ECHO_T}$ac_cv_lib_systre_regcomp" >&6
if test "$ac_cv_lib_systre_regcomp" = yes; then

		echo "$as_me:19209: checking for libiconv_open in -liconv" >&5
echo $ECHO_N "checking for libiconv_open in -liconv... $ECHO_C" >&6
if test "${ac_cv_lib_iconv_libiconv_open+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-liconv  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 19217 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char libiconv_open ();
int
main (void)
{
libiconv_open ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:19236: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:19239: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:19242: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:19245: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_iconv_libiconv_open=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_iconv_libiconv_open=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:19256: result: $ac_cv_lib_iconv_libiconv_open" >&5
echo "${ECHO_T}$ac_cv_lib_iconv_libiconv_open" >&6
if test "$ac_cv_lib_iconv_libiconv_open" = yes; then

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -liconv; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

fi

		echo "$as_me:19278: checking for libintl_gettext in -lintl" >&5
echo $ECHO_N "checking for libintl_gettext in -lintl... $ECHO_C" >&6
if test "${ac_cv_lib_intl_libintl_gettext+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lintl  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 19286 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char libintl_gettext ();
int
main (void)
{
libintl_gettext ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:19305: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:19308: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:19311: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:19314: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_intl_libintl_gettext=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_intl_libintl_gettext=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:19325: result: $ac_cv_lib_intl_libintl_gettext" >&5
echo "${ECHO_T}$ac_cv_lib_intl_libintl_gettext" >&6
if test "$ac_cv_lib_intl_libintl_gettext" = yes; then

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lintl; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

fi

		echo "$as_me:19347: checking for tre_regcomp in -ltre" >&5
echo $ECHO_N "checking for tre_regcomp in -ltre... $ECHO_C" >&6
if test "${ac_cv_lib_tre_tre_regcomp+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ltre  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 19355 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char tre_regcomp ();
int
main (void)
{
tre_regcomp ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:19374: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:19377: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:19380: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:19383: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_tre_tre_regcomp=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_tre_tre_regcomp=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:19394: result: $ac_cv_lib_tre_tre_regcomp" >&5
echo "${ECHO_T}$ac_cv_lib_tre_tre_regcomp" >&6
if test "$ac_cv_lib_tre_tre_regcomp" = yes; then

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -ltre; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

fi

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lsystre; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

		cf_regex_func=regcomp

else

		echo "$as_me:19436: checking for regcomp in -lgnurx" >&5
echo $ECHO_N "checking for regcomp in -lgnurx... $ECHO_C" >&6
if test "${ac_cv_lib_gnurx_regcomp+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lgnurx  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 19444 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char regcomp ();
int
main (void)
{
regcomp ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:19463: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:19466: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:19469: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:19472: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_gnurx_regcomp=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_gnurx_regcomp=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:19483: result: $ac_cv_lib_gnurx_regcomp" >&5
echo "${ECHO_T}$ac_cv_lib_gnurx_regcomp" >&6
if test "$ac_cv_lib_gnurx_regcomp" = yes; then

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lgnurx; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

			cf_regex_func=regcomp
fi

fi

	;;
(*)
	cf_regex_libs="regex re"
	echo "$as_me:19511: checking for regcomp" >&5
echo $ECHO_N "checking for regcomp... $ECHO_C" >&6
if test "${ac_cv_func_regcomp+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 19517 "configure"
#include "confdefs.h"
#define regcomp autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef regcomp

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char regcomp (void);

int
main (void)
{

/* The GNU C library defines stubs 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_regcomp) || defined (__stub___regcomp)
#error found stub for regcomp
#endif

	return regcomp ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:19548: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:19551: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:19554: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:19557: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_func_regcomp=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_func_regcomp=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:19567: result: $ac_cv_func_regcomp" >&5
echo "${ECHO_T}$ac_cv_func_regcomp" >&6
if test "$ac_cv_func_regcomp" = yes; then
  cf_regex_func=regcomp
else

		for cf_regex_lib in $cf_regex_libs
		do
			as_ac_Lib=`echo "ac_cv_lib_$cf_regex_lib''_regcomp" | $as_tr_sh`
echo "$as_me:19576: checking for regcomp in -l$cf_regex_lib" >&5
echo $ECHO_N "checking for regcomp in -l$cf_regex_lib... $ECHO_C" >&6
if eval "test \"\${$as_ac_Lib+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-l$cf_regex_lib  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 19584 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char regcomp ();
int
main (void)
{
regcomp ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:19603: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:19606: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:19609: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:19612: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  eval "$as_ac_Lib=yes"
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
eval "$as_ac_Lib=no"
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:19623: result: `eval echo '${'"$as_ac_Lib"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_Lib"'}'`" >&6
if test "`eval echo '${'"$as_ac_Lib"'}'`" = yes; then

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -l$cf_regex_lib; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

					cf_regex_func=regcomp
					break
fi

		done

fi

	;;
esac

if test "$cf_regex_func" = no ; then
	echo "$as_me:19655: checking for compile" >&5
echo $ECHO_N "checking for compile... $ECHO_C" >&6
if test "${ac_cv_func_compile+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 19661 "configure"
#include "confdefs.h"
#define compile autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef compile

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char compile (void);

int
main (void)
{

/* The GNU C library defines stubs 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_compile) || defined (__stub___compile)
#error found stub for compile
#endif

	return compile ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:19692: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:19695: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:19698: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:19701: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_func_compile=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_func_compile=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:19711: result: $ac_cv_func_compile" >&5
echo "${ECHO_T}$ac_cv_func_compile" >&6
if test "$ac_cv_func_compile" = yes; then
  cf_regex_func=compile
else

		echo "$as_me:19717: checking for compile in -lgen" >&5
echo $ECHO_N "checking for compile in -lgen... $ECHO_C" >&6
if test "${ac_cv_lib_gen_compile+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lgen  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 19725 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char compile ();
int
main (void)
{
compile ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:19744: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:19747: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:19750: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:19753: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_gen_compile=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_gen_compile=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:19764: result: $ac_cv_lib_gen_compile" >&5
echo "${ECHO_T}$ac_cv_lib_gen_compile" >&6
if test "$ac_cv_lib_gen_compile" = yes; then

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lgen; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

				cf_regex_func=compile
fi

fi

fi

if test "$cf_regex_func" = no ; then
	{ echo "$as_me:19792: WARNING: cannot find regular expression library" >&5
echo "$as_me: WARNING: cannot find regular expression library" >&2;}
fi

echo "$as_me:19796: checking for regular-expression headers" >&5
echo $ECHO_N "checking for regular-expression headers... $ECHO_C" >&6
if test "${cf_cv_regex_hdrs+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cf_cv_regex_hdrs=no
case "$cf_regex_func" in
(compile)
	for cf_regex_hdr in regexp.h regexpr.h
	do
		cat >"conftest.$ac_ext" <<_ACEOF
#line 19808 "configure"
#include "confdefs.h"
#include <$cf_regex_hdr>
int
main (void)
{

			char *p = compile("", "", "", 0);
			int x = step("", "");
			(void)p;
			(void)x;

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:19825: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:19828: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:19831: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:19834: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

			cf_cv_regex_hdrs=$cf_regex_hdr
			break

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
	done
	;;
(*)
	for cf_regex_hdr in regex.h
	do
		cat >"conftest.$ac_ext" <<_ACEOF
#line 19851 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <$cf_regex_hdr>
int
main (void)
{

			regex_t *p = 0;
			int x = regcomp(p, "", 0);
			int y = regexec(p, "", 0, 0, 0);
			(void)x;
			(void)y;
			regfree(p);

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:19871: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:19874: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:19877: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:19880: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

			cf_cv_regex_hdrs=$cf_regex_hdr
			break

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
	done
	;;
esac

fi
echo "$as_me:19896: result: $cf_cv_regex_hdrs" >&5
echo "${ECHO_T}$cf_cv_regex_hdrs" >&6

case "$cf_cv_regex_hdrs" in
	(no)		{ echo "$as_me:19900: WARNING: no regular expression header found" >&5
echo "$as_me: WARNING: no regular expression header found" >&2;} ;;
	(regex.h)
cat >>confdefs.h <<\EOF
#define HAVE_REGEX_H_FUNCS 1
EOF
 ;;
	(regexp.h)
cat >>confdefs.h <<\EOF
#define HAVE_REGEXP_H_FUNCS 1
EOF
 ;;
	(regexpr.h)
cat >>confdefs.h <<\EOF
#define HAVE_REGEXPR_H_FUNCS 1
EOF
 ;;
esac

for ac_header in \
fcntl.h \
getopt.h \
limits.h \
locale.h \
math.h \
poll.h \
sys/ioctl.h \
sys/param.h \
sys/poll.h \
sys/select.h \
sys/time.h \
sys/times.h \
ttyent.h \
unistd.h \
wctype.h \

do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
echo "$as_me:19938: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 19944 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:19948: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:19954: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  eval "$as_ac_Header=yes"
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  eval "$as_ac_Header=no"
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:19973: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
EOF

fi
done

for ac_header in unistd.h getopt.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
echo "$as_me:19986: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 19992 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:19996: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:20002: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  eval "$as_ac_Header=yes"
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  eval "$as_ac_Header=no"
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:20021: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
EOF

fi
done

echo "$as_me:20031: checking for header declaring getopt variables" >&5
echo $ECHO_N "checking for header declaring getopt variables... $ECHO_C" >&6
if test "${cf_cv_getopt_header+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cf_cv_getopt_header=none
for cf_header in stdio.h stdlib.h unistd.h getopt.h
do
cat >"conftest.$ac_ext" <<_ACEOF
#line 20041 "configure"
#include "confdefs.h"

#include <$cf_header>
int
main (void)
{
int x = optind; char *y = optarg; (void)x; (void)y
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:20054: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:20057: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:20060: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:20063: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_getopt_header=$cf_header
 break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
done

fi
echo "$as_me:20075: result: $cf_cv_getopt_header" >&5
echo "${ECHO_T}$cf_cv_getopt_header" >&6
if test "$cf_cv_getopt_header" != none ; then

cat >>confdefs.h <<\EOF
#define HAVE_GETOPT_HEADER 1
EOF

fi
if test "$cf_cv_getopt_header" = getopt.h ; then

cat >>confdefs.h <<\EOF
#define NEED_GETOPT_H 1
EOF

fi

echo "$as_me:20092: checking if external environ is declared" >&5
echo $ECHO_N "checking if external environ is declared... $ECHO_C" >&6
if test "${cf_cv_dcl_environ+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

    cat >"conftest.$ac_ext" <<_ACEOF
#line 20099 "configure"
#include "confdefs.h"

#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#include <unistd.h>
int
main (void)
{
int x = (int) environ
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:20115: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:20118: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:20121: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:20124: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_dcl_environ=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_dcl_environ=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:20135: result: $cf_cv_dcl_environ" >&5
echo "${ECHO_T}$cf_cv_dcl_environ" >&6

if test "$cf_cv_dcl_environ" = no ; then

cf_result=`echo "decl_environ" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`

    cat >>confdefs.h <<EOF
#define $cf_result 1
EOF

fi

# It's possible (for near-UNIX clones) that the data doesn't exist

echo "$as_me:20150: checking if external environ exists" >&5
echo $ECHO_N "checking if external environ exists... $ECHO_C" >&6
if test "${cf_cv_have_environ+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cat >"conftest.$ac_ext" <<_ACEOF
#line 20157 "configure"
#include "confdefs.h"

#undef environ
extern int environ;

int
main (void)
{
environ = 2
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:20172: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:20175: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:20178: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:20181: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_have_environ=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_have_environ=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"

fi
echo "$as_me:20192: result: $cf_cv_have_environ" >&5
echo "${ECHO_T}$cf_cv_have_environ" >&6

if test "$cf_cv_have_environ" = yes ; then

cf_result=`echo "have_environ" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`

	cat >>confdefs.h <<EOF
#define $cf_result 1
EOF

fi

echo "$as_me:20205: checking for getenv" >&5
echo $ECHO_N "checking for getenv... $ECHO_C" >&6
if test "${ac_cv_func_getenv+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 20211 "configure"
#include "confdefs.h"
#define getenv autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef getenv

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char getenv (void);

int
main (void)
{

/* The GNU C library defines stubs 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_getenv) || defined (__stub___getenv)
#error found stub for getenv
#endif

	return getenv ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:20242: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:20245: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:20248: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:20251: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_func_getenv=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_func_getenv=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:20261: result: $ac_cv_func_getenv" >&5
echo "${ECHO_T}$ac_cv_func_getenv" >&6

for ac_func in putenv setenv strdup
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
echo "$as_me:20267: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 20273 "configure"
#include "confdefs.h"
#define $ac_func autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef $ac_func

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char $ac_func (void);

int
main (void)
{

/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func)
#error found stub for $ac_func
#endif

	return $ac_func ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:20304: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:20307: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:20310: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:20313: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  eval "$as_ac_var=yes"
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
eval "$as_ac_var=no"
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:20323: result: `eval echo '${'"$as_ac_var"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
EOF

fi
done

echo "$as_me:20333: checking if getenv returns consistent values" >&5
echo $ECHO_N "checking if getenv returns consistent values... $ECHO_C" >&6
if test "${cf_cv_consistent_getenv+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

if test "$cross_compiling" = yes; then
  cf_cv_consistent_getenv=unknown
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 20343 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>

#if defined(HAVE_ENVIRON) && defined(DECL_ENVIRON) && !defined(environ)
extern char **environ;	/* POSIX, but some systems are not... */
#endif

#if defined(HAVE_STRDUP)
#define str_alloc(s) strdup(s)
#else
#define str_alloc(s) strcpy(malloc(strlen(s) + 1, s))
#endif

static void set_value(const char *name, const char *value)
{
#if defined(HAVE_SETENV)
	setenv(name, value, 1);
#elif defined(HAVE_PUTENV)
	char buffer[1024];
	sprintf(buffer, "%s=%s", name, value);
	putenv(str_alloc(buffer));
#else
#error neither putenv/setenv found
#endif
}
int main(void)
{
	int pass;
	size_t numenv, limit, j;
	char **mynames;
	char **myvalues;
	char **mypointer;
	char *equals;
	for (numenv = 0; environ[numenv]; ++numenv) ;
	limit = numenv + 10;
	mynames = (char **) calloc(limit + 1, sizeof(char *));
	myvalues = (char **) calloc(limit + 1, sizeof(char *));
	mypointer = (char **) calloc(limit + 1, sizeof(char *));
#if defined(HAVE_ENVIRON)
	for (j = 0; environ[j]; ++j) {
		mynames[j] = str_alloc(environ[j]);
		equals = strchr(mynames[j], '=');
		if (equals != 0) {
			*equals++ = '\\0';
			myvalues[j] = str_alloc(equals);
		} else {
			myvalues[j] = str_alloc("");
		}
	}
#endif
	for (j = numenv; j < limit; ++j) {
		char name[80];
		char value[80];
		size_t found;
		size_t k = 0;
		do {
			size_t jk;
			found = 0;
			sprintf(name, "TERM%lu", (unsigned long) k);
			for (jk = 0; jk < j; ++jk) {
				if (!strcmp(name, mynames[jk])) {
					found = 1;
					++k;
					break;
				}
			}
		} while (found);
		sprintf(value, "%lu:%p", (unsigned long) k, &mynames[j]);
		set_value(name, value);
		mynames[j] = str_alloc(name);
		myvalues[j] = str_alloc(value);
	}
	for (pass = 0; pass < 3; ++pass) {
		for (j = 0; j < limit; ++j) {
			char *value = getenv(mynames[j]);
			if (pass) {
				if (value == 0) {
					fprintf(stderr, "getenv returned null for %s\\n", mynames[j]);
					${cf_cv_main_return:-return}(1);
				} else if (value != mypointer[j]) {
					fprintf(stderr, "getenv returned different pointer for %s\\n", mynames[j]);
					${cf_cv_main_return:-return}(1);
				} else if (strcmp(value, myvalues[j])) {
					fprintf(stderr, "getenv returned different value for %s\\n", mynames[j]);
					${cf_cv_main_return:-return}(1);
				}
			} else {
				size_t k;
				mypointer[j] = value;
				for (k = 0; k < j; ++k) {
					if (mypointer[j] == mypointer[k]) {
						fprintf(stderr, "getenv returned same pointer for %s and %s\\n", mynames[j], mynames[k]);
						${cf_cv_main_return:-return}(1);
					}
				}
			}
		}
	}
	${cf_cv_main_return:-return}(0);
}

_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:20452: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:20455: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:20457: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:20460: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_consistent_getenv=yes
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_consistent_getenv=no
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi

fi
echo "$as_me:20473: result: $cf_cv_consistent_getenv" >&5
echo "${ECHO_T}$cf_cv_consistent_getenv" >&6

if test "x$cf_cv_consistent_getenv" = xno
then

cat >>confdefs.h <<\EOF
#define HAVE_CONSISTENT_GETENV 1
EOF

fi

if test "x$cf_cv_consistent_getenv" = xno && \
	test "x$cf_with_trace" = xyes
then
	{ echo "$as_me:20488: WARNING: The NCURSES_TRACE environment variable is not supported with this configuration" >&5
echo "$as_me: WARNING: The NCURSES_TRACE environment variable is not supported with this configuration" >&2;}
fi

echo "$as_me:20492: checking if sys/time.h works with sys/select.h" >&5
echo $ECHO_N "checking if sys/time.h works with sys/select.h... $ECHO_C" >&6
if test "${cf_cv_sys_time_select+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 20499 "configure"
#include "confdefs.h"

#include <sys/types.h>
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif

int
main (void)
{

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:20519: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:20522: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:20525: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:20528: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_sys_time_select=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_sys_time_select=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi

echo "$as_me:20540: result: $cf_cv_sys_time_select" >&5
echo "${ECHO_T}$cf_cv_sys_time_select" >&6
test "$cf_cv_sys_time_select" = yes &&
cat >>confdefs.h <<\EOF
#define HAVE_SYS_TIME_SELECT 1
EOF

###	checks for compiler characteristics
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_main_return="return"

echo "$as_me:20555: checking for an ANSI C-conforming const" >&5
echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
if test "${ac_cv_c_const+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 20561 "configure"
#include "confdefs.h"

int
main (void)
{
/* FIXME: Include the comments suggested by Paul. */
#ifndef __cplusplus
  /* Ultrix mips cc rejects this.  */
  typedef int charset[2];
  const charset x;
  /* SunOS 4.1.1 cc rejects this.  */
  char const *const *ccp;
  char **p;
  /* NEC SVR4.0.2 mips cc rejects this.  */
  struct point {int x, y;};
  static struct point const zero = {0,0};
  /* AIX XL C 1.02.0.0 rejects this.
     It does not let you subtract one const X* pointer from another in
     an arm of an if-expression whose if-part is not a constant
     expression */
  const char *g = "string";
  ccp = &g + (g ? g-g : 0);
  /* HPUX 7.0 cc rejects these. */
  ++ccp;
  p = (char**) ccp;
  ccp = (char const *const *) p;
  { /* SCO 3.2v4 cc rejects this.  */
    char *t;
    char const *s = 0 ? (char *) 0 : (char const *) 0;

    *t++ = 0;
  }
  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
    int x[] = {25, 17};
    const int *foo = &x[0];
    ++foo;
  }
  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
    typedef const int *iptr;
    iptr p = 0;
    ++p;
  }
  { /* AIX XL C 1.02.0.0 rejects this saying
       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
    struct s { int j; const int *ap[3]; };
    struct s *b; b->j = 5;
  }
  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
    const int foo = 10;
  }
#endif

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:20619: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:20622: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:20625: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:20628: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_c_const=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_c_const=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:20638: result: $ac_cv_c_const" >&5
echo "${ECHO_T}$ac_cv_c_const" >&6
if test $ac_cv_c_const = no; then

cat >>confdefs.h <<\EOF
#define const
EOF

fi

echo "$as_me:20648: checking for inline" >&5
echo $ECHO_N "checking for inline... $ECHO_C" >&6
if test "${ac_cv_c_inline+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_cv_c_inline=no
for ac_kw in inline __inline__ __inline; do
  cat >"conftest.$ac_ext" <<_ACEOF
#line 20656 "configure"
#include "confdefs.h"
#ifndef __cplusplus
static $ac_kw int static_foo () {return 0; }
$ac_kw int foo () {return 0; }
#endif

_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:20665: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:20668: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:20671: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:20674: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_c_inline=$ac_kw; break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
done

fi
echo "$as_me:20685: result: $ac_cv_c_inline" >&5
echo "${ECHO_T}$ac_cv_c_inline" >&6
case $ac_cv_c_inline in
  inline | yes) ;;
  no)
cat >>confdefs.h <<\EOF
#define inline
EOF
 ;;
  *)  cat >>confdefs.h <<EOF
#define inline $ac_cv_c_inline
EOF
 ;;
esac

NCURSES_INLINE=
if test "$ac_cv_c_inline" != no ; then
	NCURSES_INLINE=inline
	if test "$INTEL_COMPILER" = yes
	then
		:
	elif test "$CLANG_COMPILER" = yes
	then
		:
	elif test "$GCC" = yes
	then
		echo "$as_me:20711: checking if $CC supports options to tune inlining" >&5
echo $ECHO_N "checking if $CC supports options to tune inlining... $ECHO_C" >&6
if test "${cf_cv_gcc_inline+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

		cf_save_CFLAGS=$CFLAGS
		CFLAGS="$CFLAGS --param max-inline-insns-single=1200"
		cat >"conftest.$ac_ext" <<_ACEOF
#line 20720 "configure"
#include "confdefs.h"
inline int foo(void) { return 1; }
int
main (void)
{
${cf_cv_main_return:-return} foo()
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:20732: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:20735: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:20738: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:20741: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_gcc_inline=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_gcc_inline=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
		CFLAGS=$cf_save_CFLAGS

fi
echo "$as_me:20753: result: $cf_cv_gcc_inline" >&5
echo "${ECHO_T}$cf_cv_gcc_inline" >&6
		if test "$cf_cv_gcc_inline" = yes ; then

cf_fix_cppflags=no
cf_new_cflags=
cf_new_cppflags=
cf_new_extra_cppflags=

for cf_add_cflags in --param max-inline-insns-single=1200
do
case "$cf_fix_cppflags" in
(no)
	case "$cf_add_cflags" in
	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
		case "$cf_add_cflags" in
		(-D*)
			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`

			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
				&& test -z "${cf_tst_cflags}" \
				&& cf_fix_cppflags=yes

			if test "$cf_fix_cppflags" = yes ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			elif test "${cf_tst_cflags}" = "\"'" ; then

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

				continue
			fi
			;;
		esac
		case "$CPPFLAGS" in
		(*$cf_add_cflags)
			;;
		(*)
			case "$cf_add_cflags" in
			(-D*)
				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`

CPPFLAGS=`echo "$CPPFLAGS" | \
	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`

				;;
			esac

	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"

			;;
		esac
		;;
	(*)

	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"

		;;
	esac
	;;
(yes)

	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"

	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`

	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
		&& test -z "${cf_tst_cflags}" \
		&& cf_fix_cppflags=no
	;;
esac
done

if test -n "$cf_new_cflags" ; then

	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
	CFLAGS="${CFLAGS}$cf_new_cflags"

fi

if test -n "$cf_new_cppflags" ; then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"

fi

if test -n "$cf_new_extra_cppflags" ; then

	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"

fi

		fi
	fi
fi

echo "$as_me:20859: checking for signal global datatype" >&5
echo $ECHO_N "checking for signal global datatype... $ECHO_C" >&6
if test "${cf_cv_sig_atomic_t+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	for cf_type in \
		"volatile sig_atomic_t" \
		"sig_atomic_t" \
		"int"
	do
	cat >"conftest.$ac_ext" <<_ACEOF
#line 20871 "configure"
#include "confdefs.h"

#include <sys/types.h>
#include <signal.h>
#include <stdio.h>

extern $cf_type x;
$cf_type x;
static void handler(int sig)
{
	(void)sig;
	x = 5;
}
int
main (void)
{
signal(SIGINT, handler);
		 x = 1
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:20895: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:20898: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:20901: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:20904: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_sig_atomic_t=$cf_type
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_sig_atomic_t=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
		test "$cf_cv_sig_atomic_t" != no && break
	done

fi

echo "$as_me:20918: result: $cf_cv_sig_atomic_t" >&5
echo "${ECHO_T}$cf_cv_sig_atomic_t" >&6
test "$cf_cv_sig_atomic_t" != no &&
cat >>confdefs.h <<EOF
#define SIG_ATOMIC_T $cf_cv_sig_atomic_t
EOF

if test "$NCURSES_CHTYPE" = auto ; then

echo "$as_me:20927: checking for type of chtype" >&5
echo $ECHO_N "checking for type of chtype... $ECHO_C" >&6
if test "${cf_cv_typeof_chtype+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

		if test "$cross_compiling" = yes; then
  cf_cv_typeof_chtype=long
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 20937 "configure"
#include "confdefs.h"

#define WANT_BITS 31
#include <stdio.h>
int main(void)
{
	FILE *fp = fopen("cf_test.out", "w");
	if (fp != 0) {
		char *result = "long";
		if (sizeof(unsigned long) > sizeof(unsigned int)) {
			int n;
			unsigned int x, y;
			for (n = 0; n < WANT_BITS; n++) {
				x = (1 << n);
				y = (x >> n);
				if (y != 1 || x == 0) {
					x = 0;
					break;
				}
			}
			/*
			 * If x is nonzero, an int is big enough for the bits
			 * that we want.
			 */
			result = (x != 0) ? "int" : "long";
		}
		fputs(result, fp);
		fclose(fp);
	}
	${cf_cv_main_return:-return}(0);
}

_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:20972: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:20975: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:20977: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:20980: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_typeof_chtype=`cat cf_test.out`
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_typeof_chtype=long
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
		rm -f cf_test.out

fi

echo "$as_me:20995: result: $cf_cv_typeof_chtype" >&5
echo "${ECHO_T}$cf_cv_typeof_chtype" >&6

cat >>confdefs.h <<EOF
#define TYPEOF_CHTYPE $cf_cv_typeof_chtype
EOF

else
	cf_cv_typeof_chtype=$NCURSES_CHTYPE
fi
test "$cf_cv_typeof_chtype" = unsigned && cf_cv_typeof_chtype=""

echo "$as_me:21007: checking if unsigned literals are legal" >&5
echo $ECHO_N "checking if unsigned literals are legal... $ECHO_C" >&6
if test "${cf_cv_unsigned_literals+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cat >"conftest.$ac_ext" <<_ACEOF
#line 21014 "configure"
#include "confdefs.h"

int
main (void)
{
long x = 1L + 1UL + 1U + 1
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:21026: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:21029: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:21032: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21035: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_unsigned_literals=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_unsigned_literals=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi

echo "$as_me:21047: result: $cf_cv_unsigned_literals" >&5
echo "${ECHO_T}$cf_cv_unsigned_literals" >&6

cf_cv_1UL="1"
test ".$cf_cv_unsigned_literals" = .yes && cf_cv_1UL="${cf_cv_1UL}U"
test ".$cf_cv_typeof_chtype"    = .long && cf_cv_1UL="${cf_cv_1UL}L"

if test "$NCURSES_MMASK_T" = auto ; then
	cf_cv_typeof_mmask_t=long
else
	cf_cv_typeof_mmask_t=$NCURSES_MMASK_T
fi
test "$cf_cv_typeof_mmask_t" = unsigned && cf_cv_typeof_mmask_t=""

###	Checks for external-data

echo "$as_me:21063: checking if external errno is declared" >&5
echo $ECHO_N "checking if external errno is declared... $ECHO_C" >&6
if test "${cf_cv_dcl_errno+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cat >"conftest.$ac_ext" <<_ACEOF
#line 21070 "configure"
#include "confdefs.h"

#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#include <stdio.h>
#include <sys/types.h>
#include <errno.h>
int
main (void)
{
int x = (int) errno; (void)x
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:21088: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:21091: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:21094: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21097: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_dcl_errno=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_dcl_errno=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
echo "$as_me:21108: result: $cf_cv_dcl_errno" >&5
echo "${ECHO_T}$cf_cv_dcl_errno" >&6

if test "$cf_cv_dcl_errno" = no ; then

cf_result=`echo "decl_errno" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`

	cat >>confdefs.h <<EOF
#define $cf_result 1
EOF

fi

# It's possible (for near-UNIX clones) that the data doesn't exist

echo "$as_me:21123: checking if external errno exists" >&5
echo $ECHO_N "checking if external errno exists... $ECHO_C" >&6
if test "${cf_cv_have_errno+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cat >"conftest.$ac_ext" <<_ACEOF
#line 21130 "configure"
#include "confdefs.h"

#undef errno
extern int errno;

int
main (void)
{
errno = 2
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:21145: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:21148: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:21151: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21154: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_have_errno=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_have_errno=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"

fi
echo "$as_me:21165: result: $cf_cv_have_errno" >&5
echo "${ECHO_T}$cf_cv_have_errno" >&6

if test "$cf_cv_have_errno" = yes ; then

cf_result=`echo "have_errno" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`

	cat >>confdefs.h <<EOF
#define $cf_result 1
EOF

fi

echo "$as_me:21178: checking if data-only library module links" >&5
echo $ECHO_N "checking if data-only library module links... $ECHO_C" >&6
if test "${cf_cv_link_dataonly+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	rm -f conftest.a
	cat >conftest.$ac_ext <<EOF
#line 21186 "configure"
int	testdata[3] = { 123, 456, 789 };
EOF
	if { (eval echo "$as_me:21189: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:21192: \$? = $ac_status" >&5
  (exit "$ac_status"); } ; then
		mv conftest.o data.o && \
		( $AR $ARFLAGS conftest.a data.o ) 2>&5 1>/dev/null
	fi
	rm -f conftest.$ac_ext data.o
	cat >conftest.$ac_ext <<EOF
#line 21199 "configure"
int	testfunc(void)
{
#if defined(NeXT)
	${cf_cv_main_return:-return}(1);	/* I'm told this linker is broken */
#else
	extern int testdata[3];
	return testdata[0] == 123
	   &&  testdata[1] == 456
	   &&  testdata[2] == 789;
#endif
}
EOF
	if { (eval echo "$as_me:21212: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:21215: \$? = $ac_status" >&5
  (exit "$ac_status"); }; then
		mv conftest.o func.o && \
		( $AR $ARFLAGS conftest.a func.o ) 2>&5 1>/dev/null
	fi
	rm -f conftest.$ac_ext func.o
	( eval $RANLIB conftest.a ) 2>&5 >/dev/null
	cf_saveLIBS="$LIBS"
	LIBS="conftest.a $LIBS"
	if test "$cross_compiling" = yes; then
  cf_cv_link_dataonly=unknown
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 21228 "configure"
#include "confdefs.h"

	int main(void)
	{
		extern int testfunc();
		${cf_cv_main_return:-return} (!testfunc());
	}

_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:21239: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:21242: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:21244: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21247: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_link_dataonly=yes
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_link_dataonly=no
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
	LIBS="$cf_saveLIBS"

fi

echo "$as_me:21262: result: $cf_cv_link_dataonly" >&5
echo "${ECHO_T}$cf_cv_link_dataonly" >&6

if test "$cf_cv_link_dataonly" = no ; then

cat >>confdefs.h <<\EOF
#define BROKEN_LINKER 1
EOF

	BROKEN_LINKER=1
fi

###	Checks for library functions.

for ac_func in \
getcwd \
getegid \
geteuid \
getopt \
getttynam \
issetugid \
localeconv \
poll \
putenv \
remove \
select \
setbuf \
setbuffer \
setenv \
setfsuid \
setvbuf \
sigaction \
sigvec \
snprintf \
strdup \
strstr \
sysconf \
tcgetpgrp \
times \
tsearch \
vsnprintf \

do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
echo "$as_me:21306: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 21312 "configure"
#include "confdefs.h"
#define $ac_func autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef $ac_func

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char $ac_func (void);

int
main (void)
{

/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func)
#error found stub for $ac_func
#endif

	return $ac_func ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:21343: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:21346: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:21349: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21352: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  eval "$as_ac_var=yes"
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
eval "$as_ac_var=no"
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:21362: result: `eval echo '${'"$as_ac_var"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
EOF

fi
done

if test "x$ac_cv_func_getopt" = xno && \
   test "x$cf_with_progs$cf_with_tests" != xnono; then
	{ { echo "$as_me:21374: error: getopt is required for building programs" >&5
echo "$as_me: error: getopt is required for building programs" >&2;}
   { (exit 1); exit 1; }; }
fi

if test "x$with_safe_sprintf" = xyes
then
	if test "x$ac_cv_func_vsnprintf" = xyes
	then
		{ echo "$as_me:21383: WARNING: will use vsnprintf instead of safe-sprintf option" >&5
echo "$as_me: WARNING: will use vsnprintf instead of safe-sprintf option" >&2;}
	else

cat >>confdefs.h <<\EOF
#define USE_SAFE_SPRINTF 1
EOF

	fi
fi

if test "x$with_getcap" = "xyes" ; then

echo "$as_me:21396: checking for terminal-capability database functions" >&5
echo $ECHO_N "checking for terminal-capability database functions... $ECHO_C" >&6
if test "${cf_cv_cgetent+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 21403 "configure"
#include "confdefs.h"

#include <stdlib.h>
int
main (void)
{

	char temp[128];
	char *buf = temp;
	char *db_array = temp;
	cgetent(&buf, &db_array, "vt100");
	cgetcap(buf, "tc", '=');
	cgetmatch(buf, "tc");

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:21423: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:21426: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:21429: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21432: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_cgetent=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_cgetent=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"

fi
echo "$as_me:21443: result: $cf_cv_cgetent" >&5
echo "${ECHO_T}$cf_cv_cgetent" >&6

if test "$cf_cv_cgetent" = yes
then

cat >>confdefs.h <<\EOF
#define HAVE_BSD_CGETENT 1
EOF

echo "$as_me:21453: checking if cgetent uses const parameter" >&5
echo $ECHO_N "checking if cgetent uses const parameter... $ECHO_C" >&6
if test "${cf_cv_cgetent_const+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 21460 "configure"
#include "confdefs.h"

#pragma GCC diagnostic error "-Wincompatible-pointer-types-discards-qualifiers"
#include <stdlib.h>
int
main (void)
{

	char temp[128];
	char *buf = temp;
#ifndef _NETBSD_SOURCE			/* given, since April 2004 in stdlib.h */
	const char *db_array = temp;
	cgetent(&buf, &db_array, "vt100");
#endif
	cgetcap(buf, "tc", '=');
	cgetmatch(buf, "tc");

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:21483: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:21486: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:21489: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21492: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_cgetent_const=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_cgetent_const=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"

fi
echo "$as_me:21503: result: $cf_cv_cgetent_const" >&5
echo "${ECHO_T}$cf_cv_cgetent_const" >&6
	if test "$cf_cv_cgetent_const" = yes
	then

cat >>confdefs.h <<EOF
#define CGETENT_CONST const
EOF

	fi
fi

fi

echo "$as_me:21517: checking for isascii" >&5
echo $ECHO_N "checking for isascii... $ECHO_C" >&6
if test "${cf_cv_have_isascii+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cat >"conftest.$ac_ext" <<_ACEOF
#line 21524 "configure"
#include "confdefs.h"
#include <ctype.h>
int
main (void)
{
int x = isascii(' ')
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:21536: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:21539: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:21542: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21545: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_have_isascii=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_have_isascii=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"

fi
echo "$as_me:21556: result: $cf_cv_have_isascii" >&5
echo "${ECHO_T}$cf_cv_have_isascii" >&6
test "$cf_cv_have_isascii" = yes &&
cat >>confdefs.h <<\EOF
#define HAVE_ISASCII 1
EOF

if test "$ac_cv_func_sigaction" = yes; then
echo "$as_me:21564: checking whether sigaction needs _POSIX_SOURCE" >&5
echo $ECHO_N "checking whether sigaction needs _POSIX_SOURCE... $ECHO_C" >&6
cat >"conftest.$ac_ext" <<_ACEOF
#line 21567 "configure"
#include "confdefs.h"

#include <sys/types.h>
#include <signal.h>
int
main (void)
{
struct sigaction act
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:21581: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:21584: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:21587: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21590: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  sigact_bad=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

cat >"conftest.$ac_ext" <<_ACEOF
#line 21598 "configure"
#include "confdefs.h"

#define _POSIX_SOURCE
#include <sys/types.h>
#include <signal.h>
int
main (void)
{
struct sigaction act
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:21613: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:21616: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:21619: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21622: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  sigact_bad=yes

cat >>confdefs.h <<\EOF
#define _POSIX_SOURCE 1
EOF

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
sigact_bad=unknown
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
echo "$as_me:21638: result: $sigact_bad" >&5
echo "${ECHO_T}$sigact_bad" >&6
fi

echo "$as_me:21642: checking if nanosleep really works" >&5
echo $ECHO_N "checking if nanosleep really works... $ECHO_C" >&6
if test "${cf_cv_func_nanosleep+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

if test "$cross_compiling" = yes; then
  cf_cv_func_nanosleep=unknown
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 21652 "configure"
#include "confdefs.h"

#include <stdio.h>
#include <errno.h>
#include <time.h>

#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif

int main(void) {
	struct timespec ts1, ts2;
	int code;
	ts1.tv_sec  = 0;
	ts1.tv_nsec = 750000000;
	ts2.tv_sec  = 0;
	ts2.tv_nsec = 0;
	errno = 0;
	code = nanosleep(&ts1, &ts2); /* on failure errno is ENOSYS. */
	${cf_cv_main_return:-return}(code != 0);
}

_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:21677: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:21680: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:21682: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21685: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_func_nanosleep=yes
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_func_nanosleep=no
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
fi
echo "$as_me:21697: result: $cf_cv_func_nanosleep" >&5
echo "${ECHO_T}$cf_cv_func_nanosleep" >&6

test "$cf_cv_func_nanosleep" = "yes" &&
cat >>confdefs.h <<\EOF
#define HAVE_NANOSLEEP 1
EOF

for ac_header in \
termio.h \
termios.h \
unistd.h \
sys/ioctl.h \
sys/termio.h \

do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
echo "$as_me:21714: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 21720 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:21724: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:21730: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  eval "$as_ac_Header=yes"
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  eval "$as_ac_Header=no"
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:21749: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
EOF

fi
done

if test "$ac_cv_header_termios_h" = yes ; then
	case "$CFLAGS $CPPFLAGS" in
	(*-D_POSIX_SOURCE*)
		termios_bad=dunno ;;
	(*)	termios_bad=maybe ;;
	esac
	if test "$termios_bad" = maybe ; then
	echo "$as_me:21766: checking whether termios.h needs _POSIX_SOURCE" >&5
echo $ECHO_N "checking whether termios.h needs _POSIX_SOURCE... $ECHO_C" >&6
	cat >"conftest.$ac_ext" <<_ACEOF
#line 21769 "configure"
#include "confdefs.h"
#include <termios.h>
int
main (void)
{
struct termios foo; int x = foo.c_iflag = 1; (void)x
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:21781: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:21784: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:21787: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21790: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  termios_bad=no
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

		cat >"conftest.$ac_ext" <<_ACEOF
#line 21798 "configure"
#include "confdefs.h"

#define _POSIX_SOURCE
#include <termios.h>
int
main (void)
{
struct termios foo; int x = foo.c_iflag = 2; (void)x
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:21812: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:21815: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:21818: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21821: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  termios_bad=unknown
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
termios_bad=yes
cat >>confdefs.h <<\EOF
#define _POSIX_SOURCE 1
EOF

fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
	echo "$as_me:21837: result: $termios_bad" >&5
echo "${ECHO_T}$termios_bad" >&6
	fi
fi

echo "$as_me:21842: checking for tcgetattr" >&5
echo $ECHO_N "checking for tcgetattr... $ECHO_C" >&6
if test "${cf_cv_have_tcgetattr+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 21849 "configure"
#include "confdefs.h"

#include <sys/types.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_TERMIOS_H
#include <termios.h>
#define TTY struct termios
#else
#ifdef HAVE_TERMIO_H
#include <termio.h>
#define TTY struct termio
#endif
#endif

int
main (void)
{

TTY foo;
tcgetattr(1, &foo);
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:21877: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:21880: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:21883: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21886: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_have_tcgetattr=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_have_tcgetattr=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:21896: result: $cf_cv_have_tcgetattr" >&5
echo "${ECHO_T}$cf_cv_have_tcgetattr" >&6
test "$cf_cv_have_tcgetattr" = yes &&
cat >>confdefs.h <<\EOF
#define HAVE_TCGETATTR 1
EOF

echo "$as_me:21903: checking for vsscanf function or workaround" >&5
echo $ECHO_N "checking for vsscanf function or workaround... $ECHO_C" >&6
if test "${cf_cv_func_vsscanf+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 21910 "configure"
#include "confdefs.h"

#include <stdarg.h>
#include <stdio.h>
int
main (void)
{

	va_list ap;
	vsscanf("from", "%d", ap)
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:21926: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:21929: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:21932: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21935: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_func_vsscanf=vsscanf
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

cat >"conftest.$ac_ext" <<_ACEOF
#line 21943 "configure"
#include "confdefs.h"

#include <stdarg.h>
#include <stdio.h>
int
main (void)
{

	FILE strbuf;
	char *str = "from";

	strbuf._flag = _IOREAD;
	strbuf._ptr = strbuf._base = (unsigned char *) str;
	strbuf._cnt = strlen(str);
	strbuf._file = _NFILE;
	return (vfscanf(&strbuf, "%d", ap))
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:21965: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:21968: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:21971: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:21974: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_func_vsscanf=vfscanf
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

cat >"conftest.$ac_ext" <<_ACEOF
#line 21982 "configure"
#include "confdefs.h"

#include <stdarg.h>
#include <stdio.h>
int
main (void)
{

	FILE strbuf;
	char *str = "from";

	strbuf._flag = _IOREAD;
	strbuf._ptr = strbuf._base = (unsigned char *) str;
	strbuf._cnt = strlen(str);
	strbuf._file = _NFILE;
	return (_doscan(&strbuf, "%d", ap))
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:22004: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:22007: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:22010: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:22013: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_func_vsscanf=_doscan
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

cf_cv_func_vsscanf=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:22028: result: $cf_cv_func_vsscanf" >&5
echo "${ECHO_T}$cf_cv_func_vsscanf" >&6

case "$cf_cv_func_vsscanf" in
(vsscanf)
cat >>confdefs.h <<\EOF
#define HAVE_VSSCANF 1
EOF
;;
(vfscanf)
cat >>confdefs.h <<\EOF
#define HAVE_VFSCANF 1
EOF
;;
(_doscan)
cat >>confdefs.h <<\EOF
#define HAVE__DOSCAN 1
EOF
;;
esac

for ac_header in \
unistd.h \

do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
echo "$as_me:22054: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 22060 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:22064: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:22070: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  eval "$as_ac_Header=yes"
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  eval "$as_ac_Header=no"
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:22089: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
EOF

fi
done

echo "$as_me:22099: checking for working mkstemp" >&5
echo $ECHO_N "checking for working mkstemp... $ECHO_C" >&6
if test "${cf_cv_func_mkstemp+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

rm -rf ./conftest*
if test "$cross_compiling" = yes; then
  cf_cv_func_mkstemp=maybe
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 22110 "configure"
#include "confdefs.h"

#include <sys/types.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
int main(void)
{
	char *tmpl = "conftestXXXXXX";
	char name[2][80];
	int n;
	int result = 0;
	int fd;
	struct stat sb;

	umask(077);
	for (n = 0; n < 2; ++n) {
		strcpy(name[n], tmpl);
		if ((fd = mkstemp(name[n])) >= 0) {
			if (!strcmp(name[n], tmpl)
			 || stat(name[n], &sb) != 0
			 || (sb.st_mode & S_IFMT) != S_IFREG
			 || (sb.st_mode & 077) != 0) {
				result = 1;
			}
			close(fd);
		}
	}
	if (result == 0
	 && !strcmp(name[0], name[1]))
		result = 1;
	${cf_cv_main_return:-return}(result);
}

_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:22151: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:22154: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:22156: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:22159: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_func_mkstemp=yes

else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_func_mkstemp=no

fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi

fi
echo "$as_me:22174: result: $cf_cv_func_mkstemp" >&5
echo "${ECHO_T}$cf_cv_func_mkstemp" >&6
if test "x$cf_cv_func_mkstemp" = xmaybe ; then
	echo "$as_me:22177: checking for mkstemp" >&5
echo $ECHO_N "checking for mkstemp... $ECHO_C" >&6
if test "${ac_cv_func_mkstemp+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 22183 "configure"
#include "confdefs.h"
#define mkstemp autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef mkstemp

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char mkstemp (void);

int
main (void)
{

/* The GNU C library defines stubs 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_mkstemp) || defined (__stub___mkstemp)
#error found stub for mkstemp
#endif

	return mkstemp ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:22214: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:22217: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:22220: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:22223: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_func_mkstemp=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_func_mkstemp=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:22233: result: $ac_cv_func_mkstemp" >&5
echo "${ECHO_T}$ac_cv_func_mkstemp" >&6

fi
if test "x$cf_cv_func_mkstemp" = xyes || test "x$ac_cv_func_mkstemp" = xyes ; then

cat >>confdefs.h <<\EOF
#define HAVE_MKSTEMP 1
EOF

fi

# setup for prototype of fallback for vsscanf()

if test "$cf_cv_func_vsscanf" = vsscanf ; then
	HAVE_VSSCANF=1
else
	HAVE_VSSCANF=0
fi

if test "x$cross_compiling" = xyes ; then
	{ echo "$as_me:22254: WARNING: cross compiling: assume setvbuf params not reversed" >&5
echo "$as_me: WARNING: cross compiling: assume setvbuf params not reversed" >&2;}
else
	echo "$as_me:22257: checking whether setvbuf arguments are reversed" >&5
echo $ECHO_N "checking whether setvbuf arguments are reversed... $ECHO_C" >&6
if test "${ac_cv_func_setvbuf_reversed+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test "$cross_compiling" = yes; then
  { { echo "$as_me:22263: error: cannot run test program while cross compiling" >&5
echo "$as_me: error: cannot run test program while cross compiling" >&2;}
   { (exit 1); exit 1; }; }
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 22268 "configure"
#include "confdefs.h"
#include <stdio.h>
/* If setvbuf has the reversed format, exit 0. */
int
main (void)
{
  /* This call has the arguments reversed.
     A reversed system may check and see that the address of main
     is not _IOLBF, _IONBF, or _IOFBF, and return nonzero.  */
  if (setvbuf(stdout, _IOLBF, (char *) main, BUFSIZ) != 0)
    $ac_main_return(1);
  putc('\r', stdout);
  $ac_main_return(0);			/* Non-reversed systems segv here.  */
}
_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:22285: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:22288: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:22290: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:22293: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_func_setvbuf_reversed=yes
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_func_setvbuf_reversed=no
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
rm -f core ./core.* ./*.core
fi
echo "$as_me:22306: result: $ac_cv_func_setvbuf_reversed" >&5
echo "${ECHO_T}$ac_cv_func_setvbuf_reversed" >&6
if test $ac_cv_func_setvbuf_reversed = yes; then

cat >>confdefs.h <<\EOF
#define SETVBUF_REVERSED 1
EOF

fi

fi
echo "$as_me:22317: checking for intptr_t" >&5
echo $ECHO_N "checking for intptr_t... $ECHO_C" >&6
if test "${ac_cv_type_intptr_t+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 22323 "configure"
#include "confdefs.h"
$ac_includes_default
int
main (void)
{
if ((intptr_t *) 0)
  return 0;
if (sizeof (intptr_t))
  return 0;
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:22338: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:22341: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:22344: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:22347: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_type_intptr_t=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_type_intptr_t=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:22357: result: $ac_cv_type_intptr_t" >&5
echo "${ECHO_T}$ac_cv_type_intptr_t" >&6
if test "$ac_cv_type_intptr_t" = yes; then
  :
else

cat >>confdefs.h <<EOF
#define intptr_t long
EOF

fi

echo "$as_me:22369: checking for ssize_t" >&5
echo $ECHO_N "checking for ssize_t... $ECHO_C" >&6
if test "${ac_cv_type_ssize_t+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 22375 "configure"
#include "confdefs.h"
$ac_includes_default
int
main (void)
{
if ((ssize_t *) 0)
  return 0;
if (sizeof (ssize_t))
  return 0;
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:22390: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:22393: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:22396: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:22399: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_type_ssize_t=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_type_ssize_t=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:22409: result: $ac_cv_type_ssize_t" >&5
echo "${ECHO_T}$ac_cv_type_ssize_t" >&6
if test "$ac_cv_type_ssize_t" = yes; then
  :
else

cat >>confdefs.h <<EOF
#define ssize_t int
EOF

fi

echo "$as_me:22421: checking for type sigaction_t" >&5
echo $ECHO_N "checking for type sigaction_t... $ECHO_C" >&6
if test "${cf_cv_type_sigaction+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cat >"conftest.$ac_ext" <<_ACEOF
#line 22428 "configure"
#include "confdefs.h"

#include <signal.h>
int
main (void)
{
sigaction_t x
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:22441: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:22444: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:22447: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:22450: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_type_sigaction=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_type_sigaction=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi

echo "$as_me:22461: result: $cf_cv_type_sigaction" >&5
echo "${ECHO_T}$cf_cv_type_sigaction" >&6
test "$cf_cv_type_sigaction" = yes &&
cat >>confdefs.h <<\EOF
#define HAVE_TYPE_SIGACTION 1
EOF

echo "$as_me:22468: checking declaration of size-change" >&5
echo $ECHO_N "checking declaration of size-change... $ECHO_C" >&6
if test "${cf_cv_sizechange+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cf_cv_sizechange=unknown
	cf_save_CPPFLAGS="$CPPFLAGS"

for cf_opts in "" "NEED_PTEM_H"
do

	CPPFLAGS="$cf_save_CPPFLAGS"
	if test -n "$cf_opts"
	then

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}-D$cf_opts"

	fi
	cat >"conftest.$ac_ext" <<_ACEOF
#line 22489 "configure"
#include "confdefs.h"
#include <sys/types.h>
#ifdef HAVE_TERMIOS_H
#include <termios.h>
#else
#ifdef HAVE_TERMIO_H
#include <termio.h>
#endif
#endif

#ifdef NEED_PTEM_H
/* This is a workaround for SCO:  they neglected to define struct winsize in
 * termios.h -- it is only in termio.h and ptem.h
 */
#include <sys/stream.h>
#include <sys/ptem.h>
#endif

#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif

int
main (void)
{

#ifdef TIOCGSIZE
	struct ttysize win;	/* SunOS 3.0... */
	int y = win.ts_lines = 2;
	int x = win.ts_cols = 1;
	(void)y;
	(void)x;
#else
#ifdef TIOCGWINSZ
	struct winsize win;	/* everything else */
	int y = win.ws_row = 2;
	int x = win.ws_col = 1;
	(void)y;
	(void)x;
#else
	no TIOCGSIZE or TIOCGWINSZ
#endif /* TIOCGWINSZ */
#endif /* TIOCGSIZE */

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:22539: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:22542: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:22545: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:22548: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_sizechange=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_sizechange=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

	CPPFLAGS="$cf_save_CPPFLAGS"
	if test "$cf_cv_sizechange" = yes ; then
		echo "size-change succeeded ($cf_opts)" >&5
		test -n "$cf_opts" && cf_cv_sizechange="$cf_opts"
		break
	fi
done

fi
echo "$as_me:22567: result: $cf_cv_sizechange" >&5
echo "${ECHO_T}$cf_cv_sizechange" >&6
if test "$cf_cv_sizechange" != no ; then

cat >>confdefs.h <<\EOF
#define HAVE_SIZECHANGE 1
EOF

	case "$cf_cv_sizechange" in
	(NEED*)
		cat >>confdefs.h <<EOF
#define $cf_cv_sizechange  1
EOF

		;;
	esac
fi

echo "$as_me:22585: checking for memmove" >&5
echo $ECHO_N "checking for memmove... $ECHO_C" >&6
if test "${ac_cv_func_memmove+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 22591 "configure"
#include "confdefs.h"
#define memmove autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef memmove

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char memmove (void);

int
main (void)
{

/* The GNU C library defines stubs 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_memmove) || defined (__stub___memmove)
#error found stub for memmove
#endif

	return memmove ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:22622: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:22625: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:22628: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:22631: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_func_memmove=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_func_memmove=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:22641: result: $ac_cv_func_memmove" >&5
echo "${ECHO_T}$ac_cv_func_memmove" >&6
if test "$ac_cv_func_memmove" = yes; then
  :
else

echo "$as_me:22647: checking for bcopy" >&5
echo $ECHO_N "checking for bcopy... $ECHO_C" >&6
if test "${ac_cv_func_bcopy+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 22653 "configure"
#include "confdefs.h"
#define bcopy autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef bcopy

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char bcopy (void);

int
main (void)
{

/* The GNU C library defines stubs 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_bcopy) || defined (__stub___bcopy)
#error found stub for bcopy
#endif

	return bcopy ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:22684: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:22687: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:22690: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:22693: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_func_bcopy=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_func_bcopy=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:22703: result: $ac_cv_func_bcopy" >&5
echo "${ECHO_T}$ac_cv_func_bcopy" >&6
if test "$ac_cv_func_bcopy" = yes; then

	echo "$as_me:22707: checking if bcopy does overlapping moves" >&5
echo $ECHO_N "checking if bcopy does overlapping moves... $ECHO_C" >&6
if test "${cf_cv_good_bcopy+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

		if test "$cross_compiling" = yes; then
  cf_cv_good_bcopy=unknown
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 22717 "configure"
#include "confdefs.h"

int main(void) {
	static char data[] = "abcdefghijklmnopqrstuwwxyz";
	char temp[40];
	bcopy(data, temp, sizeof(data));
	bcopy(temp+10, temp, 15);
	bcopy(temp+5, temp+15, 10);
	${cf_cv_main_return:-return} (strcmp(temp, "klmnopqrstuwwxypqrstuwwxyz"));
}

_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:22731: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:22734: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:22736: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:22739: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_good_bcopy=yes
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_good_bcopy=no
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi

fi
echo "$as_me:22752: result: $cf_cv_good_bcopy" >&5
echo "${ECHO_T}$cf_cv_good_bcopy" >&6

else
  cf_cv_good_bcopy=no
fi

	if test "$cf_cv_good_bcopy" = yes ; then

cat >>confdefs.h <<\EOF
#define USE_OK_BCOPY 1
EOF

	else

cat >>confdefs.h <<\EOF
#define USE_MY_MEMMOVE 1
EOF

	fi

fi

tty >/dev/null 2>&1 || {
for ac_func in posix_openpt
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
echo "$as_me:22779: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 22785 "configure"
#include "confdefs.h"
#define $ac_func autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef $ac_func

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char $ac_func (void);

int
main (void)
{

/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func)
#error found stub for $ac_func
#endif

	return $ac_func ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:22816: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:22819: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:22822: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:22825: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  eval "$as_ac_var=yes"
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
eval "$as_ac_var=no"
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:22835: result: `eval echo '${'"$as_ac_var"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
EOF

fi
done
 }
echo "$as_me:22845: checking if poll really works" >&5
echo $ECHO_N "checking if poll really works... $ECHO_C" >&6
if test "${cf_cv_working_poll+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

if test "$cross_compiling" = yes; then
  cf_cv_working_poll=unknown
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 22855 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#ifdef HAVE_POLL_H
#include <poll.h>
#else
#include <sys/poll.h>
#endif
int main(void) {
	struct pollfd myfds;
	int ret;

	/* check for Darwin bug with respect to "devices" */
	myfds.fd = open("/dev/null", 1);	/* O_WRONLY */
	if (myfds.fd < 0)
		myfds.fd = 0;
	myfds.events = POLLIN;
	myfds.revents = 0;

	ret = poll(&myfds, 1, 100);

	if (ret < 0 || (myfds.revents & POLLNVAL)) {
		ret = -1;
	} else {
		int fd = 0;
		if (!isatty(fd)) {
			fd = open("/dev/tty", 2);	/* O_RDWR */
		}
#ifdef HAVE_POSIX_OPENPT
		if (fd < 0) {
			fd = posix_openpt(O_RDWR);
		}
#endif

		if (fd >= 0) {
			/* also check with standard input */
			myfds.fd = fd;
			myfds.events = POLLIN;
			myfds.revents = 0;
			ret = poll(&myfds, 1, 100);
		} else {
			ret = -1;
		}
	}
	${cf_cv_main_return:-return}(ret < 0);
}
_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:22907: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:22910: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:22912: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:22915: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_working_poll=yes
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_working_poll=no
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
fi
echo "$as_me:22927: result: $cf_cv_working_poll" >&5
echo "${ECHO_T}$cf_cv_working_poll" >&6
test "$cf_cv_working_poll" = "yes" &&
cat >>confdefs.h <<\EOF
#define HAVE_WORKING_POLL 1
EOF

echo "$as_me:22934: checking for va_copy" >&5
echo $ECHO_N "checking for va_copy... $ECHO_C" >&6
if test "${cf_cv_have_va_copy+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 22941 "configure"
#include "confdefs.h"

#include <stdarg.h>

int
main (void)
{

	static va_list dst;
	static va_list src;
	va_copy(dst, src)
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:22958: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:22961: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:22964: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:22967: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_have_va_copy=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_have_va_copy=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:22977: result: $cf_cv_have_va_copy" >&5
echo "${ECHO_T}$cf_cv_have_va_copy" >&6

if test "$cf_cv_have_va_copy" = yes;
then

cat >>confdefs.h <<\EOF
#define HAVE_VA_COPY 1
EOF

else # !cf_cv_have_va_copy

echo "$as_me:22989: checking for __va_copy" >&5
echo $ECHO_N "checking for __va_copy... $ECHO_C" >&6
if test "${cf_cv_have___va_copy+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 22996 "configure"
#include "confdefs.h"

#include <stdarg.h>

int
main (void)
{

	static va_list dst;
	static va_list src;
	__va_copy(dst, src)
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:23013: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:23016: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:23019: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:23022: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_have___va_copy=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_have___va_copy=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:23032: result: $cf_cv_have___va_copy" >&5
echo "${ECHO_T}$cf_cv_have___va_copy" >&6

if test "$cf_cv_have___va_copy" = yes
then

cat >>confdefs.h <<\EOF
#define HAVE___VA_COPY 1
EOF

else # !cf_cv_have___va_copy

echo "$as_me:23044: checking for __builtin_va_copy" >&5
echo $ECHO_N "checking for __builtin_va_copy... $ECHO_C" >&6
if test "${cf_cv_have___builtin_va_copy+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 23051 "configure"
#include "confdefs.h"

#include <stdarg.h>

int
main (void)
{

	static va_list dst;
	static va_list src;
	__builtin_va_copy(dst, src)
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:23068: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:23071: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:23074: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:23077: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_have___builtin_va_copy=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_have___builtin_va_copy=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:23087: result: $cf_cv_have___builtin_va_copy" >&5
echo "${ECHO_T}$cf_cv_have___builtin_va_copy" >&6

test "$cf_cv_have___builtin_va_copy" = yes &&

cat >>confdefs.h <<\EOF
#define HAVE___BUILTIN_VA_COPY 1
EOF

fi # cf_cv_have___va_copy

fi # cf_cv_have_va_copy

case "${cf_cv_have_va_copy}${cf_cv_have___va_copy}${cf_cv_have___builtin_va_copy}" in
(*yes*)
	;;

(*)
	echo "$as_me:23105: checking if we can simply copy va_list" >&5
echo $ECHO_N "checking if we can simply copy va_list... $ECHO_C" >&6
if test "${cf_cv_pointer_va_list+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 23112 "configure"
#include "confdefs.h"

#include <stdarg.h>

int
main (void)
{

	va_list dst;
	va_list src;
	dst = src
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:23129: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:23132: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:23135: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:23138: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_pointer_va_list=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_pointer_va_list=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:23148: result: $cf_cv_pointer_va_list" >&5
echo "${ECHO_T}$cf_cv_pointer_va_list" >&6

	if test "$cf_cv_pointer_va_list" = no
	then
		echo "$as_me:23153: checking if we can copy va_list indirectly" >&5
echo $ECHO_N "checking if we can copy va_list indirectly... $ECHO_C" >&6
if test "${cf_cv_array_va_list+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat >"conftest.$ac_ext" <<_ACEOF
#line 23160 "configure"
#include "confdefs.h"

#include <stdarg.h>

int
main (void)
{

	va_list dst;
	va_list src;
	*dst = *src
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:23177: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:23180: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:23183: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:23186: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_array_va_list=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_array_va_list=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:23196: result: $cf_cv_array_va_list" >&5
echo "${ECHO_T}$cf_cv_array_va_list" >&6
		test "$cf_cv_array_va_list" = yes &&
cat >>confdefs.h <<\EOF
#define ARRAY_VA_LIST 1
EOF

	fi
	;;
esac

echo "$as_me:23207: checking for pid_t" >&5
echo $ECHO_N "checking for pid_t... $ECHO_C" >&6
if test "${ac_cv_type_pid_t+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 23213 "configure"
#include "confdefs.h"
$ac_includes_default
int
main (void)
{
if ((pid_t *) 0)
  return 0;
if (sizeof (pid_t))
  return 0;
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:23228: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:23231: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:23234: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:23237: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_type_pid_t=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_type_pid_t=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:23247: result: $ac_cv_type_pid_t" >&5
echo "${ECHO_T}$ac_cv_type_pid_t" >&6
if test "$ac_cv_type_pid_t" = yes; then
  :
else

cat >>confdefs.h <<EOF
#define pid_t int
EOF

fi

for ac_header in unistd.h vfork.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
echo "$as_me:23262: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 23268 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:23272: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:23278: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  eval "$as_ac_Header=yes"
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  eval "$as_ac_Header=no"
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:23297: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
EOF

fi
done

for ac_func in fork vfork
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
echo "$as_me:23310: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 23316 "configure"
#include "confdefs.h"
#define $ac_func autoconf_temporary
#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
#undef $ac_func

#ifdef __cplusplus
extern "C"
#endif

/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char $ac_func (void);

int
main (void)
{

/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func)
#error found stub for $ac_func
#endif

	return $ac_func ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:23347: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:23350: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:23353: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:23356: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  eval "$as_ac_var=yes"
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
eval "$as_ac_var=no"
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
echo "$as_me:23366: result: `eval echo '${'"$as_ac_var"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
EOF

fi
done

ac_cv_func_fork_works=$ac_cv_func_fork
if test "x$ac_cv_func_fork" = xyes; then
  echo "$as_me:23378: checking for working fork" >&5
echo $ECHO_N "checking for working fork... $ECHO_C" >&6
if test "${ac_cv_func_fork_works+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test "$cross_compiling" = yes; then
  ac_cv_func_fork_works=cross
else
  cat >"conftest.$ac_ext" <<_ACEOF
/* By Rüdiger Kuhlmann. */
      #include <sys/types.h>
      #if HAVE_UNISTD_H
      # include <unistd.h>
      #endif
      /* Some systems only have a dummy stub for fork() */
      int main (void)
      {
        if (fork() < 0)
          $ac_main_return (1);
        $ac_main_return (0);
      }
_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:23401: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:23404: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:23406: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:23409: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_func_fork_works=yes
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_func_fork_works=no
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
fi
echo "$as_me:23421: result: $ac_cv_func_fork_works" >&5
echo "${ECHO_T}$ac_cv_func_fork_works" >&6

fi
if test "x$ac_cv_func_fork_works" = xcross; then
  case $host in
    *-*-amigaos* | *-*-msdosdjgpp*)
      # Override, as these systems have only a dummy fork() stub
      ac_cv_func_fork_works=no
      ;;
    *)
      ac_cv_func_fork_works=yes
      ;;
  esac
  { echo "$as_me:23435: WARNING: CROSS: Result $ac_cv_func_fork_works guessed due to cross-compiling." >&5
echo "$as_me: WARNING: CROSS: Result $ac_cv_func_fork_works guessed due to cross-compiling." >&2;}
fi
ac_cv_func_vfork_works=$ac_cv_func_vfork
if test "x$ac_cv_func_vfork" = xyes; then
  echo "$as_me:23440: checking for working vfork" >&5
echo $ECHO_N "checking for working vfork... $ECHO_C" >&6
if test "${ac_cv_func_vfork_works+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test "$cross_compiling" = yes; then
  ac_cv_func_vfork_works=cross
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 23449 "configure"
#include "confdefs.h"
/* Thanks to Paul Eggert for this test.  */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#if HAVE_UNISTD_H
# include <unistd.h>
#endif
#if HAVE_VFORK_H
# include <vfork.h>
#endif
/* On some sparc systems, changes by the child to local and incoming
   argument registers are propagated back to the parent.  The compiler
   is told about this with #include <vfork.h>, but some compilers
   (e.g. gcc -O) don't grok <vfork.h>.  Test for this by using a
   static variable whose address is put into a register that is
   clobbered by the vfork.  */
static
#ifdef __cplusplus
sparc_address_test (int arg)
# else
sparc_address_test (arg) int arg;
#endif
{
  static pid_t child;
  if (!child) {
    child = vfork ();
    if (child < 0) {
      perror ("vfork");
      _exit(2);
    }
    if (!child) {
      arg = getpid();
      write(-1, "", 0);
      _exit (arg);
    }
  }
}

int
main (void)
{
  pid_t parent = getpid ();
  pid_t child;

  sparc_address_test ();

  child = vfork ();

  if (child == 0) {
    /* Here is another test for sparc vfork register problems.  This
       test uses lots of local variables, at least as many local
       variables as main has allocated so far including compiler
       temporaries.  4 locals are enough for gcc 1.40.3 on a Solaris
       4.1.3 sparc, but we use 8 to be safe.  A buggy compiler should
       reuse the register of parent for one of the local variables,
       since it will think that parent can't possibly be used any more
       in this routine.  Assigning to the local variable will thus
       munge parent in the parent process.  */
    pid_t
      p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(),
      p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid();
    /* Convince the compiler that p..p7 are live; otherwise, it might
       use the same hardware register for all 8 local variables.  */
    if (p != p1 || p != p2 || p != p3 || p != p4
	|| p != p5 || p != p6 || p != p7)
      _exit(1);

    /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent
       from child file descriptors.  If the child closes a descriptor
       before it execs or exits, this munges the parent's descriptor
       as well.  Test for this by closing stdout in the child.  */
    _exit(close(fileno(stdout)) != 0);
  } else {
    int status;
    struct stat st;

    while (wait(&status) != child)
      ;
    $ac_main_return(
	 /* Was there some problem with vforking?  */
	 child < 0

	 /* Did the child fail?  (This shouldn't happen.)  */
	 || status

	 /* Did the vfork/compiler bug occur?  */
	 || parent != getpid()

	 /* Did the file descriptor bug occur?  */
	 || fstat(fileno(stdout), &st) != 0
	 );
  }
}
_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:23546: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:23549: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:23551: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:23554: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_func_vfork_works=yes
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_func_vfork_works=no
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
fi
echo "$as_me:23566: result: $ac_cv_func_vfork_works" >&5
echo "${ECHO_T}$ac_cv_func_vfork_works" >&6

fi;
if test "x$ac_cv_func_fork_works" = xcross; then
  ac_cv_func_vfork_works=ac_cv_func_vfork
  { echo "$as_me:23572: WARNING: CROSS: Result $ac_cv_func_vfork_works guessed due to cross-compiling." >&5
echo "$as_me: WARNING: CROSS: Result $ac_cv_func_vfork_works guessed due to cross-compiling." >&2;}
fi

if test "x$ac_cv_func_vfork_works" = xyes; then

cat >>confdefs.h <<\EOF
#define HAVE_WORKING_VFORK 1
EOF

else

cat >>confdefs.h <<\EOF
#define vfork fork
EOF

fi
if test "x$ac_cv_func_fork_works" = xyes; then

cat >>confdefs.h <<\EOF
#define HAVE_WORKING_FORK 1
EOF

fi

echo "$as_me:23597: checking if fopen accepts explicit binary mode" >&5
echo $ECHO_N "checking if fopen accepts explicit binary mode... $ECHO_C" >&6
if test "${cf_cv_fopen_bin_r+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	if test "$cross_compiling" = yes; then
  cf_cv_fopen_bin_r=unknown
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 23607 "configure"
#include "confdefs.h"

#include <stdio.h>
int main(void) {
	FILE *fp = fopen("conftest.tmp", "wb");
	int rc = 0;
	if (fp != 0) {
		int p, q;
		for (p = 0; p < 256; ++p) {
			fputc(p, fp);
		}
		fclose(fp);
		fp = fopen("conftest.tmp", "rb");
		if (fp != 0) {
			for (p = 0; p < 256; ++p) {
				q = fgetc(fp);
				if (q != p) {
					rc = 1;
					break;
				}
			}
		} else {
			rc = 1;
		}
	} else {
		rc = 1;
	}
	${cf_cv_main_return:-return} (rc);
}

_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:23640: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:23643: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:23645: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:23648: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_fopen_bin_r=yes
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_fopen_bin_r=no
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi

fi
echo "$as_me:23661: result: $cf_cv_fopen_bin_r" >&5
echo "${ECHO_T}$cf_cv_fopen_bin_r" >&6
test "x$cf_cv_fopen_bin_r" != xno &&
cat >>confdefs.h <<\EOF
#define USE_FOPEN_BIN_R 1
EOF

# special check for test/ditto.c

echo "$as_me:23670: checking for openpty in -lutil" >&5
echo $ECHO_N "checking for openpty in -lutil... $ECHO_C" >&6
if test "${ac_cv_lib_util_openpty+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lutil  $LIBS"
cat >"conftest.$ac_ext" <<_ACEOF
#line 23678 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply.  */
char openpty ();
int
main (void)
{
openpty ();
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:23697: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:23700: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:23703: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:23706: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_lib_util_openpty=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_lib_util_openpty=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
LIBS=$ac_check_lib_save_LIBS
fi
echo "$as_me:23717: result: $ac_cv_lib_util_openpty" >&5
echo "${ECHO_T}$ac_cv_lib_util_openpty" >&6
if test "$ac_cv_lib_util_openpty" = yes; then
  cf_cv_lib_util=yes
else
  cf_cv_lib_util=no
fi

echo "$as_me:23725: checking for openpty header" >&5
echo $ECHO_N "checking for openpty header... $ECHO_C" >&6
if test "${cf_cv_func_openpty+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cf_save_LIBS="$LIBS"
	test "$cf_cv_lib_util" = yes && {
cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lutil; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"
 }
	for cf_header in pty.h libutil.h util.h
	do
	cat >"conftest.$ac_ext" <<_ACEOF
#line 23752 "configure"
#include "confdefs.h"

#include <$cf_header>

int
main (void)
{

	int x = openpty((int *)0, (int *)0, (char *)0,
				   (struct termios *)0, (struct winsize *)0);

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:23769: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:23772: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:23775: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:23778: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

		cf_cv_func_openpty=$cf_header
		break

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5

		cf_cv_func_openpty=no

fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
	done
	LIBS="$cf_save_LIBS"

fi
echo "$as_me:23796: result: $cf_cv_func_openpty" >&5
echo "${ECHO_T}$cf_cv_func_openpty" >&6

if test "$cf_cv_func_openpty" != no ; then

cat >>confdefs.h <<EOF
#define USE_OPENPTY_HEADER <$cf_cv_func_openpty>
EOF

cat >>confdefs.h <<\EOF
#define USE_XTERM_PTY 1
EOF

	if test "x$cf_cv_lib_util" = xyes ; then

cf_add_libs="$TEST_LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -lutil; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
TEST_LIBS="$cf_add_libs"

	fi
fi

if test "$with_hashed_db" != no ; then

cat >>confdefs.h <<\EOF
#define USE_HASHED_DB 1
EOF

case $with_hashed_db in
(yes|*able*)
	;;
(*)
	if test -d "$with_hashed_db" ; then

if test -n "$with_hashed_db/include" ; then
  for cf_add_incdir in $with_hashed_db/include
  do
	while test "$cf_add_incdir" != /usr/include
	do
	  if test -d "$cf_add_incdir"
	  then
		cf_have_incdir=no
		if test -n "$CFLAGS$CPPFLAGS" ; then
		  # a loop is needed to ensure we can add subdirs of existing dirs
		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
			  cf_have_incdir=yes; break
			fi
		  done
		fi

		if test "$cf_have_incdir" = no ; then
		  if test "$cf_add_incdir" = /usr/local/include ; then
			if test "$GCC" = yes
			then
			  cf_save_CPPFLAGS=$CPPFLAGS

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"

			  cat >"conftest.$ac_ext" <<_ACEOF
#line 23869 "configure"
#include "confdefs.h"
#include <stdio.h>
int
main (void)
{
printf("Hello")
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:23881: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:23884: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:23887: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:23890: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  :
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_have_incdir=yes
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
			  CPPFLAGS=$cf_save_CPPFLAGS
			fi
		  fi
		fi

		if test "$cf_have_incdir" = no ; then
		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6

echo "${as_me:-configure}:23907: testing adding $cf_add_incdir to include-path ..." 1>&5

		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"

		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
		  test "$cf_top_incdir" = "$cf_add_incdir" && break
		  cf_add_incdir="$cf_top_incdir"
		else
		  break
		fi
	  else
		break
	  fi
	done
  done
fi

if test -n "$with_hashed_db/lib" ; then
	for cf_add_libdir in $with_hashed_db/lib
	do
		if test "$cf_add_libdir" = /usr/lib ; then
			:
		elif test -d "$cf_add_libdir"
		then
			cf_have_libdir=no
			if test -n "$LDFLAGS$LIBS" ; then
				# a loop is needed to ensure we can add subdirs of existing dirs
				for cf_test_libdir in $LDFLAGS $LIBS ; do
					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
						cf_have_libdir=yes; break
					fi
				done
			fi
			if test "$cf_have_libdir" = no ; then
				test -n "$verbose" && echo "	adding $cf_add_libdir to library-path" 1>&6

echo "${as_me:-configure}:23943: testing adding $cf_add_libdir to library-path ..." 1>&5

				LDFLAGS="-L$cf_add_libdir $LDFLAGS"
			fi
		fi
	done
fi

	else
		case "$with_hashed_db" in
		(./*|../*|/*)
			{ echo "$as_me:23954: WARNING: no such directory $with_hashed_db" >&5
echo "$as_me: WARNING: no such directory $with_hashed_db" >&2;}
			;;
		(*)

cf_search=

test "x$prefix" != "xNONE" && \
test -d "$prefix" && \
 {
	test -n "$verbose" && echo "	... testing for include-directories under $prefix"
	test -d "$prefix/include" &&          cf_search="$cf_search $prefix/include"
	test -d "$prefix/include/$with_hashed_db" &&       cf_search="$cf_search $prefix/include/$with_hashed_db"
	test -d "$prefix/include/$with_hashed_db/include" &&    cf_search="$cf_search $prefix/include/$with_hashed_db/include"
	test -d "$prefix/$with_hashed_db/include" &&       cf_search="$cf_search $prefix/$with_hashed_db/include"
	test -d "$prefix/$with_hashed_db/include/$with_hashed_db" &&    cf_search="$cf_search $prefix/$with_hashed_db/include/$with_hashed_db"
}

for cf_subdir_prefix in \
	/usr \
	/usr/local \
	/usr/pkg \
	/opt \
	/opt/local \
	$HOME
do

test "x$cf_subdir_prefix" != "x$prefix" && \
test -d "$cf_subdir_prefix" && \
{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
	test -n "$verbose" && echo "	... testing for include-directories under $cf_subdir_prefix"
	test -d "$cf_subdir_prefix/include" &&          cf_search="$cf_search $cf_subdir_prefix/include"
	test -d "$cf_subdir_prefix/include/$with_hashed_db" &&       cf_search="$cf_search $cf_subdir_prefix/include/$with_hashed_db"
	test -d "$cf_subdir_prefix/include/$with_hashed_db/include" &&    cf_search="$cf_search $cf_subdir_prefix/include/$with_hashed_db/include"
	test -d "$cf_subdir_prefix/$with_hashed_db/include" &&       cf_search="$cf_search $cf_subdir_prefix/$with_hashed_db/include"
	test -d "$cf_subdir_prefix/$with_hashed_db/include/$with_hashed_db" &&    cf_search="$cf_search $cf_subdir_prefix/$with_hashed_db/include/$with_hashed_db"
}

done

	for cf_item in $cf_search
	do
		case "$cf_item" in
		(*/$with_hashed_db)

if test -n "$cf_item" ; then
  for cf_add_incdir in $cf_item
  do
	while test "$cf_add_incdir" != /usr/include
	do
	  if test -d "$cf_add_incdir"
	  then
		cf_have_incdir=no
		if test -n "$CFLAGS$CPPFLAGS" ; then
		  # a loop is needed to ensure we can add subdirs of existing dirs
		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
			  cf_have_incdir=yes; break
			fi
		  done
		fi

		if test "$cf_have_incdir" = no ; then
		  if test "$cf_add_incdir" = /usr/local/include ; then
			if test "$GCC" = yes
			then
			  cf_save_CPPFLAGS=$CPPFLAGS

	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"

			  cat >"conftest.$ac_ext" <<_ACEOF
#line 24026 "configure"
#include "confdefs.h"
#include <stdio.h>
int
main (void)
{
printf("Hello")
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:24038: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:24041: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:24044: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:24047: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  :
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_have_incdir=yes
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
			  CPPFLAGS=$cf_save_CPPFLAGS
			fi
		  fi
		fi

		if test "$cf_have_incdir" = no ; then
		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6

echo "${as_me:-configure}:24064: testing adding $cf_add_incdir to include-path ..." 1>&5

		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"

		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
		  test "$cf_top_incdir" = "$cf_add_incdir" && break
		  cf_add_incdir="$cf_top_incdir"
		else
		  break
		fi
	  else
		break
	  fi
	done
  done
fi

			;;
		esac
	done

cf_search=

test "x$prefix" != "xNONE" && \
test -d "$prefix" && \
 {
	test -n "$verbose" && echo "	... testing for lib-directories under $prefix"
	test -d "$prefix/lib" &&          cf_search="$cf_search $prefix/lib"
	test -d "$prefix/lib/$with_hashed_db" &&       cf_search="$cf_search $prefix/lib/$with_hashed_db"
	test -d "$prefix/lib/$with_hashed_db/lib" &&    cf_search="$cf_search $prefix/lib/$with_hashed_db/lib"
	test -d "$prefix/$with_hashed_db/lib" &&       cf_search="$cf_search $prefix/$with_hashed_db/lib"
	test -d "$prefix/$with_hashed_db/lib/$with_hashed_db" &&    cf_search="$cf_search $prefix/$with_hashed_db/lib/$with_hashed_db"
}

for cf_subdir_prefix in \
	/usr \
	/usr/local \
	/usr/pkg \
	/opt \
	/opt/local \
	$HOME
do

test "x$cf_subdir_prefix" != "x$prefix" && \
test -d "$cf_subdir_prefix" && \
{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
	test -n "$verbose" && echo "	... testing for lib-directories under $cf_subdir_prefix"
	test -d "$cf_subdir_prefix/lib" &&          cf_search="$cf_search $cf_subdir_prefix/lib"
	test -d "$cf_subdir_prefix/lib/$with_hashed_db" &&       cf_search="$cf_search $cf_subdir_prefix/lib/$with_hashed_db"
	test -d "$cf_subdir_prefix/lib/$with_hashed_db/lib" &&    cf_search="$cf_search $cf_subdir_prefix/lib/$with_hashed_db/lib"
	test -d "$cf_subdir_prefix/$with_hashed_db/lib" &&       cf_search="$cf_search $cf_subdir_prefix/$with_hashed_db/lib"
	test -d "$cf_subdir_prefix/$with_hashed_db/lib/$with_hashed_db" &&    cf_search="$cf_search $cf_subdir_prefix/$with_hashed_db/lib/$with_hashed_db"
}

done

	for cf_item in $cf_search
	do
		case "$cf_item" in
		(*/$with_hashed_db)

if test -n "$cf_item" ; then
	for cf_add_libdir in $cf_item
	do
		if test "$cf_add_libdir" = /usr/lib ; then
			:
		elif test -d "$cf_add_libdir"
		then
			cf_have_libdir=no
			if test -n "$LDFLAGS$LIBS" ; then
				# a loop is needed to ensure we can add subdirs of existing dirs
				for cf_test_libdir in $LDFLAGS $LIBS ; do
					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
						cf_have_libdir=yes; break
					fi
				done
			fi
			if test "$cf_have_libdir" = no ; then
				test -n "$verbose" && echo "	adding $cf_add_libdir to library-path" 1>&6

echo "${as_me:-configure}:24144: testing adding $cf_add_libdir to library-path ..." 1>&5

				LDFLAGS="-L$cf_add_libdir $LDFLAGS"
			fi
		fi
	done
fi

			;;
		esac
	done

			;;
		esac
	fi
esac

echo "$as_me:24161: checking for db.h" >&5
echo $ECHO_N "checking for db.h... $ECHO_C" >&6
if test "${ac_cv_header_db_h+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 24167 "configure"
#include "confdefs.h"
#include <db.h>
_ACEOF
if { (eval echo "$as_me:24171: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:24177: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_c_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  ac_cv_header_db_h=yes
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  ac_cv_header_db_h=no
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:24196: result: $ac_cv_header_db_h" >&5
echo "${ECHO_T}$ac_cv_header_db_h" >&6
if test "$ac_cv_header_db_h" = yes; then

echo "$as_me:24200: checking for version of db" >&5
echo $ECHO_N "checking for version of db... $ECHO_C" >&6
if test "${cf_cv_hashed_db_version+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cf_cv_hashed_db_version=unknown

for cf_db_version in 1 2 3 4 5 6
do

echo "${as_me:-configure}:24211: testing checking for db version $cf_db_version ..." 1>&5

	cat >"conftest.$ac_ext" <<_ACEOF
#line 24214 "configure"
#include "confdefs.h"

$ac_includes_default
#include <db.h>

#ifdef DB_VERSION_MAJOR
	/* db2 (DB_VERSION_MAJOR=2) has also DB_VERSION_MINOR, tested with 7 */
#if $cf_db_version == DB_VERSION_MAJOR
	/* ok */
#else
	make an error
#endif
#else
#if $cf_db_version == 1
	/* ok: assuming this is DB 1.8.5 */
#else
	make an error
#endif
#endif

int
main (void)
{
DBT *foo = 0
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:24244: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:24247: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:24250: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:24253: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

	cf_cv_hashed_db_version=$cf_db_version
	break

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
done

fi
echo "$as_me:24267: result: $cf_cv_hashed_db_version" >&5
echo "${ECHO_T}$cf_cv_hashed_db_version" >&6

if test "$cf_cv_hashed_db_version" = unknown ; then
	{ { echo "$as_me:24271: error: Cannot determine version of db" >&5
echo "$as_me: error: Cannot determine version of db" >&2;}
   { (exit 1); exit 1; }; }
else

echo "$as_me:24276: checking for db libraries" >&5
echo $ECHO_N "checking for db libraries... $ECHO_C" >&6
if test "${cf_cv_hashed_db_libs+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cf_cv_hashed_db_libs=unknown
for cf_db_libs in "" db$cf_cv_hashed_db_version db-$cf_cv_hashed_db_version db ''
do
	cf_save_libs="$LIBS"
	if test -n "$cf_db_libs"; then

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -l$cf_db_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

	fi

echo "${as_me:-configure}:24306: testing checking for library $cf_db_libs ..." 1>&5

	cat >"conftest.$ac_ext" <<_ACEOF
#line 24309 "configure"
#include "confdefs.h"

$ac_includes_default
#include <db.h>

int
main (void)
{

	char *path = "/tmp/foo";
#ifdef DB_VERSION_MAJOR
#if DB_VERSION_MAJOR >= 4
	DB *result = 0;
	db_create(&result, NULL, 0);
	result->open(result,
		NULL,
		path,
		path,
		DB_HASH,
		DB_CREATE,
		0644);
#elif DB_VERSION_MAJOR >= 3
	DB *result = 0;
	db_create(&result, NULL, 0);
	result->open(result,
		path,
		path,
		DB_HASH,
		DB_CREATE,
		0644);
#elif DB_VERSION_MAJOR >= 2
	DB *result = 0;
	db_open(path,
		DB_HASH,
		DB_CREATE,
		0644,
		(DB_ENV *) 0,
		(DB_INFO *) 0,
		&result);
#endif /* DB_VERSION_MAJOR */
#else
	DB *result = dbopen(path,
		     2,
		     0644,
		     DB_HASH,
		     0);
#endif
	${cf_cv_main_return:-return}(result != 0)

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:24364: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:24367: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:24370: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:24373: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

	if test -n "$cf_db_libs" ; then
		cf_cv_hashed_db_libs=$cf_db_libs
	else
		cf_cv_hashed_db_libs=default
	fi
	LIBS="$cf_save_libs"
	break

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
	LIBS="$cf_save_libs"
done

fi
echo "$as_me:24393: result: $cf_cv_hashed_db_libs" >&5
echo "${ECHO_T}$cf_cv_hashed_db_libs" >&6

	if test "$cf_cv_hashed_db_libs" = unknown ; then
		{ { echo "$as_me:24397: error: Cannot determine library for db" >&5
echo "$as_me: error: Cannot determine library for db" >&2;}
   { (exit 1); exit 1; }; }
	elif test "$cf_cv_hashed_db_libs" != default ; then

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -l$cf_cv_hashed_db_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

	fi
fi

else

	{ { echo "$as_me:24423: error: Cannot find db.h" >&5
echo "$as_me: error: Cannot find db.h" >&2;}
   { (exit 1); exit 1; }; }

fi

fi

if test -z "$cf_user_CFLAGS" && test "$enable_leaks" = yes ; then
	CFLAGS=`echo "${CFLAGS}" | sed -e 's%-g %%' -e 's%-g$%%' -e 's%[	]% %g' -e 's% [ ]*% %g' -e 's%^ %%' -e 's% $%%'`
	CXXFLAGS=`echo "${CXXFLAGS}" | sed -e 's%-g %%' -e 's%-g$%%' -e 's%[	]% %g' -e 's% [ ]*% %g' -e 's%^ %%' -e 's% $%%'`
fi

# Just in case, check if the C compiler has a bool type.

echo "$as_me:24438: checking if we should include stdbool.h" >&5
echo $ECHO_N "checking if we should include stdbool.h... $ECHO_C" >&6

if test "${cf_cv_header_stdbool_h+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cat >"conftest.$ac_ext" <<_ACEOF
#line 24446 "configure"
#include "confdefs.h"

int
main (void)
{
bool foo = false
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:24458: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:24461: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:24464: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:24467: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_header_stdbool_h=0
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cat >"conftest.$ac_ext" <<_ACEOF
#line 24474 "configure"
#include "confdefs.h"

#ifndef __BEOS__
#include <stdbool.h>
#endif

int
main (void)
{
bool foo = false
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:24490: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:24493: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:24496: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:24499: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_header_stdbool_h=1
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_header_stdbool_h=0
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi

if test "$cf_cv_header_stdbool_h" = 1
then	echo "$as_me:24513: result: yes" >&5
echo "${ECHO_T}yes" >&6
else	echo "$as_me:24515: result: no" >&5
echo "${ECHO_T}no" >&6
fi

echo "$as_me:24519: checking for builtin bool type" >&5
echo $ECHO_N "checking for builtin bool type... $ECHO_C" >&6

if test "${cf_cv_cc_bool_type+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cat >"conftest.$ac_ext" <<_ACEOF
#line 24527 "configure"
#include "confdefs.h"

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

int
main (void)
{
bool x = false
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:24542: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:24545: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:24548: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:24551: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_cc_bool_type=1
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_cc_bool_type=0
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi

if test "$cf_cv_cc_bool_type" = 1
then	echo "$as_me:24564: result: yes" >&5
echo "${ECHO_T}yes" >&6
else	echo "$as_me:24566: result: no" >&5
echo "${ECHO_T}no" >&6
fi

# Check for C++ compiler characteristics (and ensure that it's there!)
if test -n "$CXX" ; then
	ac_ext=cc
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
ac_main_return="return"

if test -n "$GXX" ; then

	cf_save="$LIBS"
	LIBS="$LIBS $CXXLIBS"
	echo "$as_me:24583: checking if we already have C++ library" >&5
echo $ECHO_N "checking if we already have C++ library... $ECHO_C" >&6
	cat >"conftest.$ac_ext" <<_ACEOF
#line 24586 "configure"
#include "confdefs.h"

			#include <iostream>
int
main (void)
{

			std::cout << "Hello World!" << std::endl;
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:24600: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:24603: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:24606: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:24609: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_have_libstdcpp=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_have_libstdcpp=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
	echo "$as_me:24618: result: $cf_have_libstdcpp" >&5
echo "${ECHO_T}$cf_have_libstdcpp" >&6
	LIBS="$cf_save"

	if test "$cf_have_libstdcpp" != yes
	then
		case "$cf_cv_system_name" in
		(os2*)
			if test -z "`g++ -dM -E - < /dev/null | grep __KLIBC__`"; then
				cf_stdcpp_libname=stdcpp
			else
				cf_stdcpp_libname=stdc++
			fi
			;;
		(*)
			cf_stdcpp_libname=stdc++
			;;
		esac

		echo "$as_me:24637: checking for library $cf_stdcpp_libname" >&5
echo $ECHO_N "checking for library $cf_stdcpp_libname... $ECHO_C" >&6
if test "${cf_cv_libstdcpp+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

			cf_save="$LIBS"
			LIBS="$LIBS $CXXLIBS"

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -l$cf_stdcpp_libname; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

		cat >"conftest.$ac_ext" <<_ACEOF
#line 24663 "configure"
#include "confdefs.h"

				#include <iostream>
int
main (void)
{

				std::cout << "Hello World!" << std::endl;
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:24677: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:24680: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:24683: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:24686: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_libstdcpp=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_libstdcpp=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
			LIBS="$cf_save"

fi
echo "$as_me:24698: result: $cf_cv_libstdcpp" >&5
echo "${ECHO_T}$cf_cv_libstdcpp" >&6
		test "$cf_cv_libstdcpp" = yes && {
cf_add_libs="$CXXLIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -l$cf_stdcpp_libname; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
CXXLIBS="$cf_add_libs"
 }
	fi
fi

	echo "$as_me:24720: checking whether $CXX understands -c and -o together" >&5
echo $ECHO_N "checking whether $CXX understands -c and -o together... $ECHO_C" >&6
if test "${cf_cv_prog_CXX_c_o+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cat > conftest.$ac_ext <<CF_EOF
int main(void)
{
	${cf_cv_main_return:-return}(0);
}
CF_EOF
# We do the test twice because some compilers refuse to overwrite an
# existing .o file with -o, though they will create one.
ac_try='$CXX $CXXFLAGS $CPPFLAGS -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
if { (eval echo "$as_me:24735: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:24738: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
  test -f conftest2.$ac_objext && { (eval echo "$as_me:24740: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:24743: \$? = $ac_status" >&5
  (exit "$ac_status"); };
then
  eval cf_cv_prog_CXX_c_o=yes
else
  eval cf_cv_prog_CXX_c_o=no
fi
rm -rf ./conftest*

fi
if test "$cf_cv_prog_CXX_c_o" = yes; then
  echo "$as_me:24754: result: yes" >&5
echo "${ECHO_T}yes" >&6
else
  echo "$as_me:24757: result: no" >&5
echo "${ECHO_T}no" >&6
fi

	case "$GXX_VERSION" in
	(1.*|2.[0-6]*|[1-9][0-9].*)
		cf_cxx_library=yes
		;;
	(*-2.7*|2.7*)

cf_cxx_library=unknown
case "$cf_cv_system_name" in
(os2*)
	cf_gpp_libname=gpp
	;;
(*)
	cf_gpp_libname=g++
	;;
esac
if test "$GXX" = yes; then
	echo "$as_me:24777: checking for lib$cf_gpp_libname" >&5
echo $ECHO_N "checking for lib$cf_gpp_libname... $ECHO_C" >&6
	cf_save="$LIBS"

cf_add_libs="$LIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -l$cf_gpp_libname; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
LIBS="$cf_add_libs"

	cat >"conftest.$ac_ext" <<_ACEOF
#line 24798 "configure"
#include "confdefs.h"

#include <$cf_gpp_libname/builtin.h>

int
main (void)
{
two_arg_error_handler_t foo2 = lib_error_handler
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:24812: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:24815: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:24818: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:24821: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cxx_library=yes

cf_add_libs="$CXXLIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -l$cf_gpp_libname; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
CXXLIBS="$cf_add_libs"

	 if test "$cf_gpp_libname" = cpp ; then

cat >>confdefs.h <<\EOF
#define HAVE_GPP_BUILTIN_H 1
EOF

	 else

cat >>confdefs.h <<\EOF
#define HAVE_GXX_BUILTIN_H 1
EOF

	 fi
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cat >"conftest.$ac_ext" <<_ACEOF
#line 24858 "configure"
#include "confdefs.h"

#include <builtin.h>

int
main (void)
{
two_arg_error_handler_t foo2 = lib_error_handler
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:24872: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:24875: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:24878: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:24881: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cxx_library=yes

cf_add_libs="$CXXLIBS"
# reverse order
cf_add_0lib=
for cf_add_1lib in -l$cf_gpp_libname; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
# filter duplicates
for cf_add_1lib in $cf_add_0lib; do
	for cf_add_2lib in $cf_add_libs; do
		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
			cf_add_1lib=
			break
		fi
	done
	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
done
CXXLIBS="$cf_add_libs"

cat >>confdefs.h <<\EOF
#define HAVE_BUILTIN_H 1
EOF

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cxx_library=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
	LIBS="$cf_save"
	echo "$as_me:24914: result: $cf_cxx_library" >&5
echo "${ECHO_T}$cf_cxx_library" >&6
fi

		;;
	(*)
		cf_cxx_library=no
		;;
	esac

	ac_ext=cc
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
ac_main_return="return"
echo "$as_me:24930: checking how to run the C++ preprocessor" >&5
echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
if test -z "$CXXCPP"; then
  if test "${ac_cv_prog_CXXCPP+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
      # Double quotes because CXXCPP needs to be expanded
    for CXXCPP in "$CXX -E" "/lib/cpp"
    do
      ac_preproc_ok=false
for ac_cxx_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # 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 >"conftest.$ac_ext" <<_ACEOF
#line 24947 "configure"
#include "confdefs.h"
#include <assert.h>
                     Syntax error
_ACEOF
if { (eval echo "$as_me:24952: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:24958: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_cxx_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  :
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err "conftest.$ac_ext"

  # OK, works on sane cases.  Now check whether non-existent headers
  # can be detected and how.
  cat >"conftest.$ac_ext" <<_ACEOF
#line 24981 "configure"
#include "confdefs.h"
#include <ac_nonexistent.h>
_ACEOF
if { (eval echo "$as_me:24985: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:24991: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_cxx_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  # Broken: success on invalid input.
continue
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err "conftest.$ac_ext"

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

    done
    ac_cv_prog_CXXCPP=$CXXCPP

fi
  CXXCPP=$ac_cv_prog_CXXCPP
else
  ac_cv_prog_CXXCPP=$CXXCPP
fi
echo "$as_me:25028: result: $CXXCPP" >&5
echo "${ECHO_T}$CXXCPP" >&6
ac_preproc_ok=false
for ac_cxx_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # 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 >"conftest.$ac_ext" <<_ACEOF
#line 25038 "configure"
#include "confdefs.h"
#include <assert.h>
                     Syntax error
_ACEOF
if { (eval echo "$as_me:25043: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:25049: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_cxx_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  :
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err "conftest.$ac_ext"

  # OK, works on sane cases.  Now check whether non-existent headers
  # can be detected and how.
  cat >"conftest.$ac_ext" <<_ACEOF
#line 25072 "configure"
#include "confdefs.h"
#include <ac_nonexistent.h>
_ACEOF
if { (eval echo "$as_me:25076: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:25082: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_cxx_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  # Broken: success on invalid input.
continue
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err "conftest.$ac_ext"

done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.err "conftest.$ac_ext"
if $ac_preproc_ok; then
  :
else
  { { echo "$as_me:25110: error: C++ preprocessor \"$CXXCPP\" fails sanity check" >&5
echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check" >&2;}
   { (exit 1); exit 1; }; }
fi

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

for ac_header in typeinfo
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
echo "$as_me:25125: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 25131 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:25135: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:25141: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_cxx_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  eval "$as_ac_Header=yes"
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  eval "$as_ac_Header=no"
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:25160: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
EOF

fi
done

for ac_header in iostream
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
echo "$as_me:25173: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 25179 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
if { (eval echo "$as_me:25183: \"$ac_cpp "conftest.$ac_ext"\"") >&5
  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
  ac_status=$?
  $EGREP -v '^ *\+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  echo "$as_me:25189: \$? = $ac_status" >&5
  (exit "$ac_status"); } >/dev/null; then
  if test -s conftest.err; then
    ac_cpp_err=$ac_cxx_preproc_warn_flag
  else
    ac_cpp_err=
  fi
else
  ac_cpp_err=yes
fi
if test -z "$ac_cpp_err"; then
  eval "$as_ac_Header=yes"
else
  echo "$as_me: failed program was:" >&5
  cat "conftest.$ac_ext" >&5
  eval "$as_ac_Header=no"
fi
rm -f conftest.err "conftest.$ac_ext"
fi
echo "$as_me:25208: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
  cat >>confdefs.h <<EOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
EOF

fi
done

if test x"$ac_cv_header_iostream" = xyes ; then
	echo "$as_me:25219: checking if iostream uses std-namespace" >&5
echo $ECHO_N "checking if iostream uses std-namespace... $ECHO_C" >&6
	cat >"conftest.$ac_ext" <<_ACEOF
#line 25222 "configure"
#include "confdefs.h"

#include <iostream>
using std::endl;
using std::cerr;
int
main (void)
{

cerr << "testing" << endl;

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:25239: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:25242: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:25245: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:25248: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_iostream_namespace=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_iostream_namespace=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
	echo "$as_me:25257: result: $cf_iostream_namespace" >&5
echo "${ECHO_T}$cf_iostream_namespace" >&6
	if test "$cf_iostream_namespace" = yes ; then

cat >>confdefs.h <<\EOF
#define IOSTREAM_NAMESPACE 1
EOF

	fi
fi

echo "$as_me:25268: checking if we should include stdbool.h" >&5
echo $ECHO_N "checking if we should include stdbool.h... $ECHO_C" >&6

if test "${cf_cv_header_stdbool_h+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cat >"conftest.$ac_ext" <<_ACEOF
#line 25276 "configure"
#include "confdefs.h"

int
main (void)
{
bool foo = false
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:25288: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:25291: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:25294: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:25297: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_header_stdbool_h=0
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cat >"conftest.$ac_ext" <<_ACEOF
#line 25304 "configure"
#include "confdefs.h"

#ifndef __BEOS__
#include <stdbool.h>
#endif

int
main (void)
{
bool foo = false
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:25320: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:25323: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:25326: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:25329: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_header_stdbool_h=1
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_header_stdbool_h=0
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi

if test "$cf_cv_header_stdbool_h" = 1
then	echo "$as_me:25343: result: yes" >&5
echo "${ECHO_T}yes" >&6
else	echo "$as_me:25345: result: no" >&5
echo "${ECHO_T}no" >&6
fi

echo "$as_me:25349: checking for builtin bool type" >&5
echo $ECHO_N "checking for builtin bool type... $ECHO_C" >&6

if test "${cf_cv_builtin_bool+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	cat >"conftest.$ac_ext" <<_ACEOF
#line 25357 "configure"
#include "confdefs.h"

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

int
main (void)
{
bool x = false
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:25372: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:25375: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:25378: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:25381: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_builtin_bool=1
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_builtin_bool=0
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

fi

if test "$cf_cv_builtin_bool" = 1
then	echo "$as_me:25394: result: yes" >&5
echo "${ECHO_T}yes" >&6
else	echo "$as_me:25396: result: no" >&5
echo "${ECHO_T}no" >&6
fi

echo "$as_me:25400: checking for bool" >&5
echo $ECHO_N "checking for bool... $ECHO_C" >&6
if test "${ac_cv_type_bool+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 25406 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>

#if defined(__cplusplus)

#ifdef HAVE_GXX_BUILTIN_H
#include <g++/builtin.h>
#elif HAVE_GPP_BUILTIN_H
#include <gpp/builtin.h>
#elif HAVE_BUILTIN_H
#include <builtin.h>
#endif

#else

#if $cf_cv_header_stdbool_h
#include <stdbool.h>
#endif

#endif

int
main (void)
{
if ((bool *) 0)
  return 0;
if (sizeof (bool))
  return 0;
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:25442: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:25445: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:25448: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:25451: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_type_bool=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_type_bool=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:25461: result: $ac_cv_type_bool" >&5
echo "${ECHO_T}$ac_cv_type_bool" >&6

echo "$as_me:25464: checking size of bool" >&5
echo $ECHO_N "checking size of bool... $ECHO_C" >&6
if test "${ac_cv_sizeof_bool+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test "$ac_cv_type_bool" = yes; then
  if test "$cross_compiling" = yes; then
  # Depending upon the size, compute the lo and hi bounds.
cat >"conftest.$ac_ext" <<_ACEOF
#line 25473 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>

#if defined(__cplusplus)

#ifdef HAVE_GXX_BUILTIN_H
#include <g++/builtin.h>
#elif HAVE_GPP_BUILTIN_H
#include <gpp/builtin.h>
#elif HAVE_BUILTIN_H
#include <builtin.h>
#endif

#else

#if $cf_cv_header_stdbool_h
#include <stdbool.h>
#endif

#endif

int
main (void)
{
int _array_ [1 - 2 * !((sizeof (bool)) >= 0)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:25506: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:25509: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:25512: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:25515: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_lo=0 ac_mid=0
  while :; do
    cat >"conftest.$ac_ext" <<_ACEOF
#line 25520 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>

#if defined(__cplusplus)

#ifdef HAVE_GXX_BUILTIN_H
#include <g++/builtin.h>
#elif HAVE_GPP_BUILTIN_H
#include <gpp/builtin.h>
#elif HAVE_BUILTIN_H
#include <builtin.h>
#endif

#else

#if $cf_cv_header_stdbool_h
#include <stdbool.h>
#endif

#endif

int
main (void)
{
int _array_ [1 - 2 * !((sizeof (bool)) <= $ac_mid)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:25553: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:25556: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:25559: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:25562: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_hi=$ac_mid; break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1`
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  done
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_hi=-1 ac_mid=-1
  while :; do
    cat >"conftest.$ac_ext" <<_ACEOF
#line 25578 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>

#if defined(__cplusplus)

#ifdef HAVE_GXX_BUILTIN_H
#include <g++/builtin.h>
#elif HAVE_GPP_BUILTIN_H
#include <gpp/builtin.h>
#elif HAVE_BUILTIN_H
#include <builtin.h>
#endif

#else

#if $cf_cv_header_stdbool_h
#include <stdbool.h>
#endif

#endif

int
main (void)
{
int _array_ [1 - 2 * !((sizeof (bool)) >= $ac_mid)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:25611: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:25614: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:25617: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:25620: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_lo=$ac_mid; break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"`
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  done
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
# Binary search between lo and hi bounds.
while test "x$ac_lo" != "x$ac_hi"; do
  ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"`
  cat >"conftest.$ac_ext" <<_ACEOF
#line 25636 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>

#if defined(__cplusplus)

#ifdef HAVE_GXX_BUILTIN_H
#include <g++/builtin.h>
#elif HAVE_GPP_BUILTIN_H
#include <gpp/builtin.h>
#elif HAVE_BUILTIN_H
#include <builtin.h>
#endif

#else

#if $cf_cv_header_stdbool_h
#include <stdbool.h>
#endif

#endif

int
main (void)
{
int _array_ [1 - 2 * !((sizeof (bool)) <= $ac_mid)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:25669: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:25672: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:25675: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:25678: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_hi=$ac_mid
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_lo=`expr "$ac_mid" + 1`
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
done
ac_cv_sizeof_bool=$ac_lo
else
  if test "$cross_compiling" = yes; then
  { { echo "$as_me:25691: error: cannot run test program while cross compiling" >&5
echo "$as_me: error: cannot run test program while cross compiling" >&2;}
   { (exit 1); exit 1; }; }
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 25696 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>

#if defined(__cplusplus)

#ifdef HAVE_GXX_BUILTIN_H
#include <g++/builtin.h>
#elif HAVE_GPP_BUILTIN_H
#include <gpp/builtin.h>
#elif HAVE_BUILTIN_H
#include <builtin.h>
#endif

#else

#if $cf_cv_header_stdbool_h
#include <stdbool.h>
#endif

#endif

int
main (void)
{
FILE *f = fopen ("conftest.val", "w");
if (!f)
  $ac_main_return (1);
fprintf (f, "%ld", (long)(sizeof (bool)));
fclose (f);
  ;
  return 0;
}
_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:25733: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:25736: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:25738: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:25741: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_sizeof_bool=`cat conftest.val`
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
fi
rm -f conftest.val
else
  ac_cv_sizeof_bool=0
fi
fi
echo "$as_me:25757: result: $ac_cv_sizeof_bool" >&5
echo "${ECHO_T}$ac_cv_sizeof_bool" >&6
cat >>confdefs.h <<EOF
#define SIZEOF_BOOL $ac_cv_sizeof_bool
EOF

echo "$as_me:25763: checking for type of bool" >&5
echo $ECHO_N "checking for type of bool... $ECHO_C" >&6
if test "${cf_cv_type_of_bool+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	rm -f cf_test.out
	if test "$cross_compiling" = yes; then

		case x$ac_cv_sizeof_bool in
		(x1) cf_cv_type_of_bool="unsigned char";;
		(x2) cf_cv_type_of_bool="unsigned short";;
		(x4) cf_cv_type_of_bool="unsigned int";;
		(x8) cf_cv_type_of_bool="unsigned long";;
		(*)  cf_cv_type_of_bool=unknown;;
		esac

else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 25782 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>

#if defined(__cplusplus)

#ifdef HAVE_GXX_BUILTIN_H
#include <g++/builtin.h>
#elif HAVE_GPP_BUILTIN_H
#include <gpp/builtin.h>
#elif HAVE_BUILTIN_H
#include <builtin.h>
#endif

#else

#if $cf_cv_header_stdbool_h
#include <stdbool.h>
#endif

#endif

int main(void)
{
	FILE *fp = fopen("cf_test.out", "w");
	if (fp != 0) {
		bool x = true;
		if ((bool)(-x) >= 0)
			fputs("unsigned ", fp);
		if (sizeof(x) == sizeof(int))       fputs("int",  fp);
		else if (sizeof(x) == sizeof(char)) fputs("char", fp);
		else if (sizeof(x) == sizeof(short))fputs("short",fp);
		else if (sizeof(x) == sizeof(long)) fputs("long", fp);
		fclose(fp);
	}
	${cf_cv_main_return:-return}(0);
}

_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:25824: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:25827: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:25829: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:25832: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_type_of_bool=`cat cf_test.out`
		 if test -z "$cf_cv_type_of_bool"; then
		   cf_cv_type_of_bool=unknown
		 fi
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_type_of_bool=unknown
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
	rm -f cf_test.out

fi
echo "$as_me:25849: result: $cf_cv_type_of_bool" >&5
echo "${ECHO_T}$cf_cv_type_of_bool" >&6

if test "$cf_cv_type_of_bool" = unknown ; then
	case .$NCURSES_BOOL in
	(.auto|.) NCURSES_BOOL=unsigned;;
	esac
	{ echo "$as_me:25856: WARNING: Assuming $NCURSES_BOOL for type of bool" >&5
echo "$as_me: WARNING: Assuming $NCURSES_BOOL for type of bool" >&2;}
	cf_cv_type_of_bool=$NCURSES_BOOL
fi

echo "$as_me:25861: checking for special defines needed for etip.h" >&5
echo $ECHO_N "checking for special defines needed for etip.h... $ECHO_C" >&6
cf_save_CXXFLAGS="$CXXFLAGS"
cf_result="none"

# etip.h includes ncurses.h which includes ncurses_dll.h
# But ncurses_dll.h is generated - fix here.
test -d include || mkdir include
test -f include/ncurses_dll.h || sed -e 's/@NCURSES_WRAP_PREFIX@/'$NCURSES_WRAP_PREFIX'/g' "${srcdir}/include/ncurses_dll.h.in" >include/ncurses_dll.h

for cf_math in "" MATH_H
do
for cf_excp in "" MATH_EXCEPTION
do
	CXXFLAGS="$cf_save_CXXFLAGS -I${srcdir}/c++ -I${srcdir}/menu -Iinclude -I${srcdir}/include"
	test -n "$cf_math" && CXXFLAGS="$CXXFLAGS -DETIP_NEEDS_${cf_math}"
	test -n "$cf_excp" && CXXFLAGS="$CXXFLAGS -DETIP_NEEDS_${cf_excp}"
cat >"conftest.$ac_ext" <<_ACEOF
#line 25879 "configure"
#include "confdefs.h"

#include <etip.h.in>

int
main (void)
{

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:25893: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:25896: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:25899: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:25902: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

	test -n "$cf_math" && cat >>confdefs.h <<EOF
#define ETIP_NEEDS_${cf_math} 1
EOF

	test -n "$cf_excp" && cat >>confdefs.h <<EOF
#define ETIP_NEEDS_${cf_excp} 1
EOF

	cf_result="$cf_math $cf_excp"
	break 2

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
done
done
echo "$as_me:25923: result: $cf_result" >&5
echo "${ECHO_T}$cf_result" >&6
CXXFLAGS="$cf_save_CXXFLAGS"

if test -n "$CXX"; then
echo "$as_me:25928: checking if $CXX accepts parameter initialization" >&5
echo $ECHO_N "checking if $CXX accepts parameter initialization... $ECHO_C" >&6
if test "${cf_cv_cpp_param_init+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

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

	if test "$cross_compiling" = yes; then
  cf_cv_cpp_param_init=unknown
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 25945 "configure"
#include "confdefs.h"

class TEST {
private:
	int value;
public:
	TEST(int x = 1);
	~TEST();
};

TEST::TEST(int x = 1)	// some compilers do not like second initializer
{
	value = x;
}
int main(void) { }

_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:25964: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:25967: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:25969: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:25972: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_cpp_param_init=yes
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_cpp_param_init=no
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
	ac_ext=cc
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
ac_main_return="return"

fi
echo "$as_me:25991: result: $cf_cv_cpp_param_init" >&5
echo "${ECHO_T}$cf_cv_cpp_param_init" >&6
fi
test "$cf_cv_cpp_param_init" = yes &&
cat >>confdefs.h <<\EOF
#define CPP_HAS_PARAM_INIT 1
EOF

if test -n "$CXX"; then

echo "$as_me:26001: checking if $CXX accepts static_cast" >&5
echo $ECHO_N "checking if $CXX accepts static_cast... $ECHO_C" >&6
if test "${cf_cv_cpp_static_cast+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

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

	cat >"conftest.$ac_ext" <<_ACEOF
#line 26015 "configure"
#include "confdefs.h"

class NCursesPanel
{
public:
  NCursesPanel(int nlines,
	       int ncols,
	       int begin_y = 0,
	       int begin_x = 0)
  {
  }
  NCursesPanel();
  ~NCursesPanel();
};

template<class T> class NCursesUserPanel : public NCursesPanel
{
public:
  NCursesUserPanel (int nlines,
		    int ncols,
		    int begin_y = 0,
		    int begin_x = 0,
		    const T* p_UserData = static_cast<T*>(0))
    : NCursesPanel (nlines, ncols, begin_y, begin_x)
  {
  };
  NCursesUserPanel(const T* p_UserData = static_cast<T*>(0)) : NCursesPanel()
  {
  };

  virtual ~NCursesUserPanel() {};
};

int
main (void)
{

	const char* p_UserData = static_cast<char*>(0)
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:26059: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:26062: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:26065: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:26068: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_cpp_static_cast=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_cpp_static_cast=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"

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

fi
echo "$as_me:26086: result: $cf_cv_cpp_static_cast" >&5
echo "${ECHO_T}$cf_cv_cpp_static_cast" >&6

fi

test "$cf_cv_cpp_static_cast" = yes &&
cat >>confdefs.h <<\EOF
#define CPP_HAS_STATIC_CAST 1
EOF

	CXX_AR='$(AR)'
	CXX_ARFLAGS='$(ARFLAGS)'
	case "$cf_cv_system_name" in
	(irix*)
	    if test "$GXX" != yes ; then
		CXX_AR='$(CXX)'
		CXX_ARFLAGS='-ar -o'
	    fi
	    ;;
	(sco3.2v5*)
	    CXXLDFLAGS="-u main"
	    ;;
	(solaris2*)
	    if test "$GXX" != yes ; then
		CXX_AR='$(CXX)'
		CXX_ARFLAGS='-xar -o'
	    fi
	    ;;
	esac

else
	cf_cxx_library=no
	cf_cv_builtin_bool=1

	# Just because we are not configuring against C++ right now does not
	# mean that a user will not want to use C++.  Some distributors disable
	# the C++ portion of this configuration as a shortcut (or just to avoid
	# compiling the demo in the c++ directory).  So we need a reasonable
	# default for the 'bool' type.
	#
	# Caveat: since the storage of the bool type is not standardized, it
	# may change.

	if test "$NCURSES_BOOL" != auto ; then
		cf_cv_type_of_bool=$NCURSES_BOOL
		cf_cv_header_stdbool_h=0
	else
		if test "$cf_cv_header_stdbool_h" = 1 ; then

echo "$as_me:26135: checking for bool" >&5
echo $ECHO_N "checking for bool... $ECHO_C" >&6
if test "${ac_cv_type_bool+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 26141 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>

#if defined(__cplusplus)

#ifdef HAVE_GXX_BUILTIN_H
#include <g++/builtin.h>
#elif HAVE_GPP_BUILTIN_H
#include <gpp/builtin.h>
#elif HAVE_BUILTIN_H
#include <builtin.h>
#endif

#else

#if $cf_cv_header_stdbool_h
#include <stdbool.h>
#endif

#endif

int
main (void)
{
if ((bool *) 0)
  return 0;
if (sizeof (bool))
  return 0;
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:26177: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:26180: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:26183: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:26186: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_type_bool=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_type_bool=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:26196: result: $ac_cv_type_bool" >&5
echo "${ECHO_T}$ac_cv_type_bool" >&6

echo "$as_me:26199: checking size of bool" >&5
echo $ECHO_N "checking size of bool... $ECHO_C" >&6
if test "${ac_cv_sizeof_bool+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test "$ac_cv_type_bool" = yes; then
  if test "$cross_compiling" = yes; then
  # Depending upon the size, compute the lo and hi bounds.
cat >"conftest.$ac_ext" <<_ACEOF
#line 26208 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>

#if defined(__cplusplus)

#ifdef HAVE_GXX_BUILTIN_H
#include <g++/builtin.h>
#elif HAVE_GPP_BUILTIN_H
#include <gpp/builtin.h>
#elif HAVE_BUILTIN_H
#include <builtin.h>
#endif

#else

#if $cf_cv_header_stdbool_h
#include <stdbool.h>
#endif

#endif

int
main (void)
{
int _array_ [1 - 2 * !((sizeof (bool)) >= 0)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:26241: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:26244: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:26247: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:26250: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_lo=0 ac_mid=0
  while :; do
    cat >"conftest.$ac_ext" <<_ACEOF
#line 26255 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>

#if defined(__cplusplus)

#ifdef HAVE_GXX_BUILTIN_H
#include <g++/builtin.h>
#elif HAVE_GPP_BUILTIN_H
#include <gpp/builtin.h>
#elif HAVE_BUILTIN_H
#include <builtin.h>
#endif

#else

#if $cf_cv_header_stdbool_h
#include <stdbool.h>
#endif

#endif

int
main (void)
{
int _array_ [1 - 2 * !((sizeof (bool)) <= $ac_mid)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:26288: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:26291: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:26294: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:26297: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_hi=$ac_mid; break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1`
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  done
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_hi=-1 ac_mid=-1
  while :; do
    cat >"conftest.$ac_ext" <<_ACEOF
#line 26313 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>

#if defined(__cplusplus)

#ifdef HAVE_GXX_BUILTIN_H
#include <g++/builtin.h>
#elif HAVE_GPP_BUILTIN_H
#include <gpp/builtin.h>
#elif HAVE_BUILTIN_H
#include <builtin.h>
#endif

#else

#if $cf_cv_header_stdbool_h
#include <stdbool.h>
#endif

#endif

int
main (void)
{
int _array_ [1 - 2 * !((sizeof (bool)) >= $ac_mid)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:26346: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:26349: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:26352: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:26355: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_lo=$ac_mid; break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"`
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  done
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
# Binary search between lo and hi bounds.
while test "x$ac_lo" != "x$ac_hi"; do
  ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"`
  cat >"conftest.$ac_ext" <<_ACEOF
#line 26371 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>

#if defined(__cplusplus)

#ifdef HAVE_GXX_BUILTIN_H
#include <g++/builtin.h>
#elif HAVE_GPP_BUILTIN_H
#include <gpp/builtin.h>
#elif HAVE_BUILTIN_H
#include <builtin.h>
#endif

#else

#if $cf_cv_header_stdbool_h
#include <stdbool.h>
#endif

#endif

int
main (void)
{
int _array_ [1 - 2 * !((sizeof (bool)) <= $ac_mid)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:26404: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:26407: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:26410: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:26413: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_hi=$ac_mid
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_lo=`expr "$ac_mid" + 1`
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
done
ac_cv_sizeof_bool=$ac_lo
else
  if test "$cross_compiling" = yes; then
  { { echo "$as_me:26426: error: cannot run test program while cross compiling" >&5
echo "$as_me: error: cannot run test program while cross compiling" >&2;}
   { (exit 1); exit 1; }; }
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 26431 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>

#if defined(__cplusplus)

#ifdef HAVE_GXX_BUILTIN_H
#include <g++/builtin.h>
#elif HAVE_GPP_BUILTIN_H
#include <gpp/builtin.h>
#elif HAVE_BUILTIN_H
#include <builtin.h>
#endif

#else

#if $cf_cv_header_stdbool_h
#include <stdbool.h>
#endif

#endif

int
main (void)
{
FILE *f = fopen ("conftest.val", "w");
if (!f)
  $ac_main_return (1);
fprintf (f, "%ld", (long)(sizeof (bool)));
fclose (f);
  ;
  return 0;
}
_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:26468: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:26471: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:26473: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:26476: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_sizeof_bool=`cat conftest.val`
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
fi
rm -f conftest.val
else
  ac_cv_sizeof_bool=0
fi
fi
echo "$as_me:26492: result: $ac_cv_sizeof_bool" >&5
echo "${ECHO_T}$ac_cv_sizeof_bool" >&6
cat >>confdefs.h <<EOF
#define SIZEOF_BOOL $ac_cv_sizeof_bool
EOF

echo "$as_me:26498: checking for type of bool" >&5
echo $ECHO_N "checking for type of bool... $ECHO_C" >&6
if test "${cf_cv_type_of_bool+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

	rm -f cf_test.out
	if test "$cross_compiling" = yes; then

		case x$ac_cv_sizeof_bool in
		(x1) cf_cv_type_of_bool="unsigned char";;
		(x2) cf_cv_type_of_bool="unsigned short";;
		(x4) cf_cv_type_of_bool="unsigned int";;
		(x8) cf_cv_type_of_bool="unsigned long";;
		(*)  cf_cv_type_of_bool=unknown;;
		esac

else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 26517 "configure"
#include "confdefs.h"

#include <stdlib.h>
#include <stdio.h>

#if defined(__cplusplus)

#ifdef HAVE_GXX_BUILTIN_H
#include <g++/builtin.h>
#elif HAVE_GPP_BUILTIN_H
#include <gpp/builtin.h>
#elif HAVE_BUILTIN_H
#include <builtin.h>
#endif

#else

#if $cf_cv_header_stdbool_h
#include <stdbool.h>
#endif

#endif

int main(void)
{
	FILE *fp = fopen("cf_test.out", "w");
	if (fp != 0) {
		bool x = true;
		if ((bool)(-x) >= 0)
			fputs("unsigned ", fp);
		if (sizeof(x) == sizeof(int))       fputs("int",  fp);
		else if (sizeof(x) == sizeof(char)) fputs("char", fp);
		else if (sizeof(x) == sizeof(short))fputs("short",fp);
		else if (sizeof(x) == sizeof(long)) fputs("long", fp);
		fclose(fp);
	}
	${cf_cv_main_return:-return}(0);
}

_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:26559: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:26562: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:26564: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:26567: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  cf_cv_type_of_bool=`cat cf_test.out`
		 if test -z "$cf_cv_type_of_bool"; then
		   cf_cv_type_of_bool=unknown
		 fi
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_cv_type_of_bool=unknown
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
	rm -f cf_test.out

fi
echo "$as_me:26584: result: $cf_cv_type_of_bool" >&5
echo "${ECHO_T}$cf_cv_type_of_bool" >&6

if test "$cf_cv_type_of_bool" = unknown ; then
	case .$NCURSES_BOOL in
	(.auto|.) NCURSES_BOOL=unsigned;;
	esac
	{ echo "$as_me:26591: WARNING: Assuming $NCURSES_BOOL for type of bool" >&5
echo "$as_me: WARNING: Assuming $NCURSES_BOOL for type of bool" >&2;}
	cf_cv_type_of_bool=$NCURSES_BOOL
fi

		else
			echo "$as_me:26597: checking for fallback type of bool" >&5
echo $ECHO_N "checking for fallback type of bool... $ECHO_C" >&6
			case "$host_cpu" in
			(i?86)	cf_cv_type_of_bool=char	;;
			(*)	cf_cv_type_of_bool=int	;;
			esac
			echo "$as_me:26603: result: $cf_cv_type_of_bool" >&5
echo "${ECHO_T}$cf_cv_type_of_bool" >&6
		fi
	fi
fi

# If the C compiler did not declare bool, and we did not determine that the C++
# compiler does not declare bool, turn on an ifdef in curses.h that makes the
# ncurses library use the same type as C++ bool.  Note that this allows one to
# specify the type of bool in a configure-script option and postpone
# integration with the C++ compiler provided that the types are compatible.
USE_CXX_BOOL=1
if test "$cf_cv_cc_bool_type" = 1
then
	# oops: C has a bool.  Unlikely, but C++ could differ.
	USE_CXX_BOOL=0
elif test "$cf_cv_builtin_bool" = 0
then
	# C++ has no bool
	USE_CXX_BOOL=0
else
	# this is the normal case
	USE_CXX_BOOL='defined(__cplusplus)'
fi

if test -f "${srcdir}/Ada95/Makefile.in" ; then

	if test "$cf_with_ada" != "no" ; then
		if test "$with_libtool" != "no"; then
			{ echo "$as_me:26632: WARNING: libtool does not support Ada - disabling feature" >&5
echo "$as_me: WARNING: libtool does not support Ada - disabling feature" >&2;}
			cf_with_ada=no
		fi
	fi

	if test "$cf_with_ada" != "no" ; then

for cf_prog_gnat in gnat gnatmake gprconfig gprbuild
do

cf_upper_prog_gnat=`echo "${cf_prog_gnat}" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`

	unset ac_cv_path_cf_TEMP_gnat
	unset cf_TEMP_gnat
	# Extract the first word of "$cf_prog_gnat", so it can be a program name with args.
set dummy $cf_prog_gnat; ac_word=$2
echo "$as_me:26649: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_cf_TEMP_gnat+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  case $cf_TEMP_gnat in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_cf_TEMP_gnat="$cf_TEMP_gnat" # Let the user override the test with a path.
  ;;
  *)
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  if $as_executable_p "$ac_dir/$ac_word"; then
   ac_cv_path_cf_TEMP_gnat="$ac_dir/$ac_word"
   echo "$as_me:26666: found $ac_dir/$ac_word" >&5
   break
fi
done

  test -z "$ac_cv_path_cf_TEMP_gnat" && ac_cv_path_cf_TEMP_gnat="no"
  ;;
esac
fi
cf_TEMP_gnat=$ac_cv_path_cf_TEMP_gnat

if test -n "$cf_TEMP_gnat"; then
  echo "$as_me:26678: result: $cf_TEMP_gnat" >&5
echo "${ECHO_T}$cf_TEMP_gnat" >&6
else
  echo "$as_me:26681: result: no" >&5
echo "${ECHO_T}no" >&6
fi

	eval "cf_cv_PATH_$cf_upper_prog_gnat=$ac_cv_path_cf_TEMP_gnat"

	if test "x$cf_TEMP_gnat" != xno; then
		unset cf_cv_gnat_version
		unset cf_TEMP_gnat

echo "$as_me:26691: checking for $cf_prog_gnat version" >&5
echo $ECHO_N "checking for $cf_prog_gnat version... $ECHO_C" >&6
if test "${cf_cv_gnat_version+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cf_cv_gnat_version=`$cf_prog_gnat --version 2>&1 | \
	grep '[0-9].[0-9][0-9]*' |\
	sed -e '2,$d' -e 's/[^0-9 \.]//g' -e 's/^[ ]*//' -e 's/ .*//'`

fi
echo "$as_me:26702: result: $cf_cv_gnat_version" >&5
echo "${ECHO_T}$cf_cv_gnat_version" >&6
test -z "$cf_cv_gnat_version" && cf_cv_gnat_version=no
eval cf_TEMP_gnat=$cf_cv_gnat_version; unset cf_cv_gnat_version

	fi
	eval "cf_cv_VERSION_$cf_upper_prog_gnat=$cf_TEMP_gnat"

	unset cf_TEMP_gnat
	unset cf_cv_gnat_version
	unset ac_cv_path_cf_TEMP_gnat
done

if test "x$cf_cv_VERSION_GNATMAKE" = "xno"; then
	cf_ada_make=
	cf_cv_prog_gnat_correct=no
else
	cf_ada_make=gnatmake
	if test "x$cf_cv_VERSION_GPRCONFIG" = "xno"; then
		# gprconfig is newer than gnatmake; we can continue...
		cf_ada_config="##"
	else
		rm -rf ./conftest* ./*~conftest*
		if mkdir conftest.src
		then
			cf_ada_config=""
			cd conftest.src
			for cf_gprconfig in Ada C
			do
				echo "$as_me:26731: checking for gprconfig name for $cf_gprconfig" >&5
echo $ECHO_N "checking for gprconfig name for $cf_gprconfig... $ECHO_C" >&6
				if test "$cf_gprconfig" = C
				then
					for cf_gprconfig_param in \
						"$cf_gprconfig,,,,GNATGCC" \
						"$cf_gprconfig,,,,GCC" \
						"$cf_gprconfig"
					do
						cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&5 | ${AWK:-awk} '/^\*/{print $3;}' | head -n 1`
						test -n "$cf_gprconfig_value" && break
					done
				else
					cf_gprconfig_param=$cf_gprconfig
					cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&5 | ${AWK:-awk} '/^\*/{print $3;}' | head -n 1`
				fi
				if test -n "$cf_gprconfig_value"
				then
					eval "cf_ada_config_$cf_gprconfig=$cf_gprconfig_value"
					echo "$as_me:26750: result: $cf_gprconfig_value" >&5
echo "${ECHO_T}$cf_gprconfig_value" >&6
				else
					echo "$as_me:26753: result: missing" >&5
echo "${ECHO_T}missing" >&6
					cf_ada_config="#"
					break
				fi
			done
			cd ..
			rm -rf ./conftest* ./*~conftest*
		fi
	fi
	if test "x$cf_ada_config" != "x#"
	then

echo "$as_me:26766: checking for gnat version" >&5
echo $ECHO_N "checking for gnat version... $ECHO_C" >&6
if test "${cf_cv_gnat_version+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cf_cv_gnat_version=`${cf_ada_make:-gnatmake} --version 2>&1 | \
	grep '[0-9].[0-9][0-9]*' |\
	sed -e '2,$d' -e 's/[^0-9 \.]//g' -e 's/^[ ]*//' -e 's/ .*//'`

fi
echo "$as_me:26777: result: $cf_cv_gnat_version" >&5
echo "${ECHO_T}$cf_cv_gnat_version" >&6
test -z "$cf_cv_gnat_version" && cf_cv_gnat_version=no

case "$cf_cv_gnat_version" in
(3.1[1-9]*|3.[2-9]*|[4-9].*|[1-9][0-9].[0-9]*|20[0-9][0-9])
	cf_cv_prog_gnat_correct=yes
	;;
(*)
	{ echo "$as_me:26786: WARNING: Unsupported GNAT version $cf_cv_gnat_version. We require 3.11 or better. Disabling Ada95 binding." >&5
echo "$as_me: WARNING: Unsupported GNAT version $cf_cv_gnat_version. We require 3.11 or better. Disabling Ada95 binding." >&2;}
	cf_cv_prog_gnat_correct=no
	;;
esac

		# Extract the first word of "m4", so it can be a program name with args.
set dummy m4; ac_word=$2
echo "$as_me:26794: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_M4_exists+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test -n "$M4_exists"; then
  ac_cv_prog_M4_exists="$M4_exists" # Let the user override the test.
else
  ac_save_IFS=$IFS; IFS=$ac_path_separator
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
  IFS=$ac_save_IFS
  test -z "$ac_dir" && ac_dir=.
  $as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_M4_exists="yes"
echo "$as_me:26809: found $ac_dir/$ac_word" >&5
break
done

  test -z "$ac_cv_prog_M4_exists" && ac_cv_prog_M4_exists="no"
fi
fi
M4_exists=$ac_cv_prog_M4_exists
if test -n "$M4_exists"; then
  echo "$as_me:26818: result: $M4_exists" >&5
echo "${ECHO_T}$M4_exists" >&6
else
  echo "$as_me:26821: result: no" >&5
echo "${ECHO_T}no" >&6
fi

		if test "$ac_cv_prog_M4_exists" = no; then
			cf_cv_prog_gnat_correct=no
			{ echo "$as_me:26827: WARNING: Ada95 binding required program m4 not found. Ada95 binding disabled" >&5
echo "$as_me: WARNING: Ada95 binding required program m4 not found. Ada95 binding disabled" >&2;}
		fi
		if test "$cf_cv_prog_gnat_correct" = yes; then
			echo "$as_me:26831: checking if GNAT works" >&5
echo $ECHO_N "checking if GNAT works... $ECHO_C" >&6

rm -rf ./conftest* ./*~conftest*
cat >>conftest.ads <<CF_EOF
procedure conftest;
CF_EOF
cat >>conftest.adb <<CF_EOF
with Text_IO;
with GNAT.OS_Lib;
procedure conftest is
begin
   Text_IO.Put ("Hello World");
   Text_IO.New_Line;
   GNAT.OS_Lib.OS_Exit (0);
end conftest;
CF_EOF
if ( "$cf_ada_make" $ADAFLAGS conftest 1>&5 2>&1 ) ; then
   if ( ./conftest 1>&5 2>&1 ) ; then
      cf_cv_prog_gnat_correct=yes
   else
      cf_cv_prog_gnat_correct=no
   fi
else
   cf_cv_prog_gnat_correct=no
fi
rm -rf ./conftest* ./*~conftest*

			echo "$as_me:26859: result: $cf_cv_prog_gnat_correct" >&5
echo "${ECHO_T}$cf_cv_prog_gnat_correct" >&6
		fi
	else
		cf_cv_prog_gnat_correct=no
	fi
fi

		if test	"x$cf_cv_prog_gnat_correct" = xyes; then

 	ADAFLAGS="$ADAFLAGS -gnatpn"

	echo "$as_me:26871: checking optimization options for ADAFLAGS" >&5
echo $ECHO_N "checking optimization options for ADAFLAGS... $ECHO_C" >&6
	case "$CFLAGS" in
	(*-g*)

 	ADAFLAGS="$ADAFLAGS -g"

		;;
	esac
	case "$CFLAGS" in
	(*-O*)
		cf_O_flag=`echo "$CFLAGS" |sed -e 's/^.*-O/-O/' -e 's/[ 	].*//'`

 	ADAFLAGS="$ADAFLAGS $cf_O_flag"

		;;
	esac
	echo "$as_me:26888: result: $ADAFLAGS" >&5
echo "${ECHO_T}$ADAFLAGS" >&6

echo "$as_me:26891: checking if GNATPREP supports -T option" >&5
echo $ECHO_N "checking if GNATPREP supports -T option... $ECHO_C" >&6
if test "${cf_cv_gnatprep_opt_t+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

cf_cv_gnatprep_opt_t=no
gnatprep -T 2>/dev/null >/dev/null && cf_cv_gnatprep_opt_t=yes

fi
echo "$as_me:26901: result: $cf_cv_gnatprep_opt_t" >&5
echo "${ECHO_T}$cf_cv_gnatprep_opt_t" >&6
test "$cf_cv_gnatprep_opt_t" = yes && GNATPREP_OPTS="-T $GNATPREP_OPTS"

echo "$as_me:26905: checking if GNAT supports generics" >&5
echo $ECHO_N "checking if GNAT supports generics... $ECHO_C" >&6
case "$cf_cv_gnat_version" in
(3.1[1-9]*|3.[2-9]*|[4-9].*|[1-9][0-9].[0-9]*|20[0-9][0-9])
	cf_gnat_generics=yes
	;;
(*)
	cf_gnat_generics=no
	;;
esac
echo "$as_me:26915: result: $cf_gnat_generics" >&5
echo "${ECHO_T}$cf_gnat_generics" >&6

if test "$cf_gnat_generics" = yes
then
	cf_compile_generics=generics
	cf_generic_objects="\${GENOBJS}"
else
	cf_compile_generics=
	cf_generic_objects=
fi

echo "$as_me:26927: checking if GNAT supports SIGINT" >&5
echo $ECHO_N "checking if GNAT supports SIGINT... $ECHO_C" >&6
if test "${cf_cv_gnat_sigint+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

rm -rf ./conftest* ./*~conftest*
cat >>conftest.ads <<CF_EOF
with Ada.Interrupts.Names;

package ConfTest is

   pragma Warnings (Off);  --  the next pragma exists since 3.11p
   pragma Unreserve_All_Interrupts;
   pragma Warnings (On);

   protected Process is
      procedure Stop;
      function Continue return Boolean;
      pragma Attach_Handler (Stop, Ada.Interrupts.Names.SIGINT);
   private
      Done : Boolean := False;
   end Process;

end ConfTest;
CF_EOF
cat >>conftest.adb <<CF_EOF
package body ConfTest is
   protected body Process is
      procedure Stop is
      begin
         Done := True;
      end Stop;
      function Continue return Boolean is
      begin
         return not Done;
      end Continue;
   end Process;
end ConfTest;
CF_EOF
if ( "$cf_ada_make" $ADAFLAGS conftest 1>&5 2>&1 ) ; then
      cf_cv_gnat_sigint=yes
else
   cf_cv_gnat_sigint=no
fi
rm -rf ./conftest* ./*~conftest*

fi
echo "$as_me:26975: result: $cf_cv_gnat_sigint" >&5
echo "${ECHO_T}$cf_cv_gnat_sigint" >&6

if test "$cf_cv_gnat_sigint" = yes ; then
	USE_GNAT_SIGINT=""
else
	USE_GNAT_SIGINT="#"
fi

cf_gnat_libraries=no
cf_gnat_projects=no

if test "$enable_gnat_projects" != no ; then
echo "$as_me:26988: checking if GNAT supports project files" >&5
echo $ECHO_N "checking if GNAT supports project files... $ECHO_C" >&6
case "$cf_cv_gnat_version" in
(3.[0-9]*)
	;;
(*)
	case "$cf_cv_system_name" in
	(cygwin*|msys*)
		;;
	(*)
		rm -rf ./conftest* ./*~conftest*
		if mkdir conftest.src conftest.bin conftest.lib
		then
			cd conftest.src
			rm -rf ./conftest* ./*~conftest*
			cat >>library.gpr <<CF_EOF
project Library is
  Kind := External ("LIB_KIND");
  for Library_Name use "ConfTest";
  for Object_Dir use ".";
  for Library_ALI_Dir use External("LIBRARY_DIR");
  for Library_Version use External ("SONAME");
  for Library_Kind use Kind;
  for Library_Dir use External("BUILD_DIR");
  Source_Dir := External ("SOURCE_DIR");
  for Source_Dirs use (Source_Dir);
end Library;
CF_EOF
			cat >>confpackage.ads <<CF_EOF
package ConfPackage is
   procedure conftest;
end ConfPackage;
CF_EOF
			cat >>confpackage.adb <<CF_EOF
with Text_IO;
package body ConfPackage is
   procedure conftest is
   begin
      Text_IO.Put ("Hello World");
      Text_IO.New_Line;
   end conftest;
end ConfPackage;
CF_EOF
			if ( "$cf_ada_make" $ADAFLAGS \
					-Plibrary.gpr \
					-XBUILD_DIR="`cd ../conftest.bin;pwd`" \
					-XLIBRARY_DIR="`cd ../conftest.lib;pwd`" \
					-XSOURCE_DIR="`pwd`" \
					-XSONAME=libConfTest.so.1 \
					-XLIB_KIND=static 1>&5 2>&1 ) ; then
				cf_gnat_projects=yes
			fi
			cd ..
		fi
		if test -f conftest.lib/confpackage.ali
		then
			cf_gnat_libraries=yes
		fi
		rm -rf ./conftest* ./*~conftest*
		;;
	esac
	;;
esac
echo "$as_me:27051: result: $cf_gnat_projects" >&5
echo "${ECHO_T}$cf_gnat_projects" >&6
fi # enable_gnat_projects

if test "$cf_gnat_projects" = yes
then
	echo "$as_me:27057: checking if GNAT supports libraries" >&5
echo $ECHO_N "checking if GNAT supports libraries... $ECHO_C" >&6
	echo "$as_me:27059: result: $cf_gnat_libraries" >&5
echo "${ECHO_T}$cf_gnat_libraries" >&6
fi

USE_OLD_MAKERULES=""
USE_GNAT_PROJECTS="#"
USE_GNAT_MAKE_GPR="#"
USE_GNAT_GPRBUILD="#"

if test "$cf_gnat_projects" = yes
then
	USE_OLD_MAKERULES="#"
	USE_GNAT_PROJECTS=""
	if test "$cf_cv_VERSION_GPRBUILD" != no
	then
		USE_GNAT_GPRBUILD=""
	elif test "$cf_cv_VERSION_GNATMAKE" != no
	then
		USE_GNAT_MAKE_GPR=""
	else
		{ echo "$as_me:27079: WARNING: use old makefile rules since tools are missing" >&5
echo "$as_me: WARNING: use old makefile rules since tools are missing" >&2;}
	fi
fi

if test "$cf_gnat_libraries" = yes
then
	USE_GNAT_LIBRARIES=""
else
	USE_GNAT_LIBRARIES="#"
fi

echo "$as_me:27091: checking for ada-compiler" >&5
echo $ECHO_N "checking for ada-compiler... $ECHO_C" >&6

# Check whether --with-ada-compiler or --without-ada-compiler was given.
if test "${with_ada_compiler+set}" = set; then
  withval="$with_ada_compiler"
  cf_ada_compiler=$withval
else
  cf_ada_compiler=gnatmake
fi;

echo "$as_me:27102: result: $cf_ada_compiler" >&5
echo "${ECHO_T}$cf_ada_compiler" >&6

			cf_ada_package=terminal_interface

echo "$as_me:27107: checking for ada-include" >&5
echo $ECHO_N "checking for ada-include... $ECHO_C" >&6

# Check whether --with-ada-include or --without-ada-include was given.
if test "${with_ada_include+set}" = set; then
  withval="$with_ada_include"

else
  withval="${ADA_INCLUDE:-$prefix/share/ada/adainclude}"
fi; if test -n "$prefix/share/ada/adainclude" ; then

if test "x$prefix" != xNONE; then
	cf_path_syntax="$prefix"
else
	cf_path_syntax="$ac_default_prefix"
fi

case ".$withval" in
(.\$\(*\)*|.\'*\'*)
	;;
(..|./*|.\\*)
	;;
(.[a-zA-Z]:[\\/]*) # OS/2 EMX
	;;
(.\$\{*prefix\}*|.\$\{*dir\}*)
	eval withval="$withval"
	case ".$withval" in
	(.NONE/*)
		withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
		;;
	esac
	;;
(.no|.NONE/*)
	withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
	;;
(*)
	{ { echo "$as_me:27143: error: expected a pathname, not \"$withval\"" >&5
echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
   { (exit 1); exit 1; }; }
	;;
esac

fi
eval ADA_INCLUDE="$withval"

echo "$as_me:27152: result: $ADA_INCLUDE" >&5
echo "${ECHO_T}$ADA_INCLUDE" >&6

echo "$as_me:27155: checking for ada-objects" >&5
echo $ECHO_N "checking for ada-objects... $ECHO_C" >&6

# Check whether --with-ada-objects or --without-ada-objects was given.
if test "${with_ada_objects+set}" = set; then
  withval="$with_ada_objects"

else
  withval="${ADA_OBJECTS:-$prefix/lib/ada/adalib}"
fi; if test -n "$prefix/lib/ada/adalib" ; then

if test "x$prefix" != xNONE; then
	cf_path_syntax="$prefix"
else
	cf_path_syntax="$ac_default_prefix"
fi

case ".$withval" in
(.\$\(*\)*|.\'*\'*)
	;;
(..|./*|.\\*)
	;;
(.[a-zA-Z]:[\\/]*) # OS/2 EMX
	;;
(.\$\{*prefix\}*|.\$\{*dir\}*)
	eval withval="$withval"
	case ".$withval" in
	(.NONE/*)
		withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
		;;
	esac
	;;
(.no|.NONE/*)
	withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
	;;
(*)
	{ { echo "$as_me:27191: error: expected a pathname, not \"$withval\"" >&5
echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
   { (exit 1); exit 1; }; }
	;;
esac

fi
eval ADA_OBJECTS="$withval"

echo "$as_me:27200: result: $ADA_OBJECTS" >&5
echo "${ECHO_T}$ADA_OBJECTS" >&6

echo "$as_me:27203: checking if an Ada95 shared-library should be built" >&5
echo $ECHO_N "checking if an Ada95 shared-library should be built... $ECHO_C" >&6

# Check whether --with-ada-sharedlib or --without-ada-sharedlib was given.
if test "${with_ada_sharedlib+set}" = set; then
  withval="$with_ada_sharedlib"
  with_ada_sharedlib=$withval
else
  with_ada_sharedlib=no
fi;
echo "$as_me:27213: result: $with_ada_sharedlib" >&5
echo "${ECHO_T}$with_ada_sharedlib" >&6

if test "x$with_ada_sharedlib" != xno
then
	if test "x$cf_gnat_projects" != xyes
	then
		{ echo "$as_me:27220: WARNING: disabling shared-library since GNAT projects are not supported" >&5
echo "$as_me: WARNING: disabling shared-library since GNAT projects are not supported" >&2;}
		with_ada_sharedlib=no
	fi
fi

ADA_SHAREDLIB='lib$(LIB_NAME).so.1'
MAKE_ADA_SHAREDLIB="#"

if test "x$with_ada_sharedlib" != xno
then
	MAKE_ADA_SHAREDLIB=
	if test "x$with_ada_sharedlib" != xyes
	then
		ADA_SHAREDLIB="$with_ada_sharedlib"
	fi
fi

			# allow the Ada binding to be renamed

echo "$as_me:27240: checking for ada-libname" >&5
echo $ECHO_N "checking for ada-libname... $ECHO_C" >&6

# Check whether --with-ada-libname or --without-ada-libname was given.
if test "${with_ada_libname+set}" = set; then
  withval="$with_ada_libname"
  ADA_LIBNAME=$withval
else
  ADA_LIBNAME=AdaCurses
fi;
case "x$ADA_LIBNAME" in
(x|xyes|xno)
	ADA_LIBNAME=AdaCurses
	;;
esac

echo "$as_me:27256: result: $ADA_LIBNAME" >&5
echo "${ECHO_T}$ADA_LIBNAME" >&6

		fi
	fi
else
	cf_with_ada=no
fi

# do this "late" to avoid conflict with header-checks
if test "x$with_widec" = xyes ; then
	echo "$as_me:27267: checking for wchar_t" >&5
echo $ECHO_N "checking for wchar_t... $ECHO_C" >&6
if test "${ac_cv_type_wchar_t+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 27273 "configure"
#include "confdefs.h"
$ac_includes_default
int
main (void)
{
if ((wchar_t *) 0)
  return 0;
if (sizeof (wchar_t))
  return 0;
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:27288: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:27291: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:27294: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:27297: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_type_wchar_t=yes
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_cv_type_wchar_t=no
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
fi
echo "$as_me:27307: result: $ac_cv_type_wchar_t" >&5
echo "${ECHO_T}$ac_cv_type_wchar_t" >&6

echo "$as_me:27310: checking size of wchar_t" >&5
echo $ECHO_N "checking size of wchar_t... $ECHO_C" >&6
if test "${ac_cv_sizeof_wchar_t+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test "$ac_cv_type_wchar_t" = yes; then
  if test "$cross_compiling" = yes; then
  # Depending upon the size, compute the lo and hi bounds.
cat >"conftest.$ac_ext" <<_ACEOF
#line 27319 "configure"
#include "confdefs.h"
$ac_includes_default
int
main (void)
{
int _array_ [1 - 2 * !((sizeof (wchar_t)) >= 0)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:27331: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:27334: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:27337: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:27340: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_lo=0 ac_mid=0
  while :; do
    cat >"conftest.$ac_ext" <<_ACEOF
#line 27345 "configure"
#include "confdefs.h"
$ac_includes_default
int
main (void)
{
int _array_ [1 - 2 * !((sizeof (wchar_t)) <= $ac_mid)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:27357: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:27360: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:27363: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:27366: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_hi=$ac_mid; break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1`
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  done
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_hi=-1 ac_mid=-1
  while :; do
    cat >"conftest.$ac_ext" <<_ACEOF
#line 27382 "configure"
#include "confdefs.h"
$ac_includes_default
int
main (void)
{
int _array_ [1 - 2 * !((sizeof (wchar_t)) >= $ac_mid)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:27394: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:27397: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:27400: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:27403: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_lo=$ac_mid; break
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"`
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
  done
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
# Binary search between lo and hi bounds.
while test "x$ac_lo" != "x$ac_hi"; do
  ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"`
  cat >"conftest.$ac_ext" <<_ACEOF
#line 27419 "configure"
#include "confdefs.h"
$ac_includes_default
int
main (void)
{
int _array_ [1 - 2 * !((sizeof (wchar_t)) <= $ac_mid)]
  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext"
if { (eval echo "$as_me:27431: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:27434: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest.$ac_objext"'
  { (eval echo "$as_me:27437: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:27440: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_hi=$ac_mid
else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
ac_lo=`expr "$ac_mid" + 1`
fi
rm -f "conftest.$ac_objext" "conftest.$ac_ext"
done
ac_cv_sizeof_wchar_t=$ac_lo
else
  if test "$cross_compiling" = yes; then
  { { echo "$as_me:27453: error: cannot run test program while cross compiling" >&5
echo "$as_me: error: cannot run test program while cross compiling" >&2;}
   { (exit 1); exit 1; }; }
else
  cat >"conftest.$ac_ext" <<_ACEOF
#line 27458 "configure"
#include "confdefs.h"
$ac_includes_default
int
main (void)
{
FILE *f = fopen ("conftest.val", "w");
if (!f)
  $ac_main_return (1);
fprintf (f, "%ld", (long)(sizeof (wchar_t)));
fclose (f);
  ;
  return 0;
}
_ACEOF
rm -f "conftest$ac_exeext"
if { (eval echo "$as_me:27474: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:27477: \$? = $ac_status" >&5
  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
  { (eval echo "$as_me:27479: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:27482: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then
  ac_cv_sizeof_wchar_t=`cat conftest.val`
else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
fi
rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
fi
fi
rm -f conftest.val
else
  ac_cv_sizeof_wchar_t=0
fi
fi
echo "$as_me:27498: result: $ac_cv_sizeof_wchar_t" >&5
echo "${ECHO_T}$ac_cv_sizeof_wchar_t" >&6
cat >>confdefs.h <<EOF
#define SIZEOF_WCHAR_T $ac_cv_sizeof_wchar_t
EOF

	# cross-compiling to mingw can run into the problem that attempting to
	# link with the regex library fails, causing the test to not set this to
	# a number.  "recent" autoconf does not address this problem either -TD
	if test -z "$ac_cv_sizeof_wchar_t"
	then
		test -n "$verbose" && echo "	test failed (assume 2)" 1>&6

echo "${as_me:-configure}:27511: testing test failed (assume 2) ..." 1>&5

		sed /SIZEOF_WCHAR_T/d confdefs.h >confdefs.tmp
		mv confdefs.tmp confdefs.h
		echo "#define SIZEOF_WCHAR_T 2" >>confdefs.h
	fi
fi

### Construct the ncurses library-subsets, if any, from this set of keywords:
###	none, base, ext_funcs, ext_tinfo, ticlib, termlib, widechar
###
### ticlib modules may be a separate library, otherwise contained in termlib.
### termlib modules may be a separate library, otherwise contained in ncurses.
###
### The of "+" or " " between the tokens controls the way the script
### chooses to split module lists into libraries.
###
### (see CF_LIB_RULES).
echo "$as_me:27529: checking for library subsets" >&5
echo $ECHO_N "checking for library subsets... $ECHO_C" >&6
LIB_SUBSETS=

if test "x$cf_with_progs" = xyes || test "$with_ticlib" != no || test "$with_termcap" != no; then
	LIB_SUBSETS="${LIB_SUBSETS}ticlib"
	if test "$with_ticlib" != no ; then
		LIB_SUBSETS="${LIB_SUBSETS} "
	else
		LIB_SUBSETS="${LIB_SUBSETS}+"
	fi
fi

LIB_SUBSETS="${LIB_SUBSETS}termlib"
test "x$with_ext_funcs" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+ext_tinfo"

if test "$with_termlib" != no ; then
	LIB_SUBSETS="${LIB_SUBSETS} "
else
	LIB_SUBSETS="${LIB_SUBSETS}+"
fi

LIB_SUBSETS="${LIB_SUBSETS}base"

# Most term-driver calls are to tinfo, but some like init_pair are to the
# base library (so it resides in base).
if test "$with_term_driver" != no ; then
	LIB_SUBSETS="${LIB_SUBSETS}+port_drivers"
	case "$cf_cv_system_name" in
	(*mingw32*|*mingw64*)
		if test "x$with_exp_win32" = xyes ; then
			LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo+port_win32"
		else
			LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo+port_win32con"
		fi
		CPPFLAGS="$CPPFLAGS -DUSE_WIN32CON_DRIVER"
		;;
	(*)
		LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo"
		;;
	esac
elif test "x$with_exp_win32" = xyes ; then
	case "$cf_cv_system_name" in
	(*mingw32*|*mingw64*)
		LIB_SUBSETS="${LIB_SUBSETS}+port_win32"
		;;
	(*)
		;;
	esac
fi

test "x$with_widec"     = xyes && LIB_SUBSETS="${LIB_SUBSETS}+widechar"
test "x$with_ext_funcs" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+ext_funcs"

echo "$as_me:27583: result: $LIB_SUBSETS" >&5
echo "${ECHO_T}$LIB_SUBSETS" >&6

### Construct the list of include-directories to be generated

if test "$srcdir" != "."; then
	CPPFLAGS="-I\${srcdir}/../include $CPPFLAGS"
fi
CPPFLAGS="-I../include $CPPFLAGS"
if test "$srcdir" != "."; then
	CPPFLAGS="-I\${srcdir} $CPPFLAGS"
fi
CPPFLAGS="-I. $CPPFLAGS"

ACPPFLAGS="-I. -I../include -I../../include $ACPPFLAGS"
if test "$srcdir" != "."; then
	ACPPFLAGS="-I\${srcdir}/../../include $ACPPFLAGS"
fi
if test "$GCC" != yes; then
	ACPPFLAGS="$ACPPFLAGS -I\${includedir}"
elif test "$includedir" != "/usr/include"; then
	if test "$includedir" = '${prefix}/include' ; then
		if test x$prefix != x/usr ; then
			ACPPFLAGS="$ACPPFLAGS -I\${includedir}"
		fi
	else
		ACPPFLAGS="$ACPPFLAGS -I\${includedir}"
	fi
fi

### Build up pieces for makefile rules
echo "$as_me:27614: checking default library suffix" >&5
echo $ECHO_N "checking default library suffix... $ECHO_C" >&6

	case $DFT_LWR_MODEL in
	(libtool) DFT_ARG_SUFFIX=''   ;;
	(normal)  DFT_ARG_SUFFIX=''   ;;
	(debug)   DFT_ARG_SUFFIX='_g' ;;
	(profile) DFT_ARG_SUFFIX='_p' ;;
	(shared)  DFT_ARG_SUFFIX=''   ;;
	esac
	test -n "$LIB_SUFFIX" && DFT_ARG_SUFFIX="${LIB_SUFFIX}${DFT_ARG_SUFFIX}"
echo "$as_me:27625: result: $DFT_ARG_SUFFIX" >&5
echo "${ECHO_T}$DFT_ARG_SUFFIX" >&6

echo "$as_me:27628: checking default library-dependency suffix" >&5
echo $ECHO_N "checking default library-dependency suffix... $ECHO_C" >&6

	case X$DFT_LWR_MODEL in
	(Xlibtool)
		DFT_LIB_SUFFIX='.la'
		DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
		;;
	(Xdebug)
		case "$cf_cv_system_name" in
		(*-msvc*)
			DFT_LIB_SUFFIX='_g.lib'
			;;
		(*)
			DFT_LIB_SUFFIX='_g.a'
			;;
		esac
		DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
		;;
	(Xprofile)
		case "$cf_cv_system_name" in
		(*-msvc*)
			DFT_LIB_SUFFIX='_p.lib'
			;;
		(*)
			DFT_LIB_SUFFIX='_p.a'
			;;
		esac
		DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
		;;
	(Xshared)
		case "$cf_cv_system_name" in
		(aix[5-7]*)
			DFT_LIB_SUFFIX='.so'
			DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
			;;
		(*-msvc*)
			DFT_LIB_SUFFIX='.dll'
			DFT_DEP_SUFFIX='.dll.lib'
			;;
		(cygwin*|msys*|mingw*)
			DFT_LIB_SUFFIX='.dll'
			DFT_DEP_SUFFIX='.dll.a'
			;;
		(darwin*)
			DFT_LIB_SUFFIX='.dylib'
			DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
			;;
		(hpux*)
			case "$target" in
			(ia64*)
				DFT_LIB_SUFFIX='.so'
				DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
				;;
			(*)
				DFT_LIB_SUFFIX='.sl'
				DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
				;;
			esac
			;;
		(*)
			DFT_LIB_SUFFIX='.so'
			DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
			;;
		esac
		;;
	(*)
		case "$target" in
		(*-msvc*)
			DFT_LIB_SUFFIX='.lib'
			;;
		(*)
			DFT_LIB_SUFFIX='.a'
			;;
		esac
		DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
		;;
	esac
	if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}"
	then
		DFT_LIB_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${DFT_LIB_SUFFIX}"
		DFT_DEP_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${DFT_DEP_SUFFIX}"
	fi
echo "$as_me:27711: result: $DFT_DEP_SUFFIX" >&5
echo "${ECHO_T}$DFT_DEP_SUFFIX" >&6

echo "$as_me:27714: checking default object directory" >&5
echo $ECHO_N "checking default object directory... $ECHO_C" >&6

	case $DFT_LWR_MODEL in
	(libtool) DFT_OBJ_SUBDIR='obj_lo'  ;;
	(normal)  DFT_OBJ_SUBDIR='objects' ;;
	(debug)   DFT_OBJ_SUBDIR='obj_g' ;;
	(profile) DFT_OBJ_SUBDIR='obj_p' ;;
	(shared)
		case "$cf_cv_system_name" in
		(cygwin|msys)
			DFT_OBJ_SUBDIR='objects' ;;
		(*)
			DFT_OBJ_SUBDIR='obj_s' ;;
		esac
	esac
echo "$as_me:27730: result: $DFT_OBJ_SUBDIR" >&5
echo "${ECHO_T}$DFT_OBJ_SUBDIR" >&6

if test "x$cf_with_cxx" = xyes ; then
echo "$as_me:27734: checking c++ library-dependency suffix" >&5
echo $ECHO_N "checking c++ library-dependency suffix... $ECHO_C" >&6
if test "$with_libtool" != "no"; then
	# libtool thinks it can make c++ shared libraries (perhaps only g++)
	CXX_LIB_SUFFIX=$DFT_DEP_SUFFIX
elif test "$with_shared_cxx" != "no"; then
	# also for g++ users...
	CXX_LIB_SUFFIX=$DFT_DEP_SUFFIX
else
	# we normally make a static library because C/C++ library rules differ

	case Xnormal in
	(Xlibtool)
		CXX_LIB_SUFFIX='.la'
		CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
		;;
	(Xdebug)
		case "$cf_cv_system_name" in
		(*-msvc*)
			CXX_LIB_SUFFIX='_g.lib'
			;;
		(*)
			CXX_LIB_SUFFIX='_g.a'
			;;
		esac
		CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
		;;
	(Xprofile)
		case "$cf_cv_system_name" in
		(*-msvc*)
			CXX_LIB_SUFFIX='_p.lib'
			;;
		(*)
			CXX_LIB_SUFFIX='_p.a'
			;;
		esac
		CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
		;;
	(Xshared)
		case "$cf_cv_system_name" in
		(aix[5-7]*)
			CXX_LIB_SUFFIX='.so'
			CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
			;;
		(*-msvc*)
			CXX_LIB_SUFFIX='.dll'
			CXX_DEP_SUFFIX='.dll.lib'
			;;
		(cygwin*|msys*|mingw*)
			CXX_LIB_SUFFIX='.dll'
			CXX_DEP_SUFFIX='.dll.a'
			;;
		(darwin*)
			CXX_LIB_SUFFIX='.dylib'
			CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
			;;
		(hpux*)
			case "$target" in
			(ia64*)
				CXX_LIB_SUFFIX='.so'
				CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
				;;
			(*)
				CXX_LIB_SUFFIX='.sl'
				CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
				;;
			esac
			;;
		(*)
			CXX_LIB_SUFFIX='.so'
			CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
			;;
		esac
		;;
	(*)
		case "$target" in
		(*-msvc*)
			CXX_LIB_SUFFIX='.lib'
			;;
		(*)
			CXX_LIB_SUFFIX='.a'
			;;
		esac
		CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
		;;
	esac
	if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}"
	then
		CXX_LIB_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${CXX_LIB_SUFFIX}"
		CXX_DEP_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${CXX_DEP_SUFFIX}"
	fi

fi
echo "$as_me:27827: result: $CXX_LIB_SUFFIX" >&5
echo "${ECHO_T}$CXX_LIB_SUFFIX" >&6

fi

# do not want -ldl in build except as needed for -lncurses dependency
if test "x$with_dlsym" = xyes ; then
if test "$DFT_LWR_MODEL" = shared || \
   test "$DFT_LWR_MODEL" = libtool ; then

# remove dl library from $LIBS
LIBS=`echo "$LIBS" | sed -e 's/-ldl[ 	]//g' -e 's/-ldl$//'`

fi
fi
### Set up low-level terminfo dependencies for makefiles.

# TICS_LIST and TINFO_LIST are needed to build libtic.so and libterm.so, but
# do not need libdl
TICS_LIST=
if test "x$with_dlsym" = xyes ; then

# remove dl library from $SHLIB_LIST
TINFO_LIST=`echo "$SHLIB_LIST" | sed -e 's/-ldl[ 	]//g' -e 's/-ldl$//'`

fi

USE_ARG_SUFFIX="${DFT_ARG_SUFFIX}${EXTRA_SUFFIX}"
USE_LIB_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}"
USE_CFG_SUFFIX=${DFT_ARG_SUFFIX}${cf_cv_abi_version}
if test -n "$EXTRA_SUFFIX" && test "x$EXTRA_SUFFIX" != "x${cf_cv_abi_version}"
then
	USE_CFG_SUFFIX="${USE_CFG_SUFFIX}${EXTRA_SUFFIX}"
fi

if test "$with_ticlib" != no ; then

	if test "x$with_ticlib" != xyes ; then
		TICS_NAME=$with_ticlib
		TICS_SUFFIX="`echo "${DFT_LIB_SUFFIX}" |sed -e "s/^${USE_LIB_SUFFIX}//"`"
		TICS_ARG_SUFFIX="${with_ticlib}`echo "${USE_ARG_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`"
		TICS_DEP_SUFFIX="${with_ticlib}`echo "${DFT_DEP_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`"
		TICS_LIB_SUFFIX="${with_ticlib}"
	else
		TICS_SUFFIX=${DFT_LIB_SUFFIX}
		TICS_ARG_SUFFIX="${TICS_NAME}${USE_ARG_SUFFIX}"
		TICS_DEP_SUFFIX="${TICS_NAME}${DFT_DEP_SUFFIX}"
		TICS_LIB_SUFFIX="${TICS_NAME}${USE_LIB_SUFFIX}"
	fi
	TICS_LDFLAGS="-L${LIB_DIR}"
	TICS_LIBS="-l${TICS_ARG_SUFFIX}"
else
	TICS_SUFFIX=${DFT_LIB_SUFFIX}
	TICS_LDFLAGS="-L${LIB_DIR}"
	TICS_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX}"
fi

if test "$with_termlib" != no ; then

	if test "x$with_termlib" != xyes ; then
		TINFO_NAME=$with_termlib
		TINFO_SUFFIX="`echo "${DFT_LIB_SUFFIX}" |sed -e "s/^${USE_LIB_SUFFIX}//"`"
		TINFO_ARG_SUFFIX="${with_termlib}`echo "${USE_ARG_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`"
		TINFO_DEP_SUFFIX="${with_termlib}`echo "${DFT_DEP_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`"
		TINFO_LIB_SUFFIX="${with_termlib}"
	else
		TINFO_SUFFIX=${DFT_LIB_SUFFIX}
		TINFO_ARG_SUFFIX="${TINFO_NAME}${USE_ARG_SUFFIX}"
		TINFO_DEP_SUFFIX="${TINFO_NAME}${DFT_DEP_SUFFIX}"
		TINFO_LIB_SUFFIX="${TINFO_NAME}${USE_LIB_SUFFIX}"
	fi

	TEST_DEPS="${LIB_DIR}/${LIB_PREFIX}${TINFO_DEP_SUFFIX}"
	TEST_DEP2="${LIB_2ND}/${LIB_PREFIX}${TINFO_DEP_SUFFIX}"
	if test "$DFT_LWR_MODEL" = "libtool"; then
		TEST_ARGS="${TEST_DEPS}"
		TEST_ARG2="${TEST_DEP2}"
		TINFO_LDFLAGS="-L${LIB_DIR}"
		TINFO_LIBS="$TEST_ARGS"
		TICS_LIST="$SHLIB_LIST $TEST_ARGS"
		SHLIB_LIST="${SHLIB_LIST} $TEST_ARGS"
	else
		TEST_ARGS="-l${TINFO_ARG_SUFFIX}"
		TEST_ARG2="-l${TINFO_ARG_SUFFIX}"
		if test "x$with_term_driver" != xno ; then
			TICS_LIST="$SHLIB_LIST -l${LIB_NAME}${USE_ARG_SUFFIX}"
			TICS_LIBS="$TICS_LIBS -l${LIB_NAME}${USE_ARG_SUFFIX}"
			TINFO_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARGS"
		else
			TICS_LIST="$SHLIB_LIST -l${TINFO_LIB_SUFFIX}"
			TINFO_LIBS="$TEST_ARGS"
		fi
		TINFO_LDFLAGS="-L${LIB_DIR}"
		SHLIB_LIST="$SHLIB_LIST -l${TINFO_LIB_SUFFIX}"
	fi
else
	# the next lines are needed for linking libtic over libncurses
	TINFO_NAME=${LIB_NAME}
	TINFO_SUFFIX=${DFT_LIB_SUFFIX}
	TINFO_ARG_SUFFIX=${LIB_NAME}${USE_ARG_SUFFIX}
	if test "x$with_tic_depends" = xyes ; then
		TICS_LIST="$SHLIB_LIST -l${LIB_NAME}${USE_ARG_SUFFIX}"
	else
		TICS_LIST="$SHLIB_LIST"
	fi

	TINFO_LDFLAGS="-L${LIB_DIR}"
	TINFO_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX}"
fi

if test "$DFT_LWR_MODEL" = shared ; then
	case "$cf_cv_system_name" in
	(cygwin*|msys*)
		# "lib" files have ".dll.a" suffix, "cyg"or "msys-" files have ".dll"
		TINFO_SUFFIX=.dll
		;;
	esac
fi

if test "x$with_dlsym" = xyes ; then

# remove dl library from $TICS_LIST
TICS_LIST=`echo "$TICS_LIST" | sed -e 's/-ldl[ 	]//g' -e 's/-ldl$//'`

fi

if test "$DFT_LWR_MODEL" = "libtool"; then
	OBJEXT=lo
fi

# needed for Ada95
TINFO_LDFLAGS2=`echo "$TINFO_LDFLAGS" | sed -e 's,-L\.\./,-L../../,'`

case "$DFT_LWR_MODEL" in
(normal|debug|profile)

if test "$GCC" = yes ; then
	case "$cf_cv_system_name" in
	(OS/2*|os2*|aix[4]*|solaris2.1[0-9]|darwin*)
		LDFLAGS_STATIC=
		LDFLAGS_SHARED=
		;;
	(*) 	# normally, except when broken
		LDFLAGS_STATIC=-static
		LDFLAGS_SHARED=-dynamic
		;;
	esac
else
	case "$cf_cv_system_name" in
	(aix[4-7]*) 	# from ld manpage
		LDFLAGS_STATIC=-bstatic
		LDFLAGS_SHARED=-bdynamic
		;;
	(hpux*)		# from ld manpage for hpux10.20, hpux11.11
		# We could also use just "archive" and "shared".
		LDFLAGS_STATIC=-Wl,-a,archive_shared
		LDFLAGS_SHARED=-Wl,-a,shared_archive
		;;
	(irix*)		# from ld manpage IRIX64
		LDFLAGS_STATIC=-Bstatic
		LDFLAGS_SHARED=-Bdynamic
		;;
	(osf[45]*)	# from ld manpage osf4.0d, osf5.1
		# alternative "-oldstyle_liblookup" (not in cc manpage)
		LDFLAGS_STATIC=-noso
		LDFLAGS_SHARED=-so_archive
		;;
	(solaris2*)
		LDFLAGS_STATIC=-Bstatic
		LDFLAGS_SHARED=-Bdynamic
		;;
	esac
fi

if test -n "$LDFLAGS_STATIC" && test -n "$LDFLAGS_SHARED"
then
	echo "$as_me:28003: checking if linker supports switching between static/dynamic" >&5
echo $ECHO_N "checking if linker supports switching between static/dynamic... $ECHO_C" >&6

	rm -f libconftest.a
	cat >conftest.$ac_ext <<EOF
#line 28008 "configure"
#include <stdio.h>
int cf_ldflags_static(FILE *fp) { return fflush(fp); }
EOF
	if { (eval echo "$as_me:28012: \"$ac_compile\"") >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  echo "$as_me:28015: \$? = $ac_status" >&5
  (exit "$ac_status"); } ; then
		( $AR $ARFLAGS libconftest.a conftest.o ) 2>&5 1>/dev/null
		( eval $RANLIB libconftest.a ) 2>&5 >/dev/null
	fi
	rm -f conftest.*

	cf_save_LIBS="$LIBS"

	LIBS="$LDFLAGS_STATIC -L`pwd` -lconftest $LDFLAGS_DYNAMIC $LIBS"
	cat >"conftest.$ac_ext" <<_ACEOF
#line 28026 "configure"
#include "confdefs.h"

#line 28029 "configure"
#include <stdio.h>
int cf_ldflags_static(FILE *fp);

int
main (void)
{

	return cf_ldflags_static(stdin);

  ;
  return 0;
}
_ACEOF
rm -f "conftest.$ac_objext" "conftest$ac_exeext"
if { (eval echo "$as_me:28044: \"$ac_link\"") >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  echo "$as_me:28047: \$? = $ac_status" >&5
  (exit "$ac_status"); } &&
         { ac_try='test -s "conftest$ac_exeext"'
  { (eval echo "$as_me:28050: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  echo "$as_me:28053: \$? = $ac_status" >&5
  (exit "$ac_status"); }; }; then

	# some linkers simply ignore the -dynamic
	case x`file "conftest$ac_exeext" 2>/dev/null` in
	(*static*)
		cf_ldflags_static=no
		;;
	(*)
		cf_ldflags_static=yes
		;;
	esac

else
  echo "$as_me: failed program was:" >&5
cat "conftest.$ac_ext" >&5
cf_ldflags_static=no
fi
rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"

	rm -f libconftest.*
	LIBS="$cf_save_LIBS"

	echo "$as_me:28076: result: $cf_ldflags_static" >&5
echo "${ECHO_T}$cf_ldflags_static" >&6

	if test "$cf_ldflags_static" != yes
	then
		LDFLAGS_STATIC=
		LDFLAGS_SHARED=
	fi
else
	LDFLAGS_STATIC=
	LDFLAGS_SHARED=
fi

	;;
esac

echo "$as_me:28092: checking where we will install curses.h" >&5
echo $ECHO_N "checking where we will install curses.h... $ECHO_C" >&6

includesubdir=
if test "$with_overwrite" = no && \
 { test "x$includedir" = 'x${prefix}/include' || \
   test "x$includedir" = "x${prefix}/include"; }
then
	includesubdir="/ncurses${USE_LIB_SUFFIX}"
fi
echo "$as_me:28102: result: ${includedir}${includesubdir}" >&5
echo "${ECHO_T}${includedir}${includesubdir}" >&6

### Resolve a conflict between normal and wide-curses by forcing applications
### that will need libutf8 to add it to their configure script.
if test "$with_overwrite" != no ; then
if test "$NCURSES_LIBUTF8" = 1 ; then
	NCURSES_LIBUTF8='defined(HAVE_LIBUTF8_H)'
	{ echo "$as_me:28110: WARNING: Wide-character applications must define HAVE_LIBUTF8_H to include curses.h" >&5
echo "$as_me: WARNING: Wide-character applications must define HAVE_LIBUTF8_H to include curses.h" >&2;}
fi
fi
WITH_OVERWRITE=$with_overwrite

### At least on MinGW a shared library build without libtool
### requires adding the additional libs to the link list.
case "$cf_cv_system_name" in
(*mingw32*|*mingw64*)
	if test "$DFT_LWR_MODEL" != "libtool"; then
   	   SHLIB_LIST="$SHLIB_LIST ${LIBS}"
	fi
	;;
*)	;;
esac

# used to separate tack out of the tree
NCURSES_TREE=

### predefined stuff for the test programs

cat >>confdefs.h <<\EOF
#define HAVE_SLK_COLOR 1
EOF

# pkgsrc uses these

echo "$as_me:28138: checking for desired basename for form library" >&5
echo $ECHO_N "checking for desired basename for form library... $ECHO_C" >&6

# Check whether --with-form-libname or --without-form-libname was given.
if test "${with_form_libname+set}" = set; then
  withval="$with_form_libname"
  with_lib_basename=$withval
else
  with_lib_basename=form
fi;
FORM_NAME="$with_lib_basename"

case "x$FORM_NAME" in
(x|xno|xnone|xyes)
	FORM_NAME=form
	;;
(*)
	;;
esac

echo "$as_me:28158: result: $FORM_NAME" >&5
echo "${ECHO_T}$FORM_NAME" >&6

echo "$as_me:28161: checking for desired basename for menu library" >&5
echo $ECHO_N "checking for desired basename for menu library... $ECHO_C" >&6

# Check whether --with-menu-libname or --without-menu-libname was given.
if test "${with_menu_libname+set}" = set; then
  withval="$with_menu_libname"
  with_lib_basename=$withval
else
  with_lib_basename=menu
fi;
MENU_NAME="$with_lib_basename"

case "x$MENU_NAME" in
(x|xno|xnone|xyes)
	MENU_NAME=menu
	;;
(*)
	;;
esac

echo "$as_me:28181: result: $MENU_NAME" >&5
echo "${ECHO_T}$MENU_NAME" >&6

echo "$as_me:28184: checking for desired basename for panel library" >&5
echo $ECHO_N "checking for desired basename for panel library... $ECHO_C" >&6

# Check whether --with-panel-libname or --without-panel-libname was given.
if test "${with_panel_libname+set}" = set; then
  withval="$with_panel_libname"
  with_lib_basename=$withval
else
  with_lib_basename=panel
fi;
PANEL_NAME="$with_lib_basename"

case "x$PANEL_NAME" in
(x|xno|xnone|xyes)
	PANEL_NAME=panel
	;;
(*)
	;;
esac

echo "$as_me:28204: result: $PANEL_NAME" >&5
echo "${ECHO_T}$PANEL_NAME" >&6

echo "$as_me:28207: checking for desired basename for cxx library" >&5
echo $ECHO_N "checking for desired basename for cxx library... $ECHO_C" >&6

# Check whether --with-cxx-libname or --without-cxx-libname was given.
if test "${with_cxx_libname+set}" = set; then
  withval="$with_cxx_libname"
  with_lib_basename=$withval
else
  with_lib_basename=ncurses++
fi;
CXX_NAME="$with_lib_basename"

case "x$CXX_NAME" in
(x|xno|xnone|xyes)
	CXX_NAME=ncurses++
	;;
(*)
	;;
esac

echo "$as_me:28227: result: $CXX_NAME" >&5
echo "${ECHO_T}$CXX_NAME" >&6

### Construct the list of subdirectories for which we'll customize makefiles
### with the appropriate compile-rules.

echo "$as_me:28233: checking for src modules" >&5
echo $ECHO_N "checking for src modules... $ECHO_C" >&6

# dependencies and linker-arguments for test-programs
TEST_DEPS="${LIB_DIR}/${LIB_PREFIX}${LIB_NAME}${DFT_DEP_SUFFIX} $TEST_DEPS"
TEST_DEP2="${LIB_2ND}/${LIB_PREFIX}${LIB_NAME}${DFT_DEP_SUFFIX} $TEST_DEP2"
if test "$DFT_LWR_MODEL" = "libtool"; then
	TEST_ARGS="${TEST_DEPS}"
	TEST_ARG2="${TEST_DEP2}"
else
	TEST_ARGS="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARGS"
	TEST_ARG2="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARG2"
fi

PC_MODULES_TO_MAKE="ncurses${USE_ARG_SUFFIX}"
cf_cv_src_modules=
for cf_dir in $modules_to_build
do
	if test -f "$srcdir/$cf_dir/modules" ; then

		# We may/may not have tack in the distribution, though the
		# makefile is.
		if test "$cf_dir" = tack ; then
			if test "x$cf_with_tack" != "xyes"; then
				continue
			fi
		fi

		if test -z "$cf_cv_src_modules"; then
			cf_cv_src_modules=$cf_dir
		else
			cf_cv_src_modules="$cf_cv_src_modules $cf_dir"
		fi

		# Make the ncurses_cfg.h file record the library interface files as
		# well.  These are header files that are the same name as their
		# directory.  Ncurses is the only library that does not follow
		# that pattern.
		if test "$cf_dir" = tack ; then
			continue
		elif test -f "$srcdir/${cf_dir}/${cf_dir}.h" ; then

cf_have_include=`echo "$cf_dir" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`

			cat >>confdefs.h <<EOF
#define HAVE_${cf_have_include}_H 1
EOF

			cat >>confdefs.h <<EOF
#define HAVE_LIB${cf_have_include} 1
EOF

cf_map_lib_basename=`echo "$cf_dir" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`

eval TEST_ROOT="\$${cf_map_lib_basename}_NAME"

			TEST_DEPS="${LIB_DIR}/${LIB_PREFIX}${TEST_ROOT}${DFT_DEP_SUFFIX} $TEST_DEPS"
			TEST_DEP2="${LIB_2ND}/${LIB_PREFIX}${TEST_ROOT}${DFT_DEP_SUFFIX} $TEST_DEP2"
			if test "$DFT_LWR_MODEL" = "libtool"; then
				TEST_ARGS="${TEST_DEPS}"
				TEST_ARG2="${TEST_DEP2}"
			else
				TEST_ARGS="-l${TEST_ROOT}${USE_ARG_SUFFIX} $TEST_ARGS"
				TEST_ARG2="-l${TEST_ROOT}${USE_ARG_SUFFIX} $TEST_ARG2"
			fi
			PC_MODULES_TO_MAKE="${PC_MODULES_TO_MAKE} ${cf_dir}${USE_ARG_SUFFIX}"
		fi
	fi
done
echo "$as_me:28302: result: $cf_cv_src_modules" >&5
echo "${ECHO_T}$cf_cv_src_modules" >&6

TEST_ARGS="-L${LIB_DIR} $TEST_ARGS"
TEST_ARG2="-L${LIB_2ND} $TEST_ARG2"

SRC_SUBDIRS=
if test "x$cf_with_manpages" != xno ; then
	SRC_SUBDIRS="$SRC_SUBDIRS man"
fi
SRC_SUBDIRS="$SRC_SUBDIRS include"
for cf_dir in $cf_cv_src_modules
do
	SRC_SUBDIRS="$SRC_SUBDIRS $cf_dir"
done
if test "x$cf_with_tests" != "xno" ; then
	SRC_SUBDIRS="$SRC_SUBDIRS test"
fi
# always make this, to install the ncurses-config script
SRC_SUBDIRS="$SRC_SUBDIRS misc"
if test "$cf_with_cxx_binding" != no; then
	PC_MODULES_TO_MAKE="${PC_MODULES_TO_MAKE} ncurses++${USE_ARG_SUFFIX}"
	SRC_SUBDIRS="$SRC_SUBDIRS c++"
fi

test "x$with_termlib" != xno && PC_MODULES_TO_MAKE="$PC_MODULES_TO_MAKE $TINFO_ARG_SUFFIX"
test "x$with_ticlib" != xno && PC_MODULES_TO_MAKE="$PC_MODULES_TO_MAKE $TICS_ARG_SUFFIX"

ADA_SUBDIRS=
if test "x$cf_with_ada" = "xyes" && test "x$cf_cv_prog_gnat_correct" = xyes && test -f "$srcdir/Ada95/Makefile.in" ; then
	SRC_SUBDIRS="$SRC_SUBDIRS Ada95"
	ADA_SUBDIRS="gen src"
	if test "x$cf_with_tests" != "xno" ; then
		ADA_SUBDIRS="$ADA_SUBDIRS samples"
	fi
fi

SUB_MAKEFILES=
for cf_dir in $SRC_SUBDIRS
do
	SUB_MAKEFILES="$SUB_MAKEFILES $cf_dir/Makefile"
done

if test -n "$ADA_SUBDIRS"; then
	for cf_dir in $ADA_SUBDIRS
	do
		SUB_MAKEFILES="$SUB_MAKEFILES Ada95/$cf_dir/Makefile"
	done

fi

if test "x$cf_with_ada" = "xyes" && test "x$cf_cv_prog_gnat_correct" = "xyes"; then
   SUB_MAKEFILES="$SUB_MAKEFILES Ada95/src/library.gpr:Ada95/src/library.gpr.in"
   SUB_MAKEFILES="$SUB_MAKEFILES Ada95/gen/adacurses${USE_CFG_SUFFIX}-config:Ada95/gen/adacurses-config.in"
   SUB_MAKEFILES="$SUB_MAKEFILES man/adacurses${USE_CFG_SUFFIX}-config.1:man/MKada_config.in"
fi

DIRS_TO_MAKE="lib"
for cf_item in $cf_list_models
do

	case $cf_item in
	(libtool) cf_subdir='obj_lo'  ;;
	(normal)  cf_subdir='objects' ;;
	(debug)   cf_subdir='obj_g' ;;
	(profile) cf_subdir='obj_p' ;;
	(shared)
		case "$cf_cv_system_name" in
		(cygwin|msys)
			cf_subdir='objects' ;;
		(*)
			cf_subdir='obj_s' ;;
		esac
	esac

	for cf_item2 in $DIRS_TO_MAKE
	do
		test "$cf_item2" = "$cf_subdir" && break
	done
	test ".$cf_item2" != ".$cf_subdir" && DIRS_TO_MAKE="$DIRS_TO_MAKE $cf_subdir"
done
for cf_dir in $DIRS_TO_MAKE
do
	test ! -d "$cf_dir" && mkdir "$cf_dir"
done

# symbols that differ when compiling Ada95 by itself.
NCURSES_SHLIB2=$SHELL' $(top_srcdir)/misc/shlib'

# values to use as strings

cat >>confdefs.h <<EOF
#define NCURSES_PATHSEP '$PATH_SEPARATOR'
EOF

cat >>confdefs.h <<EOF
#define NCURSES_VERSION_STRING "${NCURSES_MAJOR}.${NCURSES_MINOR}.${NCURSES_PATCH}"
EOF

### Define substitutions for header files to avoid name-pollution

if test "x$cf_cv_have_tcgetattr" = xyes ; then
	HAVE_TCGETATTR=1
else
	HAVE_TCGETATTR=0
fi

if test "x$ac_cv_header_stdint_h" = xyes ; then
	HAVE_STDINT_H=1
else
	HAVE_STDINT_H=0
fi

if test "x$ac_cv_header_termio_h" = xyes ; then
	HAVE_TERMIO_H=1
else
	HAVE_TERMIO_H=0
fi

if test "x$ac_cv_header_termios_h" = xyes ; then
	HAVE_TERMIOS_H=1
else
	HAVE_TERMIOS_H=0
fi

################################################################################
test "x$use_database" = xyes && \
SUB_MAKEFILES="$SUB_MAKEFILES misc/run_tic.sh:misc/run_tic.in"

SUB_MAKEFILES="$SUB_MAKEFILES misc/ncurses-config:misc/ncurses-config.in"
SUB_MAKEFILES="$SUB_MAKEFILES man/ncurses${USE_CFG_SUFFIX}-config.1:man/MKncu_config.in"

if test "x$enable_pc_files" = xyes && test -z "$MAKE_PC_FILES" ; then
SUB_MAKEFILES="$SUB_MAKEFILES misc/gen-pkgconfig:misc/gen-pkgconfig.in"
fi

if test "x$cf_with_tests" != xno ; then
	MAKE_TESTS=
else
	MAKE_TESTS="#"
fi

ADAHTML_DIR=../../doc/html/ada

# workaround for OS/2 (20151017)
case "$cf_cv_system_name" in
(os2*)
	LIBTOOL_OPTS_CXX="-os2dllname ncurs++"
	;;
(*)
	LIBTOOL_OPTS_CXX=
	;;
esac

# workaround for g++ versus Solaris (20131116)
case "$cf_cv_system_name" in
(solaris2*)
	case "x$CPPFLAGS" in
	(*-D_XOPEN_SOURCE_EXTENDED*)
		test -n "$verbose" && echo "	moving _XOPEN_SOURCE_EXTENDED to work around g++ problem" 1>&6

echo "${as_me:-configure}:28463: testing moving _XOPEN_SOURCE_EXTENDED to work around g++ problem ..." 1>&5

		CFLAGS="$CFLAGS -D_XOPEN_SOURCE_EXTENDED"
		CPPFLAGS=`echo "x$CPPFLAGS" | sed -e  's/^.//' -e 's/-D_XOPEN_SOURCE_EXTENDED//'`
		;;
	esac
	;;
esac

# Help to automatically enable the extended curses features when using either
# the *-config or the ".pc" files by adding defines.
echo "$as_me:28474: checking for defines to add to ncurses${USE_CFG_SUFFIX}-config script" >&5
echo $ECHO_N "checking for defines to add to ncurses${USE_CFG_SUFFIX}-config script... $ECHO_C" >&6
PKG_CFLAGS=
for cf_loop1 in $CPPFLAGS_after_XOPEN
do
	cf_found=no
	for cf_loop2 in $CPPFLAGS_before_XOPEN
	do
		if test "x$cf_loop1" = "x$cf_loop2"
		then
			cf_found=yes
			break
		fi
	done
	test "$cf_found" = no && PKG_CFLAGS="$PKG_CFLAGS $cf_loop1"
done
echo "$as_me:28490: result: $PKG_CFLAGS" >&5
echo "${ECHO_T}$PKG_CFLAGS" >&6

# AC_CHECK_SIZEOF demands a literal parameter, no variables.  So we do this.
case "x$NCURSES_OSPEED" in
(*short*)
	cf_compatible=1
	;;
(*)
	cf_compatible=0
	;;
esac

cat >>confdefs.h <<EOF
#define NCURSES_OSPEED_COMPAT $cf_compatible
EOF

case "x$cf_cv_typeof_chtype" in
(xshort|xint|xlong)
	cf_cv_typeof_chtype="unsigned $cf_cv_typeof_chtype"
	;;
esac

case "x$cf_cv_typeof_mmask_t" in
(xshort|xint|xlong)
	cf_cv_typeof_mmask_t="unsigned $cf_cv_typeof_mmask_t"
	;;
esac

# substitute into misc/Makefile to suppress
# (un)install.data from the
# (un)install rules.
if test "x$cf_with_db_install" = "xno"; then
	MISC_INSTALL_DATA=
	MISC_UNINSTALL_DATA=
else
	MISC_INSTALL_DATA=install.data
	MISC_UNINSTALL_DATA=uninstall.data
fi

if test "x$cf_with_db_install" = "xno" || test "x$TERMINFO_SRC" = "xno"; then
	MAKE_DATABASE="#"
else
	MAKE_DATABASE="$MAKE_TERMINFO"
fi

if test -n "$PACKAGE"
then
	PACKAGE="${PACKAGE}${DFT_ARG_SUFFIX}"
	export PACKAGE
	echo "package: $PACKAGE"
fi

UNALTERED_SYMS=
cf_filter_syms=no

if test -n "$RESULTING_SYMS"
then
	cf_filter_syms=$cf_dft_filter_syms
	test -n "$verbose" && echo "	will map symbols to ABI=$cf_cv_abi_version" 1>&6

echo "${as_me:-configure}:28551: testing will map symbols to ABI=$cf_cv_abi_version ..." 1>&5

fi

if test "x$WILDCARD_SYMS" = xno
then
	cf_filter_syms=yes
fi

test "x$cf_with_trace" = xyes && NCURSES_INLINE=

UNALTERED_SYMS=`echo "$RESULTING_SYMS" | sed -e 's/\\$/\\\\$/g'`
if test "$cf_filter_syms" = yes
then
	RESULTING_SYMS=resulting.map
fi

if test "x$cross_compiling" = xyes ; then
	ADAGEN_LDFLAGS='$(CROSS_LDFLAGS)'
	CHECK_BUILD="#"
else
	ADAGEN_LDFLAGS='$(NATIVE_LDFLAGS)'
	CHECK_BUILD=
fi

# This is used for the *-config script and *.pc data files.

echo "$as_me:28578: checking for linker search path" >&5
echo $ECHO_N "checking for linker search path... $ECHO_C" >&6
if test "${cf_cv_ld_searchpath+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else

if test "$cross_compiling" != yes ; then

# GNU binutils' ld does not involve permissions which may stop ldconfig.
cf_pathlist=`ld --verbose 2>/dev/null | grep SEARCH_DIR | sed -e 's,SEARCH_DIR[("=][("=]*,,g' -e 's/"[)];//gp' | sort -u`

# The -NX options tell newer versions of Linux ldconfig to not attempt to
# update the cache, which makes it run faster.
test -z "$cf_pathlist" && \
	cf_pathlist=`(ldconfig -NX -v) 2>/dev/null | sed -e '/^[ 	]/d' -e 's/:$//' | sort -u`

test -z "$cf_pathlist" &&
	cf_pathlist=`(ldconfig -v) 2>/dev/null | sed -n -e '/^[ 	]/d' -e 's/:$//p' | sort -u`

# This works with OpenBSD 6.5, which lists only filenames
test -z "$cf_pathlist" &&
	cf_pathlist=`(ldconfig -v) 2>/dev/null | sed -n -e 's,^Adding \(.*\)/.*$,\1,p' | sort -u`

if test -z "$cf_pathlist"
then
	# dyld default path with MacOS
	if test -f /usr/bin/otool && test "x`uname -s`" = xDarwin
	then
		# do this to bypass check
		cf_cv_ld_searchpath='$HOME/lib'
		cf_pathlist="/usr/local/lib /lib /usr/lib"
	fi
fi

if test -z "$cf_pathlist"
then
	# Solaris is "SunOS"
	if test -f /usr/bin/isainfo && test "x`uname -s`" = xSunOS
	then
		case x`(isainfo -b)` in
		(x64)
			cf_pathlist="$cf_pathlist /lib/64 /usr/lib/64"
			;;
		(x32)
			test -d /usr/ccs/lib && cf_pathlist="$cf_pathlist /usr/ccs/lib"
			cf_pathlist="$cf_pathlist /lib /usr/lib"
			;;
		(*)
			{ echo "$as_me:28626: WARNING: problem with Solaris architecture" >&5
echo "$as_me: WARNING: problem with Solaris architecture" >&2;}
			;;
		esac
	fi
fi

if test -z "$cf_pathlist"
then
	# HP-UX
	if test x"`uname -s`" = xHP-UX
	then
		case x`getconf LONG_BIT` in
		(x64)
			cf_pathlist="/usr/lib/hpux64"
			;;
		(x*)
			cf_pathlist="/usr/lib/hpux32"
			;;
		esac
	fi
fi

fi

# If nothing else, assume it is conventional
test -z "$cf_pathlist" && cf_pathlist="/usr/lib /lib"

# Finally, check that this is only directories
for cf_path in $0 $cf_pathlist
do
	if test -d "$cf_path"; then
		test -n "$cf_cv_ld_searchpath" && cf_cv_ld_searchpath="${cf_cv_ld_searchpath} "
		cf_cv_ld_searchpath="${cf_cv_ld_searchpath}${cf_path}"
	fi
done

# Ensure that it is nonempty
test -z "$cf_cv_ld_searchpath" && cf_cv_ld_searchpath=/usr/lib

fi
echo "$as_me:28667: result: $cf_cv_ld_searchpath" >&5
echo "${ECHO_T}$cf_cv_ld_searchpath" >&6

LD_SEARCHPATH=`echo "$cf_cv_ld_searchpath"|sed -e 's/ /|/g'`

cat >>confdefs.h <<\EOF
#define HAVE_CURSES_DATA_BOOLNAMES 1
EOF

ac_config_files="$ac_config_files include/MKterm.h.awk include/curses.head:include/curses.h.in include/ncurses_dll.h include/termcap.h include/unctrl.h $SUB_MAKEFILES 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 overriden 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, don't put newlines in cache variables' values.
# 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.
{
  (set) 2>&1 |
    case `(ac_space=' '; set | grep ac_space) 2>&1` in
    *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 \
        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
      ;;
    esac;
} |
  sed '
     t clear
     : clear
     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
     t end
     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
     : end' >>confcache
if cmp -s $cache_file confcache; then :; else
  if test -w $cache_file; then
    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
    cat confcache >$cache_file
  else
    echo "not updating unwritable cache $cache_file"
  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}'

# VPATH may cause trouble with some makes, so we remove $(srcdir),
# ${srcdir} and @srcdir@ 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[ 	]*=/{
s/:*\$(srcdir):*/:/;
s/:*\${srcdir}:*/:/;
s/:*@srcdir@:*/:/;
s/^\([^=]*=[ 	]*\):*/\1/;
s/:*$//;
s/^[^=]*=[ 	]*$//;
}'
fi

DEFS=-DHAVE_CONFIG_H

: "${CONFIG_STATUS=./config.status}"
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
{ echo "$as_me:28757: creating $CONFIG_STATUS" >&5
echo "$as_me: creating $CONFIG_STATUS" >&6;}
cat >"$CONFIG_STATUS" <<_ACEOF
#! $SHELL
# Generated automatically by configure.
# 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
SHELL=\${CONFIG_SHELL-$SHELL}
ac_cs_invocation="\$0 \$@"

CLICOLOR_FORCE= GREP_OPTIONS=
unset CLICOLOR_FORCE GREP_OPTIONS
_ACEOF

cat >>"$CONFIG_STATUS" <<\_ACEOF
# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
  set -o posix
fi

# Name of the executable.
as_me=`echo "$0" |sed 's,.*[\\/],,'`

if expr a : '\(a\)' >/dev/null 2>&1; then
  as_expr=expr
else
  as_expr=false
fi

rm -f conf$$ conf$$.exe conf$$.file
echo >conf$$.file
if ln -s conf$$.file conf$$ 2>/dev/null; then
  # We could just check for DJGPP; but this test a) works b) is more generic
  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
  if test -f conf$$.exe; then
    # Don't use ln at all; we don't have any links
    as_ln_s='cp -p'
  else
    as_ln_s='ln -s'
  fi
elif ln conf$$.file conf$$ 2>/dev/null; then
  as_ln_s=ln
else
  as_ln_s='cp -p'
fi
rm -f conf$$ conf$$.exe conf$$.file

as_executable_p="test -f"

# Support unset when possible.
if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
  as_unset="unset"
else
  as_unset="false"
fi

# NLS nuisances.
$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; }
$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; }
$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; }
$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; }
$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; }
$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; }
$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; }
$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; }

# IFS
# We need space, tab and new line, in precisely that order.
as_nl='
'
IFS=" 	$as_nl"

# CDPATH.
$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; }

exec 6>&1

_ACEOF

# Files that config.status was made for.
if test -n "$ac_config_files"; then
  echo "config_files=\"$ac_config_files\"" >>"$CONFIG_STATUS"
fi

if test -n "$ac_config_headers"; then
  echo "config_headers=\"$ac_config_headers\"" >>"$CONFIG_STATUS"
fi

if test -n "$ac_config_links"; then
  echo "config_links=\"$ac_config_links\"" >>"$CONFIG_STATUS"
fi

if test -n "$ac_config_commands"; then
  echo "config_commands=\"$ac_config_commands\"" >>"$CONFIG_STATUS"
fi

cat >>"$CONFIG_STATUS" <<\EOF

ac_cs_usage="\
\`$as_me' instantiates files from templates according to the
current configuration.

Usage: $0 [OPTIONS] [FILE]...

  -h, --help       print this help, then exit
  -V, --version    print version number, then exit
  -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 <dickey@invisible-island.net>."
EOF

cat >>"$CONFIG_STATUS" <<EOF
ac_cs_version="\\
config.status
configured by $0, generated by GNU Autoconf 2.52.20210509,
  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"

Copyright 2003-2020,2021	Thomas E. Dickey
Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
srcdir="$srcdir"
INSTALL="$INSTALL"
EOF

cat >>"$CONFIG_STATUS" <<\EOF
# If no file are specified by the user, then we need to provide default
# value.  By we need to know if files were specified by the user.
ac_need_defaults=:
while test $# != 0
do
  case $1 in
  --*=*)
    ac_option=`expr "x$1" : 'x\([^=]*\)='`
    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
    shift
    set dummy "$ac_option" "$ac_optarg" ${1+"$@"}
    shift
    ;;
  -*);;
  *) # This is not an option, so the user has probably given explicit
     # arguments.
     ac_need_defaults=false;;
  esac

  case $1 in
  # Handling of the options.
EOF
cat >>"$CONFIG_STATUS" <<EOF
  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
    echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion"
    exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;;
EOF
cat >>"$CONFIG_STATUS" <<\EOF
  --version | --vers* | -V )
    echo "$ac_cs_version"; exit 0 ;;
  --he | --h)
    # Conflict between --help and --header
    { { echo "$as_me:28936: error: ambiguous option: $1
Try \`$0 --help' for more information." >&5
echo "$as_me: error: ambiguous option: $1
Try \`$0 --help' for more information." >&2;}
   { (exit 1); exit 1; }; };;
  --help | --hel | -h )
    echo "$ac_cs_usage"; exit 0 ;;
  --debug | --d* | -d )
    debug=: ;;
  --file | --fil | --fi | --f )
    shift
    CONFIG_FILES="$CONFIG_FILES $1"
    ac_need_defaults=false;;
  --header | --heade | --head | --hea )
    shift
    CONFIG_HEADERS="$CONFIG_HEADERS $1"
    ac_need_defaults=false;;

  # This is an error.
  -*) { { echo "$as_me:28955: error: unrecognized option: $1
Try \`$0 --help' for more information." >&5
echo "$as_me: error: unrecognized option: $1
Try \`$0 --help' for more information." >&2;}
   { (exit 1); exit 1; }; } ;;

  *) ac_config_targets="$ac_config_targets $1" ;;

  esac
  shift
done

exec 5>>config.log
cat >&5 << _ACEOF

## ----------------------- ##
## Running config.status.  ##
## ----------------------- ##

This file was extended by $as_me 2.52.20210509, executed with
  CONFIG_FILES    = $CONFIG_FILES
  CONFIG_HEADERS  = $CONFIG_HEADERS
  CONFIG_LINKS    = $CONFIG_LINKS
  CONFIG_COMMANDS = $CONFIG_COMMANDS
  > "$ac_cs_invocation"
on `(hostname || uname -n) 2>/dev/null | sed 1q`

_ACEOF
EOF

cat >>"$CONFIG_STATUS" <<EOF
#
# INIT-COMMANDS section.
#

### Special initialization commands, used to pass information from the
### configuration-run into config.status

ALTERNATE_SYMS="$ALTERNATE_SYMS"
AWK="$AWK"
CXX_NAME="$CXX_NAME"
DFT_ARG_SUFFIX="$DFT_ARG_SUFFIX"
DFT_LWR_MODEL="$DFT_LWR_MODEL"
ECHO_LD="$ECHO_LD"
EXTRA_SUFFIX="$EXTRA_SUFFIX"
FORM_NAME="$FORM_NAME"
LDCONFIG="$LDCONFIG"
LIBTOOL_VERSION="$LIBTOOL_VERSION"
LIB_NAME="$LIB_NAME"
LIB_PREFIX="$LIB_PREFIX"
LIB_SUBSETS="$LIB_SUBSETS"
LIB_SUFFIX="$LIB_SUFFIX"
LIB_TRACING="$LIB_TRACING"
LN_S="$LN_S"
MAKE_TERMINFO="$MAKE_TERMINFO"
MENU_NAME="$MENU_NAME"
NCURSES_MAJOR="$NCURSES_MAJOR"
NCURSES_MINOR="$NCURSES_MINOR"
NCURSES_OSPEED="$NCURSES_OSPEED"
NCURSES_PATCH="$NCURSES_PATCH"
PANEL_NAME="$PANEL_NAME"
SRC_SUBDIRS="$SRC_SUBDIRS"
TERMINFO="$TERMINFO"
TICS_ARG_SUFFIX="$TICS_ARG_SUFFIX"
TICS_LIB_SUFFIX="$TICS_LIB_SUFFIX"
TICS_NAME="$TICS_NAME"
TICS_SUFFIX="$TICS_SUFFIX"
TIC_PATH="$TIC_PATH"
TINFO_ARG_SUFFIX="$TINFO_ARG_SUFFIX"
TINFO_LIB_SUFFIX="$TINFO_LIB_SUFFIX"
TINFO_NAME="$TINFO_NAME"
TINFO_SUFFIX="$TINFO_SUFFIX"
UNALTERED_SYMS="$UNALTERED_SYMS"
USE_ARG_SUFFIX="$USE_ARG_SUFFIX"
USE_CFG_SUFFIX="$USE_CFG_SUFFIX"
USE_LIB_SUFFIX="$USE_LIB_SUFFIX"
USE_OLD_MAKERULES="$USE_OLD_MAKERULES"
WILDCARD_SYMS="$WILDCARD_SYMS"
WITH_CURSES_H="$with_curses_h"
WITH_ECHO="${enable_echo:=yes}"
WITH_OVERWRITE="$with_overwrite"
cf_LIST_MODELS="$cf_list_models"
cf_cv_VERSION_GNATMAKE=$cf_cv_VERSION_GNATMAKE
cf_cv_VERSION_GPRBUILD=$cf_cv_VERSION_GPRBUILD
cf_cv_abi_version="$cf_cv_abi_version"
cf_cv_do_relink="$cf_cv_do_relink"
cf_cv_do_reranlib="$cf_cv_do_reranlib"
cf_cv_do_symlinks="$cf_cv_do_symlinks"
cf_cv_enable_lp64="$cf_cv_enable_lp64"
cf_cv_enable_opaque="$cf_cv_enable_opaque"
cf_cv_make_PHONY="$cf_cv_make_PHONY"
cf_cv_prog_CC_c_o=$cf_cv_prog_CC_c_o
cf_cv_prog_CXX_c_o=$cf_cv_prog_CXX_c_o
cf_cv_prog_gnat_correct=$cf_cv_prog_gnat_correct
cf_cv_rel_version="$cf_cv_rel_version"
cf_cv_rm_so_locs="$cf_cv_rm_so_locs"
cf_cv_shared_soname='$cf_cv_shared_soname'
cf_cv_shlib_version="$cf_cv_shlib_version"
cf_cv_shlib_version_infix="$cf_cv_shlib_version_infix"
cf_cv_system_name="$cf_cv_system_name"
cf_cv_term_driver="$with_term_driver"
cf_with_ada="$cf_with_ada"
cf_with_cxx_binding="$cf_with_cxx_binding"
cf_with_db_install="$cf_with_db_install"
cf_with_manpages="$cf_with_manpages"
cf_with_tests="$cf_with_tests"
host="$host"
target="$target"
with_shared_cxx="$with_shared_cxx"

EOF

cat >>"$CONFIG_STATUS" <<\EOF
for ac_config_target in $ac_config_targets
do
  case "$ac_config_target" in
  # Handling of arguments.
  "include/MKterm.h.awk" ) CONFIG_FILES="$CONFIG_FILES include/MKterm.h.awk" ;;
  "include/curses.head" ) CONFIG_FILES="$CONFIG_FILES include/curses.head:include/curses.h.in" ;;
  "include/ncurses_dll.h" ) CONFIG_FILES="$CONFIG_FILES include/ncurses_dll.h" ;;
  "include/termcap.h" ) CONFIG_FILES="$CONFIG_FILES include/termcap.h" ;;
  "include/unctrl.h" ) CONFIG_FILES="$CONFIG_FILES include/unctrl.h" ;;
  "$SUB_MAKEFILES" ) CONFIG_FILES="$CONFIG_FILES $SUB_MAKEFILES" ;;
  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
  "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
  "include/ncurses_cfg.h" ) CONFIG_HEADERS="$CONFIG_HEADERS include/ncurses_cfg.h:include/ncurses_cfg.hin" ;;
  *) { { echo "$as_me:29081: error: invalid argument: $ac_config_target" >&5
echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
   { (exit 1); exit 1; }; };;
  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

# Create a temporary directory, and hook for its removal unless debugging.
$debug ||
{
  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
  trap '{ (exit 1); exit 1; }' 1 2 13 15
}

# Create a (secure) tmp directory for tmp files.
: ${TMPDIR=/tmp}
{
  tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
  test -n "$tmp" && test -d "$tmp"
}  ||
{
  tmp=$TMPDIR/cs$$-$RANDOM
  (umask 077 && mkdir $tmp)
} ||
{
   echo "$me: cannot create a temporary directory in $TMPDIR" >&2
   { (exit 1); exit 1; }
}

EOF

cat >>"$CONFIG_STATUS" <<EOF

#
# CONFIG_FILES section.
#

# No need to generate the scripts if there are no CONFIG_FILES.
# This happens for instance when ./config.status config.h
if test -n "\$CONFIG_FILES"; then
  # Protect against being on the right side of a sed subst in config.status.
  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
s,@SHELL@,$SHELL,;t t
s,@exec_prefix@,$exec_prefix,;t t
s,@prefix@,$prefix,;t t
s,@program_transform_name@,$program_transform_name,;t t
s,@bindir@,$bindir,;t t
s,@sbindir@,$sbindir,;t t
s,@libexecdir@,$libexecdir,;t t
s,@datarootdir@,$datarootdir,;t t
s,@datadir@,$datadir,;t t
s,@sysconfdir@,$sysconfdir,;t t
s,@sharedstatedir@,$sharedstatedir,;t t
s,@localstatedir@,$localstatedir,;t t
s,@runstatedir@,$runstatedir,;t t
s,@libdir@,$libdir,;t t
s,@includedir@,$includedir,;t t
s,@oldincludedir@,$oldincludedir,;t t
s,@infodir@,$infodir,;t t
s,@mandir@,$mandir,;t t
s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
s,@build_alias@,$build_alias,;t t
s,@host_alias@,$host_alias,;t t
s,@target_alias@,$target_alias,;t t
s,@ECHO_C@,$ECHO_C,;t t
s,@ECHO_N@,$ECHO_N,;t t
s,@ECHO_T@,$ECHO_T,;t t
s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
s,@DEFS@,$DEFS,;t t
s,@LIBS@,$LIBS,;t t
s,@top_builddir@,$top_builddir,;t t
s,@GREP@,$GREP,;t t
s,@EGREP@,$EGREP,;t t
s,@NCURSES_MAJOR@,$NCURSES_MAJOR,;t t
s,@NCURSES_MINOR@,$NCURSES_MINOR,;t t
s,@NCURSES_PATCH@,$NCURSES_PATCH,;t t
s,@cf_cv_rel_version@,$cf_cv_rel_version,;t t
s,@cf_cv_abi_version@,$cf_cv_abi_version,;t t
s,@cf_cv_builtin_bool@,$cf_cv_builtin_bool,;t t
s,@cf_cv_header_stdbool_h@,$cf_cv_header_stdbool_h,;t t
s,@cf_cv_type_of_bool@,$cf_cv_type_of_bool,;t t
s,@VERSION@,$VERSION,;t t
s,@VERSION_MAJOR@,$VERSION_MAJOR,;t t
s,@VERSION_MINOR@,$VERSION_MINOR,;t t
s,@VERSION_PATCH@,$VERSION_PATCH,;t t
s,@PACKAGE@,$PACKAGE,;t t
s,@build@,$build,;t t
s,@build_cpu@,$build_cpu,;t t
s,@build_vendor@,$build_vendor,;t t
s,@build_os@,$build_os,;t t
s,@host@,$host,;t t
s,@host_cpu@,$host_cpu,;t t
s,@host_vendor@,$host_vendor,;t t
s,@host_os@,$host_os,;t t
s,@target@,$target,;t t
s,@target_cpu@,$target_cpu,;t t
s,@target_vendor@,$target_vendor,;t t
s,@target_os@,$target_os,;t t
s,@FGREP@,$FGREP,;t t
s,@CC@,$CC,;t t
s,@CFLAGS@,$CFLAGS,;t t
s,@LDFLAGS@,$LDFLAGS,;t t
s,@CPPFLAGS@,$CPPFLAGS,;t t
s,@ac_ct_CC@,$ac_ct_CC,;t t
s,@EXEEXT@,$EXEEXT,;t t
s,@OBJEXT@,$OBJEXT,;t t
s,@EXTRA_CPPFLAGS@,$EXTRA_CPPFLAGS,;t t
s,@CPP@,$CPP,;t t
s,@LDCONFIG@,$LDCONFIG,;t t
s,@CXX@,$CXX,;t t
s,@CXXFLAGS@,$CXXFLAGS,;t t
s,@ac_ct_CXX@,$ac_ct_CXX,;t t
s,@AWK@,$AWK,;t t
s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
s,@INSTALL_DATA@,$INSTALL_DATA,;t t
s,@LINT@,$LINT,;t t
s,@LINT_OPTS@,$LINT_OPTS,;t t
s,@LN_S@,$LN_S,;t t
s,@cf_config_suffix@,$cf_config_suffix,;t t
s,@PKG_CONFIG@,$PKG_CONFIG,;t t
s,@ac_pt_PKG_CONFIG@,$ac_pt_PKG_CONFIG,;t t
s,@PKG_CONFIG_LIBDIR@,$PKG_CONFIG_LIBDIR,;t t
s,@MAKE_PC_FILES@,$MAKE_PC_FILES,;t t
s,@PC_MODULE_SUFFIX@,$PC_MODULE_SUFFIX,;t t
s,@SET_MAKE@,$SET_MAKE,;t t
s,@MAKE_NO_PHONY@,$MAKE_NO_PHONY,;t t
s,@MAKE_PHONY@,$MAKE_PHONY,;t t
s,@CTAGS@,$CTAGS,;t t
s,@ETAGS@,$ETAGS,;t t
s,@MAKE_LOWER_TAGS@,$MAKE_LOWER_TAGS,;t t
s,@MAKE_UPPER_TAGS@,$MAKE_UPPER_TAGS,;t t
s,@cf_cv_makeflags@,$cf_cv_makeflags,;t t
s,@RANLIB@,$RANLIB,;t t
s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
s,@LD@,$LD,;t t
s,@ac_ct_LD@,$ac_ct_LD,;t t
s,@AR@,$AR,;t t
s,@ac_ct_AR@,$ac_ct_AR,;t t
s,@NM@,$NM,;t t
s,@ac_ct_NM@,$ac_ct_NM,;t t
s,@ARFLAGS@,$ARFLAGS,;t t
s,@DESTDIR@,$DESTDIR,;t t
s,@BUILD_CC@,$BUILD_CC,;t t
s,@BUILD_CPP@,$BUILD_CPP,;t t
s,@BUILD_CFLAGS@,$BUILD_CFLAGS,;t t
s,@BUILD_CPPFLAGS@,$BUILD_CPPFLAGS,;t t
s,@BUILD_LDFLAGS@,$BUILD_LDFLAGS,;t t
s,@BUILD_LIBS@,$BUILD_LIBS,;t t
s,@BUILD_EXEEXT@,$BUILD_EXEEXT,;t t
s,@BUILD_OBJEXT@,$BUILD_OBJEXT,;t t
s,@cf_list_models@,$cf_list_models,;t t
s,@ABI_VERSION@,$ABI_VERSION,;t t
s,@LIBTOOL_VERSION@,$LIBTOOL_VERSION,;t t
s,@LIBTOOL@,$LIBTOOL,;t t
s,@ac_ct_LIBTOOL@,$ac_ct_LIBTOOL,;t t
s,@LT_UNDEF@,$LT_UNDEF,;t t
s,@LIBTOOL_CXX@,$LIBTOOL_CXX,;t t
s,@LIBTOOL_OPTS@,$LIBTOOL_OPTS,;t t
s,@LIB_CREATE@,$LIB_CREATE,;t t
s,@LIB_OBJECT@,$LIB_OBJECT,;t t
s,@LIB_SUFFIX@,$LIB_SUFFIX,;t t
s,@LIB_PREP@,$LIB_PREP,;t t
s,@LIB_CLEAN@,$LIB_CLEAN,;t t
s,@LIB_COMPILE@,$LIB_COMPILE,;t t
s,@LIB_LINK@,$LIB_LINK,;t t
s,@LIB_INSTALL@,$LIB_INSTALL,;t t
s,@LIB_UNINSTALL@,$LIB_UNINSTALL,;t t
s,@DFT_LWR_MODEL@,$DFT_LWR_MODEL,;t t
s,@DFT_UPR_MODEL@,$DFT_UPR_MODEL,;t t
s,@TICS_NAME@,$TICS_NAME,;t t
s,@TINFO_NAME@,$TINFO_NAME,;t t
s,@LIB_NAME@,$LIB_NAME,;t t
s,@LIB_PREFIX@,$LIB_PREFIX,;t t
s,@CC_G_OPT@,$CC_G_OPT,;t t
s,@CXX_G_OPT@,$CXX_G_OPT,;t t
s,@LD_MODEL@,$LD_MODEL,;t t
s,@shlibdir@,$shlibdir,;t t
s,@MAKE_DLLS@,$MAKE_DLLS,;t t
s,@CC_SHARED_OPTS@,$CC_SHARED_OPTS,;t t
s,@LD_RPATH_OPT@,$LD_RPATH_OPT,;t t
s,@LD_SHARED_OPTS@,$LD_SHARED_OPTS,;t t
s,@MK_SHARED_LIB@,$MK_SHARED_LIB,;t t
s,@RM_SHARED_OPTS@,$RM_SHARED_OPTS,;t t
s,@LINK_PROGS@,$LINK_PROGS,;t t
s,@LINK_TESTS@,$LINK_TESTS,;t t
s,@EXTRA_LDFLAGS@,$EXTRA_LDFLAGS,;t t
s,@LOCAL_LDFLAGS@,$LOCAL_LDFLAGS,;t t
s,@LOCAL_LDFLAGS2@,$LOCAL_LDFLAGS2,;t t
s,@INSTALL_LIB@,$INSTALL_LIB,;t t
s,@RPATH_LIST@,$RPATH_LIST,;t t
s,@EXPORT_SYMS@,$EXPORT_SYMS,;t t
s,@RESULTING_SYMS@,$RESULTING_SYMS,;t t
s,@VERSIONED_SYMS@,$VERSIONED_SYMS,;t t
s,@WILDCARD_SYMS@,$WILDCARD_SYMS,;t t
s,@cf_ldd_prog@,$cf_ldd_prog,;t t
s,@EXTRA_PKG_LDFLAGS@,$EXTRA_PKG_LDFLAGS,;t t
s,@EXTRA_SUFFIX@,$EXTRA_SUFFIX,;t t
s,@TERMINFO_SRC@,$TERMINFO_SRC,;t t
s,@NCURSES_USE_DATABASE@,$NCURSES_USE_DATABASE,;t t
s,@TIC@,$TIC,;t t
s,@ac_ct_TIC@,$ac_ct_TIC,;t t
s,@INFOCMP@,$INFOCMP,;t t
s,@ac_ct_INFOCMP@,$ac_ct_INFOCMP,;t t
s,@FALLBACK_LIST@,$FALLBACK_LIST,;t t
s,@USE_FALLBACKS@,$USE_FALLBACKS,;t t
s,@WHICH_XTERM@,$WHICH_XTERM,;t t
s,@XTERM_KBS@,$XTERM_KBS,;t t
s,@TERMINFO_DIRS@,$TERMINFO_DIRS,;t t
s,@TERMINFO@,$TERMINFO,;t t
s,@MAKE_TERMINFO@,$MAKE_TERMINFO,;t t
s,@USE_BIG_STRINGS@,$USE_BIG_STRINGS,;t t
s,@TERMPATH@,$TERMPATH,;t t
s,@NCURSES_USE_TERMCAP@,$NCURSES_USE_TERMCAP,;t t
s,@BROKEN_LINKER@,$BROKEN_LINKER,;t t
s,@NCURSES_WCWIDTH_GRAPHICS@,$NCURSES_WCWIDTH_GRAPHICS,;t t
s,@NCURSES_CH_T@,$NCURSES_CH_T,;t t
s,@NCURSES_LIBUTF8@,$NCURSES_LIBUTF8,;t t
s,@NEED_WCHAR_H@,$NEED_WCHAR_H,;t t
s,@NCURSES_MBSTATE_T@,$NCURSES_MBSTATE_T,;t t
s,@NCURSES_WCHAR_T@,$NCURSES_WCHAR_T,;t t
s,@NCURSES_WINT_T@,$NCURSES_WINT_T,;t t
s,@NCURSES_OK_WCHAR_T@,$NCURSES_OK_WCHAR_T,;t t
s,@NCURSES_OK_WINT_T@,$NCURSES_OK_WINT_T,;t t
s,@cf_cv_enable_lp64@,$cf_cv_enable_lp64,;t t
s,@NCURSES_TPARM_VARARGS@,$NCURSES_TPARM_VARARGS,;t t
s,@NCURSES_WATTR_MACROS@,$NCURSES_WATTR_MACROS,;t t
s,@RGB_PATH@,$RGB_PATH,;t t
s,@no_x11_rgb@,$no_x11_rgb,;t t
s,@NCURSES_BOOL@,$NCURSES_BOOL,;t t
s,@TERMINFO_CAPS@,$TERMINFO_CAPS,;t t
s,@NCURSES_OSPEED@,$NCURSES_OSPEED,;t t
s,@NCURSES_CCHARW_MAX@,$NCURSES_CCHARW_MAX,;t t
s,@NCURSES_SBOOL@,$NCURSES_SBOOL,;t t
s,@NCURSES_TPARM_ARG@,$NCURSES_TPARM_ARG,;t t
s,@MANPAGE_RENAMES@,$MANPAGE_RENAMES,;t t
s,@NCURSES_EXT_FUNCS@,$NCURSES_EXT_FUNCS,;t t
s,@GENERATED_EXT_FUNCS@,$GENERATED_EXT_FUNCS,;t t
s,@NCURSES_SP_FUNCS@,$NCURSES_SP_FUNCS,;t t
s,@GENERATED_SP_FUNCS@,$GENERATED_SP_FUNCS,;t t
s,@NCURSES_CONST@,$NCURSES_CONST,;t t
s,@NCURSES_EXT_COLORS@,$NCURSES_EXT_COLORS,;t t
s,@NCURSES_MOUSE_VERSION@,$NCURSES_MOUSE_VERSION,;t t
s,@NCURSES_XNAMES@,$NCURSES_XNAMES,;t t
s,@PTHREAD@,$PTHREAD,;t t
s,@cf_cv_enable_reentrant@,$cf_cv_enable_reentrant,;t t
s,@cf_cv_enable_opaque@,$cf_cv_enable_opaque,;t t
s,@NCURSES_SIZE_T@,$NCURSES_SIZE_T,;t t
s,@NCURSES_OPAQUE@,$NCURSES_OPAQUE,;t t
s,@NCURSES_OPAQUE_FORM@,$NCURSES_OPAQUE_FORM,;t t
s,@NCURSES_OPAQUE_MENU@,$NCURSES_OPAQUE_MENU,;t t
s,@NCURSES_OPAQUE_PANEL@,$NCURSES_OPAQUE_PANEL,;t t
s,@NCURSES_WRAP_PREFIX@,$NCURSES_WRAP_PREFIX,;t t
s,@NCURSES_IMPEXP@,$NCURSES_IMPEXP,;t t
s,@NCURSES_CXX_IMPEXP@,$NCURSES_CXX_IMPEXP,;t t
s,@NCURSES_INTEROP_FUNCS@,$NCURSES_INTEROP_FUNCS,;t t
s,@NCURSES_WGETCH_EVENTS@,$NCURSES_WGETCH_EVENTS,;t t
s,@EXP_WIN32_DRIVER@,$EXP_WIN32_DRIVER,;t t
s,@INTERNALS_HDR@,$INTERNALS_HDR,;t t
s,@ECHO_LT@,$ECHO_LT,;t t
s,@ECHO_LD@,$ECHO_LD,;t t
s,@RULE_CC@,$RULE_CC,;t t
s,@SHOW_CC@,$SHOW_CC,;t t
s,@ECHO_CC@,$ECHO_CC,;t t
s,@ECHO_LINK@,$ECHO_LINK,;t t
s,@INSTALL_OPT_S@,$INSTALL_OPT_S,;t t
s,@INSTALL_OPT_O@,$INSTALL_OPT_O,;t t
s,@INSTALL_OPT_P@,$INSTALL_OPT_P,;t t
s,@EXTRA_CFLAGS@,$EXTRA_CFLAGS,;t t
s,@HAVE_STDNORETURN_H@,$HAVE_STDNORETURN_H,;t t
s,@STDC_NORETURN@,$STDC_NORETURN,;t t
s,@ADAFLAGS@,$ADAFLAGS,;t t
s,@EXTRA_CXXFLAGS@,$EXTRA_CXXFLAGS,;t t
s,@ADA_TRACE@,$ADA_TRACE,;t t
s,@MATH_LIB@,$MATH_LIB,;t t
s,@NCURSES_INLINE@,$NCURSES_INLINE,;t t
s,@cf_cv_typeof_chtype@,$cf_cv_typeof_chtype,;t t
s,@cf_cv_1UL@,$cf_cv_1UL,;t t
s,@cf_cv_typeof_mmask_t@,$cf_cv_typeof_mmask_t,;t t
s,@HAVE_VSSCANF@,$HAVE_VSSCANF,;t t
s,@TEST_LIBS@,$TEST_LIBS,;t t
s,@TEST_LIBS2@,$TEST_LIBS2,;t t
s,@CXXCPP@,$CXXCPP,;t t
s,@CXXLDFLAGS@,$CXXLDFLAGS,;t t
s,@CXX_AR@,$CXX_AR,;t t
s,@CXX_ARFLAGS@,$CXX_ARFLAGS,;t t
s,@CXXLIBS@,$CXXLIBS,;t t
s,@USE_CXX_BOOL@,$USE_CXX_BOOL,;t t
s,@cf_TEMP_gnat@,$cf_TEMP_gnat,;t t
s,@M4_exists@,$M4_exists,;t t
s,@cf_ada_make@,$cf_ada_make,;t t
s,@cf_ada_config@,$cf_ada_config,;t t
s,@cf_ada_config_Ada@,$cf_ada_config_Ada,;t t
s,@cf_ada_config_C@,$cf_ada_config_C,;t t
s,@GNATPREP_OPTS@,$GNATPREP_OPTS,;t t
s,@cf_compile_generics@,$cf_compile_generics,;t t
s,@cf_generic_objects@,$cf_generic_objects,;t t
s,@USE_GNAT_SIGINT@,$USE_GNAT_SIGINT,;t t
s,@USE_OLD_MAKERULES@,$USE_OLD_MAKERULES,;t t
s,@USE_GNAT_PROJECTS@,$USE_GNAT_PROJECTS,;t t
s,@USE_GNAT_LIBRARIES@,$USE_GNAT_LIBRARIES,;t t
s,@USE_GNAT_MAKE_GPR@,$USE_GNAT_MAKE_GPR,;t t
s,@USE_GNAT_GPRBUILD@,$USE_GNAT_GPRBUILD,;t t
s,@cf_ada_compiler@,$cf_ada_compiler,;t t
s,@cf_ada_package@,$cf_ada_package,;t t
s,@ADA_INCLUDE@,$ADA_INCLUDE,;t t
s,@ADA_OBJECTS@,$ADA_OBJECTS,;t t
s,@ADA_SHAREDLIB@,$ADA_SHAREDLIB,;t t
s,@MAKE_ADA_SHAREDLIB@,$MAKE_ADA_SHAREDLIB,;t t
s,@ADA_LIBNAME@,$ADA_LIBNAME,;t t
s,@ACPPFLAGS@,$ACPPFLAGS,;t t
s,@DFT_ARG_SUFFIX@,$DFT_ARG_SUFFIX,;t t
s,@DFT_DEP_SUFFIX@,$DFT_DEP_SUFFIX,;t t
s,@DFT_OBJ_SUBDIR@,$DFT_OBJ_SUBDIR,;t t
s,@CXX_LIB_SUFFIX@,$CXX_LIB_SUFFIX,;t t
s,@USE_ARG_SUFFIX@,$USE_ARG_SUFFIX,;t t
s,@USE_CFG_SUFFIX@,$USE_CFG_SUFFIX,;t t
s,@USE_LIB_SUFFIX@,$USE_LIB_SUFFIX,;t t
s,@TICS_ARG_SUFFIX@,$TICS_ARG_SUFFIX,;t t
s,@TICS_DEP_SUFFIX@,$TICS_DEP_SUFFIX,;t t
s,@TICS_LIB_SUFFIX@,$TICS_LIB_SUFFIX,;t t
s,@TICS_LDFLAGS@,$TICS_LDFLAGS,;t t
s,@TICS_LIBS@,$TICS_LIBS,;t t
s,@TINFO_ARG_SUFFIX@,$TINFO_ARG_SUFFIX,;t t
s,@TINFO_DEP_SUFFIX@,$TINFO_DEP_SUFFIX,;t t
s,@TINFO_LIB_SUFFIX@,$TINFO_LIB_SUFFIX,;t t
s,@TINFO_LDFLAGS@,$TINFO_LDFLAGS,;t t
s,@TINFO_LIBS@,$TINFO_LIBS,;t t
s,@TINFO_LDFLAGS2@,$TINFO_LDFLAGS2,;t t
s,@LDFLAGS_STATIC@,$LDFLAGS_STATIC,;t t
s,@LDFLAGS_SHARED@,$LDFLAGS_SHARED,;t t
s,@includesubdir@,$includesubdir,;t t
s,@WITH_OVERWRITE@,$WITH_OVERWRITE,;t t
s,@TICS_LIST@,$TICS_LIST,;t t
s,@TINFO_LIST@,$TINFO_LIST,;t t
s,@SHLIB_LIST@,$SHLIB_LIST,;t t
s,@NCURSES_TREE@,$NCURSES_TREE,;t t
s,@FORM_NAME@,$FORM_NAME,;t t
s,@MENU_NAME@,$MENU_NAME,;t t
s,@PANEL_NAME@,$PANEL_NAME,;t t
s,@CXX_NAME@,$CXX_NAME,;t t
s,@TEST_ARGS@,$TEST_ARGS,;t t
s,@TEST_DEPS@,$TEST_DEPS,;t t
s,@TEST_ARG2@,$TEST_ARG2,;t t
s,@TEST_DEP2@,$TEST_DEP2,;t t
s,@PC_MODULES_TO_MAKE@,$PC_MODULES_TO_MAKE,;t t
s,@ADA_SUBDIRS@,$ADA_SUBDIRS,;t t
s,@DIRS_TO_MAKE@,$DIRS_TO_MAKE,;t t
s,@NCURSES_SHLIB2@,$NCURSES_SHLIB2,;t t
s,@HAVE_TCGETATTR@,$HAVE_TCGETATTR,;t t
s,@HAVE_STDINT_H@,$HAVE_STDINT_H,;t t
s,@HAVE_TERMIO_H@,$HAVE_TERMIO_H,;t t
s,@HAVE_TERMIOS_H@,$HAVE_TERMIOS_H,;t t
s,@cross_compiling@,$cross_compiling,;t t
s,@MAKE_TESTS@,$MAKE_TESTS,;t t
s,@ADAHTML_DIR@,$ADAHTML_DIR,;t t
s,@LIBTOOL_OPTS_CXX@,$LIBTOOL_OPTS_CXX,;t t
s,@PKG_CFLAGS@,$PKG_CFLAGS,;t t
s,@MISC_INSTALL_DATA@,$MISC_INSTALL_DATA,;t t
s,@MISC_UNINSTALL_DATA@,$MISC_UNINSTALL_DATA,;t t
s,@MAKE_DATABASE@,$MAKE_DATABASE,;t t
s,@UNALTERED_SYMS@,$UNALTERED_SYMS,;t t
s,@ADAGEN_LDFLAGS@,$ADAGEN_LDFLAGS,;t t
s,@CHECK_BUILD@,$CHECK_BUILD,;t t
s,@PRIVATE_LIBS@,$PRIVATE_LIBS,;t t
s,@LD_SEARCHPATH@,$LD_SEARCHPATH,;t t
CEOF

EOF

  cat >>"$CONFIG_STATUS" <<\EOF
  # Split the substitutions into bite-sized pieces for seds with
  # small command number limits, like on Digital OSF/1 and HP-UX.
  ac_max_sed_lines=48
  ac_sed_frag=1 # Number of current file.
  ac_beg=1 # First line for current file.
  ac_end=$ac_max_sed_lines # Line after last line for current file.
  ac_more_lines=:
  ac_sed_cmds=
  while "$ac_more_lines"; do
    if test "$ac_beg" -gt 1; then
      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
    else
      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
    fi
    if test ! -s $tmp/subs.frag; then
      ac_more_lines=false
    else
      # The purpose of the label and of the branching condition is to
      # speed up the sed processing (if there are no `@' at all, there
      # is no need to browse any of the substitutions).
      # These are the two extra sed commands mentioned above.
      (echo ':t
  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
      # It is possible to make a multiline substitution using escaped newlines.
      # Ensure that we do not split the substitution between script fragments.
      ac_BEG=$ac_end
      ac_END=`expr "$ac_end" + "$ac_max_sed_lines"`
      sed "1,${ac_BEG}d; ${ac_END}p; q" $tmp/subs.sed >$tmp/subs.next
      if test -s $tmp/subs.next; then
        grep '^s,@[^@,][^@,]*@,.*\\$' $tmp/subs.next >$tmp/subs.edit
        if test ! -s $tmp/subs.edit; then
          grep "^s,@[^@,][^@,]*@,.*,;t t$" $tmp/subs.next >$tmp/subs.edit
          if test ! -s $tmp/subs.edit; then
            if test "$ac_beg" -gt 1; then
              ac_end=`expr "$ac_end" - 1`
              continue
            fi
          fi
        fi
      fi

      if test -z "$ac_sed_cmds"; then
        ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
      else
        ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
      fi
      ac_sed_frag=`expr "$ac_sed_frag" + 1`
      ac_beg=$ac_end
      ac_end=`expr "$ac_end" + "$ac_max_sed_lines"`
    fi
  done
  if test -z "$ac_sed_cmds"; then
    ac_sed_cmds=cat
  fi
fi # test -n "$CONFIG_FILES"

EOF
cat >>"$CONFIG_STATUS" <<\EOF
for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
  case "$ac_file" in
  - | *:- | *:-:* ) # input from stdin
        cat >$tmp/stdin
        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
  * )   ac_file_in=$ac_file.in ;;
  esac

  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
  ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
         X"$ac_file" : 'X\(//\)[^/]' \| \
         X"$ac_file" : 'X\(//\)$' \| \
         X"$ac_file" : 'X\(/\)' \| \
         .     : '\(.\)' 2>/dev/null ||
echo X"$ac_file" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
  	  /^X\(\/\/\)$/{ s//\1/; q; }
  	  /^X\(\/\).*/{ s//\1/; q; }
  	  s/.*/./; q'`
  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
    { case "$ac_dir" in
  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
  *)                      as_incr_dir=.;;
esac
as_dummy="$ac_dir"
for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
  case $as_mkdir_dir in
    # Skip DOS drivespec
    ?:) as_incr_dir=$as_mkdir_dir ;;
    *)
      as_incr_dir=$as_incr_dir/$as_mkdir_dir
      test -d "$as_incr_dir" || mkdir "$as_incr_dir"
    ;;
  esac
done; }

    ac_dir_suffix="/`echo $ac_dir|sed 's,^\./,,'`"
    # A "../" for each directory in $ac_dir_suffix.
    ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'`
  else
    ac_dir_suffix= ac_dots=
  fi

  case "$srcdir" in
  .)  ac_srcdir=.
      if test -z "$ac_dots"; then
         ac_top_srcdir=.
      else
         ac_top_srcdir=`echo "$ac_dots" | sed 's,/$,,'`
      fi ;;
  [\\/]* | ?:[\\/]* )
      ac_srcdir="$srcdir$ac_dir_suffix";
      ac_top_srcdir="$srcdir" ;;
  *) # Relative path.
    ac_srcdir="$ac_dots$srcdir$ac_dir_suffix"
    ac_top_srcdir="$ac_dots$srcdir" ;;
  esac

  case $INSTALL in
  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
  *) ac_INSTALL=$ac_dots$INSTALL ;;
  esac

  if test x"$ac_file" != x-; then
    { echo "$as_me:29593: creating $ac_file" >&5
echo "$as_me: creating $ac_file" >&6;}
    rm -f "$ac_file"
  fi
  # 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 automatically by config.status.  */
  configure_input="Generated automatically from `echo $ac_file_in |
                                                 sed 's,.*/,,'` by configure."

  # First look for the input files in the build tree, otherwise in the
  # src tree.
  ac_file_inputs=`IFS=:
    for f in $ac_file_in; do
      case $f in
      -) echo $tmp/stdin ;;
      [\\/$]*)
         # Absolute (can't be DOS-style, as IFS=:)
         test -f "$f" || { { echo "$as_me:29611: error: cannot find input file: $f" >&5
echo "$as_me: error: cannot find input file: $f" >&2;}
   { (exit 1); exit 1; }; }
         echo $f;;
      *) # Relative
         if test -f "$f"; then
           # Build tree
           echo $f
         elif test -f "$srcdir/$f"; then
           # Source tree
           echo "$srcdir/$f"
         else
           # /dev/null tree
           { { echo "$as_me:29624: error: cannot find input file: $f" >&5
echo "$as_me: error: cannot find input file: $f" >&2;}
   { (exit 1); exit 1; }; }
         fi;;
      esac
    done` || { (exit 1); exit 1; }
EOF
cat >>"$CONFIG_STATUS" <<\EOF
  ac_warn_datarootdir=no
  if test x"$ac_file" != x-; then
    for ac_item in $ac_file_inputs
    do
      ac_seen=`grep '@\(datadir\|mandir\|infodir\)@' "$ac_item"`
      if test -n "$ac_seen"; then
        ac_used=`grep '@datarootdir@' "$ac_item"`
        if test -z "$ac_used"; then
          { echo "$as_me:29640: WARNING: datarootdir was used implicitly but not set:
$ac_seen" >&5
echo "$as_me: WARNING: datarootdir was used implicitly but not set:
$ac_seen" >&2;}
          ac_warn_datarootdir=yes
        fi
      fi
      ac_seen=`grep '${datarootdir}' "$ac_item"`
      if test -n "$ac_seen"; then
        { echo "$as_me:29649: WARNING: datarootdir was used explicitly but not set:
$ac_seen" >&5
echo "$as_me: WARNING: datarootdir was used explicitly but not set:
$ac_seen" >&2;}
        ac_warn_datarootdir=yes
      fi
    done
  fi

if test "x$ac_warn_datarootdir" = xyes; then
  ac_sed_cmds="$ac_sed_cmds | sed -e 's,@datarootdir@,\${prefix}/share,g' -e 's,\${datarootdir},\${prefix}/share,g'"
fi

EOF
cat >>"$CONFIG_STATUS" <<EOF
  sed "$ac_vpsub
$extrasub
EOF
cat >>"$CONFIG_STATUS" <<\EOF
:t
/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
s,@configure_input@,$configure_input,;t t
s,@srcdir@,$ac_srcdir,;t t
s,@top_srcdir@,$ac_top_srcdir,;t t
s,@INSTALL@,$ac_INSTALL,;t t
" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
  rm -f $tmp/stdin
  if test x"$ac_file" != x-; then
    cp "$tmp/out" "$ac_file"

    for ac_name in prefix exec_prefix datarootdir
    do
        ac_seen=`${FGREP-fgrep} -n '${'$ac_name'[:=].*}' "$ac_file"`
        if test -n "$ac_seen"; then
            ac_init=`${EGREP-egrep} '[ 	]*'$ac_name'[ 	]*=' "$ac_file"`
            if test -z "$ac_init"; then
              ac_seen=`echo "$ac_seen" |sed -e 's,^,'$ac_file':,'`
              { echo "$as_me:29686: WARNING: Variable $ac_name is used but was not set:
$ac_seen" >&5
echo "$as_me: WARNING: Variable $ac_name is used but was not set:
$ac_seen" >&2;}
            fi
        fi
    done
    ${EGREP-egrep} -n '@[a-z_][a-z_0-9]+@' "$ac_file" >$tmp/out
    ${EGREP-egrep} -n '@[A-Z_][A-Z_0-9]+@' "$ac_file" >>$tmp/out
    if test -s $tmp/out; then
      ac_seen=`sed -e 's,^,'$ac_file':,' < $tmp/out`
      { echo "$as_me:29697: WARNING: Some variables may not be substituted:
$ac_seen" >&5
echo "$as_me: WARNING: Some variables may not be substituted:
$ac_seen" >&2;}
    fi
  else
    cat $tmp/out
  fi
  rm -f $tmp/out

done
EOF
cat >>"$CONFIG_STATUS" <<\EOF

#
# CONFIG_HEADER section.
#

# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
# NAME is the cpp macro being defined and VALUE is the value it is being given.
#
# ac_d sets the value in "#define NAME VALUE" lines.
ac_dA='s,^\([ 	]*\)#\([ 	]*define[ 	][ 	]*\)'
ac_dB='[ 	].*$,\1#\2'
ac_dC=' '
ac_dD=',;t'
# ac_i turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
ac_iA='s,^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
ac_iB='\([ 	]\),\1#\2define\3'
ac_iC=' '
ac_iD='\4,;t'
# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
ac_uA='s,^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
ac_uB='$,\1#\2define\3'
ac_uC=' '
ac_uD=',;t'

for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
  case "$ac_file" in
  - | *:- | *:-:* ) # input from stdin
        cat >$tmp/stdin
        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
  * )   ac_file_in=$ac_file.in ;;
  esac

  test x"$ac_file" != x- && { echo "$as_me:29746: creating $ac_file" >&5
echo "$as_me: creating $ac_file" >&6;}

  # First look for the input files in the build tree, otherwise in the
  # src tree.
  ac_file_inputs=`IFS=:
    for f in $ac_file_in; do
      case $f in
      -) echo $tmp/stdin ;;
      [\\/$]*)
         # Absolute (can't be DOS-style, as IFS=:)
         test -f "$f" || { { echo "$as_me:29757: error: cannot find input file: $f" >&5
echo "$as_me: error: cannot find input file: $f" >&2;}
   { (exit 1); exit 1; }; }
         echo $f;;
      *) # Relative
         if test -f "$f"; then
           # Build tree
           echo $f
         elif test -f "$srcdir/$f"; then
           # Source tree
           echo "$srcdir/$f"
         else
           # /dev/null tree
           { { echo "$as_me:29770: error: cannot find input file: $f" >&5
echo "$as_me: error: cannot find input file: $f" >&2;}
   { (exit 1); exit 1; }; }
         fi;;
      esac
    done` || { (exit 1); exit 1; }
  # Remove the trailing spaces.
  sed 's/[ 	]*$//' $ac_file_inputs >$tmp/in

EOF

# Transform confdefs.h into a list of #define's.  We won't use it as a sed
# script, but as data to insert where we see @DEFS@.  We expect AC_SAVE_DEFS to
# be either 'cat' or 'sort'.
cat confdefs.h | uniq >conftest.vals

# Break up conftest.vals because some shells have a limit on
# the size of here documents, and old seds have small limits too.

rm -f conftest.tail
echo '  rm -f conftest.frag' >> "$CONFIG_STATUS"
while grep . conftest.vals >/dev/null
do
  # Write chunks of a limited-size here document to conftest.frag.
  echo '  cat >> conftest.frag <<CEOF' >> "$CONFIG_STATUS"
  sed "${ac_max_here_lines}q" conftest.vals | sed -e 's/#ifdef.*/#if 0/' >> "$CONFIG_STATUS"
  echo 'CEOF' >> "$CONFIG_STATUS"
  sed "1,${ac_max_here_lines}d" conftest.vals > conftest.tail
  rm -f conftest.vals
  mv conftest.tail conftest.vals
done
rm -f conftest.vals

# Run sed to substitute the contents of conftest.frag into $tmp/in at the
# marker @DEFS@.
echo '  cat >> conftest.edit <<CEOF
/@DEFS@/r conftest.frag
/@DEFS@/d
CEOF
sed -f conftest.edit $tmp/in > $tmp/out
rm -f $tmp/in
mv $tmp/out $tmp/in
rm -f conftest.edit conftest.frag
' >> "$CONFIG_STATUS"

cat >>"$CONFIG_STATUS" <<\EOF
  # 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 automatically by config.status.  */
  if test x"$ac_file" = x-; then
    echo "/* Generated automatically by configure.  */" >$tmp/config.h
  else
    echo "/* $ac_file.  Generated automatically by configure.  */" >$tmp/config.h
  fi
  cat $tmp/in >>$tmp/config.h
  rm -f $tmp/in
  if test x"$ac_file" != x-; then
    if cmp -s "$ac_file" "$tmp/config.h" 2>/dev/null; then
      { echo "$as_me:29828: $ac_file is unchanged" >&5
echo "$as_me: $ac_file is unchanged" >&6;}
    else
      ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
         X"$ac_file" : 'X\(//\)[^/]' \| \
         X"$ac_file" : 'X\(//\)$' \| \
         X"$ac_file" : 'X\(/\)' \| \
         .     : '\(.\)' 2>/dev/null ||
echo X"$ac_file" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
  	  /^X\(\/\/\)$/{ s//\1/; q; }
  	  /^X\(\/\).*/{ s//\1/; q; }
  	  s/.*/./; q'`
      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
        { case "$ac_dir" in
  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
  *)                      as_incr_dir=.;;
esac
as_dummy="$ac_dir"
for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
  case $as_mkdir_dir in
    # Skip DOS drivespec
    ?:) as_incr_dir=$as_mkdir_dir ;;
    *)
      as_incr_dir=$as_incr_dir/$as_mkdir_dir
      test -d "$as_incr_dir" || mkdir "$as_incr_dir"
    ;;
  esac
done; }

      fi
      rm -f "$ac_file"
      mv "$tmp/config.h" "$ac_file"
    fi
  else
    cat $tmp/config.h
    rm -f $tmp/config.h
  fi
done
EOF
cat >>"$CONFIG_STATUS" <<\EOF
#
# CONFIG_COMMANDS section.
#
for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`

  case "$ac_dest" in
    default )
if test "x$cf_with_tests" != xno ; then

for cf_dir in test
do
	if test ! -d "$srcdir/$cf_dir" ; then
		continue
	elif test -f "$srcdir/$cf_dir/programs" ; then
		$AWK -f "$srcdir/test/mk-test.awk" INSTALL=no ECHO_LINK="$ECHO_LD" "$srcdir/$cf_dir/programs" >>$cf_dir/Makefile
	fi
done

fi

cf_prefix=$LIB_PREFIX

case "$cf_cv_shlib_version" in
(cygdll|msysdll|mingw|msvcdll)
	TINFO_NAME=$TINFO_ARG_SUFFIX
	TINFO_SUFFIX=.dll
	;;
esac

if test -n "$TINFO_SUFFIX" ; then
	case "$TINFO_SUFFIX" in
	(tw*)
		TINFO_NAME="${TINFO_NAME}tw${EXTRA_SUFFIX}"
		TINFO_SUFFIX=`echo "$TINFO_SUFFIX" | sed 's/^tw'$EXTRA_SUFFIX'//'`
		;;
	(t*)
		TINFO_NAME="${TINFO_NAME}t${EXTRA_SUFFIX}"
		TINFO_SUFFIX=`echo "$TINFO_SUFFIX" | sed 's/^t'$EXTRA_SUFFIX'//'`
		;;
	(w*)
		TINFO_NAME="${TINFO_NAME}w${EXTRA_SUFFIX}"
		TINFO_SUFFIX=`echo "$TINFO_SUFFIX" | sed 's/^w'$EXTRA_SUFFIX'//'`
		;;
	esac
fi

for cf_dir in $SRC_SUBDIRS
do
	if test ! -d "$srcdir/$cf_dir" ; then
		continue
	elif test -f "$srcdir/$cf_dir/modules" ; then

		SHARED_LIB=
		Libs_To_Make=
		cf_awk_program=
		if test -n "${cf_cv_abi_version}" && test "x${cf_cv_abi_version}" != "x5"
		then
			cf_awk_program="$cf_awk_program\
/deprecated in ABI${cf_cv_abi_version}/ { next; }\
{ sub(\"NCURSES([WT]+)?\", \"&${cf_cv_abi_version}\"); }\
"
		fi

		if test "x$WILDCARD_SYMS" = xno
		then
			cf_awk_program="$cf_awk_program\
/[ 	]_\\*;/ { skip=1; next; }\
"
		fi

		if test "x$cf_awk_program" != "x"
		then
			cat >>$cf_dir/Makefile <<CF_EOF

# Generated by CF_LIB_RULES
resulting.map: $UNALTERED_SYMS
	$AWK 'BEGIN { skip = 1; last=""; } \
$cf_awk_program \
{ if ( last != "" && ( skip == 0 || \$\$0 !~ /}/ ) ) { print last; }\
 skip = 0; last = \$\$0; } \
END { print last; }' < "$UNALTERED_SYMS" >\$@

distclean::
	rm -f resulting.map
CF_EOF
		fi

		for cf_item in $cf_LIST_MODELS
		do

	case X$cf_item in
	(Xlibtool)
		cf_suffix='.la'
		cf_depsuf=$cf_suffix
		;;
	(Xdebug)
		case "$cf_cv_system_name" in
		(*-msvc*)
			cf_suffix='_g.lib'
			;;
		(*)
			cf_suffix='_g.a'
			;;
		esac
		cf_depsuf=$cf_suffix
		;;
	(Xprofile)
		case "$cf_cv_system_name" in
		(*-msvc*)
			cf_suffix='_p.lib'
			;;
		(*)
			cf_suffix='_p.a'
			;;
		esac
		cf_depsuf=$cf_suffix
		;;
	(Xshared)
		case "$cf_cv_system_name" in
		(aix[5-7]*)
			cf_suffix='.so'
			cf_depsuf=$cf_suffix
			;;
		(*-msvc*)
			cf_suffix='.dll'
			cf_depsuf='.dll.lib'
			;;
		(cygwin*|msys*|mingw*)
			cf_suffix='.dll'
			cf_depsuf='.dll.a'
			;;
		(darwin*)
			cf_suffix='.dylib'
			cf_depsuf=$cf_suffix
			;;
		(hpux*)
			case "$target" in
			(ia64*)
				cf_suffix='.so'
				cf_depsuf=$cf_suffix
				;;
			(*)
				cf_suffix='.sl'
				cf_depsuf=$cf_suffix
				;;
			esac
			;;
		(*)
			cf_suffix='.so'
			cf_depsuf=$cf_suffix
			;;
		esac
		;;
	(*)
		case "$target" in
		(*-msvc*)
			cf_suffix='.lib'
			;;
		(*)
			cf_suffix='.a'
			;;
		esac
		cf_depsuf=$cf_suffix
		;;
	esac
	if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}"
	then
		cf_suffix="${LIB_SUFFIX}${EXTRA_SUFFIX}${cf_suffix}"
		cf_depsuf="${LIB_SUFFIX}${EXTRA_SUFFIX}${cf_depsuf}"
	fi

			if test "$cf_dir" = "c++"
			then

cf_map_lib_basename=`echo "cxx" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`

eval cf_libname="\$${cf_map_lib_basename}_NAME"

			else

cf_map_lib_basename=`echo "$cf_dir" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`

eval cf_libname="\$${cf_map_lib_basename}_NAME"

			fi
			test -z "$cf_libname" && cf_libname="$cf_dir"
			if test "$cf_item" = shared ; then
				if test -n "${LIB_SUFFIX}"
				then
					cf_shared_suffix=`echo "$cf_suffix" | sed 's/^'"${USE_LIB_SUFFIX}"'//'`
				else
					cf_shared_suffix="$cf_suffix"
				fi
				if test "$cf_cv_do_symlinks" = yes ; then
					cf_version_name=

					case "$cf_cv_shlib_version" in
					(rel)
						cf_version_name=REL_VERSION
						;;
					(abi)
						cf_version_name=ABI_VERSION
						;;
					esac

					if test -n "$cf_version_name"
					then
						case "$cf_cv_system_name" in
						(darwin*)
							# "w", etc?
							cf_suffix="${USE_LIB_SUFFIX}"'.${'$cf_version_name'}'"$cf_shared_suffix"
							;;
						(*)
							cf_suffix="$cf_suffix"'.${'$cf_version_name'}'
							;;
						esac
					fi
					if test -n "${USE_LIB_SUFFIX}"
					then
						cf_shared_suffix=`echo "$cf_suffix" | sed 's/^'"${USE_LIB_SUFFIX}"'//'`
					else
						cf_shared_suffix="$cf_suffix"
					fi
				fi
				# cygwin needs import library, and has unique naming convention
				# use autodetected ${cf_prefix} for import lib and static lib, but
				# use 'cyg' prefix for shared lib.
				case "$cf_cv_shlib_version" in
				(cygdll)
					cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'`
					cf_add_lib="../lib/cyg${cf_libname}${cf_cygsuf}"
					;;
				(msysdll)
					cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'`
					cf_add_lib="../lib/msys-${cf_libname}${cf_cygsuf}"
					;;
				(mingw)
					cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'`
					cf_add_lib="../lib/lib${cf_libname}${cf_cygsuf}"
					;;
				(msvcdll)
					cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'`
					cf_add_lib="../lib/${cf_libname}${cf_cygsuf}"
					;;
				(*)
					cf_add_lib=
					;;
				esac
				if test -n "$cf_add_lib"
				then
					Libs_To_Make="$Libs_To_Make $cf_add_lib"
					continue
				fi
			fi
			cf_add_lib="../lib/${cf_prefix}${cf_libname}${cf_suffix}"
			Libs_To_Make="$Libs_To_Make $cf_add_lib"
		done

		if test "$cf_dir" = ncurses ; then
			cf_subsets="$LIB_SUBSETS"
			cf_r_parts="$cf_subsets"
			cf_liblist="$Libs_To_Make"

			while test -n "$cf_r_parts"
			do
				cf_l_parts=`echo "$cf_r_parts" |sed -e 's/ .*$//'`
				cf_r_parts=`echo "$cf_r_parts" |sed -e 's/^[^ ]* //'`
				if test "$cf_l_parts" != "$cf_r_parts" ; then
					cf_add_lib=
					case "$cf_l_parts" in
					(*termlib*)
						cf_add_lib=`echo "$cf_liblist" |sed -e s%${LIB_NAME}${USE_LIB_SUFFIX}%${TINFO_LIB_SUFFIX}%g`
						;;
					(*ticlib*)
						cf_add_lib=`echo "$cf_liblist" |sed -e s%${LIB_NAME}${USE_LIB_SUFFIX}%${TICS_LIB_SUFFIX}%g`
						;;
					(*)
						break
						;;
					esac
					if test -n "$cf_add_lib"; then
						Libs_To_Make="$cf_add_lib $Libs_To_Make"
					fi
				else
					break
				fi
			done
		else
			cf_subsets=`echo "$LIB_SUBSETS" | sed -e 's/^termlib.* //'`
		fi

		if test "$cf_dir" = c++; then
			if test "x$with_shared_cxx" != xyes && test -n "$cf_shared_suffix"; then
				cf_list=
				for cf_item in $Libs_To_Make
				do
					case "$cf_item" in
					(*.a)
						;;
					(*)
						cf_item=`echo "$cf_item" | sed -e "s,"$cf_shared_suffix",.a,"`
						;;
					esac
					for cf_test in $cf_list
					do
						if test "$cf_test" = "$cf_item"
						then
							cf_LIST_MODELS=`echo "$cf_LIST_MODELS" | sed -e 's/normal//'`
							cf_item=
							break
						fi
					done
					test -n "$cf_item" && cf_list="$cf_list $cf_item"
				done
				Libs_To_Make="$cf_list"
			fi
		fi

		sed -e "s%@Libs_To_Make@%$Libs_To_Make%" \
		    -e "s%@SHARED_LIB@%$SHARED_LIB%" \
			"$cf_dir/Makefile" >$cf_dir/Makefile.out
		mv "$cf_dir/Makefile.out" "$cf_dir/Makefile"

		$AWK -f "$srcdir/mk-0th.awk" \
			libname="${cf_dir}${LIB_SUFFIX}" subsets="$LIB_SUBSETS" ticlib="$TICS_LIB_SUFFIX" termlib="$TINFO_LIB_SUFFIX" \
			"$srcdir/$cf_dir/modules" >>$cf_dir/Makefile

		for cf_subset in $cf_subsets
		do
			cf_subdirs=
			for cf_item in $cf_LIST_MODELS
			do

			echo "Appending rules for ${cf_item} model (${cf_dir}: ${cf_subset})"

cf_ITEM=`echo "$cf_item" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`

			CXX_MODEL=$cf_ITEM
			if test "$CXX_MODEL" = SHARED; then
				case "$cf_cv_shlib_version" in
				(cygdll|msysdll|mingw|msvcdll)
					test "x$with_shared_cxx" = xno && test -n "$verbose" && echo "	overriding CXX_MODEL to SHARED" 1>&6

echo "${as_me:-configure}:30215: testing overriding CXX_MODEL to SHARED ..." 1>&5

					with_shared_cxx=yes
					;;
				(*)
					test "x$with_shared_cxx" = xno && CXX_MODEL=NORMAL
					;;
				esac
			fi

	case X$cf_item in
	(Xlibtool)
		cf_suffix='.la'
		cf_depsuf=$cf_suffix
		;;
	(Xdebug)
		case "$cf_cv_system_name" in
		(*-msvc*)
			cf_suffix='_g.lib'
			;;
		(*)
			cf_suffix='_g.a'
			;;
		esac
		cf_depsuf=$cf_suffix
		;;
	(Xprofile)
		case "$cf_cv_system_name" in
		(*-msvc*)
			cf_suffix='_p.lib'
			;;
		(*)
			cf_suffix='_p.a'
			;;
		esac
		cf_depsuf=$cf_suffix
		;;
	(Xshared)
		case "$cf_cv_system_name" in
		(aix[5-7]*)
			cf_suffix='.so'
			cf_depsuf=$cf_suffix
			;;
		(*-msvc*)
			cf_suffix='.dll'
			cf_depsuf='.dll.lib'
			;;
		(cygwin*|msys*|mingw*)
			cf_suffix='.dll'
			cf_depsuf='.dll.a'
			;;
		(darwin*)
			cf_suffix='.dylib'
			cf_depsuf=$cf_suffix
			;;
		(hpux*)
			case "$target" in
			(ia64*)
				cf_suffix='.so'
				cf_depsuf=$cf_suffix
				;;
			(*)
				cf_suffix='.sl'
				cf_depsuf=$cf_suffix
				;;
			esac
			;;
		(*)
			cf_suffix='.so'
			cf_depsuf=$cf_suffix
			;;
		esac
		;;
	(*)
		case "$target" in
		(*-msvc*)
			cf_suffix='.lib'
			;;
		(*)
			cf_suffix='.a'
			;;
		esac
		cf_depsuf=$cf_suffix
		;;
	esac
	if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}"
	then
		cf_suffix="${LIB_SUFFIX}${EXTRA_SUFFIX}${cf_suffix}"
		cf_depsuf="${LIB_SUFFIX}${EXTRA_SUFFIX}${cf_depsuf}"
	fi

	case $cf_item in
	(libtool) cf_subdir='obj_lo'  ;;
	(normal)  cf_subdir='objects' ;;
	(debug)   cf_subdir='obj_g' ;;
	(profile) cf_subdir='obj_p' ;;
	(shared)
		case "$cf_cv_system_name" in
		(cygwin|msys)
			cf_subdir='objects' ;;
		(*)
			cf_subdir='obj_s' ;;
		esac
	esac

			# Test for case where we build libtinfo with a different name.
			cf_libname=$cf_dir
			if test "$cf_dir" = ncurses ; then
				case "$cf_subset" in
				(*base*)
					cf_libname=${cf_libname}$USE_LIB_SUFFIX
					;;
				(*termlib*)
					cf_libname=$TINFO_LIB_SUFFIX
					;;
				(ticlib*)
					cf_libname=$TICS_LIB_SUFFIX
					;;
				esac
			elif test "$cf_dir" = c++ ; then

cf_map_lib_basename=`echo "cxx" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`

eval cf_libname="\$${cf_map_lib_basename}_NAME"

				cf_libname=${cf_libname}$USE_LIB_SUFFIX
			else

cf_map_lib_basename=`echo "$cf_dir" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`

eval cf_libname="\$${cf_map_lib_basename}_NAME"

				cf_libname=${cf_libname}$USE_LIB_SUFFIX
			fi
			if test -n "${USE_ARG_SUFFIX}" ; then
				# undo $USE_LIB_SUFFIX add-on in CF_LIB_SUFFIX
				cf_suffix=`echo "$cf_suffix" |sed -e "s%^${USE_LIB_SUFFIX}%%"`
			fi

			# These dependencies really are for development, not
			# builds, but they are useful in porting, too.
			cf_depend="../include/ncurses_cfg.h"
			if test "$srcdir" = "."; then
				cf_reldir="."
			else
				cf_reldir="\${srcdir}"
			fi

			if test -f "$srcdir/$cf_dir/$cf_dir.priv.h" ; then
				cf_depend="$cf_depend $cf_reldir/$cf_dir.priv.h"
			elif test -f "$srcdir/$cf_dir/curses.priv.h" ; then
				cf_depend="$cf_depend $cf_reldir/curses.priv.h"
			fi

 			cf_dir_suffix=
 			old_cf_suffix="$cf_suffix"
 			if test "$cf_cv_shlib_version_infix" = yes ; then
			if test -n "$USE_LIB_SUFFIX" ; then
				case "$USE_LIB_SUFFIX" in
				(tw*)
					cf_libname=`echo "$cf_libname" | sed 's/tw'$EXTRA_SUFFIX'$//'`
					cf_suffix=`echo "$cf_suffix" | sed 's/^tw'$EXTRA_SUFFIX'//'`
					cf_dir_suffix=tw$EXTRA_SUFFIX
					;;
				(t*)
					cf_libname=`echo "$cf_libname" | sed 's/t'$EXTRA_SUFFIX'$//'`
					cf_suffix=`echo "$cf_suffix" | sed 's/^t'$EXTRA_SUFFIX'//'`
					cf_dir_suffix=t$EXTRA_SUFFIX
					;;
				(w*)
					cf_libname=`echo "$cf_libname" | sed 's/w'$EXTRA_SUFFIX'$//'`
					cf_suffix=`echo "$cf_suffix" | sed 's/^w'$EXTRA_SUFFIX'//'`
					cf_dir_suffix=w$EXTRA_SUFFIX
					;;
				(*)
					cf_libname=`echo "$cf_libname" | sed 's/'$EXTRA_SUFFIX'$//'`
					cf_suffix=`echo "$cf_suffix" | sed 's/^'$EXTRA_SUFFIX'//'`
					cf_dir_suffix=$EXTRA_SUFFIX
					;;
				esac
			fi
 			fi

			$AWK -f "$srcdir/mk-1st.awk" \
				name=${cf_libname}${cf_dir_suffix} \
				traces=$LIB_TRACING \
				MODEL=$cf_ITEM \
				CXX_MODEL=$CXX_MODEL \
				LIB_SUFFIX=$LIB_SUFFIX \
				USE_LIB_SUFFIX=$USE_LIB_SUFFIX \
				make_phony="${cf_cv_make_PHONY:-no}" \
				model=$cf_subdir \
				prefix=$cf_prefix \
				suffix=$cf_suffix \
				subset=$cf_subset \
				driver=$cf_cv_term_driver \
				SymLink="$LN_S" \
				TermlibRoot=$TINFO_NAME \
				TermlibSuffix=$TINFO_SUFFIX \
				ShlibVer=$cf_cv_shlib_version \
				ShlibVerInfix=$cf_cv_shlib_version_infix \
				ReLink=${cf_cv_do_relink:-no} \
				ReRanlib=${cf_cv_do_reranlib:-yes} \
				DoLinks=$cf_cv_do_symlinks \
				rmSoLocs=$cf_cv_rm_so_locs \
				ldconfig="$LDCONFIG" \
				overwrite=$WITH_OVERWRITE \
				depend="$cf_depend" \
				host="$host" \
				libtool_version="$LIBTOOL_VERSION" \
				"$srcdir/$cf_dir/modules" >>$cf_dir/Makefile

			cf_suffix="$old_cf_suffix"

			for cf_subdir2 in $cf_subdirs lib
			do
				test "$cf_subdir" = "$cf_subdir2" && break
			done
			test "${cf_subset}.${cf_subdir2}" != "${cf_subset}.${cf_subdir}" && \
			$AWK -f "$srcdir/mk-2nd.awk" \
				name=$cf_dir \
				traces=$LIB_TRACING \
				MODEL=$cf_ITEM \
				model=$cf_subdir \
				subset=$cf_subset \
				srcdir=$srcdir \
				echo=$WITH_ECHO \
				crenames=$cf_cv_prog_CC_c_o \
				cxxrenames=$cf_cv_prog_CXX_c_o \
				"$srcdir/$cf_dir/modules" >>$cf_dir/Makefile
			cf_subdirs="$cf_subdirs $cf_subdir"
			done
		done
	fi

	echo '	( cd '$cf_dir' && ${MAKE} ${TOP_MFLAGS} $@ )' >>Makefile
done

echo >> Makefile
echo '# generated by CF_LIB_RULES' >> Makefile

if test "x$cf_cv_make_PHONY" = xyes ; then
	cat >> Makefile <<-CF_EOF

	.PHONY :	libs
	.PHONY :	lintlib
	.PHONY :	install.includes
	.PHONY :	uninstall.includes
	.PHONY :	install.libs
	.PHONY :	uninstall.libs
CF_EOF
fi

for cf_dir in $SRC_SUBDIRS
do
	if test ! -d "$srcdir/$cf_dir" ; then
		continue
	fi

	if test -f "$cf_dir/Makefile" ; then
		case "$cf_dir" in
		(Ada95)
			echo 'libs \' >> Makefile
			echo 'install.libs \' >> Makefile
			echo 'uninstall.libs ::' >> Makefile
			echo '	( cd '$cf_dir' && ${MAKE} ${TOP_MFLAGS} $@ )' >> Makefile
			;;
		esac
	fi

	if test -f "$srcdir/$cf_dir/modules" ; then

		if test "x$cf_cv_make_PHONY" = xyes ; then
			cat >> Makefile <<-CF_EOF

			.PHONY :	install.$cf_dir
			.PHONY :	uninstall.$cf_dir
CF_EOF
		fi

		echo >> Makefile
		if test -f "$srcdir/$cf_dir/headers" ; then
cat >> Makefile <<CF_EOF
install.includes \\
uninstall.includes \\
CF_EOF
		fi

cat >> Makefile <<CF_EOF
lint \\
libs \\
lintlib \\
install.libs \\
uninstall.libs \\
install.$cf_dir \\
uninstall.$cf_dir ::
	( cd "$cf_dir" && \${MAKE} \${TOP_MFLAGS} \$@ )
CF_EOF
	elif test -f "$srcdir/$cf_dir/headers" ; then
cat >> Makefile <<CF_EOF

libs \\
install.libs \\
uninstall.libs \\
install.includes \\
uninstall.includes ::
	( cd "$cf_dir" && \${MAKE} \${TOP_MFLAGS} \$@ )
CF_EOF
fi
done

if test "x$cf_cv_make_PHONY" = xyes ; then
	cat >> Makefile <<-CF_EOF

	.PHONY :	install.data
	.PHONY :	uninstall.data
CF_EOF
fi

if test "x$cf_with_db_install" = xyes; then
cat >> Makefile <<CF_EOF

install.libs uninstall.libs \\
install.data uninstall.data ::
$MAKE_TERMINFO	( cd misc && \${MAKE} \${TOP_MFLAGS} \$@ )
CF_EOF
else
cat >> Makefile <<CF_EOF

install.libs uninstall.libs ::
	( cd misc && \${MAKE} \${TOP_MFLAGS} \$@ )
CF_EOF
fi

if test "x$cf_with_manpages" = xyes; then

if test "x$cf_cv_make_PHONY" = xyes ; then
	cat >> Makefile <<-CF_EOF

	.PHONY :	install.man
	.PHONY :	uninstall.man
CF_EOF
fi

cat >> Makefile <<CF_EOF

install.man \\
uninstall.man ::
	( cd man && \${MAKE} \${TOP_MFLAGS} \$@ )
CF_EOF
fi

cat >> Makefile <<CF_EOF

distclean ::
	rm -f config.cache config.log config.status Makefile include/ncurses_cfg.h
	rm -f headers.sh headers.sed mk_shared_lib.sh
	rm -f edit_man.* man_alias.*
	rm -rf \${DIRS_TO_MAKE}
CF_EOF

# Special case: tack's manpage lives in its own directory.
if test "x$cf_with_manpages" = xyes; then
if test "x$cf_with_tack" = "xyes"; then
cat >> Makefile <<CF_EOF

install.man \\
uninstall.man ::
	( cd tack && \${MAKE} \${TOP_MFLAGS} \$@ )
CF_EOF
fi
fi

rm -f headers.sed headers.sh

echo creating headers.sh
cat >headers.sh <<CF_EOF
#! $SHELL
# This shell script is generated by the 'configure' script.  It is invoked in a
# subdirectory of the build tree.  It generates a sed-script in the parent
# directory that is used to adjust includes for header files that reside in a
# subdirectory of /usr/include, etc.
PRG=""
while test \$# != 3
do
PRG="\$PRG \$1"; shift
done
DST=\$1
REF=\$2
SRC=\$3
TMPSRC=\${TMPDIR:-/tmp}/\`basename \$SRC\`\$\$
TMPSED=\${TMPDIR:-/tmp}/headers.sed\$\$
echo installing \$SRC in \$DST
CF_EOF

if test "$WITH_CURSES_H" = yes; then
	cat >>headers.sh <<CF_EOF
case \$DST in
(/*/include/*)
	END=\`basename \$DST\`
	for i in \`cat \$REF/../*/headers |${FGREP-fgrep} -v "#"\`
	do
		NAME=\`basename \$i\`
		echo "s/<\$NAME>/<\$END\/\$NAME>/" >> \$TMPSED
	done
	;;
(*)
	echo "" >> \$TMPSED
	;;
esac
CF_EOF

else
	cat >>headers.sh <<CF_EOF
case \$DST in
(/*/include/*)
	END=\`basename \$DST\`
	for i in \`cat \$REF/../*/headers |${FGREP-fgrep} -v "#"\`
	do
		NAME=\`basename \$i\`
		if test "\$NAME" = "curses.h"
		then
			echo "s/<curses.h>/<ncurses.h>/" >> \$TMPSED
			NAME=ncurses.h
		fi
		echo "s/<\$NAME>/<\$END\/\$NAME>/" >> \$TMPSED
	done
	;;
(*)
	echo "s/<curses.h>/<ncurses.h>/" >> \$TMPSED
	;;
esac
CF_EOF
fi
cat >>headers.sh <<CF_EOF
rm -f \$TMPSRC
sed -f \$TMPSED \$SRC > \$TMPSRC
NAME=\`basename \$SRC\`
CF_EOF
if test "$WITH_CURSES_H" != yes; then
	cat >>headers.sh <<CF_EOF
test "\$NAME" = "curses.h" && NAME=ncurses.h
CF_EOF
fi
cat >>headers.sh <<CF_EOF
# Just in case someone gzip'd manpages, remove the conflicting copy.
test -f \$DST/\$NAME.gz && rm -f \$DST/\$NAME.gz

eval \$PRG \$TMPSRC \$DST/\$NAME
rm -f \$TMPSRC \$TMPSED
CF_EOF

chmod 0755 headers.sh

for cf_dir in $SRC_SUBDIRS
do
	if test ! -d "$srcdir/$cf_dir" ; then
		continue
	fi

	if test -f "$srcdir/$cf_dir/headers" ; then
		$AWK -f "$srcdir/mk-hdr.awk" \
			subset="$LIB_SUBSETS" \
			compat="$WITH_CURSES_H" \
			"$srcdir/$cf_dir/headers" >>$cf_dir/Makefile
	fi

	if test -f "$srcdir/$cf_dir/modules" ; then
		if test "$cf_dir" != "c++" ; then
			if test "x$cf_cv_make_PHONY" = xyes ; then
				cat >> $cf_dir/Makefile <<-CF_EOF

				.PHONY :	depend
CF_EOF
			fi

			cat >>$cf_dir/Makefile <<"CF_EOF"
depend : ${AUTO_SRC}
	makedepend -- ${CPPFLAGS} -- ${C_SRC}

# DO NOT DELETE THIS LINE -- make depend depends on it.
CF_EOF
		fi
	fi
done

if test "x$cf_with_ada" = "xyes" && test "x$cf_cv_prog_gnat_correct" = "xyes"; then
if test -z "$USE_OLD_MAKERULES" ; then
	$AWK -f "$srcdir/Ada95/mk-1st.awk" <"$srcdir/Ada95/src/modules" >>Ada95/src/Makefile
fi
fi
 ;;
  esac
done
EOF

cat >>"$CONFIG_STATUS" <<\EOF

{ (exit 0); exit 0; }
EOF
chmod +x "$CONFIG_STATUS"
ac_clean_files=$ac_clean_files_save

# 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=:
  exec 5>/dev/null
  $SHELL "$CONFIG_STATUS" || 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" || { (exit 1); exit 1; }
fi
${MAKE:-make} preinstall
