# Copyright (c) 2008-2009 IBM Corp. and Others. All Rights Reserved
--- 3_2.orig/icu/source/config/mh-darwin        2008-10-20 14:57:52.000000000 -0700
+++ 3_2/icu/source/config/mh-darwin     2008-10-20 15:57:28.000000000 -0700
@@ -13,8 +13,8 @@
 LD_FLAGS += -headerpad_max_install_names
 
 ## Commands to generate dependency files
-GEN_DEPS.c=	$(CC) -E -MMD  $(DEFS) $(CPPFLAGS)
-GEN_DEPS.cc=	$(CXX) -E -MMD  $(DEFS) $(CPPFLAGS)
+GEN_DEPS.c=	echo 
+GEN_DEPS.cc=	echo 
 
 ## Commands to compile
 COMPILE.c=	$(CC) $(DEFS) $(CPPFLAGS) $(CFLAGS) -fno-common -c
Only in 3_0.orig/icu/source: config.cache
Only in 3_0.orig/icu/source: config.log
diff -ru 3_0.orig/icu/source/configure 3_0/icu/source/configure
--- 3_2.orig/icu/source/configure
+++ 3_2/icu/source/configure
2d1
< 
4,5c3
< # Generated automatically using autoconf version 2.13 
< # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
---
> # Generated by GNU Autoconf 2.63.
6a5,6
> # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
> # 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
8a9,571
> ## --------------------- ##
> ## M4sh Initialization.  ##
> ## --------------------- ##
> 
> # Be more Bourne compatible
> DUALCASE=1; export DUALCASE # for MKS sh
> if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
>   emulate sh
>   NULLCMD=:
>   # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
>   # is contrary to our usage.  Disable this feature.
>   alias -g '${1+"$@"}'='"$@"'
>   setopt NO_GLOB_SUBST
> else
>   case `(set -o) 2>/dev/null` in
>   *posix*) set -o posix ;;
> esac
> 
> fi
> 
> 
> 
> 
> # PATH needs CR
> # Avoid depending upon Character Ranges.
> as_cr_letters='abcdefghijklmnopqrstuvwxyz'
> as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
> as_cr_Letters=$as_cr_letters$as_cr_LETTERS
> as_cr_digits='0123456789'
> as_cr_alnum=$as_cr_Letters$as_cr_digits
> 
> as_nl='
> '
> export as_nl
> # Printing a long string crashes Solaris 7 /usr/bin/printf.
> as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
> as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
> as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
> if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
>   as_echo='printf %s\n'
>   as_echo_n='printf %s'
> else
>   if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
>     as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
>     as_echo_n='/usr/ucb/echo -n'
>   else
>     as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
>     as_echo_n_body='eval
>       arg=$1;
>       case $arg in
>       *"$as_nl"*)
> 	expr "X$arg" : "X\\(.*\\)$as_nl";
> 	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
>       esac;
>       expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
>     '
>     export as_echo_n_body
>     as_echo_n='sh -c $as_echo_n_body as_echo'
>   fi
>   export as_echo_body
>   as_echo='sh -c $as_echo_body as_echo'
> fi
> 
> # The user is always right.
> if test "${PATH_SEPARATOR+set}" != set; then
>   PATH_SEPARATOR=:
>   (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
>     (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
>       PATH_SEPARATOR=';'
>   }
> fi
> 
> # Support unset when possible.
> if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
>   as_unset=unset
> else
>   as_unset=false
> fi
> 
> 
> # IFS
> # We need space, tab and new line, in precisely that order.  Quoting is
> # there to prevent editors from complaining about space-tab.
> # (If _AS_PATH_WALK were called with IFS unset, it would disable word
> # splitting by setting IFS to empty value.)
> IFS=" ""	$as_nl"
> 
> # Find who we are.  Look in the path if we contain no directory separator.
> case $0 in
>   *[\\/]* ) as_myself=$0 ;;
>   *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
> done
> IFS=$as_save_IFS
> 
>      ;;
> esac
> # We did not find ourselves, most probably we were run as `sh COMMAND'
> # in which case we are not to be found in the path.
> if test "x$as_myself" = x; then
>   as_myself=$0
> fi
> if test ! -f "$as_myself"; then
>   $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
>   { (exit 1); exit 1; }
> fi
> 
> # Work around bugs in pre-3.0 UWIN ksh.
> for as_var in ENV MAIL MAILPATH
> do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
> done
> PS1='$ '
> PS2='> '
> PS4='+ '
> 
> # NLS nuisances.
> LC_ALL=C
> export LC_ALL
> LANGUAGE=C
> export LANGUAGE
> 
> # Required to use basename.
> if expr a : '\(a\)' >/dev/null 2>&1 &&
>    test "X`expr 00001 : '.*\(...\)'`" = X001; then
>   as_expr=expr
> else
>   as_expr=false
> fi
> 
> if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
>   as_basename=basename
> else
>   as_basename=false
> fi
> 
> 
> # Name of the executable.
> as_me=`$as_basename -- "$0" ||
> $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
> 	 X"$0" : 'X\(//\)$' \| \
> 	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
> $as_echo X/"$0" |
>     sed '/^.*\/\([^/][^/]*\)\/*$/{
> 	    s//\1/
> 	    q
> 	  }
> 	  /^X\/\(\/\/\)$/{
> 	    s//\1/
> 	    q
> 	  }
> 	  /^X\/\(\/\).*/{
> 	    s//\1/
> 	    q
> 	  }
> 	  s/.*/./; q'`
> 
> # CDPATH.
> $as_unset CDPATH
> 
> 
> if test "x$CONFIG_SHELL" = x; then
>   if (eval ":") 2>/dev/null; then
>   as_have_required=yes
> else
>   as_have_required=no
> fi
> 
>   if test $as_have_required = yes &&	 (eval ":
> (as_func_return () {
>   (exit \$1)
> }
> as_func_success () {
>   as_func_return 0
> }
> as_func_failure () {
>   as_func_return 1
> }
> as_func_ret_success () {
>   return 0
> }
> as_func_ret_failure () {
>   return 1
> }
> 
> exitcode=0
> if as_func_success; then
>   :
> else
>   exitcode=1
>   echo as_func_success failed.
> fi
> 
> if as_func_failure; then
>   exitcode=1
>   echo as_func_failure succeeded.
> fi
> 
> if as_func_ret_success; then
>   :
> else
>   exitcode=1
>   echo as_func_ret_success failed.
> fi
> 
> if as_func_ret_failure; then
>   exitcode=1
>   echo as_func_ret_failure succeeded.
> fi
> 
> if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
>   :
> else
>   exitcode=1
>   echo positional parameters were not saved.
> fi
> 
> test \$exitcode = 0) || { (exit 1); exit 1; }
> 
> (
>   as_lineno_1=\$LINENO
>   as_lineno_2=\$LINENO
>   test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
>   test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
> ") 2> /dev/null; then
>   :
> else
>   as_candidate_shells=
>     as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   case $as_dir in
> 	 /*)
> 	   for as_base in sh bash ksh sh5; do
> 	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
> 	   done;;
>        esac
> done
> IFS=$as_save_IFS
> 
> 
>       for as_shell in $as_candidate_shells $SHELL; do
> 	 # Try only shells that exist, to save several forks.
> 	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
> 		{ ("$as_shell") 2> /dev/null <<\_ASEOF
> if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
>   emulate sh
>   NULLCMD=:
>   # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
>   # is contrary to our usage.  Disable this feature.
>   alias -g '${1+"$@"}'='"$@"'
>   setopt NO_GLOB_SUBST
> else
>   case `(set -o) 2>/dev/null` in
>   *posix*) set -o posix ;;
> esac
> 
> fi
> 
> 
> :
> _ASEOF
> }; then
>   CONFIG_SHELL=$as_shell
> 	       as_have_required=yes
> 	       if { "$as_shell" 2> /dev/null <<\_ASEOF
> if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
>   emulate sh
>   NULLCMD=:
>   # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
>   # is contrary to our usage.  Disable this feature.
>   alias -g '${1+"$@"}'='"$@"'
>   setopt NO_GLOB_SUBST
> else
>   case `(set -o) 2>/dev/null` in
>   *posix*) set -o posix ;;
> esac
> 
> fi
> 
> 
> :
> (as_func_return () {
>   (exit $1)
> }
> as_func_success () {
>   as_func_return 0
> }
> as_func_failure () {
>   as_func_return 1
> }
> as_func_ret_success () {
>   return 0
> }
> as_func_ret_failure () {
>   return 1
> }
> 
> exitcode=0
> if as_func_success; then
>   :
> else
>   exitcode=1
>   echo as_func_success failed.
> fi
> 
> if as_func_failure; then
>   exitcode=1
>   echo as_func_failure succeeded.
> fi
> 
> if as_func_ret_success; then
>   :
> else
>   exitcode=1
>   echo as_func_ret_success failed.
> fi
> 
> if as_func_ret_failure; then
>   exitcode=1
>   echo as_func_ret_failure succeeded.
> fi
> 
> if ( set x; as_func_ret_success y && test x = "$1" ); then
>   :
> else
>   exitcode=1
>   echo positional parameters were not saved.
> fi
> 
> test $exitcode = 0) || { (exit 1); exit 1; }
> 
> (
>   as_lineno_1=$LINENO
>   as_lineno_2=$LINENO
>   test "x$as_lineno_1" != "x$as_lineno_2" &&
>   test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
> 
> _ASEOF
> }; then
>   break
> fi
> 
> fi
> 
>       done
> 
>       if test "x$CONFIG_SHELL" != x; then
>   for as_var in BASH_ENV ENV
> 	do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
> 	done
> 	export CONFIG_SHELL
> 	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
> fi
> 
> 
>     if test $as_have_required = no; then
>   echo This script requires a shell more modern than all the
>       echo shells that I found on your system.  Please install a
>       echo modern shell, or manually run the script under such a
>       echo shell if you do have one.
>       { (exit 1); exit 1; }
> fi
> 
> 
> fi
> 
> fi
> 
> 
> 
> (eval "as_func_return () {
>   (exit \$1)
> }
> as_func_success () {
>   as_func_return 0
> }
> as_func_failure () {
>   as_func_return 1
> }
> as_func_ret_success () {
>   return 0
> }
> as_func_ret_failure () {
>   return 1
> }
> 
> exitcode=0
> if as_func_success; then
>   :
> else
>   exitcode=1
>   echo as_func_success failed.
> fi
> 
> if as_func_failure; then
>   exitcode=1
>   echo as_func_failure succeeded.
> fi
> 
> if as_func_ret_success; then
>   :
> else
>   exitcode=1
>   echo as_func_ret_success failed.
> fi
> 
> if as_func_ret_failure; then
>   exitcode=1
>   echo as_func_ret_failure succeeded.
> fi
> 
> if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
>   :
> else
>   exitcode=1
>   echo positional parameters were not saved.
> fi
> 
> test \$exitcode = 0") || {
>   echo No shell found that supports shell functions.
>   echo Please tell bug-autoconf@gnu.org about your system,
>   echo including any error possibly output before this message.
>   echo This can help us improve future autoconf versions.
>   echo Configuration will now proceed without shell functions.
> }
> 
> 
> 
>   as_lineno_1=$LINENO
>   as_lineno_2=$LINENO
>   test "x$as_lineno_1" != "x$as_lineno_2" &&
>   test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
> 
>   # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
>   # uniformly replaced by the line number.  The first 'sed' inserts a
>   # line-number line after each line using $LINENO; the second 'sed'
>   # does the real work.  The second script uses 'N' to pair each
>   # line-number line with the line containing $LINENO, and appends
>   # trailing '-' during substitution so that $LINENO is not a special
>   # case at line end.
>   # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
>   # scripts with optimization help from Paolo Bonzini.  Blame Lee
>   # E. McMahon (1931-1989) for sed's syntax.  :-)
>   sed -n '
>     p
>     /[$]LINENO/=
>   ' <$as_myself |
>     sed '
>       s/[$]LINENO.*/&-/
>       t lineno
>       b
>       :lineno
>       N
>       :loop
>       s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
>       t loop
>       s/-\n.*//
>     ' >$as_me.lineno &&
>   chmod +x "$as_me.lineno" ||
>     { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
>    { (exit 1); exit 1; }; }
> 
>   # Don't try to exec as it changes $[0], causing all sort of problems
>   # (the dirname of $[0] is not the place where we might find the
>   # original and so on.  Autoconf is especially sensitive to this).
>   . "./$as_me.lineno"
>   # Exit status is that of the last command.
>   exit
> }
> 
> 
> if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
>   as_dirname=dirname
> else
>   as_dirname=false
> fi
> 
> ECHO_C= ECHO_N= ECHO_T=
> case `echo -n x` in
> -n*)
>   case `echo 'x\c'` in
>   *c*) ECHO_T='	';;	# ECHO_T is single tab character.
>   *)   ECHO_C='\c';;
>   esac;;
> *)
>   ECHO_N='-n';;
> esac
> if expr a : '\(a\)' >/dev/null 2>&1 &&
>    test "X`expr 00001 : '.*\(...\)'`" = X001; then
>   as_expr=expr
> else
>   as_expr=false
> fi
> 
> rm -f conf$$ conf$$.exe conf$$.file
> if test -d conf$$.dir; then
>   rm -f conf$$.dir/conf$$.file
> else
>   rm -f conf$$.dir
>   mkdir conf$$.dir 2>/dev/null
> fi
> if (echo >conf$$.file) 2>/dev/null; then
>   if ln -s conf$$.file conf$$ 2>/dev/null; then
>     as_ln_s='ln -s'
>     # ... but there are two gotchas:
>     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
>     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
>     # In both cases, we have to default to `cp -p'.
>     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
>       as_ln_s='cp -p'
>   elif ln conf$$.file conf$$ 2>/dev/null; then
>     as_ln_s=ln
>   else
>     as_ln_s='cp -p'
>   fi
> else
>   as_ln_s='cp -p'
> fi
> rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
> rmdir conf$$.dir 2>/dev/null
> 
> if mkdir -p . 2>/dev/null; then
>   as_mkdir_p=:
> else
>   test -d ./-p && rmdir ./-p
>   as_mkdir_p=false
> fi
> 
> if test -x / >/dev/null 2>&1; then
>   as_test_x='test -x'
> else
>   if ls -dL / >/dev/null 2>&1; then
>     as_ls_L_option=L
>   else
>     as_ls_L_option=
>   fi
>   as_test_x='
>     eval sh -c '\''
>       if test -d "$1"; then
> 	test -d "$1/.";
>       else
> 	case $1 in
> 	-*)set "./$1";;
> 	esac;
> 	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
> 	???[sx]*):;;*)false;;esac;fi
>     '\'' sh
>   '
> fi
> as_executable_p=$as_test_x
> 
> # Sed expression to map a string onto a valid CPP name.
> as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
> 
> # Sed expression to map a string onto a valid variable name.
> as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
> 
10,11c573,583
< # Defaults:
< ac_help=
---
> 
> exec 7<&0 </dev/null 6>&1
> 
> # 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`
> 
> #
> # Initializations.
> #
13,52c585,810
< # Any additions from configure.in:
< ac_help="$ac_help
<   --enable-strict         compile with strict compiler options [default=no]"
< ac_help="$ac_help
<   --enable-64bit-libs     build 64-bit libraries [default=yes]"
< ac_help="$ac_help
<   --enable-shared         build shared libraries [default=yes]"
< ac_help="$ac_help
<   --enable-static         build static libraries [default=no]"
< ac_help="$ac_help
<   --enable-debug          build debug libraries [default=no]"
< ac_help="$ac_help
<   --enable-release        build release libraries [default=yes]"
< ac_help="$ac_help
<   --enable-renaming       add a version suffix to symbols [default=yes]"
< ac_help="$ac_help
<   --enable-tracing        enable function and data tracing [default=yes]"
< ac_help="$ac_help
<   --enable-rpath          use rpath when linking [default is only if necessary]"
< ac_help="$ac_help
<   --enable-threads        build ICU with thread safety [default=yes]"
< ac_help="$ac_help
<   --with-iostream=version specify the version of iostream to use (none, old, std, auto) [default=auto]"
< ac_help="$ac_help
<   --enable-extras         build ICU extras [default=yes]"
< ac_help="$ac_help
<   --enable-icuio          build ICU's icuio library [default=yes]"
< ac_help="$ac_help
<   --enable-layout         build ICU's layout library [default=yes]"
< ac_help="$ac_help
<   --with-data-packaging=type specify how to package ICU data (files, archive, library, auto) [default=auto]"
< ac_help="$ac_help
< "
< ac_help="$ac_help
<   --with-library-suffix=suffix    tag a suffix to the library names [default=]"
< ac_help="$ac_help
<   --enable-tests          build ICU tests [default=yes]"
< ac_help="$ac_help
<   --enable-samples        build ICU samples [default=yes]  
< Additionally, the variable FORCE_LIBS may be set before calling configure. If set, it will REPLACE any automatic list of libraries."
---
> ac_clean_files=
> ac_config_libobj_dir=.
> LIBOBJS=
> cross_compiling=no
> subdirs=
> MFLAGS=
> MAKEFLAGS=
> SHELL=${CONFIG_SHELL-/bin/sh}
> 
> # Identity of this package.
> PACKAGE_NAME=
> PACKAGE_TARNAME=
> PACKAGE_VERSION=
> PACKAGE_STRING=
> PACKAGE_BUGREPORT=
> 
> ac_unique_file="common/unicode/utypes.h"
> # Factoring default headers for most tests.
> ac_includes_default="\
> #include <stdio.h>
> #ifdef HAVE_SYS_TYPES_H
> # include <sys/types.h>
> #endif
> #ifdef HAVE_SYS_STAT_H
> # include <sys/stat.h>
> #endif
> #ifdef STDC_HEADERS
> # include <stdlib.h>
> # include <stddef.h>
> #else
> # ifdef HAVE_STDLIB_H
> #  include <stdlib.h>
> # endif
> #endif
> #ifdef HAVE_STRING_H
> # if !defined STDC_HEADERS && defined HAVE_MEMORY_H
> #  include <memory.h>
> # endif
> # include <string.h>
> #endif
> #ifdef HAVE_STRINGS_H
> # include <strings.h>
> #endif
> #ifdef HAVE_INTTYPES_H
> # include <inttypes.h>
> #endif
> #ifdef HAVE_STDINT_H
> # include <stdint.h>
> #endif
> #ifdef HAVE_UNISTD_H
> # include <unistd.h>
> #endif"
> 
> ac_subst_vars='LTLIBOBJS
> LIBOBJS
> AIX_SHLIB
> ld_rpath_suf
> platform_make_fragment
> platform_make_fragment_name
> platform
> ICUDATA_CHAR
> SAMPLES_TRUE
> TESTS_TRUE
> ICULIBSUFFIXCNAME
> U_HAVE_LIB_SUFFIX
> ICULIBSUFFIX
> DATA_PACKAGING_MODE
> DATA_PACKAGING_CPPFLAGS
> thepkgicudatadir
> pkgicudatadir
> thelibdir
> thedatadir
> thesysconfdir
> LAYOUT_TRUE
> ICUIO_TRUE
> EXTRAS_TRUE
> U_SIZEOF_WCHAR_T
> U_HAVE_WCSCPY
> U_HAVE_WCHAR_H
> HAVE_UINT64_T
> HAVE_INT64_T
> HAVE_UINT32_T
> HAVE_INT32_T
> HAVE_UINT16_T
> HAVE_INT16_T
> HAVE_UINT8_T
> HAVE_INT8_T
> U_TIMEZONE
> U_HAVE_TIMEZONE
> U_TZNAME
> U_HAVE_TZNAME
> U_TZSET
> U_HAVE_TZSET
> U_HAVE_POPEN
> U_HAVE_PLACEMENT_NEW
> U_OVERRIDE_CXX_ALLOCATION
> U_HAVE_NAMESPACE
> U_NL_LANGINFO_CODESET
> U_HAVE_NL_LANGINFO_CODESET
> U_HAVE_NL_LANGINFO
> U_IS_BIG_ENDIAN
> U_IOSTREAM_SOURCE
> CXXCPP
> U_HAVE_INTTYPES_H
> EGREP
> GREP
> CPP
> GENCCODE_ASSEMBLY
> HAVE_MMAP
> ICU_USE_THREADS
> THREADS_TRUE
> U_INLINE
> ENABLE_RPATH
> U_ENABLE_TRACING
> U_DISABLE_RENAMING
> AR
> RANLIB
> ENABLE_RELEASE
> ENABLE_DEBUG
> ENABLE_STATIC
> ENABLE_SHARED
> LIB_M
> COMPILE_LINK_ENVVAR
> ARFLAGS
> host_os
> host_vendor
> host_cpu
> host
> build_os
> build_vendor
> build_cpu
> build
> DOXYGEN
> U_MAKE
> STRIP
> INSTALL_DATA
> INSTALL_SCRIPT
> INSTALL_PROGRAM
> ac_ct_CXX
> CXXFLAGS
> CXX
> OBJEXT
> EXEEXT
> ac_ct_CC
> LDFLAGS
> CFLAGS
> CC
> CPPFLAGS
> UNICODE_VERSION
> LIB_VERSION_MAJOR
> LIB_VERSION
> VERSION
> PACKAGE
> target_alias
> host_alias
> build_alias
> LIBS
> ECHO_T
> ECHO_N
> ECHO_C
> DEFS
> mandir
> localedir
> libdir
> psdir
> pdfdir
> dvidir
> htmldir
> infodir
> docdir
> oldincludedir
> includedir
> localstatedir
> sharedstatedir
> sysconfdir
> datadir
> datarootdir
> libexecdir
> sbindir
> bindir
> program_transform_name
> prefix
> exec_prefix
> PACKAGE_BUGREPORT
> PACKAGE_STRING
> PACKAGE_VERSION
> PACKAGE_TARNAME
> PACKAGE_NAME
> PATH_SEPARATOR
> SHELL'
> ac_subst_files=''
> ac_user_opts='
> enable_option_checking
> enable_strict
> enable_64bit_libs
> enable_shared
> enable_static
> enable_debug
> enable_release
> enable_renaming
> enable_tracing
> enable_rpath
> enable_threads
> with_iostream
> enable_extras
> enable_layout
> with_data_packaging
> enable_mapped
> with_library_suffix
> enable_tests
> enable_samples
> '
>       ac_precious_vars='build_alias
> host_alias
> target_alias
> CC
> CFLAGS
> LDFLAGS
> LIBS
> CPPFLAGS
> CXX
> CXXFLAGS
> CCC
> CPP
> CXXCPP'
> 
54a813,816
> ac_init_help=
> ac_init_version=false
> ac_unrecognized_opts=
> ac_unrecognized_sep=
57,58c819
< build=NONE
< cache_file=./config.cache
---
> cache_file=/dev/null
60d820
< host=NONE
62d821
< nonopt=NONE
71d829
< target=NONE
74a833,839
> 
> # Installation directory options.
> # These are left unexpanded so users can "make install exec_prefix=/foo"
> # and all the variables that are supposed to be based on exec_prefix
> # by default will actually change.
> # Use braces instead of parens because sh, perl, etc. also accept them.
> # (The list follows the same order as the GNU Coding Standards.)
78c843,844
< datadir='${prefix}/share'
---
> datarootdir='${prefix}/share'
> datadir='${datarootdir}'
82d847
< libdir='${exec_prefix}/lib'
85,93c850,858
< infodir='${prefix}/info'
< mandir='${prefix}/man'
< 
< # Initialize some other variables.
< subdirs=
< MFLAGS= MAKEFLAGS=
< SHELL=${CONFIG_SHELL-/bin/sh}
< # Maximum number of lines to put in a shell here document.
< ac_max_here_lines=12
---
> docdir='${datarootdir}/doc/${PACKAGE}'
> infodir='${datarootdir}/info'
> htmldir='${docdir}'
> dvidir='${docdir}'
> pdfdir='${docdir}'
> psdir='${docdir}'
> libdir='${exec_prefix}/lib'
> localedir='${datarootdir}/locale'
> mandir='${datarootdir}/man'
95a861
> ac_dashdash=
98d863
< 
101c866
<     eval "$ac_prev=\$ac_option"
---
>     eval $ac_prev=\$ac_option
106,108c871,873
<   case "$ac_option" in
<   -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
<   *) ac_optarg= ;;
---
>   case $ac_option in
>   *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
>   *)	ac_optarg=yes ;;
113c878,880
<   case "$ac_option" in
---
>   case $ac_dashdash$ac_option in
>   --)
>     ac_dashdash=yes ;;
118c885
<     bindir="$ac_optarg" ;;
---
>     bindir=$ac_optarg ;;
121c888
<     ac_prev=build ;;
---
>     ac_prev=build_alias ;;
123c890
<     build="$ac_optarg" ;;
---
>     build_alias=$ac_optarg ;;
130c897,900
<     cache_file="$ac_optarg" ;;
---
>     cache_file=$ac_optarg ;;
> 
>   --config-cache | -C)
>     cache_file=config.cache ;;
132c902
<   -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
---
>   -datadir | --datadir | --datadi | --datad)
134,136c904,912
<   -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
<   | --da=*)
<     datadir="$ac_optarg" ;;
---
>   -datadir=* | --datadir=* | --datadi=* | --datad=*)
>     datadir=$ac_optarg ;;
> 
>   -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
>   | --dataroo | --dataro | --datar)
>     ac_prev=datarootdir ;;
>   -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
>   | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
>     datarootdir=$ac_optarg ;;
139c915
<     ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
---
>     ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
141,145c917,939
<     if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
<       { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
<     fi
<     ac_feature=`echo $ac_feature| sed 's/-/_/g'`
<     eval "enable_${ac_feature}=no" ;;
---
>     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
>       { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
>    { (exit 1); exit 1; }; }
>     ac_useropt_orig=$ac_useropt
>     ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
>     case $ac_user_opts in
>       *"
> "enable_$ac_useropt"
> "*) ;;
>       *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
> 	 ac_unrecognized_sep=', ';;
>     esac
>     eval enable_$ac_useropt=no ;;
> 
>   -docdir | --docdir | --docdi | --doc | --do)
>     ac_prev=docdir ;;
>   -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
>     docdir=$ac_optarg ;;
> 
>   -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
>     ac_prev=dvidir ;;
>   -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
>     dvidir=$ac_optarg ;;
148c942
<     ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
---
>     ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
150,156c944,954
<     if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
<       { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
<     fi
<     ac_feature=`echo $ac_feature| sed 's/-/_/g'`
<     case "$ac_option" in
<       *=*) ;;
<       *) ac_optarg=yes ;;
---
>     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
>       { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
>    { (exit 1); exit 1; }; }
>     ac_useropt_orig=$ac_useropt
>     ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
>     case $ac_user_opts in
>       *"
> "enable_$ac_useropt"
> "*) ;;
>       *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
> 	 ac_unrecognized_sep=', ';;
158c956
<     eval "enable_${ac_feature}='$ac_optarg'" ;;
---
>     eval enable_$ac_useropt=\$ac_optarg ;;
167c965
<     exec_prefix="$ac_optarg" ;;
---
>     exec_prefix=$ac_optarg ;;
173,226c971,976
<   -help | --help | --hel | --he)
<     # 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
< Usage: configure [options] [host]
< Options: [defaults in brackets after descriptions]
< Configuration:
<   --cache-file=FILE       cache test results in FILE
<   --help                  print this message
<   --no-create             do not create output files
<   --quiet, --silent       do not print \`checking...' messages
<   --version               print the version of autoconf that created configure
< Directory and file names:
<   --prefix=PREFIX         install architecture-independent files in PREFIX
<                           [$ac_default_prefix]
<   --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
<                           [same as prefix]
<   --bindir=DIR            user executables in DIR [EPREFIX/bin]
<   --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
<   --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
<   --datadir=DIR           read-only architecture-independent data in DIR
<                           [PREFIX/share]
<   --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
<   --sharedstatedir=DIR    modifiable architecture-independent data in DIR
<                           [PREFIX/com]
<   --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
<   --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
<   --includedir=DIR        C header files in DIR [PREFIX/include]
<   --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
<   --infodir=DIR           info documentation in DIR [PREFIX/info]
<   --mandir=DIR            man documentation in DIR [PREFIX/man]
<   --srcdir=DIR            find the sources in DIR [configure dir or ..]
<   --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
< EOF
<     cat << EOF
< Host type:
<   --build=BUILD           configure for building on BUILD [BUILD=HOST]
<   --host=HOST             configure for HOST [guessed]
<   --target=TARGET         configure for TARGET [TARGET=HOST]
< Features and packages:
<   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
<   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
<   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
<   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
<   --x-includes=DIR        X include files are in DIR
<   --x-libraries=DIR       X library files are in DIR
< EOF
<     if test -n "$ac_help"; then
<       echo "--enable and --with options recognized:$ac_help"
<     fi
<     exit 0 ;;
---
>   -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 ;;
229c979
<     ac_prev=host ;;
---
>     ac_prev=host_alias ;;
231c981,987
<     host="$ac_optarg" ;;
---
>     host_alias=$ac_optarg ;;
> 
>   -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
>     ac_prev=htmldir ;;
>   -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
>   | --ht=*)
>     htmldir=$ac_optarg ;;
238c994
<     includedir="$ac_optarg" ;;
---
>     includedir=$ac_optarg ;;
243c999
<     infodir="$ac_optarg" ;;
---
>     infodir=$ac_optarg ;;
248c1004
<     libdir="$ac_optarg" ;;
---
>     libdir=$ac_optarg ;;
255c1011,1016
<     libexecdir="$ac_optarg" ;;
---
>     libexecdir=$ac_optarg ;;
> 
>   -localedir | --localedir | --localedi | --localed | --locale)
>     ac_prev=localedir ;;
>   -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
>     localedir=$ac_optarg ;;
258,259c1019
<   | --localstate | --localstat | --localsta | --localst \
<   | --locals | --local | --loca | --loc | --lo)
---
>   | --localstate | --localstat | --localsta | --localst | --locals)
262,264c1022,1023
<   | --localstate=* | --localstat=* | --localsta=* | --localst=* \
<   | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
<     localstatedir="$ac_optarg" ;;
---
>   | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
>     localstatedir=$ac_optarg ;;
269c1028
<     mandir="$ac_optarg" ;;
---
>     mandir=$ac_optarg ;;
276c1035
<   | --no-cr | --no-c)
---
>   | --no-cr | --no-c | -n)
290c1049
<     oldincludedir="$ac_optarg" ;;
---
>     oldincludedir=$ac_optarg ;;
295c1054
<     prefix="$ac_optarg" ;;
---
>     prefix=$ac_optarg ;;
302c1061
<     program_prefix="$ac_optarg" ;;
---
>     program_prefix=$ac_optarg ;;
309c1068
<     program_suffix="$ac_optarg" ;;
---
>     program_suffix=$ac_optarg ;;
326c1085,1095
<     program_transform_name="$ac_optarg" ;;
---
>     program_transform_name=$ac_optarg ;;
> 
>   -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
>     ac_prev=pdfdir ;;
>   -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
>     pdfdir=$ac_optarg ;;
> 
>   -psdir | --psdir | --psdi | --psd | --ps)
>     ac_prev=psdir ;;
>   -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
>     psdir=$ac_optarg ;;
336c1105
<     sbindir="$ac_optarg" ;;
---
>     sbindir=$ac_optarg ;;
347c1116
<     sharedstatedir="$ac_optarg" ;;
---
>     sharedstatedir=$ac_optarg ;;
352c1121
<     site="$ac_optarg" ;;
---
>     site=$ac_optarg ;;
357c1126
<     srcdir="$ac_optarg" ;;
---
>     srcdir=$ac_optarg ;;
364c1133
<     sysconfdir="$ac_optarg" ;;
---
>     sysconfdir=$ac_optarg ;;
367c1136
<     ac_prev=target ;;
---
>     ac_prev=target_alias ;;
369c1138
<     target="$ac_optarg" ;;
---
>     target_alias=$ac_optarg ;;
374,376c1143,1144
<   -version | --version | --versio | --versi | --vers)
<     echo "configure generated by autoconf version 2.13"
<     exit 0 ;;
---
>   -version | --version | --versio | --versi | --vers | -V)
>     ac_init_version=: ;;
379c1147
<     ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
---
>     ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
381,387c1149,1159
<     if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
<       { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
<     fi
<     ac_package=`echo $ac_package| sed 's/-/_/g'`
<     case "$ac_option" in
<       *=*) ;;
<       *) ac_optarg=yes ;;
---
>     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
>       { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
>    { (exit 1); exit 1; }; }
>     ac_useropt_orig=$ac_useropt
>     ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
>     case $ac_user_opts in
>       *"
> "with_$ac_useropt"
> "*) ;;
>       *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
> 	 ac_unrecognized_sep=', ';;
389c1161
<     eval "with_${ac_package}='$ac_optarg'" ;;
---
>     eval with_$ac_useropt=\$ac_optarg ;;
392c1164
<     ac_package=`echo $ac_option|sed -e 's/-*without-//'`
---
>     ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
394,398c1166,1178
<     if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
<       { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
<     fi
<     ac_package=`echo $ac_package| sed 's/-/_/g'`
<     eval "with_${ac_package}=no" ;;
---
>     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
>       { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
>    { (exit 1); exit 1; }; }
>     ac_useropt_orig=$ac_useropt
>     ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
>     case $ac_user_opts in
>       *"
> "with_$ac_useropt"
> "*) ;;
>       *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
> 	 ac_unrecognized_sep=', ';;
>     esac
>     eval with_$ac_useropt=no ;;
409c1189
<     x_includes="$ac_optarg" ;;
---
>     x_includes=$ac_optarg ;;
416c1196
<     x_libraries="$ac_optarg" ;;
---
>     x_libraries=$ac_optarg ;;
418c1198,1200
<   -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
---
>   -*) { $as_echo "$as_me: error: unrecognized option: $ac_option
> Try \`$0 --help' for more information." >&2
>    { (exit 1); exit 1; }; }
420a1203,1211
>   *=*)
>     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 &&
>       { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2
>    { (exit 1); exit 1; }; }
>     eval $ac_envvar=\$ac_optarg
>     export $ac_envvar ;;
> 
422,428c1213,1217
<     if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
<       echo "configure: warning: $ac_option: invalid host type" 1>&2
<     fi
<     if test "x$nonopt" != xNONE; then
<       { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
<     fi
<     nonopt="$ac_option"
---
>     # FIXME: should be removed in autoconf 3.0.
>     $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
>     expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
>       $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
>     : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
435c1224,1226
<   { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
---
>   ac_option=--`echo $ac_prev | sed 's/_/-/g'`
>   { $as_echo "$as_me: error: missing argument to $ac_option" >&2
>    { (exit 1); exit 1; }; }
438,451c1229,1235
< trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
< 
< # File descriptor usage:
< # 0 standard input
< # 1 file creation
< # 2 errors and warnings
< # 3 some systems may open it to /dev/tty
< # 4 used on the Kubota Titan
< # 6 checking for... messages and results
< # 5 compiler messages saved in config.log
< if test "$silent" = yes; then
<   exec 6>/dev/null
< else
<   exec 6>&1
---
> if test -n "$ac_unrecognized_opts"; then
>   case $enable_option_checking in
>     no) ;;
>     fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2
>    { (exit 1); exit 1; }; } ;;
>     *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
>   esac
453,458d1236
< exec 5>./config.log
< 
< echo "\
< This file contains any messages produced by compilers while
< running configure, to aid debugging if configure makes a mistake.
< " 1>&5
460,463c1238,1242
< # Strip out --no-create and --no-recursion so they do not pile up.
< # Also quote any args containing shell metacharacters.
< ac_configure_args=
< for ac_arg
---
> # Check all directory arguments for consistency.
> for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
> 		datadir sysconfdir sharedstatedir localstatedir includedir \
> 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
> 		libdir localedir mandir
465,472c1244,1254
<   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_configure_args="$ac_configure_args '$ac_arg'" ;;
<   *) ac_configure_args="$ac_configure_args $ac_arg" ;;
---
>   eval ac_val=\$$ac_var
>   # Remove trailing slashes.
>   case $ac_val in
>     */ )
>       ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
>       eval $ac_var=\$ac_val;;
>   esac
>   # Be sure to have absolute directory names.
>   case $ac_val in
>     [\\/$]* | ?:[\\/]* )  continue;;
>     NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
473a1256,1257
>   { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
>    { (exit 1); exit 1; }; }
476,484c1260,1291
< # NLS nuisances.
< # Only set these to C if already set.  These must not be set unconditionally
< # because not all systems understand e.g. LANG=C (notably SCO).
< # Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
< # Non-C LC_CTYPE values break the ctype check.
< if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
< if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
< if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
< if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
---
> # There might be people who depend on the old broken behavior: `$host'
> # used to hold the argument of --host etc.
> # FIXME: To remove some day.
> build=$build_alias
> host=$host_alias
> target=$target_alias
> 
> # FIXME: To remove some day.
> if test "x$host_alias" != x; then
>   if test "x$build_alias" = x; then
>     cross_compiling=maybe
>     $as_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
> 
> 
> ac_pwd=`pwd` && test -n "$ac_pwd" &&
> ac_ls_di=`ls -di .` &&
> ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
>   { $as_echo "$as_me: error: working directory cannot be determined" >&2
>    { (exit 1); exit 1; }; }
> test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
>   { $as_echo "$as_me: error: pwd does not report name of working directory" >&2
>    { (exit 1); exit 1; }; }
486,493d1292
< # 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
< 
< # A filename unique to this package, relative to the directory that
< # configure is in, which we can look for to find out if srcdir is correct.
< ac_unique_file=common/unicode/utypes.h
498,501c1297,1320
<   # 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=.
---
>   # Try the directory containing this script, then the parent directory.
>   ac_confdir=`$as_dirname -- "$as_myself" ||
> $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
> 	 X"$as_myself" : 'X\(//\)[^/]' \| \
> 	 X"$as_myself" : 'X\(//\)$' \| \
> 	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
> $as_echo X"$as_myself" |
>     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
> 	    s//\1/
> 	    q
> 	  }
> 	  /^X\(\/\/\)[^/].*/{
> 	    s//\1/
> 	    q
> 	  }
> 	  /^X\(\/\/\)$/{
> 	    s//\1/
> 	    q
> 	  }
> 	  /^X\(\/\).*/{
> 	    s//\1/
> 	    q
> 	  }
> 	  s/.*/./; q'`
503c1322
<   if test ! -r $srcdir/$ac_unique_file; then
---
>   if test ! -r "$srcdir/$ac_unique_file"; then
509,530c1328,1352
< if test ! -r $srcdir/$ac_unique_file; then
<   if test "$ac_srcdir_defaulted" = yes; then
<     { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
<   else
<     { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
<   fi
< fi
< srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
< 
< # 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 "loading site script $ac_site_file"
<     . "$ac_site_file"
<   fi
---
> if test ! -r "$srcdir/$ac_unique_file"; then
>   test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
>   { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
>    { (exit 1); exit 1; }; }
> fi
> ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
> ac_abs_confdir=`(
> 	cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2
>    { (exit 1); exit 1; }; }
> 	pwd)`
> # When building in place, set srcdir=.
> if test "$ac_abs_confdir" = "$ac_pwd"; then
>   srcdir=.
> fi
> # Remove unnecessary trailing slashes from srcdir.
> # Double slashes in file names in object file debugging info
> # mess up M-x gdb in Emacs.
> case $srcdir in
> */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
> esac
> for ac_var in $ac_precious_vars; do
>   eval ac_env_${ac_var}_set=\${${ac_var}+set}
>   eval ac_env_${ac_var}_value=\$${ac_var}
>   eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
>   eval ac_cv_env_${ac_var}_value=\$${ac_var}
533,539c1355,1362
< if test -r "$cache_file"; then
<   echo "loading cache $cache_file"
<   . $cache_file
< else
<   echo "creating cache $cache_file"
<   > $cache_file
< fi
---
> #
> # Report the --help message.
> #
> if test "$ac_init_help" = "long"; then
>   # Omit some internal or obsolete options to make the list less imposing.
>   # This message is too long to be a string in the A/UX 3.1 sh.
>   cat <<_ACEOF
> \`configure' configures this package to adapt to many kinds of systems.
541,556c1364,1819
< ac_ext=c
< # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
< ac_cpp='$CPP $CPPFLAGS'
< ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
< ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
< cross_compiling=$ac_cv_prog_cc_cross
< 
< ac_exeext=
< ac_objext=o
< if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
<   # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
<   if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
<     ac_n= ac_c='
< ' ac_t='	'
<   else
<     ac_n=-n ac_c= ac_t=
---
> Usage: $0 [OPTION]... [VAR=VALUE]...
> 
> To assign environment variables (e.g., CC, CFLAGS...), specify them as
> VAR=VALUE.  See below for descriptions of some of the useful variables.
> 
> Defaults for the options are specified in brackets.
> 
> Configuration:
>   -h, --help              display this help and exit
>       --help=short        display options specific to this package
>       --help=recursive    display the short help of all the included packages
>   -V, --version           display version information and exit
>   -q, --quiet, --silent   do not print \`checking...' messages
>       --cache-file=FILE   cache test results in FILE [disabled]
>   -C, --config-cache      alias for \`--cache-file=config.cache'
>   -n, --no-create         do not create output files
>       --srcdir=DIR        find the sources in DIR [configure dir or \`..']
> 
> Installation directories:
>   --prefix=PREFIX         install architecture-independent files in PREFIX
>                           [$ac_default_prefix]
>   --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
>                           [PREFIX]
> 
> By default, \`make install' will install all the files in
> \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
> an installation prefix other than \`$ac_default_prefix' using \`--prefix',
> for instance \`--prefix=\$HOME'.
> 
> For better control, use the options below.
> 
> Fine tuning of the installation directories:
>   --bindir=DIR            user executables [EPREFIX/bin]
>   --sbindir=DIR           system admin executables [EPREFIX/sbin]
>   --libexecdir=DIR        program executables [EPREFIX/libexec]
>   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
>   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
>   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
>   --libdir=DIR            object code libraries [EPREFIX/lib]
>   --includedir=DIR        C header files [PREFIX/include]
>   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
>   --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
>   --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
>   --infodir=DIR           info documentation [DATAROOTDIR/info]
>   --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
>   --mandir=DIR            man documentation [DATAROOTDIR/man]
>   --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]
>   --htmldir=DIR           html documentation [DOCDIR]
>   --dvidir=DIR            dvi documentation [DOCDIR]
>   --pdfdir=DIR            pdf documentation [DOCDIR]
>   --psdir=DIR             ps documentation [DOCDIR]
> _ACEOF
> 
>   cat <<\_ACEOF
> 
> System types:
>   --build=BUILD     configure for building on BUILD [guessed]
>   --host=HOST       cross-compile to build programs to run on HOST [BUILD]
> _ACEOF
> fi
> 
> if test -n "$ac_init_help"; then
> 
>   cat <<\_ACEOF
> 
> Optional Features:
>   --disable-option-checking  ignore unrecognized --enable/--with options
>   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
>   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
>   --enable-strict         compile with strict compiler options default=no
>   --enable-64bit-libs     build 64-bit libraries default=yes
>   --enable-shared         build shared libraries default=yes
>   --enable-static         build static libraries default=no
>   --enable-debug          build debug libraries default=no
>   --enable-release        build release libraries default=yes
>   --enable-renaming       add a version suffix to symbols default=yes
>   --enable-tracing        enable function and data tracing default=yes
>   --enable-rpath          use rpath when linking default is only if necessary
>   --enable-threads        build ICU with thread safety default=yes
>   --enable-extras         build ICU extras default=yes
>   --enable-icuio          build ICU's icuio library default=yes
>   --enable-layout         build ICU's layout library default=yes
> 
>   --enable-tests          build ICU tests default=yes
>   --enable-samples        build ICU samples default=yes
> Additionally, the variable FORCE_LIBS may be set before calling configure. If set, it will REPLACE any automatic list of libraries.
> 
> Optional Packages:
>   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
>   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
>   --with-iostream=version specify the version of iostream to use (none, old, std, auto) default=auto
>   --with-data-packaging=type specify how to package ICU data (files, archive, library, auto) default=auto
>   --with-library-suffix=suffix    tag a suffix to the library names default=
> 
> Some influential environment variables:
>   CC          C compiler command
>   CFLAGS      C compiler flags
>   LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
>               nonstandard directory <lib dir>
>   LIBS        libraries to pass to the linker, e.g. -l<library>
>   CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
>               you have headers in a nonstandard directory <include dir>
>   CXX         C++ compiler command
>   CXXFLAGS    C++ compiler flags
>   CPP         C preprocessor
>   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.
> 
> _ACEOF
> ac_status=$?
> fi
> 
> if test "$ac_init_help" = "recursive"; then
>   # If there are subdirs, report their specific --help.
>   for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
>     test -d "$ac_dir" ||
>       { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
>       continue
>     ac_builddir=.
> 
> case "$ac_dir" in
> .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
> *)
>   ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
>   # A ".." for each directory in $ac_dir_suffix.
>   ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
>   case $ac_top_builddir_sub in
>   "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
>   *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
>   esac ;;
> esac
> ac_abs_top_builddir=$ac_pwd
> ac_abs_builddir=$ac_pwd$ac_dir_suffix
> # for backward compatibility:
> ac_top_builddir=$ac_top_build_prefix
> 
> case $srcdir in
>   .)  # We are building in place.
>     ac_srcdir=.
>     ac_top_srcdir=$ac_top_builddir_sub
>     ac_abs_top_srcdir=$ac_pwd ;;
>   [\\/]* | ?:[\\/]* )  # Absolute name.
>     ac_srcdir=$srcdir$ac_dir_suffix;
>     ac_top_srcdir=$srcdir
>     ac_abs_top_srcdir=$srcdir ;;
>   *) # Relative name.
>     ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
>     ac_top_srcdir=$ac_top_build_prefix$srcdir
>     ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
> esac
> ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
> 
>     cd "$ac_dir" || { ac_status=$?; continue; }
>     # Check for guested configure.
>     if test -f "$ac_srcdir/configure.gnu"; then
>       echo &&
>       $SHELL "$ac_srcdir/configure.gnu" --help=recursive
>     elif test -f "$ac_srcdir/configure"; then
>       echo &&
>       $SHELL "$ac_srcdir/configure" --help=recursive
>     else
>       $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
>     fi || ac_status=$?
>     cd "$ac_pwd" || { ac_status=$?; break; }
>   done
> fi
> 
> test -n "$ac_init_help" && exit $ac_status
> if $ac_init_version; then
>   cat <<\_ACEOF
> configure
> generated by GNU Autoconf 2.63
> 
> Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
> 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
> This configure script is free software; the Free Software Foundation
> gives unlimited permission to copy, distribute and modify it.
> _ACEOF
>   exit
> fi
> cat >config.log <<_ACEOF
> This file contains any messages produced by compilers while
> running configure, to aid debugging if configure makes a mistake.
> 
> It was created by $as_me, which was
> generated by GNU Autoconf 2.63.  Invocation command line was
> 
>   $ $0 $@
> 
> _ACEOF
> exec 5>>config.log
> {
> cat <<_ASUNAME
> ## --------- ##
> ## Platform. ##
> ## --------- ##
> 
> hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
> uname -m = `(uname -m) 2>/dev/null || echo unknown`
> uname -r = `(uname -r) 2>/dev/null || echo unknown`
> uname -s = `(uname -s) 2>/dev/null || echo unknown`
> uname -v = `(uname -v) 2>/dev/null || echo unknown`
> 
> /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
> /bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
> 
> /bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
> /usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
> /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
> /usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
> /bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
> /usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
> /bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
> 
> _ASUNAME
> 
> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   $as_echo "PATH: $as_dir"
> done
> IFS=$as_save_IFS
> 
> } >&5
> 
> cat >&5 <<_ACEOF
> 
> 
> ## ----------- ##
> ## Core tests. ##
> ## ----------- ##
> 
> _ACEOF
> 
> 
> # Keep a trace of the command line.
> # Strip out --no-create and --no-recursion so they do not pile up.
> # Strip out --silent because we don't want to record it for future runs.
> # Also quote any args containing shell meta-characters.
> # Make two passes to allow for proper duplicate-argument suppression.
> ac_configure_args=
> ac_configure_args0=
> ac_configure_args1=
> ac_must_keep_next=false
> for ac_pass in 1 2
> do
>   for ac_arg
>   do
>     case $ac_arg in
>     -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
>     -q | -quiet | --quiet | --quie | --qui | --qu | --q \
>     | -silent | --silent | --silen | --sile | --sil)
>       continue ;;
>     *\'*)
>       ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
>     esac
>     case $ac_pass in
>     1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
>     2)
>       ac_configure_args1="$ac_configure_args1 '$ac_arg'"
>       if test $ac_must_keep_next = true; then
> 	ac_must_keep_next=false # Got value, back to normal.
>       else
> 	case $ac_arg in
> 	  *=* | --config-cache | -C | -disable-* | --disable-* \
> 	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
> 	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
> 	  | -with-* | --with-* | -without-* | --without-* | --x)
> 	    case "$ac_configure_args0 " in
> 	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
> 	    esac
> 	    ;;
> 	  -* ) ac_must_keep_next=true ;;
> 	esac
>       fi
>       ac_configure_args="$ac_configure_args '$ac_arg'"
>       ;;
>     esac
>   done
> done
> $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
> $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
> 
> # When interrupted or exit'd, cleanup temporary files, and complete
> # config.log.  We remove comments because anyway the quotes in there
> # would cause problems or look ugly.
> # WARNING: Use '\'' to represent an apostrophe within the trap.
> # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
> trap 'exit_status=$?
>   # Save into config.log some information that might help in debugging.
>   {
>     echo
> 
>     cat <<\_ASBOX
> ## ---------------- ##
> ## Cache variables. ##
> ## ---------------- ##
> _ASBOX
>     echo
>     # The following way of writing the cache mishandles newlines in values,
> (
>   for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
>     eval ac_val=\$$ac_var
>     case $ac_val in #(
>     *${as_nl}*)
>       case $ac_var in #(
>       *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
> $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
>       esac
>       case $ac_var in #(
>       _ | IFS | as_nl) ;; #(
>       BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
>       *) $as_unset $ac_var ;;
>       esac ;;
>     esac
>   done
>   (set) 2>&1 |
>     case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
>     *${as_nl}ac_space=\ *)
>       sed -n \
> 	"s/'\''/'\''\\\\'\'''\''/g;
> 	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
>       ;; #(
>     *)
>       sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
>       ;;
>     esac |
>     sort
> )
>     echo
> 
>     cat <<\_ASBOX
> ## ----------------- ##
> ## Output variables. ##
> ## ----------------- ##
> _ASBOX
>     echo
>     for ac_var in $ac_subst_vars
>     do
>       eval ac_val=\$$ac_var
>       case $ac_val in
>       *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
>       esac
>       $as_echo "$ac_var='\''$ac_val'\''"
>     done | sort
>     echo
> 
>     if test -n "$ac_subst_files"; then
>       cat <<\_ASBOX
> ## ------------------- ##
> ## File substitutions. ##
> ## ------------------- ##
> _ASBOX
>       echo
>       for ac_var in $ac_subst_files
>       do
> 	eval ac_val=\$$ac_var
> 	case $ac_val in
> 	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
> 	esac
> 	$as_echo "$ac_var='\''$ac_val'\''"
>       done | sort
>       echo
>     fi
> 
>     if test -s confdefs.h; then
>       cat <<\_ASBOX
> ## ----------- ##
> ## confdefs.h. ##
> ## ----------- ##
> _ASBOX
>       echo
>       cat confdefs.h
>       echo
>     fi
>     test "$ac_signal" != 0 &&
>       $as_echo "$as_me: caught signal $ac_signal"
>     $as_echo "$as_me: exit $exit_status"
>   } >&5
>   rm -f core *.core core.conftest.* &&
>     rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
>     exit $exit_status
> ' 0
> for ac_signal in 1 2 13 15; do
>   trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
> done
> ac_signal=0
> 
> # confdefs.h avoids OS command line length limits that DEFS can exceed.
> rm -f -r conftest* confdefs.h
> 
> # Predefined preprocessor variables.
> 
> cat >>confdefs.h <<_ACEOF
> #define PACKAGE_NAME "$PACKAGE_NAME"
> _ACEOF
> 
> 
> cat >>confdefs.h <<_ACEOF
> #define PACKAGE_TARNAME "$PACKAGE_TARNAME"
> _ACEOF
> 
> 
> cat >>confdefs.h <<_ACEOF
> #define PACKAGE_VERSION "$PACKAGE_VERSION"
> _ACEOF
> 
> 
> cat >>confdefs.h <<_ACEOF
> #define PACKAGE_STRING "$PACKAGE_STRING"
> _ACEOF
> 
> 
> cat >>confdefs.h <<_ACEOF
> #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
> _ACEOF
> 
> 
> # Let the site file select an alternate cache file if it wants to.
> # Prefer an explicitly selected file to automatically selected ones.
> ac_site_file1=NONE
> ac_site_file2=NONE
> if test -n "$CONFIG_SITE"; then
>   ac_site_file1=$CONFIG_SITE
> elif test "x$prefix" != xNONE; then
>   ac_site_file1=$prefix/share/config.site
>   ac_site_file2=$prefix/etc/config.site
> else
>   ac_site_file1=$ac_default_prefix/share/config.site
>   ac_site_file2=$ac_default_prefix/etc/config.site
> fi
> for ac_site_file in "$ac_site_file1" "$ac_site_file2"
> do
>   test "x$ac_site_file" = xNONE && continue
>   if test -r "$ac_site_file"; then
>     { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
> $as_echo "$as_me: loading site script $ac_site_file" >&6;}
>     sed 's/^/| /' "$ac_site_file" >&5
>     . "$ac_site_file"
>   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
>     { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5
> $as_echo "$as_me: loading cache $cache_file" >&6;}
>     case $cache_file in
>       [\\/]* | ?:[\\/]* ) . "$cache_file";;
>       *)                      . "./$cache_file";;
>     esac
559c1822,1884
<   ac_n= ac_c='\c' ac_t=
---
>   { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5
> $as_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 $ac_precious_vars; do
>   eval ac_old_set=\$ac_cv_env_${ac_var}_set
>   eval ac_new_set=\$ac_env_${ac_var}_set
>   eval ac_old_val=\$ac_cv_env_${ac_var}_value
>   eval ac_new_val=\$ac_env_${ac_var}_value
>   case $ac_old_set,$ac_new_set in
>     set,)
>       { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
> $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
>       ac_cache_corrupted=: ;;
>     ,set)
>       { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
> $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
>       ac_cache_corrupted=: ;;
>     ,);;
>     *)
>       if test "x$ac_old_val" != "x$ac_new_val"; then
> 	# differences in whitespace do not lead to failure.
> 	ac_old_val_w=`echo x $ac_old_val`
> 	ac_new_val_w=`echo x $ac_new_val`
> 	if test "$ac_old_val_w" != "$ac_new_val_w"; then
> 	  { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
> $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
> 	  ac_cache_corrupted=:
> 	else
> 	  { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
> $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
> 	  eval $ac_var=\$ac_old_val
> 	fi
> 	{ $as_echo "$as_me:$LINENO:   former value:  \`$ac_old_val'" >&5
> $as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
> 	{ $as_echo "$as_me:$LINENO:   current value: \`$ac_new_val'" >&5
> $as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
>       fi;;
>   esac
>   # Pass precious variables to config.status.
>   if test "$ac_new_set" = set; then
>     case $ac_new_val in
>     *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
>     *) ac_arg=$ac_var=$ac_new_val ;;
>     esac
>     case " $ac_configure_args " in
>       *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
>       *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
>     esac
>   fi
> done
> if $ac_cache_corrupted; then
>   { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
>   { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
> $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
>   { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
> $as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
>    { (exit 1); exit 1; }; }
564a1890,1912
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> ac_ext=c
> ac_cpp='$CPP $CPPFLAGS'
> ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
> ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
> ac_compiler_gnu=$ac_cv_c_compiler_gnu
> 
> 
> 
> ac_config_headers="$ac_config_headers common/icucfg.h"
> 
568,569c1916,1917
< echo $ac_n "checking for ICU version numbers""... $ac_c" 1>&6
< echo "configure:570: checking for ICU version numbers" >&5
---
> { $as_echo "$as_me:$LINENO: checking for ICU version numbers" >&5
> $as_echo_n "checking for ICU version numbers... " >&6; }
578c1926,1928
<         { echo "configure: error: Cannot determine ICU version number from header files" 1>&2; exit 1; }
---
>         { { $as_echo "$as_me:$LINENO: error: Cannot determine ICU version number from header files" >&5
> $as_echo "$as_me: error: Cannot determine ICU version number from header files" >&2;}
>    { (exit 1); exit 1; }; }
586c1936,1937
< echo "$ac_t""release $VERSION, library $LIB_VERSION" 1>&6
---
> { $as_echo "$as_me:$LINENO: result: release $VERSION, library $LIB_VERSION" >&5
> $as_echo "release $VERSION, library $LIB_VERSION" >&6; }
594c1945,1991
< # Extract the first word of "gcc", so it can be a program name with args.
---
> ac_ext=c
> ac_cpp='$CPP $CPPFLAGS'
> ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
> ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
> ac_compiler_gnu=$ac_cv_c_compiler_gnu
> if test -n "$ac_tool_prefix"; then
>   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
> set dummy ${ac_tool_prefix}gcc; ac_word=$2
> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
> $as_echo_n "checking for $ac_word... " >&6; }
> if test "${ac_cv_prog_CC+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   if test -n "$CC"; then
>   ac_cv_prog_CC="$CC" # Let the user override the test.
> else
> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_exec_ext in '' $ac_executable_extensions; do
>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
>     ac_cv_prog_CC="${ac_tool_prefix}gcc"
>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
>     break 2
>   fi
> done
> done
> IFS=$as_save_IFS
> 
> fi
> fi
> CC=$ac_cv_prog_CC
> if test -n "$CC"; then
>   { $as_echo "$as_me:$LINENO: result: $CC" >&5
> $as_echo "$CC" >&6; }
> else
>   { $as_echo "$as_me:$LINENO: result: no" >&5
> $as_echo "no" >&6; }
> fi
> 
> 
> fi
> if test -z "$ac_cv_prog_CC"; then
>   ac_ct_CC=$CC
>   # Extract the first word of "gcc", so it can be a program name with args.
596,599c1993,2049
< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
< echo "configure:598: checking for $ac_word" >&5
< if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
> $as_echo_n "checking for $ac_word... " >&6; }
> if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   if test -n "$ac_ct_CC"; then
>   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
> else
> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_exec_ext in '' $ac_executable_extensions; do
>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
>     ac_cv_prog_ac_ct_CC="gcc"
>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
>     break 2
>   fi
> done
> done
> IFS=$as_save_IFS
> 
> fi
> fi
> ac_ct_CC=$ac_cv_prog_ac_ct_CC
> if test -n "$ac_ct_CC"; then
>   { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
> $as_echo "$ac_ct_CC" >&6; }
> else
>   { $as_echo "$as_me:$LINENO: result: no" >&5
> $as_echo "no" >&6; }
> fi
> 
>   if test "x$ac_ct_CC" = x; then
>     CC=""
>   else
>     case $cross_compiling:$ac_tool_warned in
> yes:)
> { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
> $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
> ac_tool_warned=yes ;;
> esac
>     CC=$ac_ct_CC
>   fi
> else
>   CC="$ac_cv_prog_CC"
> fi
> 
> if test -z "$CC"; then
>           if test -n "$ac_tool_prefix"; then
>     # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
> set dummy ${ac_tool_prefix}cc; ac_word=$2
> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
> $as_echo_n "checking for $ac_word... " >&6; }
> if test "${ac_cv_prog_CC+set}" = set; then
>   $as_echo_n "(cached) " >&6
604,613c2054,2068
<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
<   ac_dummy="$PATH"
<   for ac_dir in $ac_dummy; do
<     test -z "$ac_dir" && ac_dir=.
<     if test -f $ac_dir/$ac_word; then
<       ac_cv_prog_CC="gcc"
<       break
<     fi
<   done
<   IFS="$ac_save_ifs"
---
> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_exec_ext in '' $ac_executable_extensions; do
>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
>     ac_cv_prog_CC="${ac_tool_prefix}cc"
>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
>     break 2
>   fi
> done
> done
> IFS=$as_save_IFS
> 
616c2071
< CC="$ac_cv_prog_CC"
---
> CC=$ac_cv_prog_CC
618c2073,2074
<   echo "$ac_t""$CC" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: $CC" >&5
> $as_echo "$CC" >&6; }
620c2076,2077
<   echo "$ac_t""no" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: no" >&5
> $as_echo "no" >&6; }
622a2080,2082
> 
>   fi
> fi
626,629c2086,2089
< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
< echo "configure:628: checking for $ac_word" >&5
< if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
> $as_echo_n "checking for $ac_word... " >&6; }
> if test "${ac_cv_prog_CC+set}" = set; then
>   $as_echo_n "(cached) " >&6
634d2093
<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
636,648c2095,2113
<   ac_dummy="$PATH"
<   for ac_dir in $ac_dummy; do
<     test -z "$ac_dir" && ac_dir=.
<     if test -f $ac_dir/$ac_word; then
<       if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
<         ac_prog_rejected=yes
< 	continue
<       fi
<       ac_cv_prog_CC="cc"
<       break
<     fi
<   done
<   IFS="$ac_save_ifs"
---
> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_exec_ext in '' $ac_executable_extensions; do
>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
>     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
>        ac_prog_rejected=yes
>        continue
>      fi
>     ac_cv_prog_CC="cc"
>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
>     break 2
>   fi
> done
> done
> IFS=$as_save_IFS
> 
653c2118
<   if test $# -gt 0; then
---
>   if test $# != 0; then
658,660c2123
<     set dummy "$ac_dir/$ac_word" "$@"
<     shift
<     ac_cv_prog_CC="$@"
---
>     ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
665c2128
< CC="$ac_cv_prog_CC"
---
> CC=$ac_cv_prog_CC
667c2130,2131
<   echo "$ac_t""$CC" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: $CC" >&5
> $as_echo "$CC" >&6; }
669c2133,2134
<   echo "$ac_t""no" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: no" >&5
> $as_echo "no" >&6; }
672,680c2137,2148
<   if test -z "$CC"; then
<     case "`uname -s`" in
<     *win32* | *WIN32*)
<       # Extract the first word of "cl", so it can be a program name with args.
< set dummy cl; ac_word=$2
< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
< echo "configure:679: checking for $ac_word" >&5
< if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> 
> fi
> if test -z "$CC"; then
>   if test -n "$ac_tool_prefix"; then
>   for ac_prog in cl.exe
>   do
>     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
> set dummy $ac_tool_prefix$ac_prog; ac_word=$2
> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
> $as_echo_n "checking for $ac_word... " >&6; }
> if test "${ac_cv_prog_CC+set}" = set; then
>   $as_echo_n "(cached) " >&6
685,694c2153,2167
<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
<   ac_dummy="$PATH"
<   for ac_dir in $ac_dummy; do
<     test -z "$ac_dir" && ac_dir=.
<     if test -f $ac_dir/$ac_word; then
<       ac_cv_prog_CC="cl"
<       break
<     fi
<   done
<   IFS="$ac_save_ifs"
---
> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_exec_ext in '' $ac_executable_extensions; do
>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
>     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
>     break 2
>   fi
> done
> done
> IFS=$as_save_IFS
> 
697c2170
< CC="$ac_cv_prog_CC"
---
> CC=$ac_cv_prog_CC
699c2172,2173
<   echo "$ac_t""$CC" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: $CC" >&5
> $as_echo "$CC" >&6; }
701c2175,2176
<   echo "$ac_t""no" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: no" >&5
> $as_echo "no" >&6; }
703,704c2178,2206
<  ;;
<     esac
---
> 
> 
>     test -n "$CC" && break
>   done
> fi
> if test -z "$CC"; then
>   ac_ct_CC=$CC
>   for ac_prog in cl.exe
> do
>   # Extract the first word of "$ac_prog", so it can be a program name with args.
> set dummy $ac_prog; ac_word=$2
> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
> $as_echo_n "checking for $ac_word... " >&6; }
> if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   if test -n "$ac_ct_CC"; then
>   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
> else
> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_exec_ext in '' $ac_executable_extensions; do
>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
>     ac_cv_prog_ac_ct_CC="$ac_prog"
>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
>     break 2
706c2208,2220
<   test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
---
> done
> done
> IFS=$as_save_IFS
> 
> fi
> fi
> ac_ct_CC=$ac_cv_prog_ac_ct_CC
> if test -n "$ac_ct_CC"; then
>   { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
> $as_echo "$ac_ct_CC" >&6; }
> else
>   { $as_echo "$as_me:$LINENO: result: no" >&5
> $as_echo "no" >&6; }
709,710d2222
< echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
< echo "configure:711: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
712,730c2224,2228
< ac_ext=c
< # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
< ac_cpp='$CPP $CPPFLAGS'
< ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
< ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
< cross_compiling=$ac_cv_prog_cc_cross
< 
< cat > conftest.$ac_ext << EOF
< 
< #line 722 "configure"
< #include "confdefs.h"
< 
< main(){return(0);}
< EOF
< if { (eval echo configure:727: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   ac_cv_prog_cc_works=yes
<   # If we can't run a trivial program, we are probably using a cross compiler.
<   if (./conftest; exit) 2>/dev/null; then
<     ac_cv_prog_cc_cross=no
---
>   test -n "$ac_ct_CC" && break
> done
> 
>   if test "x$ac_ct_CC" = x; then
>     CC=""
732c2230,2236
<     ac_cv_prog_cc_cross=yes
---
>     case $cross_compiling:$ac_tool_warned in
> yes:)
> { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
> $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
> ac_tool_warned=yes ;;
> esac
>     CC=$ac_ct_CC
734,737d2237
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   ac_cv_prog_cc_works=no
739,745d2238
< rm -fr conftest*
< ac_ext=c
< # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
< ac_cpp='$CPP $CPPFLAGS'
< ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
< ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
< cross_compiling=$ac_cv_prog_cc_cross
747,749d2239
< echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
< if test $ac_cv_prog_cc_works = no; then
<   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
751,754d2240
< echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
< echo "configure:753: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
< echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
< cross_compiling=$ac_cv_prog_cc_cross
756,767c2242,2368
< echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
< echo "configure:758: checking whether we are using GNU C" >&5
< if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.c <<EOF
< #ifdef __GNUC__
<   yes;
< #endif
< EOF
< if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:767: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
<   ac_cv_prog_gcc=yes
---
> 
> test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
> { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
> See \`config.log' for more details." >&5
> $as_echo "$as_me: error: no acceptable C compiler found in \$PATH
> See \`config.log' for more details." >&2;}
>    { (exit 1); exit 1; }; }; }
> 
> # Provide some information about the compiler.
> $as_echo "$as_me:$LINENO: checking for C compiler version" >&5
> set X $ac_compile
> ac_compiler=$2
> { (ac_try="$ac_compiler --version >&5"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compiler --version >&5") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); }
> { (ac_try="$ac_compiler -v >&5"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compiler -v >&5") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); }
> { (ac_try="$ac_compiler -V >&5"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compiler -V >&5") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); }
> 
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
> int
> main ()
> {
> 
>   ;
>   return 0;
> }
> _ACEOF
> ac_clean_files_save=$ac_clean_files
> ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
> # Try to create an executable without -o first, disregard a.out.
> # It will help us diagnose broken compilers, and finding out an intuition
> # of exeext.
> { $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
> $as_echo_n "checking for C compiler default output file name... " >&6; }
> ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
> 
> # The possible output files:
> ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
> 
> ac_rmfiles=
> for ac_file in $ac_files
> do
>   case $ac_file in
>     *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
>     * ) ac_rmfiles="$ac_rmfiles $ac_file";;
>   esac
> done
> rm -f $ac_rmfiles
> 
> if { (ac_try="$ac_link_default"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link_default") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); }; then
>   # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
> # So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
> # in a Makefile.  We should not override ac_cv_exeext if it was cached,
> # so that the user can short-circuit this test for compilers unknown to
> # Autoconf.
> for ac_file in $ac_files ''
> do
>   test -f "$ac_file" || continue
>   case $ac_file in
>     *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
> 	;;
>     [ab].out )
> 	# We found the default executable, but exeext='' is most
> 	# certainly right.
> 	break;;
>     *.* )
>         if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
> 	then :; else
> 	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
> 	fi
> 	# We set ac_cv_exeext here because the later test for it is not
> 	# safe: cross compilers may not add the suffix if given an `-o'
> 	# argument, so we may need to know it at that point already.
> 	# Even if this section looks crufty: it has the advantage of
> 	# actually working.
> 	break;;
>     * )
> 	break;;
>   esac
> done
> test "$ac_cv_exeext" = no && ac_cv_exeext=
> 
769c2370
<   ac_cv_prog_gcc=no
---
>   ac_file=''
770a2372,2423
> 
> { $as_echo "$as_me:$LINENO: result: $ac_file" >&5
> $as_echo "$ac_file" >&6; }
> if test -z "$ac_file"; then
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
> { { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables
> See \`config.log' for more details." >&5
> $as_echo "$as_me: error: C compiler cannot create executables
> See \`config.log' for more details." >&2;}
>    { (exit 77); exit 77; }; }; }
> fi
> 
> ac_exeext=$ac_cv_exeext
> 
> # Check that the compiler produces executables we can run.  If not, either
> # the compiler is broken, or we cross compile.
> { $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5
> $as_echo_n "checking whether the C compiler works... " >&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'
>   { (case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_try") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); }; }; then
>     cross_compiling=no
>   else
>     if test "$cross_compiling" = maybe; then
> 	cross_compiling=yes
>     else
> 	{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
> { { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs.
> If you meant to cross compile, use \`--host'.
> See \`config.log' for more details." >&5
> $as_echo "$as_me: error: cannot run C compiled programs.
> If you meant to cross compile, use \`--host'.
> See \`config.log' for more details." >&2;}
>    { (exit 1); exit 1; }; }; }
>     fi
>   fi
771a2425,2426
> { $as_echo "$as_me:$LINENO: result: yes" >&5
> $as_echo "yes" >&6; }
773c2428,2549
< echo "$ac_t""$ac_cv_prog_gcc" 1>&6
---
> rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
> ac_clean_files=$ac_clean_files_save
> # Check that the compiler produces executables we can run.  If not, either
> # the compiler is broken, or we cross compile.
> { $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
> $as_echo_n "checking whether we are cross compiling... " >&6; }
> { $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5
> $as_echo "$cross_compiling" >&6; }
> 
> { $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5
> $as_echo_n "checking for suffix of executables... " >&6; }
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $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 conftest.exe conftest conftest.*; do
>   test -f "$ac_file" || continue
>   case $ac_file in
>     *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
>     *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
> 	  break;;
>     * ) break;;
>   esac
> done
> else
>   { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
> { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
> See \`config.log' for more details." >&5
> $as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
> See \`config.log' for more details." >&2;}
>    { (exit 1); exit 1; }; }; }
> fi
> 
> rm -f conftest$ac_cv_exeext
> { $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
> $as_echo "$ac_cv_exeext" >&6; }
> 
> rm -f conftest.$ac_ext
> EXEEXT=$ac_cv_exeext
> ac_exeext=$EXEEXT
> { $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5
> $as_echo_n "checking for suffix of object files... " >&6; }
> if test "${ac_cv_objext+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
> int
> main ()
> {
> 
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.o conftest.obj
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); }; then
>   for ac_file in conftest.o conftest.obj conftest.*; do
>   test -f "$ac_file" || continue;
>   case $ac_file in
>     *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
>     *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
>        break;;
>   esac
> done
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
> { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
> See \`config.log' for more details." >&5
> $as_echo "$as_me: error: cannot compute suffix of object files: cannot compile
> See \`config.log' for more details." >&2;}
>    { (exit 1); exit 1; }; }; }
> fi
> 
> rm -f conftest.$ac_cv_objext conftest.$ac_ext
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
> $as_echo "$ac_cv_objext" >&6; }
> OBJEXT=$ac_cv_objext
> ac_objext=$OBJEXT
> { $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
> $as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
> if test "${ac_cv_c_compiler_gnu+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
775c2551,2594
< if test $ac_cv_prog_gcc = yes; then
---
> int
> main ()
> {
> #ifndef __GNUC__
>        choke me
> #endif
> 
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   ac_compiler_gnu=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_compiler_gnu=no
> fi
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> ac_cv_c_compiler_gnu=$ac_compiler_gnu
> 
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
> $as_echo "$ac_cv_c_compiler_gnu" >&6; }
> if test $ac_compiler_gnu = yes; then
779a2599,2658
> ac_test_CFLAGS=${CFLAGS+set}
> ac_save_CFLAGS=$CFLAGS
> { $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
> $as_echo_n "checking whether $CC accepts -g... " >&6; }
> if test "${ac_cv_prog_cc_g+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   ac_save_c_werror_flag=$ac_c_werror_flag
>    ac_c_werror_flag=yes
>    ac_cv_prog_cc_g=no
>    CFLAGS="-g"
>    cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
> int
> main ()
> {
> 
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   ac_cv_prog_cc_g=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	CFLAGS=""
>       cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
> int
> main ()
> {
781,787c2660,2682
< ac_test_CFLAGS="${CFLAGS+set}"
< ac_save_CFLAGS="$CFLAGS"
< CFLAGS=
< echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
< echo "configure:786: checking whether ${CC-cc} accepts -g" >&5
< if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   :
789,790c2684,2721
<   echo 'void f(){}' > conftest.c
< if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_c_werror_flag=$ac_save_c_werror_flag
> 	 CFLAGS="-g"
> 	 cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
> int
> main ()
> {
> 
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
793c2724,2727
<   ac_cv_prog_cc_g=no
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 
795d2728
< rm -f conftest*
796a2730
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
799c2733,2740
< echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
---
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> fi
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
>    ac_c_werror_flag=$ac_save_c_werror_flag
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
> $as_echo "$ac_cv_prog_cc_g" >&6; }
801c2742
<   CFLAGS="$ac_save_CFLAGS"
---
>   CFLAGS=$ac_save_CFLAGS
814a2756,2790
> { $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
> $as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
> if test "${ac_cv_prog_cc_c89+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   ac_cv_prog_cc_c89=no
> ac_save_CC=$CC
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end 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;
> }
816c2792,2821
< for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl
---
> /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
>    function prototypes and stuff, but not '\xHH' hex character constants.
>    These don't provoke an error unfortunately, instead are silently treated
>    as 'x'.  The following induces an error, until -std is added to get
>    proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
>    array size at least.  It's necessary to write '\x00'==0 to get something
>    that's true only with -std.  */
> int osf4_cc_array ['\x00' == 0 ? 1 : -1];
> 
> /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
>    inside strings and character constants.  */
> #define FOO(x) 'x'
> int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
> 
> int test (int i, double x);
> struct s1 {int (*f) (int a);};
> struct s2 {int (*f) (double a);};
> int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
> int argc;
> char **argv;
> int
> main ()
> {
> return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
>   ;
>   return 0;
> }
> _ACEOF
> for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
> 	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
818,823c2823,2895
< # Extract the first word of "$ac_prog", so it can be a program name with args.
< set dummy $ac_prog; ac_word=$2
< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
< echo "configure:822: checking for $ac_word" >&5
< if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
>   CC="$ac_save_CC $ac_arg"
>   rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   ac_cv_prog_cc_c89=$ac_arg
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 
> fi
> 
> rm -f core conftest.err conftest.$ac_objext
>   test "x$ac_cv_prog_cc_c89" != "xno" && break
> done
> rm -f conftest.$ac_ext
> CC=$ac_save_CC
> 
> fi
> # AC_CACHE_VAL
> case "x$ac_cv_prog_cc_c89" in
>   x)
>     { $as_echo "$as_me:$LINENO: result: none needed" >&5
> $as_echo "none needed" >&6; } ;;
>   xno)
>     { $as_echo "$as_me:$LINENO: result: unsupported" >&5
> $as_echo "unsupported" >&6; } ;;
>   *)
>     CC="$CC $ac_cv_prog_cc_c89"
>     { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
> $as_echo "$ac_cv_prog_cc_c89" >&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_ext=cpp
> ac_cpp='$CXXCPP $CPPFLAGS'
> ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
> ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
> ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
> if test -z "$CXX"; then
>   if test -n "$CCC"; then
>     CXX=$CCC
>   else
>     if test -n "$ac_tool_prefix"; then
>   for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
>   do
>     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
> set dummy $ac_tool_prefix$ac_prog; ac_word=$2
> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
> $as_echo_n "checking for $ac_word... " >&6; }
> if test "${ac_cv_prog_CXX+set}" = set; then
>   $as_echo_n "(cached) " >&6
828,837c2900,2914
<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
<   ac_dummy="$PATH"
<   for ac_dir in $ac_dummy; do
<     test -z "$ac_dir" && ac_dir=.
<     if test -f $ac_dir/$ac_word; then
<       ac_cv_prog_CXX="$ac_prog"
<       break
<     fi
<   done
<   IFS="$ac_save_ifs"
---
> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_exec_ext in '' $ac_executable_extensions; do
>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
>     ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
>     break 2
>   fi
> done
> done
> IFS=$as_save_IFS
> 
840c2917
< CXX="$ac_cv_prog_CXX"
---
> CXX=$ac_cv_prog_CXX
842c2919,2920
<   echo "$ac_t""$CXX" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: $CXX" >&5
> $as_echo "$CXX" >&6; }
844c2922,2923
<   echo "$ac_t""no" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: no" >&5
> $as_echo "no" >&6; }
847c2926,2955
< test -n "$CXX" && break
---
> 
>     test -n "$CXX" && break
>   done
> fi
> if test -z "$CXX"; then
>   ac_ct_CXX=$CXX
>   for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
> do
>   # Extract the first word of "$ac_prog", so it can be a program name with args.
> set dummy $ac_prog; ac_word=$2
> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
> $as_echo_n "checking for $ac_word... " >&6; }
> if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   if test -n "$ac_ct_CXX"; then
>   ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
> else
> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_exec_ext in '' $ac_executable_extensions; do
>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
>     ac_cv_prog_ac_ct_CXX="$ac_prog"
>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
>     break 2
>   fi
> done
849c2957,2968
< test -n "$CXX" || CXX="gcc"
---
> IFS=$as_save_IFS
> 
> fi
> fi
> ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
> if test -n "$ac_ct_CXX"; then
>   { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
> $as_echo "$ac_ct_CXX" >&6; }
> else
>   { $as_echo "$as_me:$LINENO: result: no" >&5
> $as_echo "no" >&6; }
> fi
852,853c2971,2972
< echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6
< echo "configure:854: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5
---
>   test -n "$ac_ct_CXX" && break
> done
855,873c2974,2975
< ac_ext=C
< # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
< ac_cpp='$CXXCPP $CPPFLAGS'
< ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
< ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
< cross_compiling=$ac_cv_prog_cxx_cross
< 
< cat > conftest.$ac_ext << EOF
< 
< #line 865 "configure"
< #include "confdefs.h"
< 
< int main(){return(0);}
< EOF
< if { (eval echo configure:870: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   ac_cv_prog_cxx_works=yes
<   # If we can't run a trivial program, we are probably using a cross compiler.
<   if (./conftest; exit) 2>/dev/null; then
<     ac_cv_prog_cxx_cross=no
---
>   if test "x$ac_ct_CXX" = x; then
>     CXX="g++"
875c2977,2983
<     ac_cv_prog_cxx_cross=yes
---
>     case $cross_compiling:$ac_tool_warned in
> yes:)
> { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
> $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
> ac_tool_warned=yes ;;
> esac
>     CXX=$ac_ct_CXX
877,880d2984
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   ac_cv_prog_cxx_works=no
882,888d2985
< rm -fr conftest*
< ac_ext=c
< # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
< ac_cpp='$CPP $CPPFLAGS'
< ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
< ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
< cross_compiling=$ac_cv_prog_cc_cross
890,892c2987
< echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6
< if test $ac_cv_prog_cxx_works = no; then
<   { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; }
---
>   fi
894,897c2989,3037
< echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
< echo "configure:896: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5
< echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6
< cross_compiling=$ac_cv_prog_cxx_cross
---
> # Provide some information about the compiler.
> $as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5
> set X $ac_compile
> ac_compiler=$2
> { (ac_try="$ac_compiler --version >&5"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compiler --version >&5") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); }
> { (ac_try="$ac_compiler -v >&5"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compiler -v >&5") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); }
> { (ac_try="$ac_compiler -V >&5"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compiler -V >&5") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); }
> 
> { $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
> $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
> if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
899,906c3039,3043
< echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
< echo "configure:901: checking whether we are using GNU C++" >&5
< if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.C <<EOF
< #ifdef __GNUC__
<   yes;
---
> int
> main ()
> {
> #ifndef __GNUC__
>        choke me
908,916d3044
< EOF
< if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:910: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
<   ac_cv_prog_gxx=yes
< else
<   ac_cv_prog_gxx=no
< fi
< fi
< 
< echo "$ac_t""$ac_cv_prog_gxx" 1>&6
918c3046,3082
< if test $ac_cv_prog_gxx = yes; then
---
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_cxx_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   ac_compiler_gnu=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_compiler_gnu=no
> fi
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
> 
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
> $as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
> if test $ac_compiler_gnu = yes; then
922a3087,3107
> ac_test_CXXFLAGS=${CXXFLAGS+set}
> ac_save_CXXFLAGS=$CXXFLAGS
> { $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
> $as_echo_n "checking whether $CXX accepts -g... " >&6; }
> if test "${ac_cv_prog_cxx_g+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   ac_save_cxx_werror_flag=$ac_cxx_werror_flag
>    ac_cxx_werror_flag=yes
>    ac_cv_prog_cxx_g=no
>    CXXFLAGS="-g"
>    cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
> int
> main ()
> {
924,930c3109,3131
< ac_test_CXXFLAGS="${CXXFLAGS+set}"
< ac_save_CXXFLAGS="$CXXFLAGS"
< CXXFLAGS=
< echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
< echo "configure:929: checking whether ${CXX-g++} accepts -g" >&5
< if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_cxx_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   ac_cv_prog_cxx_g=yes
932,933c3133,3209
<   echo 'void f(){}' > conftest.cc
< if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	CXXFLAGS=""
>       cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
> int
> main ()
> {
> 
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_cxx_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   :
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cxx_werror_flag=$ac_save_cxx_werror_flag
> 	 CXXFLAGS="-g"
> 	 cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
> int
> main ()
> {
> 
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_cxx_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
936c3212,3218
<   ac_cv_prog_cxx_g=no
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 
> fi
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
938d3219
< rm -f conftest*
939a3221
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
942c3224,3228
< echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6
---
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
>    ac_cxx_werror_flag=$ac_save_cxx_werror_flag
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
> $as_echo "$ac_cv_prog_cxx_g" >&6; }
944c3230
<   CXXFLAGS="$ac_save_CXXFLAGS"
---
>   CXXFLAGS=$ac_save_CXXFLAGS
957a3244,3248
> 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
960,961c3251,3252
< for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
<   if test -f $ac_dir/install-sh; then
---
> for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
>   if test -f "$ac_dir/install-sh"; then
965c3256
<   elif test -f $ac_dir/install.sh; then
---
>   elif test -f "$ac_dir/install.sh"; then
968a3260,3263
>   elif test -f "$ac_dir/shtool"; then
>     ac_aux_dir=$ac_dir
>     ac_install_sh="$ac_aux_dir/shtool install -c"
>     break
972c3267,3269
<   { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
---
>   { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
> $as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
>    { (exit 1); exit 1; }; }
974,976c3271,3279
< ac_config_guess=$ac_aux_dir/config.guess
< ac_config_sub=$ac_aux_dir/config.sub
< ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
---
> 
> # These three variables are undocumented and unsupported,
> # and are intended to be withdrawn in a future Autoconf release.
> # They can cause serious problems if a builder's source tree is in a directory
> # whose full name contains unusual characters.
> ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
> ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
> ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
> 
984a3288
> # AmigaOS /C/install, which installs bootblocks on floppy discs
987a3292
> # OS/2's system install, which has a completely different semantic
989,990c3294,3296
< echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
< echo "configure:991: checking for a BSD compatible install" >&5
---
> # Reject install programs that cannot install multiple files.
> { $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
> $as_echo_n "checking for a BSD-compatible install... " >&6; }
992,993c3298,3299
< if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> if test "${ac_cv_path_install+set}" = set; then
>   $as_echo_n "(cached) " >&6
995,1005c3301,3318
<     IFS="${IFS= 	}"; ac_save_IFS="$IFS"; IFS=":"
<   for ac_dir in $PATH; do
<     # Account for people who put trailing slashes in PATH elements.
<     case "$ac_dir/" in
<     /|./|.//|/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 test -f $ac_dir/$ac_prog; then
---
>   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   # Account for people who put trailing slashes in PATH elements.
> case $as_dir/ in
>   ./ | .// | /cC/* | \
>   /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
>   ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
>   /usr/ucb/* ) ;;
>   *)
>     # OSF1 and SCO ODT 3.0 have their own names for install.
>     # Don't use installbsd from OSF since it installs stuff as root
>     # by default.
>     for ac_prog in ginstall scoinst install; do
>       for ac_exec_ext in '' $ac_executable_extensions; do
> 	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
1007c3320
<             grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
---
> 	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
1009a3323,3326
> 	  elif test $ac_prog = install &&
> 	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
> 	    # program-specific install script used by HP pwplus--don't use.
> 	    :
1011,1012c3328,3339
< 	    ac_cv_path_install="$ac_dir/$ac_prog -c"
< 	    break 2
---
> 	    rm -rf conftest.one conftest.two conftest.dir
> 	    echo one > conftest.one
> 	    echo two > conftest.two
> 	    mkdir conftest.dir
> 	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
> 	      test -s conftest.one && test -s conftest.two &&
> 	      test -s conftest.dir/conftest.one &&
> 	      test -s conftest.dir/conftest.two
> 	    then
> 	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
> 	      break 3
> 	    fi
1016,1019c3343,3350
<       ;;
<     esac
<   done
<   IFS="$ac_save_IFS"
---
>     done
>     ;;
> esac
> 
> done
> IFS=$as_save_IFS
> 
> rm -rf conftest.one conftest.two conftest.dir
1023c3354
<     INSTALL="$ac_cv_path_install"
---
>     INSTALL=$ac_cv_path_install
1025,1026c3356,3357
<     # As a last resort, use the slow shell script.  We don't cache a
<     # path for INSTALL within a source directory, because that will
---
>     # As a last resort, use the slow shell script.  Don't cache a
>     # value for INSTALL within a source directory, because that will
1028,1029c3359,3360
<     # removed, or if the path is relative.
<     INSTALL="$ac_install_sh"
---
>     # removed, or if the value is a relative name.
>     INSTALL=$ac_install_sh
1032c3363,3364
< echo "$ac_t""$INSTALL" 1>&6
---
> { $as_echo "$as_me:$LINENO: result: $INSTALL" >&5
> $as_echo "$INSTALL" >&6; }
1038c3370
< test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
---
> test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
1054,1057c3386,3389
< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
< echo "configure:1056: checking for $ac_word" >&5
< if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
> $as_echo_n "checking for $ac_word... " >&6; }
> if test "${ac_cv_prog_STRIP+set}" = set; then
>   $as_echo_n "(cached) " >&6
1062,1071c3394,3408
<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
<   ac_dummy="$PATH"
<   for ac_dir in $ac_dummy; do
<     test -z "$ac_dir" && ac_dir=.
<     if test -f $ac_dir/$ac_word; then
<       ac_cv_prog_STRIP="strip"
<       break
<     fi
<   done
<   IFS="$ac_save_ifs"
---
> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_exec_ext in '' $ac_executable_extensions; do
>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
>     ac_cv_prog_STRIP="strip"
>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
>     break 2
>   fi
> done
> done
> IFS=$as_save_IFS
> 
1075c3412
< STRIP="$ac_cv_prog_STRIP"
---
> STRIP=$ac_cv_prog_STRIP
1077c3414,3415
<   echo "$ac_t""$STRIP" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: $STRIP" >&5
> $as_echo "$STRIP" >&6; }
1079c3417,3418
<   echo "$ac_t""no" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: no" >&5
> $as_echo "no" >&6; }
1082a3422
> 
1085c3425
< # Extract the first word of "$ac_prog", so it can be a program name with args.
---
>   # Extract the first word of "$ac_prog", so it can be a program name with args.
1087,1090c3427,3430
< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
< echo "configure:1089: checking for $ac_word" >&5
< if eval "test \"`echo '$''{'ac_cv_path_U_MAKE'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
> $as_echo_n "checking for $ac_word... " >&6; }
> if test "${ac_cv_path_U_MAKE+set}" = set; then
>   $as_echo_n "(cached) " >&6
1092,1093c3432,3433
<   case "$U_MAKE" in
<   /*)
---
>   case $U_MAKE in
>   [\\/]* | ?:[\\/]*)
1096,1098d3435
<   ?:/*)			 
<   ac_cv_path_U_MAKE="$U_MAKE" # Let the user override the test with a dos path.
<   ;;
1100,1109c3437,3451
<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
<   ac_dummy="$PATH"
<   for ac_dir in $ac_dummy; do 
<     test -z "$ac_dir" && ac_dir=.
<     if test -f $ac_dir/$ac_word; then
<       ac_cv_path_U_MAKE="$ac_dir/$ac_word"
<       break
<     fi
<   done
<   IFS="$ac_save_ifs"
---
>   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_exec_ext in '' $ac_executable_extensions; do
>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
>     ac_cv_path_U_MAKE="$as_dir/$ac_word$ac_exec_ext"
>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
>     break 2
>   fi
> done
> done
> IFS=$as_save_IFS
> 
1113c3455
< U_MAKE="$ac_cv_path_U_MAKE"
---
> U_MAKE=$ac_cv_path_U_MAKE
1115c3457,3458
<   echo "$ac_t""$U_MAKE" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: $U_MAKE" >&5
> $as_echo "$U_MAKE" >&6; }
1117c3460,3461
<   echo "$ac_t""no" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: no" >&5
> $as_echo "no" >&6; }
1120c3464,3465
< test -n "$U_MAKE" && break
---
> 
>   test -n "$U_MAKE" && break
1128,1131c3473,3476
< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
< echo "configure:1130: checking for $ac_word" >&5
< if eval "test \"`echo '$''{'ac_cv_path_DOXYGEN'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
> $as_echo_n "checking for $ac_word... " >&6; }
> if test "${ac_cv_path_DOXYGEN+set}" = set; then
>   $as_echo_n "(cached) " >&6
1133,1134c3478,3479
<   case "$DOXYGEN" in
<   /*)
---
>   case $DOXYGEN in
>   [\\/]* | ?:[\\/]*)
1137,1139d3481
<   ?:/*)			 
<   ac_cv_path_DOXYGEN="$DOXYGEN" # Let the user override the test with a dos path.
<   ;;
1141,1150c3483,3498
<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
<   ac_dummy="$PATH:/usr/local/bin:/usr/bin"
<   for ac_dir in $ac_dummy; do 
<     test -z "$ac_dir" && ac_dir=.
<     if test -f $ac_dir/$ac_word; then
<       ac_cv_path_DOXYGEN="$ac_dir/$ac_word"
<       break
<     fi
<   done
<   IFS="$ac_save_ifs"
---
>   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> as_dummy="$PATH:/usr/local/bin:/usr/bin"
> for as_dir in $as_dummy
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_exec_ext in '' $ac_executable_extensions; do
>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
>     ac_cv_path_DOXYGEN="$as_dir/$ac_word$ac_exec_ext"
>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
>     break 2
>   fi
> done
> done
> IFS=$as_save_IFS
> 
1154c3502
< DOXYGEN="$ac_cv_path_DOXYGEN"
---
> DOXYGEN=$ac_cv_path_DOXYGEN
1156c3504,3505
<   echo "$ac_t""$DOXYGEN" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: $DOXYGEN" >&5
> $as_echo "$DOXYGEN" >&6; }
1158c3507,3508
<   echo "$ac_t""no" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: no" >&5
> $as_echo "no" >&6; }
1164,1180c3514,3543
< if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
< else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
< fi
< 
< echo $ac_n "checking host system type""... $ac_c" 1>&6
< echo "configure:1170: checking host system type" >&5
< 
< host_alias=$host
< case "$host_alias" in
< NONE)
<   case $nonopt in
<   NONE)
<     if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
<     else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
<     fi ;;
<   *) host_alias=$nonopt ;;
<   esac ;;
---
> $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
>   { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
> $as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
>    { (exit 1); exit 1; }; }
> 
> { $as_echo "$as_me:$LINENO: checking build system type" >&5
> $as_echo_n "checking build system type... " >&6; }
> if test "${ac_cv_build+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   ac_build_alias=$build_alias
> test "x$ac_build_alias" = x &&
>   ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
> test "x$ac_build_alias" = x &&
>   { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
> $as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
>    { (exit 1); exit 1; }; }
> ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
>   { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
> $as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
>    { (exit 1); exit 1; }; }
> 
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5
> $as_echo "$ac_cv_build" >&6; }
> case $ac_cv_build in
> *-*-*) ;;
> *) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
> $as_echo "$as_me: error: invalid value of canonical build" >&2;}
>    { (exit 1); exit 1; }; };;
1182,1216c3545,3570
< 
< host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
< host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
< host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
< host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
< echo "$ac_t""$host" 1>&6
< 
< echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
< echo "configure:1191: checking for Cygwin environment" >&5
< if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 1196 "configure"
< #include "confdefs.h"
< 
< int main() {
< 
< #ifndef __CYGWIN__
< #define __CYGWIN__ __CYGWIN32__
< #endif
< return __CYGWIN__;
< ; return 0; }
< EOF
< if { (eval echo configure:1207: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
<   rm -rf conftest*
<   ac_cv_cygwin=yes
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   ac_cv_cygwin=no
< fi
< rm -f conftest*
< rm -f conftest*
---
> build=$ac_cv_build
> ac_save_IFS=$IFS; IFS='-'
> set x $ac_cv_build
> shift
> build_cpu=$1
> build_vendor=$2
> shift; shift
> # Remember, the first character of IFS is used to create $*,
> # except with old shells:
> build_os=$*
> IFS=$ac_save_IFS
> case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
> 
> 
> { $as_echo "$as_me:$LINENO: checking host system type" >&5
> $as_echo_n "checking host system type... " >&6; }
> if test "${ac_cv_host+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   if test "x$host_alias" = x; then
>   ac_cv_host=$ac_cv_build
> else
>   ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
>     { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
> $as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
>    { (exit 1); exit 1; }; }
1219,1245d3572
< echo "$ac_t""$ac_cv_cygwin" 1>&6
< CYGWIN=
< test "$ac_cv_cygwin" = yes && CYGWIN=yes
< echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
< echo "configure:1224: checking for mingw32 environment" >&5
< if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 1229 "configure"
< #include "confdefs.h"
< 
< int main() {
< return __MINGW32__;
< ; return 0; }
< EOF
< if { (eval echo configure:1236: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
<   rm -rf conftest*
<   ac_cv_mingw32=yes
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   ac_cv_mingw32=no
< fi
< rm -f conftest*
< rm -f conftest*
1246a3574,3593
> { $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5
> $as_echo "$ac_cv_host" >&6; }
> case $ac_cv_host in
> *-*-*) ;;
> *) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
> $as_echo "$as_me: error: invalid value of canonical host" >&2;}
>    { (exit 1); exit 1; }; };;
> esac
> host=$ac_cv_host
> ac_save_IFS=$IFS; IFS='-'
> set x $ac_cv_host
> shift
> host_cpu=$1
> host_vendor=$2
> shift; shift
> # Remember, the first character of IFS is used to create $*,
> # except with old shells:
> host_os=$*
> IFS=$ac_save_IFS
> case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
1248,1277d3594
< echo "$ac_t""$ac_cv_mingw32" 1>&6
< MINGW32=
< test "$ac_cv_mingw32" = yes && MINGW32=yes
< 
< 
< echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
< echo "configure:1255: checking for executable suffix" >&5
< if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
<   ac_cv_exeext=.exe
< else
<   rm -f conftest*
<   echo 'int main () { return 0; }' > conftest.$ac_ext
<   ac_cv_exeext=
<   if { (eval echo configure:1265: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
<     for file in conftest.*; do
<       case $file in
<       *.c | *.o | *.obj) ;;
<       *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
<       esac
<     done
<   else
<     { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
<   fi
<   rm -f conftest*
<   test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
< fi
< fi
1279,1282d3595
< EXEEXT=""
< test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
< echo "$ac_t""${ac_cv_exeext}" 1>&6
< ac_exeext=$EXEEXT
1286,1288c3599,3601
<     echo $ac_n "checking whether strict compiling is on""... $ac_c" 1>&6
< echo "configure:1288: checking whether strict compiling is on" >&5
<     # Check whether --enable-strict or --disable-strict was given.
---
>     { $as_echo "$as_me:$LINENO: checking whether strict compiling is on" >&5
> $as_echo_n "checking whether strict compiling is on... " >&6; }
>     # Check whether --enable-strict was given.
1290,1291c3603
<   enableval="$enable_strict"
<   
---
>   enableval=$enable_strict;
1298c3610
<       
---
> 
1303c3615,3616
<     echo "$ac_t""$ac_use_strict_options" 1>&6
---
>     { $as_echo "$as_me:$LINENO: result: $ac_use_strict_options" >&5
> $as_echo "$ac_use_strict_options" >&6; }
1343c3656,3657
<     # Check whether --enable-64bit-libs or --disable-64bit-libs was given.
---
> 
>     # Check whether --enable-64bit-libs was given.
1345,1346c3659
<   enableval="$enable_64bit_libs"
<   ENABLE_64BIT_LIBS=${enableval}
---
>   enableval=$enable_64bit_libs; ENABLE_64BIT_LIBS=${enableval}
1349c3662
<     
---
> 
1352,1353c3665,3666
<         echo $ac_n "checking for 64-bit executable support""... $ac_c" 1>&6
< echo "configure:1354: checking for 64-bit executable support" >&5
---
>         { $as_echo "$as_me:$LINENO: checking for 64-bit executable support" >&5
> $as_echo_n "checking for 64-bit executable support... " >&6; }
1408c3721
<             if test "$ac_cv_prog_gcc" = no; then
---
>             if test "$ac_cv_c_compiler_gnu" = no; then
1420,1422c3733,3738
<   cat > conftest.$ac_ext <<EOF
< #line 1422 "configure"
< #include "confdefs.h"
---
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
1424,1426c3740,3762
< EOF
< if { (eval echo configure:1426: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
< then
---
> _ACEOF
> rm -f conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
>   { (case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_try") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); }; }; then
1429,1432c3765,3770
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -fr conftest*
<   ENABLE_64BIT_LIBS=no
---
>   $as_echo "$as_me: program exited with status $ac_status" >&5
> $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> ( exit $ac_status )
> ENABLE_64BIT_LIBS=no
1434c3772,3773
< rm -fr conftest*
---
> rm -rf conftest.dSYM
> rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
1436a3776
> 
1450c3790
<                         
---
> 
1458,1460c3798,3803
<   cat > conftest.$ac_ext <<EOF
< #line 1460 "configure"
< #include "confdefs.h"
---
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
1462,1464c3805,3827
< EOF
< if { (eval echo configure:1464: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
< then
---
> _ACEOF
> rm -f conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
>   { (case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_try") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); }; }; then
1467,1470c3830,3835
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -fr conftest*
<   ENABLE_64BIT_LIBS=no
---
>   $as_echo "$as_me: program exited with status $ac_status" >&5
> $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> ( exit $ac_status )
> ENABLE_64BIT_LIBS=no
1472c3837,3838
< rm -fr conftest*
---
> rm -rf conftest.dSYM
> rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
1474a3841
> 
1483,1485c3850,3855
<   cat > conftest.$ac_ext <<EOF
< #line 1485 "configure"
< #include "confdefs.h"
---
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
1487,1489c3857,3879
< EOF
< if { (eval echo configure:1489: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
< then
---
> _ACEOF
> rm -f conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
>   { (case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_try") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); }; }; then
1492,1495c3882,3887
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -fr conftest*
<   ENABLE_64BIT_LIBS=no
---
>   $as_echo "$as_me: program exited with status $ac_status" >&5
> $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> ( exit $ac_status )
> ENABLE_64BIT_LIBS=no
1497c3889,3890
< rm -fr conftest*
---
> rm -rf conftest.dSYM
> rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
1499a3893
> 
1511c3905,3906
<         echo "$ac_t""$ENABLE_64BIT_LIBS" 1>&6
---
>         { $as_echo "$as_me:$LINENO: result: $ENABLE_64BIT_LIBS" >&5
> $as_echo "$ENABLE_64BIT_LIBS" >&6; }
1517,1520c3912,3915
< 	echo $ac_n "checking which Makefile fragment to use""... $ac_c" 1>&6
< echo "configure:1519: checking which Makefile fragment to use" >&5
< if eval "test \"`echo '$''{'icu_cv_host_frag'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> 	{ $as_echo "$as_me:$LINENO: checking which Makefile fragment to use" >&5
> $as_echo_n "checking which Makefile fragment to use... " >&6; }
> if test "${icu_cv_host_frag+set}" = set; then
>   $as_echo_n "(cached) " >&6
1522c3917
<   
---
> 
1525,1526c3920,3921
< 	if test "$GCC" = yes; then	
< 		icu_cv_host_frag=mh-solaris-gcc 
---
> 	if test "$GCC" = yes; then
> 		icu_cv_host_frag=mh-solaris-gcc
1533c3928
< 	else  
---
> 	else
1587,1589d3981
< 		
< 	
< fi
1591c3983,3986
< echo "$ac_t""$icu_cv_host_frag" 1>&6
---
> 
> fi
> { $as_echo "$as_me:$LINENO: result: $icu_cv_host_frag" >&5
> $as_echo "$icu_cv_host_frag" >&6; }
1595,1599c3990,3993
< 	*-*-hpux*) 	echo $ac_n "checking for floor in -lm""... $ac_c" 1>&6
< echo "configure:1597: checking for floor in -lm" >&5
< ac_lib_var=`echo m'_'floor | sed 'y%./+-%__p_%'`
< if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> 	*-*-hpux*) 	{ $as_echo "$as_me:$LINENO: checking for floor in -lm" >&5
> $as_echo_n "checking for floor in -lm... " >&6; }
> if test "${ac_cv_lib_m_floor+set}" = set; then
>   $as_echo_n "(cached) " >&6
1601c3995
<   ac_save_LIBS="$LIBS"
---
>   ac_check_lib_save_LIBS=$LIBS
1603,1629c3997,4055
< cat > conftest.$ac_ext <<EOF
< #line 1605 "configure"
< #include "confdefs.h"
< /* Override any gcc2 internal prototype to avoid an error.  */
< /* We use char because int might match the return type of a gcc2
<     builtin and then its argument prototype would still apply.  */
< char floor();
< 
< int main() {
< floor()
< ; return 0; }
< EOF
< if { (eval echo configure:1616: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
<   eval "ac_cv_lib_$ac_lib_var=yes"
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   eval "ac_cv_lib_$ac_lib_var=no"
< fi
< rm -f conftest*
< LIBS="$ac_save_LIBS"
< 
< fi
< if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
<   echo "$ac_t""yes" 1>&6
---
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
> /* Override any GCC internal prototype to avoid an error.
>    Use char because int might match the return type of a GCC
>    builtin and then its argument prototype would still apply.  */
> #ifdef __cplusplus
> extern "C"
> #endif
> char floor ();
> int
> main ()
> {
> return floor ();
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
>   ac_cv_lib_m_floor=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_lib_m_floor=no
> fi
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
> LIBS=$ac_check_lib_save_LIBS
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_m_floor" >&5
> $as_echo "$ac_cv_lib_m_floor" >&6; }
> if test "x$ac_cv_lib_m_floor" = x""yes; then
1631,1632d4056
< else
<   echo "$ac_t""no" 1>&6
1635,1666d4058
< 	
< 	*) 		echo $ac_n "checking for floor in -lm""... $ac_c" 1>&6
< echo "configure:1638: checking for floor in -lm" >&5
< ac_lib_var=`echo m'_'floor | sed 'y%./+-%__p_%'`
< if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   ac_save_LIBS="$LIBS"
< LIBS="-lm  $LIBS"
< cat > conftest.$ac_ext <<EOF
< #line 1646 "configure"
< #include "confdefs.h"
< /* Override any gcc2 internal prototype to avoid an error.  */
< /* We use char because int might match the return type of a gcc2
<     builtin and then its argument prototype would still apply.  */
< char floor();
< 
< int main() {
< floor()
< ; return 0; }
< EOF
< if { (eval echo configure:1657: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
<   eval "ac_cv_lib_$ac_lib_var=yes"
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   eval "ac_cv_lib_$ac_lib_var=no"
< fi
< rm -f conftest*
< LIBS="$ac_save_LIBS"
1668,1675c4060,4129
< fi
< if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
<   echo "$ac_t""yes" 1>&6
<     ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \
<     -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
<   cat >> confdefs.h <<EOF
< #define $ac_tr_lib 1
< EOF
---
> 	*)
> { $as_echo "$as_me:$LINENO: checking for floor in -lm" >&5
> $as_echo_n "checking for floor in -lm... " >&6; }
> if test "${ac_cv_lib_m_floor+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   ac_check_lib_save_LIBS=$LIBS
> LIBS="-lm  $LIBS"
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
> /* Override any GCC internal prototype to avoid an error.
>    Use char because int might match the return type of a GCC
>    builtin and then its argument prototype would still apply.  */
> #ifdef __cplusplus
> extern "C"
> #endif
> char floor ();
> int
> main ()
> {
> return floor ();
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
>   ac_cv_lib_m_floor=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_lib_m_floor=no
> fi
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
> LIBS=$ac_check_lib_save_LIBS
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_m_floor" >&5
> $as_echo "$ac_cv_lib_m_floor" >&6; }
> if test "x$ac_cv_lib_m_floor" = x""yes; then
>   cat >>confdefs.h <<_ACEOF
> #define HAVE_LIBM 1
> _ACEOF
1679,1680d4132
< else
<   echo "$ac_t""no" 1>&6
1682c4134
<  
---
> 
1687,1688c4139,4140
< echo $ac_n "checking whether to build shared libraries""... $ac_c" 1>&6
< echo "configure:1689: checking whether to build shared libraries" >&5
---
> { $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
> $as_echo_n "checking whether to build shared libraries... " >&6; }
1690c4142
< # Check whether --enable-shared or --disable-shared was given.
---
> # Check whether --enable-shared was given.
1692,1693c4144
<   enableval="$enable_shared"
<    case "${enableval}" in
---
>   enableval=$enable_shared;  case "${enableval}" in
1703c4154,4155
< echo "$ac_t""$enabled" 1>&6
---
> { $as_echo "$as_me:$LINENO: result: $enabled" >&5
> $as_echo "$enabled" >&6; }
1706,1707c4158,4159
< echo $ac_n "checking whether to build static libraries""... $ac_c" 1>&6
< echo "configure:1708: checking whether to build static libraries" >&5
---
> { $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5
> $as_echo_n "checking whether to build static libraries... " >&6; }
1709c4161
< # Check whether --enable-static or --disable-static was given.
---
> # Check whether --enable-static was given.
1711,1712c4163
<   enableval="$enable_static"
<    case "${enableval}" in
---
>   enableval=$enable_static;  case "${enableval}" in
1719c4170,4171
< echo "$ac_t""$enabled" 1>&6
---
> { $as_echo "$as_me:$LINENO: result: $enabled" >&5
> $as_echo "$enabled" >&6; }
1722,1723c4174,4175
< echo $ac_n "checking whether to build debug libraries""... $ac_c" 1>&6
< echo "configure:1724: checking whether to build debug libraries" >&5
---
> { $as_echo "$as_me:$LINENO: checking whether to build debug libraries" >&5
> $as_echo_n "checking whether to build debug libraries... " >&6; }
1726c4178
< # Check whether --enable-debug or --disable-debug was given.
---
> # Check whether --enable-debug was given.
1728,1729c4180
<   enableval="$enable_debug"
<    case "${enableval}" in
---
>   enableval=$enable_debug;  case "${enableval}" in
1735c4186,4187
< echo "$ac_t""$enabled" 1>&6
---
> { $as_echo "$as_me:$LINENO: result: $enabled" >&5
> $as_echo "$enabled" >&6; }
1738,1739c4190,4191
< echo $ac_n "checking whether to build release libraries""... $ac_c" 1>&6
< echo "configure:1740: checking whether to build release libraries" >&5
---
> { $as_echo "$as_me:$LINENO: checking whether to build release libraries" >&5
> $as_echo_n "checking whether to build release libraries... " >&6; }
1742c4194
< # Check whether --enable-release or --disable-release was given.
---
> # Check whether --enable-release was given.
1744,1745c4196
<   enableval="$enable_release"
<    case "${enableval}" in
---
>   enableval=$enable_release;  case "${enableval}" in
1751c4202,4203
< echo "$ac_t""$enabled" 1>&6
---
> { $as_echo "$as_me:$LINENO: result: $enabled" >&5
> $as_echo "$enabled" >&6; }
1754,1759c4206,4212
< # Extract the first word of "ranlib", so it can be a program name with args.
< set dummy ranlib; ac_word=$2
< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
< echo "configure:1758: checking for $ac_word" >&5
< if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&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
> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
> $as_echo_n "checking for $ac_word... " >&6; }
> if test "${ac_cv_prog_RANLIB+set}" = set; then
>   $as_echo_n "(cached) " >&6
1764,1774c4217,4231
<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
<   ac_dummy="$PATH"
<   for ac_dir in $ac_dummy; do
<     test -z "$ac_dir" && ac_dir=.
<     if test -f $ac_dir/$ac_word; then
<       ac_cv_prog_RANLIB="ranlib"
<       break
<     fi
<   done
<   IFS="$ac_save_ifs"
<   test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
---
> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_exec_ext in '' $ac_executable_extensions; do
>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
>     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
>     break 2
>   fi
> done
> done
> IFS=$as_save_IFS
> 
1777c4234
< RANLIB="$ac_cv_prog_RANLIB"
---
> RANLIB=$ac_cv_prog_RANLIB
1779c4236,4293
<   echo "$ac_t""$RANLIB" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5
> $as_echo "$RANLIB" >&6; }
> else
>   { $as_echo "$as_me:$LINENO: result: no" >&5
> $as_echo "no" >&6; }
> fi
> 
> 
> fi
> if test -z "$ac_cv_prog_RANLIB"; then
>   ac_ct_RANLIB=$RANLIB
>   # Extract the first word of "ranlib", so it can be a program name with args.
> set dummy ranlib; ac_word=$2
> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
> $as_echo_n "checking for $ac_word... " >&6; }
> if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   if test -n "$ac_ct_RANLIB"; then
>   ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
> else
> as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_exec_ext in '' $ac_executable_extensions; do
>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
>     ac_cv_prog_ac_ct_RANLIB="ranlib"
>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
>     break 2
>   fi
> done
> done
> IFS=$as_save_IFS
> 
> fi
> fi
> ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
> if test -n "$ac_ct_RANLIB"; then
>   { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
> $as_echo "$ac_ct_RANLIB" >&6; }
> else
>   { $as_echo "$as_me:$LINENO: result: no" >&5
> $as_echo "no" >&6; }
> fi
> 
>   if test "x$ac_ct_RANLIB" = x; then
>     RANLIB=":"
>   else
>     case $cross_compiling:$ac_tool_warned in
> yes:)
> { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
> $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
> ac_tool_warned=yes ;;
> esac
>     RANLIB=$ac_ct_RANLIB
>   fi
1781c4295
<   echo "$ac_t""no" 1>&6
---
>   RANLIB="$ac_cv_prog_RANLIB"
1786,1789c4300,4303
< echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
< echo "configure:1788: checking for $ac_word" >&5
< if eval "test \"`echo '$''{'ac_cv_path_AR'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
> $as_echo_n "checking for $ac_word... " >&6; }
> if test "${ac_cv_path_AR+set}" = set; then
>   $as_echo_n "(cached) " >&6
1791,1792c4305,4306
<   case "$AR" in
<   /*)
---
>   case $AR in
>   [\\/]* | ?:[\\/]*)
1795,1797d4308
<   ?:/*)			 
<   ac_cv_path_AR="$AR" # Let the user override the test with a dos path.
<   ;;
1799,1808c4310,4325
<   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
<   ac_dummy="$PATH:/bin:/usr/bin:/usr/ccs/bin"
<   for ac_dir in $ac_dummy; do 
<     test -z "$ac_dir" && ac_dir=.
<     if test -f $ac_dir/$ac_word; then
<       ac_cv_path_AR="$ac_dir/$ac_word"
<       break
<     fi
<   done
<   IFS="$ac_save_ifs"
---
>   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> as_dummy="$PATH:/bin:/usr/bin:/usr/ccs/bin"
> for as_dir in $as_dummy
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_exec_ext in '' $ac_executable_extensions; do
>   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
>     ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext"
>     $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
>     break 2
>   fi
> done
> done
> IFS=$as_save_IFS
> 
1813c4330
< AR="$ac_cv_path_AR"
---
> AR=$ac_cv_path_AR
1815c4332,4333
<   echo "$ac_t""$AR" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: $AR" >&5
> $as_echo "$AR" >&6; }
1817c4335,4336
<   echo "$ac_t""no" 1>&6
---
>   { $as_echo "$as_me:$LINENO: result: no" >&5
> $as_echo "no" >&6; }
1821,1822c4340,4342
< echo $ac_n "checking whether to enable renaming of symbols""... $ac_c" 1>&6
< echo "configure:1823: checking whether to enable renaming of symbols" >&5
---
> 
> { $as_echo "$as_me:$LINENO: checking whether to enable renaming of symbols" >&5
> $as_echo_n "checking whether to enable renaming of symbols... " >&6; }
1825c4345
< # Check whether --enable-renaming or --disable-renaming was given.
---
> # Check whether --enable-renaming was given.
1827,1828c4347
<   enableval="$enable_renaming"
<    case "${enableval}" in
---
>   enableval=$enable_renaming;  case "${enableval}" in
1835c4354,4355
< echo "$ac_t""$enabled" 1>&6
---
> { $as_echo "$as_me:$LINENO: result: $enabled" >&5
> $as_echo "$enabled" >&6; }
1838,1839c4358,4359
< echo $ac_n "checking whether to enable function and data tracing""... $ac_c" 1>&6
< echo "configure:1840: checking whether to enable function and data tracing" >&5
---
> { $as_echo "$as_me:$LINENO: checking whether to enable function and data tracing" >&5
> $as_echo_n "checking whether to enable function and data tracing... " >&6; }
1842c4362
< # Check whether --enable-tracing or --disable-tracing was given.
---
> # Check whether --enable-tracing was given.
1844,1845c4364
<   enableval="$enable_tracing"
<    case "${enableval}" in
---
>   enableval=$enable_tracing;  case "${enableval}" in
1852c4371,4372
< echo "$ac_t""$enabled" 1>&6
---
> { $as_echo "$as_me:$LINENO: result: $enabled" >&5
> $as_echo "$enabled" >&6; }
1855c4375
< # Check whether --enable-rpath or --disable-rpath was given.
---
> # Check whether --enable-rpath was given.
1857,1858c4377
<   enableval="$enable_rpath"
<    case "${enableval}" in
---
>   enableval=$enable_rpath;  case "${enableval}" in
1871,1874c4390,4393
< echo $ac_n "checking for definition of U_INLINE for C""... $ac_c" 1>&6
< echo "configure:1873: checking for definition of U_INLINE for C" >&5
< if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> { $as_echo "$as_me:$LINENO: checking for definition of U_INLINE for C" >&5
> $as_echo_n "checking for definition of U_INLINE for C... " >&6; }
> if test "${ac_cv_c_inline+set}" = set; then
>   $as_echo_n "(cached) " >&6
1878,1880c4397,4402
<   cat > conftest.$ac_ext <<EOF
< #line 1880 "configure"
< #include "confdefs.h"
---
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
1882c4404,4406
< int main() {
---
> int
> main ()
> {
1884,1887c4408,4429
< ; return 0; }
< EOF
< if { (eval echo configure:1887: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
<   rm -rf conftest*
---
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
1890,1891c4432,4435
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 
1893c4437,4438
< rm -f conftest*
---
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
1895,1896d4439
<   
< fi
1898c4441,4443
< echo "$ac_t""$ac_cv_c_inline" 1>&6
---
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
> $as_echo "$ac_cv_c_inline" >&6; }
1908c4453
< # Check whether --enable-threads or --disable-threads was given.
---
> # Check whether --enable-threads was given.
1910,1911c4455
<   enableval="$enable_threads"
<   case "${enableval}" in
---
>   enableval=$enable_threads; case "${enableval}" in
1914c4458,4460
< 		*) { echo "configure: error: bad value ${enableval} for --enable-threads" 1>&2; exit 1; } ;;
---
> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-threads" >&5
> $as_echo "$as_me: error: bad value ${enableval} for --enable-threads" >&2;}
>    { (exit 1); exit 1; }; } ;;
1930,1935c4476,4481
<            
<   echo $ac_n "checking for pthread_attr_init in -lpthread""... $ac_c" 1>&6
< echo "configure:1933: checking for pthread_attr_init in -lpthread" >&5
< ac_lib_var=`echo pthread'_'pthread_attr_init | sed 'y%./+-%__p_%'`
< if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> 
> 
> { $as_echo "$as_me:$LINENO: checking for pthread_attr_init in -lpthread" >&5
> $as_echo_n "checking for pthread_attr_init in -lpthread... " >&6; }
> if test "${ac_cv_lib_pthread_pthread_attr_init+set}" = set; then
>   $as_echo_n "(cached) " >&6
1937c4483
<   ac_save_LIBS="$LIBS"
---
>   ac_check_lib_save_LIBS=$LIBS
1939,1970c4485,4546
< cat > conftest.$ac_ext <<EOF
< #line 1941 "configure"
< #include "confdefs.h"
< /* Override any gcc2 internal prototype to avoid an error.  */
< /* We use char because int might match the return type of a gcc2
<     builtin and then its argument prototype would still apply.  */
< char pthread_attr_init();
< 
< int main() {
< pthread_attr_init()
< ; return 0; }
< EOF
< if { (eval echo configure:1952: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
<   eval "ac_cv_lib_$ac_lib_var=yes"
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   eval "ac_cv_lib_$ac_lib_var=no"
< fi
< rm -f conftest*
< LIBS="$ac_save_LIBS"
< 
< fi
< if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
<   echo "$ac_t""yes" 1>&6
<     ac_tr_lib=HAVE_LIB`echo pthread | sed -e 's/[^a-zA-Z0-9_]/_/g' \
<     -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
<   cat >> confdefs.h <<EOF
< #define $ac_tr_lib 1
< EOF
---
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
> /* Override any GCC internal prototype to avoid an error.
>    Use char because int might match the return type of a GCC
>    builtin and then its argument prototype would still apply.  */
> #ifdef __cplusplus
> extern "C"
> #endif
> char pthread_attr_init ();
> int
> main ()
> {
> return pthread_attr_init ();
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
>   ac_cv_lib_pthread_pthread_attr_init=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_lib_pthread_pthread_attr_init=no
> fi
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
> LIBS=$ac_check_lib_save_LIBS
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_attr_init" >&5
> $as_echo "$ac_cv_lib_pthread_pthread_attr_init" >&6; }
> if test "x$ac_cv_lib_pthread_pthread_attr_init" = x""yes; then
>   cat >>confdefs.h <<_ACEOF
> #define HAVE_LIBPTHREAD 1
> _ACEOF
1974,1975d4549
< else
<   echo "$ac_t""no" 1>&6
1981,1986c4555,4560
<                
<    
< echo $ac_n "checking for library containing pthread_mutex_destroy""... $ac_c" 1>&6
< echo "configure:1985: checking for library containing pthread_mutex_destroy" >&5
< if eval "test \"`echo '$''{'ac_cv_search_pthread_mutex_destroy'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> 
> 
> { $as_echo "$as_me:$LINENO: checking for library containing pthread_mutex_destroy" >&5
> $as_echo_n "checking for library containing pthread_mutex_destroy... " >&6; }
> if test "${ac_cv_search_pthread_mutex_destroy+set}" = set; then
>   $as_echo_n "(cached) " >&6
1992,2005c4566,4608
< cat > conftest.$ac_ext <<EOF
< #line 1994 "configure"
< #include "confdefs.h"
< /* Override any gcc2 internal prototype to avoid an error.  */
< /* We use char because int might match the return type of a gcc2
<     builtin and then its argument prototype would still apply.  */
< char pthread_mutex_destroy();
< 
< int main() {
< pthread_mutex_destroy()
< ; return 0; }
< EOF
< if { (eval echo configure:2005: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
---
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
> /* Override any GCC internal prototype to avoid an error.
>    Use char because int might match the return type of a GCC
>    builtin and then its argument prototype would still apply.  */
> #ifdef __cplusplus
> extern "C"
> #endif
> char pthread_mutex_destroy ();
> int
> main ()
> {
> return pthread_mutex_destroy ();
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
2009,2010c4612,4615
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 
2012c4617,4620
< rm -f conftest*
---
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
2015,2028c4623,4665
< cat > conftest.$ac_ext <<EOF
< #line 2017 "configure"
< #include "confdefs.h"
< /* Override any gcc2 internal prototype to avoid an error.  */
< /* We use char because int might match the return type of a gcc2
<     builtin and then its argument prototype would still apply.  */
< char pthread_mutex_destroy();
< 
< int main() {
< pthread_mutex_destroy()
< ; return 0; }
< EOF
< if { (eval echo configure:2028: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
---
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
> /* Override any GCC internal prototype to avoid an error.
>    Use char because int might match the return type of a GCC
>    builtin and then its argument prototype would still apply.  */
> #ifdef __cplusplus
> extern "C"
> #endif
> char pthread_mutex_destroy ();
> int
> main ()
> {
> return pthread_mutex_destroy ();
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
2031,2032c4668,4671
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 
2034c4673,4676
< rm -f conftest*
---
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
2038,2039c4680,4681
< 
< echo "$ac_t""$ac_cv_search_pthread_mutex_destroy" 1>&6
---
> { $as_echo "$as_me:$LINENO: result: $ac_cv_search_pthread_mutex_destroy" >&5
> $as_echo "$ac_cv_search_pthread_mutex_destroy" >&6; }
2042c4684
<   
---
> 
2044c4686
<   
---
> 
2050,2054c4692,4696
<         echo $ac_n "checking for pthread_mutex_init in -lpthread""... $ac_c" 1>&6
< echo "configure:2052: checking for pthread_mutex_init in -lpthread" >&5
< ac_lib_var=`echo pthread'_'pthread_mutex_init | sed 'y%./+-%__p_%'`
< if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> 
> { $as_echo "$as_me:$LINENO: checking for pthread_mutex_init in -lpthread" >&5
> $as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; }
> if test "${ac_cv_lib_pthread_pthread_mutex_init+set}" = set; then
>   $as_echo_n "(cached) " >&6
2056c4698
<   ac_save_LIBS="$LIBS"
---
>   ac_check_lib_save_LIBS=$LIBS
2058,2089c4700,4761
< cat > conftest.$ac_ext <<EOF
< #line 2060 "configure"
< #include "confdefs.h"
< /* Override any gcc2 internal prototype to avoid an error.  */
< /* We use char because int might match the return type of a gcc2
<     builtin and then its argument prototype would still apply.  */
< char pthread_mutex_init();
< 
< int main() {
< pthread_mutex_init()
< ; return 0; }
< EOF
< if { (eval echo configure:2071: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
<   eval "ac_cv_lib_$ac_lib_var=yes"
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   eval "ac_cv_lib_$ac_lib_var=no"
< fi
< rm -f conftest*
< LIBS="$ac_save_LIBS"
< 
< fi
< if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
<   echo "$ac_t""yes" 1>&6
<     ac_tr_lib=HAVE_LIB`echo pthread | sed -e 's/[^a-zA-Z0-9_]/_/g' \
<     -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
<   cat >> confdefs.h <<EOF
< #define $ac_tr_lib 1
< EOF
---
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
> /* Override any GCC internal prototype to avoid an error.
>    Use char because int might match the return type of a GCC
>    builtin and then its argument prototype would still apply.  */
> #ifdef __cplusplus
> extern "C"
> #endif
> char pthread_mutex_init ();
> int
> main ()
> {
> return pthread_mutex_init ();
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
>   ac_cv_lib_pthread_pthread_mutex_init=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_lib_pthread_pthread_mutex_init=no
> fi
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
> LIBS=$ac_check_lib_save_LIBS
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5
> $as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; }
> if test "x$ac_cv_lib_pthread_pthread_mutex_init" = x""yes; then
>   cat >>confdefs.h <<_ACEOF
> #define HAVE_LIBPTHREAD 1
> _ACEOF
2093,2094d4764
< else
<   echo "$ac_t""no" 1>&6
2102,2109c4772,4786
<    echo $ac_n "checking for pthread_mutex_lock""... $ac_c" 1>&6
< echo "configure:2104: checking for pthread_mutex_lock" >&5
< if eval "test \"`echo '$''{'ac_cv_func_pthread_mutex_lock'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 2109 "configure"
< #include "confdefs.h"
---
>    { $as_echo "$as_me:$LINENO: checking for pthread_mutex_lock" >&5
> $as_echo_n "checking for pthread_mutex_lock... " >&6; }
> if test "${ac_cv_func_pthread_mutex_lock+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> /* Define pthread_mutex_lock to an innocuous variant, in case <limits.h> declares pthread_mutex_lock.
>    For example, HP-UX 11i <limits.h> declares gettimeofday.  */
> #define pthread_mutex_lock innocuous_pthread_mutex_lock
> 
2111,2116c4788,4796
<     which can conflict with char pthread_mutex_lock(); below.  */
< #include <assert.h>
< /* Override any gcc2 internal prototype to avoid an error.  */
< /* We use char because int might match the return type of a gcc2
<     builtin and then its argument prototype would still apply.  */
< char pthread_mutex_lock();
---
>     which can conflict with char pthread_mutex_lock (); below.
>     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
>     <limits.h> exists even on freestanding compilers.  */
> 
> #ifdef __STDC__
> # include <limits.h>
> #else
> # include <assert.h>
> #endif
2118c4798
< int main() {
---
> #undef pthread_mutex_lock
2119a4800,4806
> /* Override any GCC internal prototype to avoid an error.
>    Use char because int might match the return type of a GCC
>    builtin and then its argument prototype would still apply.  */
> #ifdef __cplusplus
> extern "C"
> #endif
> char pthread_mutex_lock ();
2123c4810
< #if defined (__stub_pthread_mutex_lock) || defined (__stub___pthread_mutex_lock)
---
> #if defined __stub_pthread_mutex_lock || defined __stub___pthread_mutex_lock
2125,2126d4811
< #else
< pthread_mutex_lock();
2129,2147c4814,4853
< ; return 0; }
< EOF
< if { (eval echo configure:2132: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
<   eval "ac_cv_func_pthread_mutex_lock=yes"
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   eval "ac_cv_func_pthread_mutex_lock=no"
< fi
< rm -f conftest*
< fi
< 
< if eval "test \"`echo '$ac_cv_func_'pthread_mutex_lock`\" = yes"; then
<   echo "$ac_t""yes" 1>&6
<   :
< else
<   echo "$ac_t""no" 1>&6
---
> int
> main ()
> {
> return pthread_mutex_lock ();
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
>   ac_cv_func_pthread_mutex_lock=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_func_pthread_mutex_lock=no
> fi
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
2148a4855,4856
> { $as_echo "$as_me:$LINENO: result: $ac_cv_func_pthread_mutex_lock" >&5
> $as_echo "$ac_cv_func_pthread_mutex_lock" >&6; }
2156c4864
<      if test "$ac_cv_prog_gcc" = no; then
---
>      if test "$ac_cv_c_compiler_gnu" = no; then
2180,2188c4888,4899
< echo $ac_n "checking for mmap""... $ac_c" 1>&6
< echo "configure:2182: checking for mmap" >&5
< if eval "test \"`echo '$''{'ac_cv_func_mmap_ok'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 2187 "configure"
< #include "confdefs.h"
<     
---
> { $as_echo "$as_me:$LINENO: checking for mmap" >&5
> $as_echo_n "checking for mmap... " >&6; }
> if test "${ac_cv_func_mmap_ok+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
2193,2194c4904,4907
<     
< int main() {
---
> 
> int
> main ()
> {
2196,2199c4909,4933
< ; return 0; }
< EOF
< if { (eval echo configure:2199: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
---
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
2202,2205c4936,4939
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   ac_cv_func_mmap_ok=no
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_func_mmap_ok=no
2207c4941,4944
< rm -f conftest* 
---
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
2210c4947,4948
< echo "$ac_t""$ac_cv_func_mmap_ok" 1>&6
---
> { $as_echo "$as_me:$LINENO: result: $ac_cv_func_mmap_ok" >&5
> $as_echo "$ac_cv_func_mmap_ok" >&6; }
2227,2228c4965,4971
< echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
< echo "configure:2229: checking how to run the C preprocessor" >&5
---
> ac_ext=c
> ac_cpp='$CPP $CPPFLAGS'
> ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
> ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
> ac_compiler_gnu=$ac_cv_c_compiler_gnu
> { $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
> $as_echo_n "checking how to run the C preprocessor... " >&6; }
2234,2235c4977,5084
< if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
>   if test "${ac_cv_prog_CPP+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>       # Double quotes because CPP needs to be expanded
>     for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
>     do
>       ac_preproc_ok=false
> for ac_c_preproc_warn_flag in '' yes
> do
>   # Use a header file that comes with gcc, so configuring glibc
>   # with a fresh cross-compiler works.
>   # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
>   # <limits.h> exists even on freestanding compilers.
>   # On the NeXT, cc -E runs the code through the compiler's parser,
>   # not just through cpp. "Syntax error" is here to catch this case.
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #ifdef __STDC__
> # include <limits.h>
> #else
> # include <assert.h>
> #endif
> 		     Syntax error
> _ACEOF
> if { (ac_try="$ac_cpp conftest.$ac_ext"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } >/dev/null && {
> 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        }; then
>   :
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' 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 nonexistent headers
>   # can be detected and how.
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #include <ac_nonexistent.h>
> _ACEOF
> if { (ac_try="$ac_cpp conftest.$ac_ext"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } >/dev/null && {
> 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        }; then
>   # Broken: success on invalid input.
> continue
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' 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
2237,2239c5086,5096
<     # This must be in double quotes, not single quotes, because CPP may get
<   # substituted into the Makefile and "${CC-cc}" will confuse make.
<   CPP="${CC-cc} -E"
---
>   ac_cv_prog_CPP=$CPP
> fi
> { $as_echo "$as_me:$LINENO: result: $CPP" >&5
> $as_echo "$CPP" >&6; }
> ac_preproc_ok=false
> for ac_c_preproc_warn_flag in '' yes
> do
>   # Use a header file that comes with gcc, so configuring glibc
>   # with a fresh cross-compiler works.
>   # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
>   # <limits.h> exists even on freestanding compilers.
2241,2251c5098,5128
<   # not just through cpp.
<   cat > conftest.$ac_ext <<EOF
< #line 2244 "configure"
< #include "confdefs.h"
< #include <assert.h>
< Syntax Error
< EOF
< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
< { (eval echo configure:2250: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
< if test -z "$ac_err"; then
---
>   # not just through cpp. "Syntax error" is here to catch this case.
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #ifdef __STDC__
> # include <limits.h>
> #else
> # include <assert.h>
> #endif
> 		     Syntax error
> _ACEOF
> if { (ac_try="$ac_cpp conftest.$ac_ext"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } >/dev/null && {
> 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        }; then
2254,2268c5131,5183
<   echo "$ac_err" >&5
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   CPP="${CC-cc} -E -traditional-cpp"
<   cat > conftest.$ac_ext <<EOF
< #line 2261 "configure"
< #include "confdefs.h"
< #include <assert.h>
< Syntax Error
< EOF
< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
< { (eval echo configure:2267: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
< if test -z "$ac_err"; then
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' 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 nonexistent headers
>   # can be detected and how.
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #include <ac_nonexistent.h>
> _ACEOF
> if { (ac_try="$ac_cpp conftest.$ac_ext"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } >/dev/null && {
> 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        }; then
>   # Broken: success on invalid input.
> continue
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' 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
2271,2285c5186,5400
<   echo "$ac_err" >&5
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   CPP="${CC-cc} -nologo -E"
<   cat > conftest.$ac_ext <<EOF
< #line 2278 "configure"
< #include "confdefs.h"
< #include <assert.h>
< Syntax Error
< EOF
< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
< { (eval echo configure:2284: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
< if test -z "$ac_err"; then
---
>   { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
> { { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
> See \`config.log' for more details." >&5
> $as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
> See \`config.log' for more details." >&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
> 
> 
> { $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
> $as_echo_n "checking for grep that handles long lines and -e... " >&6; }
> if test "${ac_cv_path_GREP+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   if test -z "$GREP"; then
>   ac_path_GREP_found=false
>   # Loop through the user's path and test for each of PROGNAME-LIST
>   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_prog in grep ggrep; do
>     for ac_exec_ext in '' $ac_executable_extensions; do
>       ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
>       { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
> # Check for GNU ac_path_GREP and select it if it is found.
>   # Check for GNU $ac_path_GREP
> case `"$ac_path_GREP" --version 2>&1` in
> *GNU*)
>   ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
> *)
>   ac_count=0
>   $as_echo_n 0123456789 >"conftest.in"
>   while :
>   do
>     cat "conftest.in" "conftest.in" >"conftest.tmp"
>     mv "conftest.tmp" "conftest.in"
>     cp "conftest.in" "conftest.nl"
>     $as_echo 'GREP' >> "conftest.nl"
>     "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
>     diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
>     ac_count=`expr $ac_count + 1`
>     if test $ac_count -gt ${ac_path_GREP_max-0}; then
>       # Best one so far, save it but keep looking for a better one
>       ac_cv_path_GREP="$ac_path_GREP"
>       ac_path_GREP_max=$ac_count
>     fi
>     # 10*(2^10) chars as input seems more than enough
>     test $ac_count -gt 10 && break
>   done
>   rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
> esac
> 
>       $ac_path_GREP_found && break 3
>     done
>   done
> done
> IFS=$as_save_IFS
>   if test -z "$ac_cv_path_GREP"; then
>     { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
> $as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
>    { (exit 1); exit 1; }; }
>   fi
> else
>   ac_cv_path_GREP=$GREP
> fi
> 
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
> $as_echo "$ac_cv_path_GREP" >&6; }
>  GREP="$ac_cv_path_GREP"
> 
> 
> { $as_echo "$as_me:$LINENO: checking for egrep" >&5
> $as_echo_n "checking for egrep... " >&6; }
> if test "${ac_cv_path_EGREP+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
>    then ac_cv_path_EGREP="$GREP -E"
>    else
>      if test -z "$EGREP"; then
>   ac_path_EGREP_found=false
>   # Loop through the user's path and test for each of PROGNAME-LIST
>   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
> do
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   for ac_prog in egrep; do
>     for ac_exec_ext in '' $ac_executable_extensions; do
>       ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
>       { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
> # Check for GNU ac_path_EGREP and select it if it is found.
>   # Check for GNU $ac_path_EGREP
> case `"$ac_path_EGREP" --version 2>&1` in
> *GNU*)
>   ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
> *)
>   ac_count=0
>   $as_echo_n 0123456789 >"conftest.in"
>   while :
>   do
>     cat "conftest.in" "conftest.in" >"conftest.tmp"
>     mv "conftest.tmp" "conftest.in"
>     cp "conftest.in" "conftest.nl"
>     $as_echo 'EGREP' >> "conftest.nl"
>     "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
>     diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
>     ac_count=`expr $ac_count + 1`
>     if test $ac_count -gt ${ac_path_EGREP_max-0}; then
>       # Best one so far, save it but keep looking for a better one
>       ac_cv_path_EGREP="$ac_path_EGREP"
>       ac_path_EGREP_max=$ac_count
>     fi
>     # 10*(2^10) chars as input seems more than enough
>     test $ac_count -gt 10 && break
>   done
>   rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
> esac
> 
>       $ac_path_EGREP_found && break 3
>     done
>   done
> done
> IFS=$as_save_IFS
>   if test -z "$ac_cv_path_EGREP"; then
>     { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
> $as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
>    { (exit 1); exit 1; }; }
>   fi
> else
>   ac_cv_path_EGREP=$EGREP
> fi
> 
>    fi
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
> $as_echo "$ac_cv_path_EGREP" >&6; }
>  EGREP="$ac_cv_path_EGREP"
> 
> 
> { $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5
> $as_echo_n "checking for ANSI C header files... " >&6; }
> if test "${ac_cv_header_stdc+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #include <stdlib.h>
> #include <stdarg.h>
> #include <string.h>
> #include <float.h>
> 
> int
> main ()
> {
> 
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   ac_cv_header_stdc=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_header_stdc=no
> fi
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> 
> if test $ac_cv_header_stdc = yes; then
>   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #include <string.h>
> 
> _ACEOF
> if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
>   $EGREP "memchr" >/dev/null 2>&1; then
2288,2292c5403
<   echo "$ac_err" >&5
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   CPP=/lib/cpp
---
>   ac_cv_header_stdc=no
2294a5406,5424
> 
> 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
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #include <stdlib.h>
> 
> _ACEOF
> if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
>   $EGREP "free" >/dev/null 2>&1; then
>   :
> else
>   ac_cv_header_stdc=no
2296a5427,5501
> 
> 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
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #include <ctype.h>
> #include <stdlib.h>
> #if ((' ' & 0x0FF) == 0x020)
> # define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
> # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
> #else
> # define ISLOWER(c) \
> 		   (('a' <= (c) && (c) <= 'i') \
> 		     || ('j' <= (c) && (c) <= 'r') \
> 		     || ('s' <= (c) && (c) <= 'z'))
> # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
> #endif
> 
> #define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
> int
> main ()
> {
>   int i;
>   for (i = 0; i < 256; i++)
>     if (XOR (islower (i), ISLOWER (i))
> 	|| toupper (i) != TOUPPER (i))
>       return 2;
>   return 0;
> }
> _ACEOF
> rm -f conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
>   { (case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_try") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); }; }; then
>   :
> else
>   $as_echo "$as_me: program exited with status $ac_status" >&5
> $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> ( exit $ac_status )
> ac_cv_header_stdc=no
> fi
> rm -rf conftest.dSYM
> rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
> fi
> 
> 
2298,2299d5502
< rm -f conftest*
<   ac_cv_prog_CPP="$CPP"
2301,2303c5504,5511
<   CPP="$ac_cv_prog_CPP"
< else
<   ac_cv_prog_CPP="$CPP"
---
> { $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
> $as_echo "$ac_cv_header_stdc" >&6; }
> if test $ac_cv_header_stdc = yes; then
> 
> cat >>confdefs.h <<\_ACEOF
> #define STDC_HEADERS 1
> _ACEOF
> 
2305d5512
< echo "$ac_t""$CPP" 1>&6
2307c5514,5525
< for ac_hdr in inttypes.h
---
> # 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
2309,2333c5527,5581
< ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
< echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
< echo "configure:2312: checking for $ac_hdr" >&5
< if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 2317 "configure"
< #include "confdefs.h"
< #include <$ac_hdr>
< EOF
< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
< { (eval echo configure:2322: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
< if test -z "$ac_err"; then
<   rm -rf conftest*
<   eval "ac_cv_header_$ac_safe=yes"
< else
<   echo "$ac_err" >&5
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   eval "ac_cv_header_$ac_safe=no"
< fi
< rm -f conftest*
---
> as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
> { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
> $as_echo_n "checking for $ac_header... " >&6; }
> if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> 
> #include <$ac_header>
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   eval "$as_ac_Header=yes"
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	eval "$as_ac_Header=no"
> fi
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> fi
> ac_res=`eval 'as_val=${'$as_ac_Header'}
> 		 $as_echo "$as_val"'`
> 	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
> $as_echo "$ac_res" >&6; }
> as_val=`eval 'as_val=${'$as_ac_Header'}
> 		 $as_echo "$as_val"'`
>    if test "x$as_val" = x""yes; then
>   cat >>confdefs.h <<_ACEOF
> #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
> _ACEOF
> 
2335,2343c5583,5728
< if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
<   echo "$ac_t""yes" 1>&6
<     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
<   cat >> confdefs.h <<EOF
< #define $ac_tr_hdr 1
< EOF
<  
< else
<   echo "$ac_t""no" 1>&6
---
> 
> done
> 
> 
> 
> for ac_header in inttypes.h
> do
> as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
> if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
>   { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
> $as_echo_n "checking for $ac_header... " >&6; }
> if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
>   $as_echo_n "(cached) " >&6
> fi
> ac_res=`eval 'as_val=${'$as_ac_Header'}
> 		 $as_echo "$as_val"'`
> 	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
> $as_echo "$ac_res" >&6; }
> else
>   # Is the header compilable?
> { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
> $as_echo_n "checking $ac_header usability... " >&6; }
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> #include <$ac_header>
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   ac_header_compiler=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_header_compiler=no
> fi
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
> $as_echo "$ac_header_compiler" >&6; }
> 
> # Is the header present?
> { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
> $as_echo_n "checking $ac_header presence... " >&6; }
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #include <$ac_header>
> _ACEOF
> if { (ac_try="$ac_cpp conftest.$ac_ext"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } >/dev/null && {
> 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        }; then
>   ac_header_preproc=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
>   ac_header_preproc=no
> fi
> 
> rm -f conftest.err conftest.$ac_ext
> { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
> $as_echo "$ac_header_preproc" >&6; }
> 
> # So?  What about this header?
> case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
>   yes:no: )
>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
> $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
> $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
>     ac_header_preproc=yes
>     ;;
>   no:yes:* )
>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
> $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
> $as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
> $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
> $as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
> $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
> $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
> 
>     ;;
> esac
> { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
> $as_echo_n "checking for $ac_header... " >&6; }
> if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
>   $as_echo_n "(cached) " >&6
> else
>   eval "$as_ac_Header=\$ac_header_preproc"
> fi
> ac_res=`eval 'as_val=${'$as_ac_Header'}
> 		 $as_echo "$as_val"'`
> 	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
> $as_echo "$ac_res" >&6; }
> 
> fi
> as_val=`eval 'as_val=${'$as_ac_Header'}
> 		 $as_echo "$as_val"'`
>    if test "x$as_val" = x""yes; then
>   cat >>confdefs.h <<_ACEOF
> #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
> _ACEOF
> 
2344a5730
> 
2353c5739,5740
<  echo "$ac_t"""C compiler set to CCC ${CC}" " 1>&6
---
>  { $as_echo "$as_me:$LINENO: result: \"C compiler set to CCC ${CC}\" " >&5
> $as_echo "\"C compiler set to CCC ${CC}\" " >&6; }
2361c5748,5749
< # Check whether --with-iostream or --without-iostream was given.
---
> 
> # Check whether --with-iostream was given.
2363,2364c5751
<   withval="$with_iostream"
<   case "${withval}" in
---
>   withval=$with_iostream; case "${withval}" in
2369c5756,5758
< 		*) { echo "configure: error: bad value ${withval} for --with-iostream" 1>&2; exit 1; } ;;
---
> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${withval} for --with-iostream" >&5
> $as_echo "$as_me: error: bad value ${withval} for --with-iostream" >&2;}
>    { (exit 1); exit 1; }; } ;;
2379,2381c5768,5769
<     
<     ac_ext=C
< # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
---
> 
>     ac_ext=cpp
2383,2385c5771,5773
< ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
< ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
< cross_compiling=$ac_cv_prog_cxx_cross
---
> 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
2393,2397c5781,5789
<     echo $ac_n "checking iostream usability""... $ac_c" 1>&6
< echo "configure:2395: checking iostream usability" >&5
<     cat > conftest.$ac_ext <<EOF
< #line 2397 "configure"
< #include "confdefs.h"
---
>     { $as_echo "$as_me:$LINENO: checking iostream usability" >&5
> $as_echo_n "checking iostream usability... " >&6; }
> 
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
2399c5791,5793
< int main() {
---
> int
> main ()
> {
2401,2404c5795,5816
< ; return 0; }
< EOF
< if { (eval echo configure:2404: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
<   rm -rf conftest*
---
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_cxx_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
2407,2410c5819,5822
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   ac_cv_header_iostream=no
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_header_iostream=no
2412c5824,5825
< rm -f conftest*
---
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
2417c5830,5831
<     echo "$ac_t""$ac_cv_header_iostream" 1>&6
---
>     { $as_echo "$as_me:$LINENO: result: $ac_cv_header_iostream" >&5
> $as_echo "$ac_cv_header_iostream" >&6; }
2423,2424c5837,5843
<         echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6
< echo "configure:2425: checking how to run the C++ preprocessor" >&5
---
>         ac_ext=cpp
> ac_cpp='$CXXCPP $CPPFLAGS'
> ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
> ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
> ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
> { $as_echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
> $as_echo_n "checking how to run the C++ preprocessor... " >&6; }
2426,2427c5845,5846
< if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
>   if test "${ac_cv_prog_CXXCPP+set}" = set; then
>   $as_echo_n "(cached) " >&6
2429,2444c5848,5889
<   ac_ext=C
< # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
< ac_cpp='$CXXCPP $CPPFLAGS'
< ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
< ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
< cross_compiling=$ac_cv_prog_cxx_cross
<   CXXCPP="${CXX-g++} -E"
<   cat > conftest.$ac_ext <<EOF
< #line 2438 "configure"
< #include "confdefs.h"
< #include <stdlib.h>
< EOF
< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
< { (eval echo configure:2443: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
< if test -z "$ac_err"; then
---
>       # 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.
>   # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
>   # <limits.h> exists even on freestanding compilers.
>   # On the NeXT, cc -E runs the code through the compiler's parser,
>   # not just through cpp. "Syntax error" is here to catch this case.
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #ifdef __STDC__
> # include <limits.h>
> #else
> # include <assert.h>
> #endif
> 		     Syntax error
> _ACEOF
> if { (ac_try="$ac_cpp conftest.$ac_ext"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } >/dev/null && {
> 	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
> 	 test ! -s conftest.err
>        }; then
2447,2451c5892,5896
<   echo "$ac_err" >&5
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   CXXCPP=/lib/cpp
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
>   # Broken: fails on valid input.
> continue
2453,2488c5898,5936
< rm -f conftest*
<   ac_cv_prog_CXXCPP="$CXXCPP"
< ac_ext=C
< # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
< ac_cpp='$CXXCPP $CPPFLAGS'
< ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
< ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
< cross_compiling=$ac_cv_prog_cxx_cross
< fi
< fi
< CXXCPP="$ac_cv_prog_CXXCPP"
< echo "$ac_t""$CXXCPP" 1>&6
< 
< ac_safe=`echo "iostream.h" | sed 'y%./+-%__p_%'`
< echo $ac_n "checking for iostream.h""... $ac_c" 1>&6
< echo "configure:2469: checking for iostream.h" >&5
< if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 2474 "configure"
< #include "confdefs.h"
< #include <iostream.h>
< EOF
< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
< { (eval echo configure:2479: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
< if test -z "$ac_err"; then
<   rm -rf conftest*
<   eval "ac_cv_header_$ac_safe=yes"
< else
<   echo "$ac_err" >&5
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   eval "ac_cv_header_$ac_safe=no"
---
> 
> rm -f conftest.err conftest.$ac_ext
> 
>   # OK, works on sane cases.  Now check whether nonexistent headers
>   # can be detected and how.
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #include <ac_nonexistent.h>
> _ACEOF
> if { (ac_try="$ac_cpp conftest.$ac_ext"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } >/dev/null && {
> 	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
> 	 test ! -s conftest.err
>        }; then
>   # Broken: success on invalid input.
> continue
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
>   # Passes both tests.
> ac_preproc_ok=:
> break
2490c5938,6003
< rm -f conftest*
---
> 
> 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
> { $as_echo "$as_me:$LINENO: result: $CXXCPP" >&5
> $as_echo "$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.
>   # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
>   # <limits.h> exists even on freestanding compilers.
>   # On the NeXT, cc -E runs the code through the compiler's parser,
>   # not just through cpp. "Syntax error" is here to catch this case.
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #ifdef __STDC__
> # include <limits.h>
> #else
> # include <assert.h>
> #endif
> 		     Syntax error
> _ACEOF
> if { (ac_try="$ac_cpp conftest.$ac_ext"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } >/dev/null && {
> 	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
> 	 test ! -s conftest.err
>        }; then
>   :
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
>   # Broken: fails on valid input.
> continue
2492,2493c6005,6051
< if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
<   echo "$ac_t""yes" 1>&6
---
> 
> rm -f conftest.err conftest.$ac_ext
> 
>   # OK, works on sane cases.  Now check whether nonexistent headers
>   # can be detected and how.
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #include <ac_nonexistent.h>
> _ACEOF
> if { (ac_try="$ac_cpp conftest.$ac_ext"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } >/dev/null && {
> 	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
> 	 test ! -s conftest.err
>        }; then
>   # Broken: success on invalid input.
> continue
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' 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
2496c6054,6195
<   echo "$ac_t""no" 1>&6
---
>   { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
> $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
> { { $as_echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
> See \`config.log' for more details." >&5
> $as_echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
> See \`config.log' for more details." >&2;}
>    { (exit 1); exit 1; }; }; }
> fi
> 
> ac_ext=cpp
> ac_cpp='$CXXCPP $CPPFLAGS'
> ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
> ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
> ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
> 
> 
> if test "${ac_cv_header_iostream_h+set}" = set; then
>   { $as_echo "$as_me:$LINENO: checking for iostream.h" >&5
> $as_echo_n "checking for iostream.h... " >&6; }
> if test "${ac_cv_header_iostream_h+set}" = set; then
>   $as_echo_n "(cached) " >&6
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_header_iostream_h" >&5
> $as_echo "$ac_cv_header_iostream_h" >&6; }
> else
>   # Is the header compilable?
> { $as_echo "$as_me:$LINENO: checking iostream.h usability" >&5
> $as_echo_n "checking iostream.h usability... " >&6; }
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> #include <iostream.h>
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_cxx_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   ac_header_compiler=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_header_compiler=no
> fi
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
> $as_echo "$ac_header_compiler" >&6; }
> 
> # Is the header present?
> { $as_echo "$as_me:$LINENO: checking iostream.h presence" >&5
> $as_echo_n "checking iostream.h presence... " >&6; }
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #include <iostream.h>
> _ACEOF
> if { (ac_try="$ac_cpp conftest.$ac_ext"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } >/dev/null && {
> 	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
> 	 test ! -s conftest.err
>        }; then
>   ac_header_preproc=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
>   ac_header_preproc=no
> fi
> 
> rm -f conftest.err conftest.$ac_ext
> { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
> $as_echo "$ac_header_preproc" >&6; }
> 
> # So?  What about this header?
> case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
>   yes:no: )
>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h: accepted by the compiler, rejected by the preprocessor!" >&5
> $as_echo "$as_me: WARNING: iostream.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h: proceeding with the compiler's result" >&5
> $as_echo "$as_me: WARNING: iostream.h: proceeding with the compiler's result" >&2;}
>     ac_header_preproc=yes
>     ;;
>   no:yes:* )
>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h: present but cannot be compiled" >&5
> $as_echo "$as_me: WARNING: iostream.h: present but cannot be compiled" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h:     check for missing prerequisite headers?" >&5
> $as_echo "$as_me: WARNING: iostream.h:     check for missing prerequisite headers?" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h: see the Autoconf documentation" >&5
> $as_echo "$as_me: WARNING: iostream.h: see the Autoconf documentation" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h:     section \"Present But Cannot Be Compiled\"" >&5
> $as_echo "$as_me: WARNING: iostream.h:     section \"Present But Cannot Be Compiled\"" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h: proceeding with the preprocessor's result" >&5
> $as_echo "$as_me: WARNING: iostream.h: proceeding with the preprocessor's result" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: iostream.h: in the future, the compiler will take precedence" >&5
> $as_echo "$as_me: WARNING: iostream.h: in the future, the compiler will take precedence" >&2;}
> 
>     ;;
> esac
> { $as_echo "$as_me:$LINENO: checking for iostream.h" >&5
> $as_echo_n "checking for iostream.h... " >&6; }
> if test "${ac_cv_header_iostream_h+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   ac_cv_header_iostream_h=$ac_header_preproc
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_header_iostream_h" >&5
> $as_echo "$ac_cv_header_iostream_h" >&6; }
> 
2498a6198
> 
2500,2507c6200,6210
<             echo $ac_n "checking whether ostream is really defined""... $ac_c" 1>&6
< echo "configure:2502: checking whether ostream is really defined" >&5
<             if eval "test \"`echo '$''{'ac_cv_iostream_ok'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 2507 "configure"
< #include "confdefs.h"
---
>             { $as_echo "$as_me:$LINENO: checking whether ostream is really defined" >&5
> $as_echo_n "checking whether ostream is really defined... " >&6; }
>             if test "${ac_cv_iostream_ok+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
2509c6212,6214
< int main() {
---
> int
> main ()
> {
2511,2514c6216,6240
< ; return 0; }
< EOF
< if { (eval echo configure:2514: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
---
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_cxx_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
2517,2520c6243,6246
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   ac_cv_iostream_ok=no
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_iostream_ok=no
2522c6248,6251
< rm -f conftest*
---
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
2525c6254,6255
<             echo "$ac_t""$ac_cv_iostream_ok" 1>&6
---
>             { $as_echo "$as_me:$LINENO: result: $ac_cv_iostream_ok" >&5
> $as_echo "$ac_cv_iostream_ok" >&6; }
2545c6275,6277
<             { echo "configure: error: ${withval} iostream is not available" 1>&2; exit 1; }
---
>             { { $as_echo "$as_me:$LINENO: error: ${withval} iostream is not available" >&5
> $as_echo "$as_me: error: ${withval} iostream is not available" >&2;}
>    { (exit 1); exit 1; }; }
2551d6282
< # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
2553,2555c6284,6287
< ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
< ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
< cross_compiling=$ac_cv_prog_cc_cross
---
> 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
> 
2558,2561c6290,6293
< echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
< echo "configure:2560: checking whether byte ordering is bigendian" >&5
< if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
>  { $as_echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
> $as_echo_n "checking whether byte ordering is bigendian... " >&6; }
> if test "${ac_cv_c_bigendian+set}" = set; then
>   $as_echo_n "(cached) " >&6
2564,2567c6296,6349
< # See if sys/param.h defines the BYTE_ORDER macro.
< cat > conftest.$ac_ext <<EOF
< #line 2567 "configure"
< #include "confdefs.h"
---
>     # See if we're dealing with a universal compiler.
>     cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #ifndef __APPLE_CC__
> 	       not a universal capable compiler
> 	     #endif
> 	     typedef int dummy;
> 
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
> 
> 	# Check for potential -arch flags.  It is not universal unless
> 	# there are some -arch flags.  Note that *ppc* also matches
> 	# ppc64.  This check is also rather less than ideal.
> 	case "${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}" in  #(
> 	  *-arch*ppc*|*-arch*i386*|*-arch*x86_64*) ac_cv_c_bigendian=universal;;
> 	esac
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 
> fi
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
>     if test $ac_cv_c_bigendian = unknown; then
>       # See if sys/param.h defines the BYTE_ORDER macro.
>       cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
2569,2570c6351
< #include <sys/param.h>
< int main() {
---
> 	     #include <sys/param.h>
2572,2578c6353,6383
< #if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
<  bogus endian macros
< #endif
< ; return 0; }
< EOF
< if { (eval echo configure:2578: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
<   rm -rf conftest*
---
> int
> main ()
> {
> #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
> 		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
> 		     && LITTLE_ENDIAN)
> 	      bogus endian macros
> 	     #endif
> 
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
2580,2582c6385,6390
< cat > conftest.$ac_ext <<EOF
< #line 2582 "configure"
< #include "confdefs.h"
---
> 	 cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
2584,2585c6392
< #include <sys/param.h>
< int main() {
---
> 		#include <sys/param.h>
2586a6394,6396
> int
> main ()
> {
2588,2593c6398,6422
<  not big endian
< #endif
< ; return 0; }
< EOF
< if { (eval echo configure:2593: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
<   rm -rf conftest*
---
> 		 not big endian
> 		#endif
> 
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
2596,2599c6425,6428
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   ac_cv_c_bigendian=no
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_c_bigendian=no
2601c6430,6431
< rm -f conftest*
---
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
2603,2604c6433,6436
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 
2606,2622c6438,6459
< rm -f conftest*
< if test $ac_cv_c_bigendian = unknown; then
< if test "$cross_compiling" = yes; then
<     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
< else
<   cat > conftest.$ac_ext <<EOF
< #line 2613 "configure"
< #include "confdefs.h"
< main () {
<   /* Are we little or big endian?  From Harbison&Steele.  */
<   union
<   {
<     long l;
<     char c[sizeof (long)];
<   } u;
<   u.l = 1;
<   exit (u.c[sizeof (long) - 1] == 1);
---
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
>     fi
>     if test $ac_cv_c_bigendian = unknown; then
>       # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
>       cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #include <limits.h>
> 
> int
> main ()
> {
> #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
> 	      bogus endian macros
> 	     #endif
> 
>   ;
>   return 0;
2624,2631c6461,6517
< EOF
< if { (eval echo configure:2626: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
< then
<   ac_cv_c_bigendian=no
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -fr conftest*
---
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   # It does; now see whether it defined to _BIG_ENDIAN or not.
> 	 cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #include <limits.h>
> 
> int
> main ()
> {
> #ifndef _BIG_ENDIAN
> 		 not big endian
> 		#endif
> 
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
2632a6519,6531
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_c_bigendian=no
> fi
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 
2634c6533,6603
< rm -fr conftest*
---
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
>     fi
>     if test $ac_cv_c_bigendian = unknown; then
>       # Compile a test program.
>       if test "$cross_compiling" = yes; then
>   # Try to guess by grepping values from an object file.
> 	 cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> short int ascii_mm[] =
> 		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
> 		short int ascii_ii[] =
> 		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
> 		int use_ascii (int i) {
> 		  return ascii_mm[i] + ascii_ii[i];
> 		}
> 		short int ebcdic_ii[] =
> 		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
> 		short int ebcdic_mm[] =
> 		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
> 		int use_ebcdic (int i) {
> 		  return ebcdic_mm[i] + ebcdic_ii[i];
> 		}
> 		extern int foo;
> 
> int
> main ()
> {
> return use_ascii (foo) == use_ebcdic (foo);
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
> 	      ac_cv_c_bigendian=yes
> 	    fi
> 	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
> 	      if test "$ac_cv_c_bigendian" = unknown; then
> 		ac_cv_c_bigendian=no
> 	      else
> 		# finding both strings is unlikely to happen, but who knows?
> 		ac_cv_c_bigendian=unknown
> 	      fi
> 	    fi
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 
2636a6606,6661
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> 
> 	     /* Are we little or big endian?  From Harbison&Steele.  */
> 	     union
> 	     {
> 	       long int l;
> 	       char c[sizeof (long int)];
> 	     } u;
> 	     u.l = 1;
> 	     return u.c[sizeof (long int) - 1] == 1;
> 
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
>   { (case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_try") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); }; }; then
>   ac_cv_c_bigendian=no
> else
>   $as_echo "$as_me: program exited with status $ac_status" >&5
> $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> ( exit $ac_status )
> ac_cv_c_bigendian=yes
2637a6663,6664
> rm -rf conftest.dSYM
> rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
2640,2644d6666
< echo "$ac_t""$ac_cv_c_bigendian" 1>&6
< if test $ac_cv_c_bigendian = yes; then
<   cat >> confdefs.h <<\EOF
< #define WORDS_BIGENDIAN 1
< EOF
2645a6668
>     fi
2646a6670,6693
> { $as_echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5
> $as_echo "$ac_cv_c_bigendian" >&6; }
>  case $ac_cv_c_bigendian in #(
>    yes)
>      cat >>confdefs.h <<\_ACEOF
> #define WORDS_BIGENDIAN 1
> _ACEOF
> ;; #(
>    no)
>       ;; #(
>    universal)
> 
> cat >>confdefs.h <<\_ACEOF
> #define AC_APPLE_UNIVERSAL_BUILD 1
> _ACEOF
> 
>      ;; #(
>    *)
>      { { $as_echo "$as_me:$LINENO: error: unknown endianness
>  presetting ac_cv_c_bigendian=no (or yes) will help" >&5
> $as_echo "$as_me: error: unknown endianness
>  presetting ac_cv_c_bigendian=no (or yes) will help" >&2;}
>    { (exit 1); exit 1; }; } ;;
>  esac
2659,2666c6706,6720
< echo $ac_n "checking for nl_langinfo""... $ac_c" 1>&6
< echo "configure:2661: checking for nl_langinfo" >&5
< if eval "test \"`echo '$''{'ac_cv_func_nl_langinfo'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 2666 "configure"
< #include "confdefs.h"
---
> { $as_echo "$as_me:$LINENO: checking for nl_langinfo" >&5
> $as_echo_n "checking for nl_langinfo... " >&6; }
> if test "${ac_cv_func_nl_langinfo+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> /* Define nl_langinfo to an innocuous variant, in case <limits.h> declares nl_langinfo.
>    For example, HP-UX 11i <limits.h> declares gettimeofday.  */
> #define nl_langinfo innocuous_nl_langinfo
> 
2668,2673c6722,6724
<     which can conflict with char nl_langinfo(); below.  */
< #include <assert.h>
< /* Override any gcc2 internal prototype to avoid an error.  */
< /* We use char because int might match the return type of a gcc2
<     builtin and then its argument prototype would still apply.  */
< char nl_langinfo();
---
>     which can conflict with char nl_langinfo (); below.
>     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
>     <limits.h> exists even on freestanding compilers.  */
2675c6726,6730
< int main() {
---
> #ifdef __STDC__
> # include <limits.h>
> #else
> # include <assert.h>
> #endif
2676a6732,6740
> #undef nl_langinfo
> 
> /* Override any GCC internal prototype to avoid an error.
>    Use char because int might match the return type of a GCC
>    builtin and then its argument prototype would still apply.  */
> #ifdef __cplusplus
> extern "C"
> #endif
> char nl_langinfo ();
2680c6744
< #if defined (__stub_nl_langinfo) || defined (__stub___nl_langinfo)
---
> #if defined __stub_nl_langinfo || defined __stub___nl_langinfo
2682,2683d6745
< #else
< nl_langinfo();
2686,2701c6748,6791
< ; return 0; }
< EOF
< if { (eval echo configure:2689: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
<   eval "ac_cv_func_nl_langinfo=yes"
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   eval "ac_cv_func_nl_langinfo=no"
< fi
< rm -f conftest*
< fi
< 
< if eval "test \"`echo '$ac_cv_func_'nl_langinfo`\" = yes"; then
<   echo "$ac_t""yes" 1>&6
---
> int
> main ()
> {
> return nl_langinfo ();
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
>   ac_cv_func_nl_langinfo=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_func_nl_langinfo=no
> fi
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_func_nl_langinfo" >&5
> $as_echo "$ac_cv_func_nl_langinfo" >&6; }
> if test "x$ac_cv_func_nl_langinfo" = x""yes; then
2704,2705c6794
<   echo "$ac_t""no" 1>&6
< U_HAVE_NL_LANGINFO=0
---
>   U_HAVE_NL_LANGINFO=0
2710,2713c6799,6802
<   echo $ac_n "checking for nl_langinfo's argument to obtain the codeset""... $ac_c" 1>&6
< echo "configure:2712: checking for nl_langinfo's argument to obtain the codeset" >&5
< if eval "test \"`echo '$''{'ac_cv_nl_langinfo_codeset'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
>   { $as_echo "$as_me:$LINENO: checking for nl_langinfo's argument to obtain the codeset" >&5
> $as_echo_n "checking for nl_langinfo's argument to obtain the codeset... " >&6; }
> if test "${ac_cv_nl_langinfo_codeset+set}" = set; then
>   $as_echo_n "(cached) " >&6
2717,2719c6806,6811
<   cat > conftest.$ac_ext <<EOF
< #line 2719 "configure"
< #include "confdefs.h"
---
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
2721c6813,6815
< int main() {
---
> int
> main ()
> {
2723,2726c6817,6841
< ; return 0; }
< EOF
< if { (eval echo configure:2726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
---
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
2729,2730c6844,6847
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 
2732c6849,6852
< rm -f conftest*
---
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
2735,2736c6855,6856
< 
< echo "$ac_t""$ac_cv_nl_langinfo_codeset" 1>&6
---
> { $as_echo "$as_me:$LINENO: result: $ac_cv_nl_langinfo_codeset" >&5
> $as_echo "$ac_cv_nl_langinfo_codeset" >&6; }
2746,2747c6866
< ac_ext=C
< # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
---
> ac_ext=cpp
2749,2760c6868,6882
< ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
< ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
< cross_compiling=$ac_cv_prog_cxx_cross
< 
< echo $ac_n "checking for namespace support""... $ac_c" 1>&6
< echo "configure:2755: checking for namespace support" >&5
< if eval "test \"`echo '$''{'ac_cv_namespace_ok'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 2760 "configure"
< #include "confdefs.h"
---
> ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
> ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
> ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
> 
> { $as_echo "$as_me:$LINENO: checking for namespace support" >&5
> $as_echo_n "checking for namespace support... " >&6; }
> if test "${ac_cv_namespace_ok+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
2764,2765c6886,6889
<     
< int main() {
---
> 
> int
> main ()
> {
2767,2770c6891,6915
< ; return 0; }
< EOF
< if { (eval echo configure:2770: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
---
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_cxx_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
2773,2776c6918,6921
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   ac_cv_namespace_ok=no
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_namespace_ok=no
2778c6923,6926
< rm -f conftest* 
---
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
2781c6929,6930
< echo "$ac_t""$ac_cv_namespace_ok" 1>&6
---
> { $as_echo "$as_me:$LINENO: result: $ac_cv_namespace_ok" >&5
> $as_echo "$ac_cv_namespace_ok" >&6; }
2789,2790c6938,6939
< echo $ac_n "checking for properly overriding new and delete""... $ac_c" 1>&6
< echo "configure:2791: checking for properly overriding new and delete" >&5
---
> { $as_echo "$as_me:$LINENO: checking for properly overriding new and delete" >&5
> $as_echo_n "checking for properly overriding new and delete... " >&6; }
2793,2794c6942,6943
< if eval "test \"`echo '$''{'ac_cv_override_cxx_allocation_ok'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> if test "${ac_cv_override_cxx_allocation_ok+set}" = set; then
>   $as_echo_n "(cached) " >&6
2796,2798c6945,6950
<   cat > conftest.$ac_ext <<EOF
< #line 2798 "configure"
< #include "confdefs.h"
---
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
2807,2813c6959,6988
<     
< int main() {
<     
< ; return 0; }
< EOF
< if { (eval echo configure:2813: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
---
> 
> int
> main ()
> {
> 
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_cxx_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
2816,2819c6991,6994
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   ac_cv_override_cxx_allocation_ok=no
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_override_cxx_allocation_ok=no
2821c6996,6999
< rm -f conftest* 
---
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
2824c7002,7003
< echo "$ac_t""$ac_cv_override_cxx_allocation_ok" 1>&6
---
> { $as_echo "$as_me:$LINENO: result: $ac_cv_override_cxx_allocation_ok" >&5
> $as_echo "$ac_cv_override_cxx_allocation_ok" >&6; }
2828,2835c7007,7017
<     echo $ac_n "checking for placement new and delete""... $ac_c" 1>&6
< echo "configure:2830: checking for placement new and delete" >&5
<     if eval "test \"`echo '$''{'ac_cv_override_placement_new_ok'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 2835 "configure"
< #include "confdefs.h"
---
>     { $as_echo "$as_me:$LINENO: checking for placement new and delete" >&5
> $as_echo_n "checking for placement new and delete... " >&6; }
>     if test "${ac_cv_override_placement_new_ok+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
2846,2852c7028,7057
<         
< int main() {
<         
< ; return 0; }
< EOF
< if { (eval echo configure:2852: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
---
> 
> int
> main ()
> {
> 
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_cxx_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
2855,2858c7060,7063
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   ac_cv_override_placement_new_ok=no
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_override_placement_new_ok=no
2860c7065,7068
< rm -f conftest* 
---
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
2863c7071,7072
<     echo "$ac_t""$ac_cv_override_placement_new_ok" 1>&6
---
>     { $as_echo "$as_me:$LINENO: result: $ac_cv_override_placement_new_ok" >&5
> $as_echo "$ac_cv_override_placement_new_ok" >&6; }
2873d7081
< # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
2875,2886c7083,7101
< ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
< ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
< cross_compiling=$ac_cv_prog_cc_cross
< 
< echo $ac_n "checking for popen""... $ac_c" 1>&6
< echo "configure:2881: checking for popen" >&5
< if eval "test \"`echo '$''{'ac_cv_func_popen'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 2886 "configure"
< #include "confdefs.h"
---
> ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
> ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
> ac_compiler_gnu=$ac_cv_c_compiler_gnu
> 
> { $as_echo "$as_me:$LINENO: checking for popen" >&5
> $as_echo_n "checking for popen... " >&6; }
> if test "${ac_cv_func_popen+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> /* Define popen to an innocuous variant, in case <limits.h> declares popen.
>    For example, HP-UX 11i <limits.h> declares gettimeofday.  */
> #define popen innocuous_popen
> 
2888,2893c7103,7111
<     which can conflict with char popen(); below.  */
< #include <assert.h>
< /* Override any gcc2 internal prototype to avoid an error.  */
< /* We use char because int might match the return type of a gcc2
<     builtin and then its argument prototype would still apply.  */
< char popen();
---
>     which can conflict with char popen (); below.
>     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
>     <limits.h> exists even on freestanding compilers.  */
> 
> #ifdef __STDC__
> # include <limits.h>
> #else
> # include <assert.h>
> #endif
2895c7113
< int main() {
---
> #undef popen
2896a7115,7121
> /* Override any GCC internal prototype to avoid an error.
>    Use char because int might match the return type of a GCC
>    builtin and then its argument prototype would still apply.  */
> #ifdef __cplusplus
> extern "C"
> #endif
> char popen ();
2900c7125
< #if defined (__stub_popen) || defined (__stub___popen)
---
> #if defined __stub_popen || defined __stub___popen
2902,2903d7126
< #else
< popen();
2906,2924c7129,7168
< ; return 0; }
< EOF
< if { (eval echo configure:2909: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
<   eval "ac_cv_func_popen=yes"
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   eval "ac_cv_func_popen=no"
< fi
< rm -f conftest*
< fi
< 
< if eval "test \"`echo '$ac_cv_func_'popen`\" = yes"; then
<   echo "$ac_t""yes" 1>&6
<   :
< else
<   echo "$ac_t""no" 1>&6
---
> int
> main ()
> {
> return popen ();
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
>   ac_cv_func_popen=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_func_popen=no
> fi
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
2925a7170,7171
> { $as_echo "$as_me:$LINENO: result: $ac_cv_func_popen" >&5
> $as_echo "$ac_cv_func_popen" >&6; }
2935,2942c7181,7195
< echo $ac_n "checking for tzset""... $ac_c" 1>&6
< echo "configure:2937: checking for tzset" >&5
< if eval "test \"`echo '$''{'ac_cv_func_tzset'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 2942 "configure"
< #include "confdefs.h"
---
> { $as_echo "$as_me:$LINENO: checking for tzset" >&5
> $as_echo_n "checking for tzset... " >&6; }
> if test "${ac_cv_func_tzset+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> /* Define tzset to an innocuous variant, in case <limits.h> declares tzset.
>    For example, HP-UX 11i <limits.h> declares gettimeofday.  */
> #define tzset innocuous_tzset
> 
2944,2949c7197,7199
<     which can conflict with char tzset(); below.  */
< #include <assert.h>
< /* Override any gcc2 internal prototype to avoid an error.  */
< /* We use char because int might match the return type of a gcc2
<     builtin and then its argument prototype would still apply.  */
< char tzset();
---
>     which can conflict with char tzset (); below.
>     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
>     <limits.h> exists even on freestanding compilers.  */
2951c7201,7205
< int main() {
---
> #ifdef __STDC__
> # include <limits.h>
> #else
> # include <assert.h>
> #endif
2952a7207,7215
> #undef tzset
> 
> /* Override any GCC internal prototype to avoid an error.
>    Use char because int might match the return type of a GCC
>    builtin and then its argument prototype would still apply.  */
> #ifdef __cplusplus
> extern "C"
> #endif
> char tzset ();
2956c7219
< #if defined (__stub_tzset) || defined (__stub___tzset)
---
> #if defined __stub_tzset || defined __stub___tzset
2958,2959d7220
< #else
< tzset();
2962,2980c7223,7262
< ; return 0; }
< EOF
< if { (eval echo configure:2965: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
<   eval "ac_cv_func_tzset=yes"
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   eval "ac_cv_func_tzset=no"
< fi
< rm -f conftest*
< fi
< 
< if eval "test \"`echo '$ac_cv_func_'tzset`\" = yes"; then
<   echo "$ac_t""yes" 1>&6
<   :
< else
<   echo "$ac_t""no" 1>&6
---
> int
> main ()
> {
> return tzset ();
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
>   ac_cv_func_tzset=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_func_tzset=no
> fi
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
2981a7264,7265
> { $as_echo "$as_me:$LINENO: result: $ac_cv_func_tzset" >&5
> $as_echo "$ac_cv_func_tzset" >&6; }
2989,2996c7273,7287
<     echo $ac_n "checking for _tzset""... $ac_c" 1>&6
< echo "configure:2991: checking for _tzset" >&5
< if eval "test \"`echo '$''{'ac_cv_func__tzset'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 2996 "configure"
< #include "confdefs.h"
---
>     { $as_echo "$as_me:$LINENO: checking for _tzset" >&5
> $as_echo_n "checking for _tzset... " >&6; }
> if test "${ac_cv_func__tzset+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> /* Define _tzset to an innocuous variant, in case <limits.h> declares _tzset.
>    For example, HP-UX 11i <limits.h> declares gettimeofday.  */
> #define _tzset innocuous__tzset
> 
2998,3003c7289,7297
<     which can conflict with char _tzset(); below.  */
< #include <assert.h>
< /* Override any gcc2 internal prototype to avoid an error.  */
< /* We use char because int might match the return type of a gcc2
<     builtin and then its argument prototype would still apply.  */
< char _tzset();
---
>     which can conflict with char _tzset (); below.
>     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
>     <limits.h> exists even on freestanding compilers.  */
> 
> #ifdef __STDC__
> # include <limits.h>
> #else
> # include <assert.h>
> #endif
3005c7299
< int main() {
---
> #undef _tzset
3006a7301,7307
> /* Override any GCC internal prototype to avoid an error.
>    Use char because int might match the return type of a GCC
>    builtin and then its argument prototype would still apply.  */
> #ifdef __cplusplus
> extern "C"
> #endif
> char _tzset ();
3010c7311
< #if defined (__stub__tzset) || defined (__stub____tzset)
---
> #if defined __stub__tzset || defined __stub____tzset
3012,3013d7312
< #else
< _tzset();
3016,3034c7315,7354
< ; return 0; }
< EOF
< if { (eval echo configure:3019: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
<   eval "ac_cv_func__tzset=yes"
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   eval "ac_cv_func__tzset=no"
< fi
< rm -f conftest*
< fi
< 
< if eval "test \"`echo '$ac_cv_func_'_tzset`\" = yes"; then
<   echo "$ac_t""yes" 1>&6
<   :
< else
<   echo "$ac_t""no" 1>&6
---
> int
> main ()
> {
> return _tzset ();
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
>   ac_cv_func__tzset=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_func__tzset=no
> fi
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
3035a7356,7357
> { $as_echo "$as_me:$LINENO: result: $ac_cv_func__tzset" >&5
> $as_echo "$ac_cv_func__tzset" >&6; }
3047,3054c7369,7379
< echo $ac_n "checking for tzname""... $ac_c" 1>&6
< echo "configure:3049: checking for tzname" >&5
< if eval "test \"`echo '$''{'ac_cv_var_tzname'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 3054 "configure"
< #include "confdefs.h"
---
> { $as_echo "$as_me:$LINENO: checking for tzname" >&5
> $as_echo_n "checking for tzname... " >&6; }
> if test "${ac_cv_var_tzname+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
3063c7388,7390
< int main() {
---
> int
> main ()
> {
3065,3068c7392,7416
< ; return 0; }
< EOF
< if { (eval echo configure:3068: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
---
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
3071,3076c7419,7422
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   ac_cv_var_tzname=no
< fi
< rm -f conftest*
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_var_tzname=no
3079c7425,7430
< echo "$ac_t""$ac_cv_var_tzname" 1>&6
---
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_var_tzname" >&5
> $as_echo "$ac_cv_var_tzname" >&6; }
3084,3091c7435,7445
<   echo $ac_n "checking for _tzname""... $ac_c" 1>&6
< echo "configure:3086: checking for _tzname" >&5
< if eval "test \"`echo '$''{'ac_cv_var__tzname'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 3091 "configure"
< #include "confdefs.h"
---
>   { $as_echo "$as_me:$LINENO: checking for _tzname" >&5
> $as_echo_n "checking for _tzname... " >&6; }
> if test "${ac_cv_var__tzname+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
3095,3096c7449,7452
<   
< int main() {
---
> 
> int
> main ()
> {
3098,3101c7454,7478
< ; return 0; }
< EOF
< if { (eval echo configure:3101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
---
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
3104,3109c7481,7484
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   ac_cv_var__tzname=no
< fi
< rm -f conftest*
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_var__tzname=no
3112c7487,7492
< echo "$ac_t""$ac_cv_var__tzname" 1>&6
---
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_var__tzname" >&5
> $as_echo "$ac_cv_var__tzname" >&6; }
3121,3128c7501,7511
< echo $ac_n "checking for timezone""... $ac_c" 1>&6
< echo "configure:3123: checking for timezone" >&5
< if eval "test \"`echo '$''{'ac_cv_var_timezone'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 3128 "configure"
< #include "confdefs.h"
---
> { $as_echo "$as_me:$LINENO: checking for timezone" >&5
> $as_echo_n "checking for timezone... " >&6; }
> if test "${ac_cv_var_timezone+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
3137c7520,7522
< int main() {
---
> int
> main ()
> {
3139,3142c7524,7548
< ; return 0; }
< EOF
< if { (eval echo configure:3142: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
---
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
3145,3150c7551,7554
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   ac_cv_var_timezone=no
< fi
< rm -f conftest*
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_var_timezone=no
3153c7557,7562
< echo "$ac_t""$ac_cv_var_timezone" 1>&6
---
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_var_timezone" >&5
> $as_echo "$ac_cv_var_timezone" >&6; }
3159,3166c7568,7578
<   echo $ac_n "checking for __timezone""... $ac_c" 1>&6
< echo "configure:3161: checking for __timezone" >&5
< if eval "test \"`echo '$''{'ac_cv_var___timezone'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 3166 "configure"
< #include "confdefs.h"
---
>   { $as_echo "$as_me:$LINENO: checking for __timezone" >&5
> $as_echo_n "checking for __timezone... " >&6; }
> if test "${ac_cv_var___timezone+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
3168,3169c7580,7583
<   
< int main() {
---
> 
> int
> main ()
> {
3171,3174c7585,7609
< ; return 0; }
< EOF
< if { (eval echo configure:3174: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
---
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
3177,3182c7612,7615
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   ac_cv_var___timezone=no
< fi
< rm -f conftest*
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_var___timezone=no
3185c7618,7623
< echo "$ac_t""$ac_cv_var___timezone" 1>&6
---
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_var___timezone" >&5
> $as_echo "$ac_cv_var___timezone" >&6; }
3190,3197c7628,7638
<     echo $ac_n "checking for _timezone""... $ac_c" 1>&6
< echo "configure:3192: checking for _timezone" >&5
< if eval "test \"`echo '$''{'ac_cv_var__timezone'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 3197 "configure"
< #include "confdefs.h"
---
>     { $as_echo "$as_me:$LINENO: checking for _timezone" >&5
> $as_echo_n "checking for _timezone... " >&6; }
> if test "${ac_cv_var__timezone+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
3199,3200c7640,7643
<     
< int main() {
---
> 
> int
> main ()
> {
3202,3205c7645,7669
< ; return 0; }
< EOF
< if { (eval echo configure:3205: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
---
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
3208,3213c7672,7675
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   ac_cv_var__timezone=no
< fi
< rm -f conftest*
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_var__timezone=no
3216c7678,7683
< echo "$ac_t""$ac_cv_var__timezone" 1>&6
---
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext conftest.$ac_ext
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_var__timezone" >&5
> $as_echo "$ac_cv_var__timezone" >&6; }
3226,3244c7693,7696
< echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
< echo "configure:3228: checking for ANSI C header files" >&5
< if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 3233 "configure"
< #include "confdefs.h"
< #include <stdlib.h>
< #include <stdarg.h>
< #include <string.h>
< #include <float.h>
< EOF
< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
< { (eval echo configure:3241: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
< if test -z "$ac_err"; then
<   rm -rf conftest*
<   ac_cv_header_stdc=yes
---
> { $as_echo "$as_me:$LINENO: checking for int8_t" >&5
> $as_echo_n "checking for int8_t... " >&6; }
> if test "${ac_cv_type_int8_t+set}" = set; then
>   $as_echo_n "(cached) " >&6
3246,3262c7698,7766
<   echo "$ac_err" >&5
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   ac_cv_header_stdc=no
< fi
< rm -f conftest*
< 
< if test $ac_cv_header_stdc = yes; then
<   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
< cat > conftest.$ac_ext <<EOF
< #line 3258 "configure"
< #include "confdefs.h"
< #include <string.h>
< EOF
< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
<   egrep "memchr" >/dev/null 2>&1; then
---
>   ac_cv_type_int8_t=no
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof (int8_t))
>        return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof ((int8_t)))
> 	  return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
3265,3268c7769,7770
<   rm -rf conftest*
<   ac_cv_header_stdc=no
< fi
< rm -f conftest*
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
3269a7772
> 	ac_cv_type_int8_t=yes
3272,3281c7775
< 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 <<EOF
< #line 3276 "configure"
< #include "confdefs.h"
< #include <stdlib.h>
< EOF
< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
<   egrep "free" >/dev/null 2>&1; then
<   :
---
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
3283,3286c7777,7779
<   rm -rf conftest*
<   ac_cv_header_stdc=no
< fi
< rm -f conftest*
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
3290,3292c7783,7787
< 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
---
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_int8_t" >&5
> $as_echo "$ac_cv_type_int8_t" >&6; }
> if test "x$ac_cv_type_int8_t" = x""yes; then
3295,3304d7789
<   cat > conftest.$ac_ext <<EOF
< #line 3297 "configure"
< #include "confdefs.h"
< #include <ctype.h>
< #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
< #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
< #define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
< int main () { int i; for (i = 0; i < 256; i++)
< if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
< exit (0); }
3306,3317c7791,7793
< EOF
< if { (eval echo configure:3308: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
< then
<   :
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -fr conftest*
<   ac_cv_header_stdc=no
< fi
< rm -fr conftest*
< fi
---
> cat >>confdefs.h <<_ACEOF
> #define int8_t signed char
> _ACEOF
3320d7795
< fi
3322,3326c7797,7874
< echo "$ac_t""$ac_cv_header_stdc" 1>&6
< if test $ac_cv_header_stdc = yes; then
<   cat >> confdefs.h <<\EOF
< #define STDC_HEADERS 1
< EOF
---
> { $as_echo "$as_me:$LINENO: checking for uint8_t" >&5
> $as_echo_n "checking for uint8_t... " >&6; }
> if test "${ac_cv_type_uint8_t+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   ac_cv_type_uint8_t=no
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof (uint8_t))
>        return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof ((uint8_t)))
> 	  return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   :
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
3327a7876
> 	ac_cv_type_uint8_t=yes
3330,3333c7879
< echo $ac_n "checking for int8_t""... $ac_c" 1>&6
< echo "configure:3332: checking for int8_t" >&5
< if eval "test \"`echo '$''{'ac_cv_type_int8_t'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
3335,3352c7881,7882
<   cat > conftest.$ac_ext <<EOF
< #line 3337 "configure"
< #include "confdefs.h"
< #include <sys/types.h>
< #if STDC_HEADERS
< #include <stdlib.h>
< #include <stddef.h>
< #endif
< EOF
< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
<   egrep "(^|[^a-zA-Z_0-9])int8_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
<   rm -rf conftest*
<   ac_cv_type_int8_t=yes
< else
<   rm -rf conftest*
<   ac_cv_type_int8_t=no
< fi
< rm -f conftest*
---
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
3354,3359d7883
< fi
< echo "$ac_t""$ac_cv_type_int8_t" 1>&6
< if test $ac_cv_type_int8_t = no; then
<   cat >> confdefs.h <<\EOF
< #define int8_t signed char
< EOF
3363,3383c7887
< echo $ac_n "checking for uint8_t""... $ac_c" 1>&6
< echo "configure:3365: checking for uint8_t" >&5
< if eval "test \"`echo '$''{'ac_cv_type_uint8_t'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 3370 "configure"
< #include "confdefs.h"
< #include <sys/types.h>
< #if STDC_HEADERS
< #include <stdlib.h>
< #include <stddef.h>
< #endif
< EOF
< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
<   egrep "(^|[^a-zA-Z_0-9])uint8_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
<   rm -rf conftest*
<   ac_cv_type_uint8_t=yes
< else
<   rm -rf conftest*
<   ac_cv_type_uint8_t=no
---
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
3385c7889,7893
< rm -f conftest*
---
> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint8_t" >&5
> $as_echo "$ac_cv_type_uint8_t" >&6; }
> if test "x$ac_cv_type_uint8_t" = x""yes; then
>   :
> else
3387,3390c7895
< fi
< echo "$ac_t""$ac_cv_type_uint8_t" 1>&6
< if test $ac_cv_type_uint8_t = no; then
<   cat >> confdefs.h <<\EOF
---
> cat >>confdefs.h <<_ACEOF
3392c7897
< EOF
---
> _ACEOF
3396,3413c7901,7904
< echo $ac_n "checking for int16_t""... $ac_c" 1>&6
< echo "configure:3398: checking for int16_t" >&5
< if eval "test \"`echo '$''{'ac_cv_type_int16_t'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 3403 "configure"
< #include "confdefs.h"
< #include <sys/types.h>
< #if STDC_HEADERS
< #include <stdlib.h>
< #include <stddef.h>
< #endif
< EOF
< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
<   egrep "(^|[^a-zA-Z_0-9])int16_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
<   rm -rf conftest*
<   ac_cv_type_int16_t=yes
---
> { $as_echo "$as_me:$LINENO: checking for int16_t" >&5
> $as_echo_n "checking for int16_t... " >&6; }
> if test "${ac_cv_type_int16_t+set}" = set; then
>   $as_echo_n "(cached) " >&6
3415d7905
<   rm -rf conftest*
3416a7907,7980
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof (int16_t))
>        return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof ((int16_t)))
> 	  return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   :
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_type_int16_t=yes
3418c7982,7987
< rm -f conftest*
---
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
3421,3423c7990,7999
< echo "$ac_t""$ac_cv_type_int16_t" 1>&6
< if test $ac_cv_type_int16_t = no; then
<   cat >> confdefs.h <<\EOF
---
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_int16_t" >&5
> $as_echo "$ac_cv_type_int16_t" >&6; }
> if test "x$ac_cv_type_int16_t" = x""yes; then
>   :
> else
> 
> cat >>confdefs.h <<_ACEOF
3425c8001
< EOF
---
> _ACEOF
3429,3446c8005,8008
< echo $ac_n "checking for uint16_t""... $ac_c" 1>&6
< echo "configure:3431: checking for uint16_t" >&5
< if eval "test \"`echo '$''{'ac_cv_type_uint16_t'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 3436 "configure"
< #include "confdefs.h"
< #include <sys/types.h>
< #if STDC_HEADERS
< #include <stdlib.h>
< #include <stddef.h>
< #endif
< EOF
< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
<   egrep "(^|[^a-zA-Z_0-9])uint16_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
<   rm -rf conftest*
<   ac_cv_type_uint16_t=yes
---
> { $as_echo "$as_me:$LINENO: checking for uint16_t" >&5
> $as_echo_n "checking for uint16_t... " >&6; }
> if test "${ac_cv_type_uint16_t+set}" = set; then
>   $as_echo_n "(cached) " >&6
3448d8009
<   rm -rf conftest*
3449a8011,8084
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof (uint16_t))
>        return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof ((uint16_t)))
> 	  return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   :
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_type_uint16_t=yes
3451c8086,8091
< rm -f conftest*
---
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
3454,3456c8094,8103
< echo "$ac_t""$ac_cv_type_uint16_t" 1>&6
< if test $ac_cv_type_uint16_t = no; then
<   cat >> confdefs.h <<\EOF
---
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint16_t" >&5
> $as_echo "$ac_cv_type_uint16_t" >&6; }
> if test "x$ac_cv_type_uint16_t" = x""yes; then
>   :
> else
> 
> cat >>confdefs.h <<_ACEOF
3458c8105
< EOF
---
> _ACEOF
3462,3479c8109,8112
< echo $ac_n "checking for int32_t""... $ac_c" 1>&6
< echo "configure:3464: checking for int32_t" >&5
< if eval "test \"`echo '$''{'ac_cv_type_int32_t'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 3469 "configure"
< #include "confdefs.h"
< #include <sys/types.h>
< #if STDC_HEADERS
< #include <stdlib.h>
< #include <stddef.h>
< #endif
< EOF
< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
<   egrep "(^|[^a-zA-Z_0-9])int32_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
<   rm -rf conftest*
<   ac_cv_type_int32_t=yes
---
> { $as_echo "$as_me:$LINENO: checking for int32_t" >&5
> $as_echo_n "checking for int32_t... " >&6; }
> if test "${ac_cv_type_int32_t+set}" = set; then
>   $as_echo_n "(cached) " >&6
3481d8113
<   rm -rf conftest*
3482a8115,8188
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof (int32_t))
>        return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof ((int32_t)))
> 	  return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   :
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_type_int32_t=yes
3484c8190,8195
< rm -f conftest*
---
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
3487,3489c8198,8207
< echo "$ac_t""$ac_cv_type_int32_t" 1>&6
< if test $ac_cv_type_int32_t = no; then
<   cat >> confdefs.h <<\EOF
---
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_int32_t" >&5
> $as_echo "$ac_cv_type_int32_t" >&6; }
> if test "x$ac_cv_type_int32_t" = x""yes; then
>   :
> else
> 
> cat >>confdefs.h <<_ACEOF
3491c8209
< EOF
---
> _ACEOF
3495,3512c8213,8216
< echo $ac_n "checking for uint32_t""... $ac_c" 1>&6
< echo "configure:3497: checking for uint32_t" >&5
< if eval "test \"`echo '$''{'ac_cv_type_uint32_t'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 3502 "configure"
< #include "confdefs.h"
< #include <sys/types.h>
< #if STDC_HEADERS
< #include <stdlib.h>
< #include <stddef.h>
< #endif
< EOF
< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
<   egrep "(^|[^a-zA-Z_0-9])uint32_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
<   rm -rf conftest*
<   ac_cv_type_uint32_t=yes
---
> { $as_echo "$as_me:$LINENO: checking for uint32_t" >&5
> $as_echo_n "checking for uint32_t... " >&6; }
> if test "${ac_cv_type_uint32_t+set}" = set; then
>   $as_echo_n "(cached) " >&6
3514d8217
<   rm -rf conftest*
3515a8219,8292
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof (uint32_t))
>        return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof ((uint32_t)))
> 	  return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   :
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_type_uint32_t=yes
3517c8294,8299
< rm -f conftest*
---
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
3520,3522c8302,8311
< echo "$ac_t""$ac_cv_type_uint32_t" 1>&6
< if test $ac_cv_type_uint32_t = no; then
<   cat >> confdefs.h <<\EOF
---
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5
> $as_echo "$ac_cv_type_uint32_t" >&6; }
> if test "x$ac_cv_type_uint32_t" = x""yes; then
>   :
> else
> 
> cat >>confdefs.h <<_ACEOF
3524c8313
< EOF
---
> _ACEOF
3528,3545c8317,8320
< echo $ac_n "checking for int64_t""... $ac_c" 1>&6
< echo "configure:3530: checking for int64_t" >&5
< if eval "test \"`echo '$''{'ac_cv_type_int64_t'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 3535 "configure"
< #include "confdefs.h"
< #include <sys/types.h>
< #if STDC_HEADERS
< #include <stdlib.h>
< #include <stddef.h>
< #endif
< EOF
< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
<   egrep "(^|[^a-zA-Z_0-9])int64_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
<   rm -rf conftest*
<   ac_cv_type_int64_t=yes
---
> { $as_echo "$as_me:$LINENO: checking for int64_t" >&5
> $as_echo_n "checking for int64_t... " >&6; }
> if test "${ac_cv_type_int64_t+set}" = set; then
>   $as_echo_n "(cached) " >&6
3547d8321
<   rm -rf conftest*
3548a8323,8404
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof (int64_t))
>        return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof ((int64_t)))
> 	  return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   :
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_type_int64_t=yes
> fi
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 
3550d8405
< rm -f conftest*
3551a8407
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
3553,3555c8409,8415
< echo "$ac_t""$ac_cv_type_int64_t" 1>&6
< if test $ac_cv_type_int64_t = no; then
<   cat >> confdefs.h <<\EOF
---
> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_int64_t" >&5
> $as_echo "$ac_cv_type_int64_t" >&6; }
> if test "x$ac_cv_type_int64_t" = x""yes; then
>   :
> else
> 
> cat >>confdefs.h <<_ACEOF
3557c8417
< EOF
---
> _ACEOF
3561,3578c8421,8424
< echo $ac_n "checking for uint64_t""... $ac_c" 1>&6
< echo "configure:3563: checking for uint64_t" >&5
< if eval "test \"`echo '$''{'ac_cv_type_uint64_t'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 3568 "configure"
< #include "confdefs.h"
< #include <sys/types.h>
< #if STDC_HEADERS
< #include <stdlib.h>
< #include <stddef.h>
< #endif
< EOF
< if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
<   egrep "(^|[^a-zA-Z_0-9])uint64_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
<   rm -rf conftest*
<   ac_cv_type_uint64_t=yes
---
> { $as_echo "$as_me:$LINENO: checking for uint64_t" >&5
> $as_echo_n "checking for uint64_t... " >&6; }
> if test "${ac_cv_type_uint64_t+set}" = set; then
>   $as_echo_n "(cached) " >&6
3580d8425
<   rm -rf conftest*
3581a8427,8500
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof (uint64_t))
>        return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
> int
> main ()
> {
> if (sizeof ((uint64_t)))
> 	  return 0;
>   ;
>   return 0;
> }
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   :
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_cv_type_uint64_t=yes
3583c8502,8507
< rm -f conftest*
---
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
3586,3588c8510,8519
< echo "$ac_t""$ac_cv_type_uint64_t" 1>&6
< if test $ac_cv_type_uint64_t = no; then
<   cat >> confdefs.h <<\EOF
---
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint64_t" >&5
> $as_echo "$ac_cv_type_uint64_t" >&6; }
> if test "x$ac_cv_type_uint64_t" = x""yes; then
>   :
> else
> 
> cat >>confdefs.h <<_ACEOF
3590c8521
< EOF
---
> _ACEOF
3651,3659c8582,8600
< ac_safe=`echo "wchar.h" | sed 'y%./+-%__p_%'`
< echo $ac_n "checking for wchar.h""... $ac_c" 1>&6
< echo "configure:3654: checking for wchar.h" >&5
< if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   cat > conftest.$ac_ext <<EOF
< #line 3659 "configure"
< #include "confdefs.h"
---
> if test "${ac_cv_header_wchar_h+set}" = set; then
>   { $as_echo "$as_me:$LINENO: checking for wchar.h" >&5
> $as_echo_n "checking for wchar.h... " >&6; }
> if test "${ac_cv_header_wchar_h+set}" = set; then
>   $as_echo_n "(cached) " >&6
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_header_wchar_h" >&5
> $as_echo "$ac_cv_header_wchar_h" >&6; }
> else
>   # Is the header compilable?
> { $as_echo "$as_me:$LINENO: checking wchar.h usability" >&5
> $as_echo_n "checking wchar.h usability... " >&6; }
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> $ac_includes_default
3661,3679c8602,8701
< EOF
< ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
< { (eval echo configure:3664: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
< ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
< if test -z "$ac_err"; then
<   rm -rf conftest*
<   eval "ac_cv_header_$ac_safe=yes"
< else
<   echo "$ac_err" >&5
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -rf conftest*
<   eval "ac_cv_header_$ac_safe=no"
< fi
< rm -f conftest*
< fi
< if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
<   echo "$ac_t""yes" 1>&6
<   :
---
> _ACEOF
> rm -f conftest.$ac_objext
> if { (ac_try="$ac_compile"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_compile") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest.$ac_objext; then
>   ac_header_compiler=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 	ac_header_compiler=no
> fi
> 
> rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
> $as_echo "$ac_header_compiler" >&6; }
> 
> # Is the header present?
> { $as_echo "$as_me:$LINENO: checking wchar.h presence" >&5
> $as_echo_n "checking wchar.h presence... " >&6; }
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> #include <wchar.h>
> _ACEOF
> if { (ac_try="$ac_cpp conftest.$ac_ext"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } >/dev/null && {
> 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        }; then
>   ac_header_preproc=yes
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
>   ac_header_preproc=no
> fi
> 
> rm -f conftest.err conftest.$ac_ext
> { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
> $as_echo "$ac_header_preproc" >&6; }
> 
> # So?  What about this header?
> case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
>   yes:no: )
>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h: accepted by the compiler, rejected by the preprocessor!" >&5
> $as_echo "$as_me: WARNING: wchar.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h: proceeding with the compiler's result" >&5
> $as_echo "$as_me: WARNING: wchar.h: proceeding with the compiler's result" >&2;}
>     ac_header_preproc=yes
>     ;;
>   no:yes:* )
>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h: present but cannot be compiled" >&5
> $as_echo "$as_me: WARNING: wchar.h: present but cannot be compiled" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h:     check for missing prerequisite headers?" >&5
> $as_echo "$as_me: WARNING: wchar.h:     check for missing prerequisite headers?" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h: see the Autoconf documentation" >&5
> $as_echo "$as_me: WARNING: wchar.h: see the Autoconf documentation" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h:     section \"Present But Cannot Be Compiled\"" >&5
> $as_echo "$as_me: WARNING: wchar.h:     section \"Present But Cannot Be Compiled\"" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h: proceeding with the preprocessor's result" >&5
> $as_echo "$as_me: WARNING: wchar.h: proceeding with the preprocessor's result" >&2;}
>     { $as_echo "$as_me:$LINENO: WARNING: wchar.h: in the future, the compiler will take precedence" >&5
> $as_echo "$as_me: WARNING: wchar.h: in the future, the compiler will take precedence" >&2;}
> 
>     ;;
> esac
> { $as_echo "$as_me:$LINENO: checking for wchar.h" >&5
> $as_echo_n "checking for wchar.h... " >&6; }
> if test "${ac_cv_header_wchar_h+set}" = set; then
>   $as_echo_n "(cached) " >&6
3681c8703,8707
<   echo "$ac_t""no" 1>&6
---
>   ac_cv_header_wchar_h=$ac_header_preproc
> fi
> { $as_echo "$as_me:$LINENO: result: $ac_cv_header_wchar_h" >&5
> $as_echo "$ac_cv_header_wchar_h" >&6; }
> 
3683a8710
> 
3689c8716
<     cat >> confdefs.h <<\EOF
---
>     cat >>confdefs.h <<\_ACEOF
3691c8718
< EOF
---
> _ACEOF
3694,3719c8721,8782
<         
< echo $ac_n "checking for library containing wcscpy""... $ac_c" 1>&6
< echo "configure:3697: checking for library containing wcscpy" >&5
< if eval "test \"`echo '$''{'ac_cv_search_wcscpy'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
< else
<   ac_func_search_save_LIBS="$LIBS"
< ac_cv_search_wcscpy="no"
< cat > conftest.$ac_ext <<EOF
< #line 3704 "configure"
< #include "confdefs.h"
< /* Override any gcc2 internal prototype to avoid an error.  */
< /* We use char because int might match the return type of a gcc2
<     builtin and then its argument prototype would still apply.  */
< char wcscpy();
< 
< int main() {
< wcscpy()
< ; return 0; }
< EOF
< if { (eval echo configure:3715: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
<   ac_cv_search_wcscpy="none required"
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
---
>         { $as_echo "$as_me:$LINENO: checking for library containing wcscpy" >&5
> $as_echo_n "checking for library containing wcscpy... " >&6; }
> if test "${ac_cv_search_wcscpy+set}" = set; then
>   $as_echo_n "(cached) " >&6
> else
>   ac_func_search_save_LIBS=$LIBS
> cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
> 
> /* Override any GCC internal prototype to avoid an error.
>    Use char because int might match the return type of a GCC
>    builtin and then its argument prototype would still apply.  */
> #ifdef __cplusplus
> extern "C"
> #endif
> char wcscpy ();
> int
> main ()
> {
> return wcscpy ();
>   ;
>   return 0;
> }
> _ACEOF
> for ac_lib in '' wcs w; do
>   if test -z "$ac_lib"; then
>     ac_res="none required"
>   else
>     ac_res=-l$ac_lib
>     LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
>   fi
>   rm -f conftest.$ac_objext conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>conftest.er1
>   ac_status=$?
>   grep -v '^ *+' conftest.er1 >conftest.err
>   rm -f conftest.er1
>   cat conftest.err >&5
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && {
> 	 test -z "$ac_c_werror_flag" ||
> 	 test ! -s conftest.err
>        } && test -s conftest$ac_exeext && {
> 	 test "$cross_compiling" = yes ||
> 	 $as_test_x conftest$ac_exeext
>        }; then
>   ac_cv_search_wcscpy=$ac_res
> else
>   $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> 
3721,3742c8784,8789
< rm -f conftest*
< test "$ac_cv_search_wcscpy" = "no" && for i in wcs w; do
< LIBS="-l$i  $ac_func_search_save_LIBS"
< cat > conftest.$ac_ext <<EOF
< #line 3726 "configure"
< #include "confdefs.h"
< /* Override any gcc2 internal prototype to avoid an error.  */
< /* We use char because int might match the return type of a gcc2
<     builtin and then its argument prototype would still apply.  */
< char wcscpy();
< 
< int main() {
< wcscpy()
< ; return 0; }
< EOF
< if { (eval echo configure:3737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
<   rm -rf conftest*
<   ac_cv_search_wcscpy="-l$i"
< break
< else
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
---
> 
> rm -rf conftest.dSYM
> rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
>       conftest$ac_exeext
>   if test "${ac_cv_search_wcscpy+set}" = set; then
>   break
3744d8790
< rm -f conftest*
3746c8792,8798
< LIBS="$ac_func_search_save_LIBS"
---
> if test "${ac_cv_search_wcscpy+set}" = set; then
>   :
> else
>   ac_cv_search_wcscpy=no
> fi
> rm conftest.$ac_ext
> LIBS=$ac_func_search_save_LIBS
3747a8800,8804
> { $as_echo "$as_me:$LINENO: result: $ac_cv_search_wcscpy" >&5
> $as_echo "$ac_cv_search_wcscpy" >&6; }
> ac_res=$ac_cv_search_wcscpy
> if test "$ac_res" != no; then
>   test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
3749,3754d8805
< echo "$ac_t""$ac_cv_search_wcscpy" 1>&6
< if test "$ac_cv_search_wcscpy" != "no"; then
<   test "$ac_cv_search_wcscpy" = "none required" || LIBS="$ac_cv_search_wcscpy $LIBS"
<   
< else :
<   
3755a8807
> 
3766,3769c8818,8821
< echo $ac_n "checking size of wchar_t""... $ac_c" 1>&6
< echo "configure:3768: checking size of wchar_t" >&5
< if eval "test \"`echo '$''{'ac_cv_sizeof_wchar_t'+set}'`\" = set"; then
<   echo $ac_n "(cached) $ac_c" 1>&6
---
> { $as_echo "$as_me:$LINENO: checking size of wchar_t" >&5
> $as_echo_n "checking size of wchar_t... " >&6; }
> if test "${ac_cv_sizeof_wchar_t+set}" = set; then
>   $as_echo_n "(cached) " >&6
3774,3776c8826,8831
<   cat > conftest.$ac_ext <<EOF
< #line 3776 "configure"
< #include "confdefs.h"
---
>   cat >conftest.$ac_ext <<_ACEOF
> /* confdefs.h.  */
> _ACEOF
> cat confdefs.h >>conftest.$ac_ext
> cat >>conftest.$ac_ext <<_ACEOF
> /* end confdefs.h.  */
3792,3794c8847,8869
< EOF
< if { (eval echo configure:3794: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
< then
---
> _ACEOF
> rm -f conftest$ac_exeext
> if { (ac_try="$ac_link"
> case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_link") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
>   { (case "(($ac_try" in
>   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>   *) ac_try_echo=$ac_try;;
> esac
> eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
> $as_echo "$ac_try_echo") >&5
>   (eval "$ac_try") 2>&5
>   ac_status=$?
>   $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
>   (exit $ac_status); }; }; then
3797,3800c8872,8877
<   echo "configure: failed program was:" >&5
<   cat conftest.$ac_ext >&5
<   rm -fr conftest*
<   ac_cv_sizeof_wchar_t=0
---
>   $as_echo "$as_me: program exited with status $ac_status" >&5
> $as_echo "$as_me: failed program was:" >&5
> sed 's/^/| /' conftest.$ac_ext >&5
> 
> ( exit $ac_status )
> ac_cv_sizeof_wchar_t=0
3802c8879,8880
< rm -fr conftest*
---
> rm -rf conftest.dSYM
> rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
3804a8883
> 
3806,3807c8885,8887
< echo "$ac_t""$ac_cv_sizeof_wchar_t" 1>&6
< cat >> confdefs.h <<EOF
---
> { $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_wchar_t" >&5
> $as_echo "$ac_cv_sizeof_wchar_t" >&6; }
> cat >>confdefs.h <<_ACEOF
3809c8889
< EOF
---
> _ACEOF
3815c8895,8897
< 	   { echo "configure: error: There is wchar.h but the size of wchar_t is 0" 1>&2; exit 1; }
---
> 	   { { $as_echo "$as_me:$LINENO: error: There is wchar.h but the size of wchar_t is 0" >&5
> $as_echo "$as_me: error: There is wchar.h but the size of wchar_t is 0" >&2;}
>    { (exit 1); exit 1; }; }
3826c8908
< # Check whether --enable-extras or --disable-extras was given.
---
> # Check whether --enable-extras was given.
3828,3829c8910
<   enableval="$enable_extras"
<   case "${enableval}" in
---
>   enableval=$enable_extras; case "${enableval}" in
3832c8913,8915
< 		*) { echo "configure: error: bad value ${enableval} for --enable-extras" 1>&2; exit 1; } ;;
---
> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-extras" >&5
> $as_echo "$as_me: error: bad value ${enableval} for --enable-extras" >&2;}
>    { (exit 1); exit 1; }; } ;;
3844c8927
< # Check whether --enable-extras or --disable-extras was given.
---
> # Check whether --enable-extras was given.
3846,3847c8929
<   enableval="$enable_extras"
<   case "${enableval}" in
---
>   enableval=$enable_extras; case "${enableval}" in
3850c8932,8934
< 		*) { echo "configure: error: bad value ${enableval} for --enable-icuio" 1>&2; exit 1; } ;;
---
> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-icuio" >&5
> $as_echo "$as_me: error: bad value ${enableval} for --enable-icuio" >&2;}
>    { (exit 1); exit 1; }; } ;;
3863c8947
< # Check whether --enable-layout or --disable-layout was given.
---
> # Check whether --enable-layout was given.
3865,3866c8949
<   enableval="$enable_layout"
<   case "${enableval}" in
---
>   enableval=$enable_layout; case "${enableval}" in
3869c8952,8954
< 		*) { echo "configure: error: bad value ${enableval} for --enable-layout" 1>&2; exit 1; } ;;
---
> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-layout" >&5
> $as_echo "$as_me: error: bad value ${enableval} for --enable-layout" >&2;}
>    { (exit 1); exit 1; }; } ;;
3882c8967,8968
< # Check whether --with-data-packaging or --without-data-packaging was given.
---
> 
> # Check whether --with-data-packaging was given.
3884,3885c8970
<   withval="$with_data_packaging"
<   case "${withval}" in
---
>   withval=$with_data_packaging; case "${withval}" in
3891c8976,8978
< 		*) { echo "configure: error: bad value ${withval} for --with-data-packaging" 1>&2; exit 1; } ;;
---
> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${withval} for --with-data-packaging" >&5
> $as_echo "$as_me: error: bad value ${withval} for --with-data-packaging" >&2;}
>    { (exit 1); exit 1; }; } ;;
3910c8997
< # Check whether --enable-mapped or --disable-mapped was given.
---
> # Check whether --enable-mapped was given.
3912,3913c8999
<   enableval="$enable_mapped"
<   case "${enableval}" in
---
>   enableval=$enable_mapped; case "${enableval}" in
3916c9002,9004
<                *) { echo "configure: error: bad value ${enableval} for --enable-mapped; use --with-data-packaging now" 1>&2; exit 1; } ;;
---
>                *) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-mapped; use --with-data-packaging now" >&5
> $as_echo "$as_me: error: bad value ${enableval} for --enable-mapped; use --with-data-packaging now" >&2;}
>    { (exit 1); exit 1; }; } ;;
3926c9014,9015
<     	    echo "configure: warning: use --with-data-packaging=archive instead of --enable-mapped" 1>&2
---
>     	    { $as_echo "$as_me:$LINENO: WARNING: use --with-data-packaging=archive instead of --enable-mapped" >&5
> $as_echo "$as_me: WARNING: use --with-data-packaging=archive instead of --enable-mapped" >&2;}
3929c9018,9019
<     	    echo "configure: warning: use --with-data-packaging=library instead of --disable-mapped" 1>&2
---
>     	    { $as_echo "$as_me:$LINENO: WARNING: use --with-data-packaging=library instead of --disable-mapped" >&5
> $as_echo "$as_me: WARNING: use --with-data-packaging=library instead of --disable-mapped" >&2;}
3933c9023,9025
< 	{ echo "configure: error: conflicting values used for --with-data-packaging and deprecated --enable-mapped" 1>&2; exit 1; }
---
> 	{ { $as_echo "$as_me:$LINENO: error: conflicting values used for --with-data-packaging and deprecated --enable-mapped" >&5
> $as_echo "$as_me: error: conflicting values used for --with-data-packaging and deprecated --enable-mapped" >&2;}
>    { (exit 1); exit 1; }; }
3959,3961c9051,9054
< echo $ac_n "checking for a library suffix to use""... $ac_c" 1>&6
< echo "configure:3961: checking for a library suffix to use" >&5
< # Check whether --with-library-suffix or --without-library-suffix was given.
---
> { $as_echo "$as_me:$LINENO: checking for a library suffix to use" >&5
> $as_echo_n "checking for a library suffix to use... " >&6; }
> 
> # Check whether --with-library-suffix was given.
3963,3964c9056
<   withval="$with_library_suffix"
<   ICULIBSUFFIX="${withval}"
---
>   withval=$with_library_suffix; ICULIBSUFFIX="${withval}"
3973c9065,9066
< echo "$ac_t""$msg" 1>&6
---
> { $as_echo "$as_me:$LINENO: result: $msg" >&5
> $as_echo "$msg" >&6; }
3985c9078
< # Check whether --enable-tests or --disable-tests was given.
---
> # Check whether --enable-tests was given.
3987,3988c9080
<   enableval="$enable_tests"
<   case "${enableval}" in
---
>   enableval=$enable_tests; case "${enableval}" in
3991c9083,9085
< 		*) { echo "configure: error: bad value ${enableval} for --enable-tests" 1>&2; exit 1; } ;;
---
> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-tests" >&5
> $as_echo "$as_me: error: bad value ${enableval} for --enable-tests" >&2;}
>    { (exit 1); exit 1; }; } ;;
4004c9098
< # Check whether --enable-samples or --disable-samples was given.
---
> # Check whether --enable-samples was given.
4006,4007c9100
<   enableval="$enable_samples"
<   case "${enableval}" in
---
>   enableval=$enable_samples; case "${enableval}" in
4010c9103,9105
< 		*) { echo "configure: error: bad value ${enableval} for --enable-samples" 1>&2; exit 1; } ;;
---
> 		*) { { $as_echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-samples" >&5
> $as_echo "$as_me: error: bad value ${enableval} for --enable-samples" >&2;}
>    { (exit 1); exit 1; }; } ;;
4067c9162
< 	*-*-hpux*) 	
---
> 	*-*-hpux*)
4113,4114c9208,9210
< trap '' 1 2 15
< cat > confcache <<\EOF
---
> ac_config_files="$ac_config_files icudefs.mk Makefile data/icupkg.inc config/Makefile.inc data/Makefile stubdata/Makefile common/Makefile i18n/Makefile layout/Makefile layoutex/Makefile io/Makefile extra/Makefile extra/uconv/Makefile extra/scrptrun/Makefile tools/Makefile tools/ctestfw/Makefile tools/makeconv/Makefile tools/genrb/Makefile tools/genuca/Makefile tools/genccode/Makefile tools/gencmn/Makefile tools/gencnval/Makefile tools/gennames/Makefile tools/gentest/Makefile tools/gennorm/Makefile tools/genprops/Makefile tools/gencase/Makefile tools/genpname/Makefile tools/genbrk/Makefile tools/gensprep/Makefile tools/icuswap/Makefile tools/pkgdata/Makefile tools/toolutil/Makefile tools/dumpce/Makefile test/Makefile test/testdata/Makefile test/testdata/pkgdata.inc test/hdrtst/Makefile test/intltest/Makefile test/cintltst/Makefile test/iotest/Makefile test/thaitest/Makefile test/testmap/Makefile test/letest/Makefile test/threadtest/Makefile samples/Makefile samples/date/Makefile samples/cal/Makefile samples/layout/Makefile common/unicode/platform.h"
> 
> cat >confcache <<\_ACEOF
4117,4118c9213,9215
< # scripts and configure runs.  It is not useful on other systems.
< # If it contains results you don't want to keep, you may remove or edit it.
---
> # 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.
4120,4127c9217,9218
< # By default, configure uses ./config.cache as the cache file,
< # creating it if it does not exist already.  You can give configure
< # the --cache-file=FILE option to use a different cache file; that is
< # what configure does when it calls configure scripts in
< # subdirectories, so they share the cache.
< # Giving --cache-file=/dev/null disables caching, for debugging configure.
< # config.status only pays attention to the cache file if you give it the
< # --recheck option to rerun configure.
---
> # config.status only pays attention to the cache file if you give it
> # the --recheck option to rerun configure.
4129c9220,9225
< EOF
---
> # `ac_cv_env_foo' variables (set or unset) will be overridden when
> # loading this file, other *unset* `ac_cv_foo' will be assigned the
> # following values.
> 
> _ACEOF
> 
4132c9228
< # So, don't put newlines in cache variables' values.
---
> # So, we kill variables containing newlines.
4135,4154c9231,9277
< (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 \
<       -e "s/'/'\\\\''/g" \
<       -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
<     ;;
<   *)
<     # `set' quotes correctly as required by POSIX, so do not add quotes.
<     sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
<     ;;
<   esac >> confcache
< if cmp -s $cache_file confcache; then
<   :
< else
<   if test -w $cache_file; then
<     echo "updating cache $cache_file"
<     cat confcache > $cache_file
---
> (
>   for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
>     eval ac_val=\$$ac_var
>     case $ac_val in #(
>     *${as_nl}*)
>       case $ac_var in #(
>       *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
> $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
>       esac
>       case $ac_var in #(
>       _ | IFS | as_nl) ;; #(
>       BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
>       *) $as_unset $ac_var ;;
>       esac ;;
>     esac
>   done
> 
>   (set) 2>&1 |
>     case $as_nl`(ac_space=' '; set) 2>&1` in #(
>     *${as_nl}ac_space=\ *)
>       # `set' does not quote correctly, so add quotes (double-quote
>       # substitution turns \\\\ into \\, and sed turns \\ into \).
>       sed -n \
> 	"s/'/'\\\\''/g;
> 	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
>       ;; #(
>     *)
>       # `set' quotes correctly as required by POSIX, so do not add quotes.
>       sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
>       ;;
>     esac |
>     sort
> ) |
>   sed '
>      /^ac_cv_env_/b end
>      t clear
>      :clear
>      s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
>      t end
>      s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
>      :end' >>confcache
> if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
>   if test -w "$cache_file"; then
>     test "x$cache_file" != "x/dev/null" &&
>       { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5
> $as_echo "$as_me: updating cache $cache_file" >&6;}
>     cat confcache >$cache_file
4156c9279,9280
<     echo "not updating unwritable cache $cache_file"
---
>     { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
> $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
4161,4162d9284
< trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
< 
4167,4172c9289
< # Any assignment to VPATH causes Sun make to only execute
< # the first set of double-colon rules, so remove it if not needed.
< # If there is a colon in the path, we need to keep it.
< if test "x$srcdir" = x.; then
<   ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
< fi
---
> DEFS=-DHAVE_CONFIG_H
4174c9291,9302
< trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
---
> ac_libobjs=
> ac_ltlibobjs=
> for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
>   # 1. Remove the extension, and $U if already installed.
>   ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
>   ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
>   # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
>   #    will be set to the directory where LIBOBJS objects are built.
>   ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
>   ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
> done
> LIBOBJS=$ac_libobjs
4176c9304
< DEFS=-DHAVE_CONFIG_H
---
> LTLIBOBJS=$ac_ltlibobjs
4178,4179d9305
< # Without the "./", some shells look in PATH for config.status.
< : ${CONFIG_STATUS=./config.status}
4181,4185c9307,9317
< echo creating $CONFIG_STATUS
< rm -f $CONFIG_STATUS
< cat > $CONFIG_STATUS <<EOF
< #! /bin/sh
< # Generated automatically by configure.
---
> 
> 
> : ${CONFIG_STATUS=./config.status}
> ac_write_fail=0
> ac_clean_files_save=$ac_clean_files
> ac_clean_files="$ac_clean_files $CONFIG_STATUS"
> { $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
> $as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
> cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
> #! $SHELL
> # Generated by $as_me.
4187,4191d9318
< # This directory was configured as follows,
< # on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
< #
< # $0 $ac_configure_args
< #
4193c9320
< # configure, is in ./config.log if it exists.
---
> # configure, is in config.log if it exists.
4195,4196c9322,9420
< ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
< for ac_option
---
> debug=false
> ac_cs_recheck=false
> ac_cs_silent=false
> SHELL=\${CONFIG_SHELL-$SHELL}
> _ACEOF
> 
> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
> ## --------------------- ##
> ## M4sh Initialization.  ##
> ## --------------------- ##
> 
> # Be more Bourne compatible
> DUALCASE=1; export DUALCASE # for MKS sh
> if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
>   emulate sh
>   NULLCMD=:
>   # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
>   # is contrary to our usage.  Disable this feature.
>   alias -g '${1+"$@"}'='"$@"'
>   setopt NO_GLOB_SUBST
> else
>   case `(set -o) 2>/dev/null` in
>   *posix*) set -o posix ;;
> esac
> 
> fi
> 
> 
> 
> 
> # PATH needs CR
> # Avoid depending upon Character Ranges.
> as_cr_letters='abcdefghijklmnopqrstuvwxyz'
> as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
> as_cr_Letters=$as_cr_letters$as_cr_LETTERS
> as_cr_digits='0123456789'
> as_cr_alnum=$as_cr_Letters$as_cr_digits
> 
> as_nl='
> '
> export as_nl
> # Printing a long string crashes Solaris 7 /usr/bin/printf.
> as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
> as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
> as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
> if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
>   as_echo='printf %s\n'
>   as_echo_n='printf %s'
> else
>   if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
>     as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
>     as_echo_n='/usr/ucb/echo -n'
>   else
>     as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
>     as_echo_n_body='eval
>       arg=$1;
>       case $arg in
>       *"$as_nl"*)
> 	expr "X$arg" : "X\\(.*\\)$as_nl";
> 	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
>       esac;
>       expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
>     '
>     export as_echo_n_body
>     as_echo_n='sh -c $as_echo_n_body as_echo'
>   fi
>   export as_echo_body
>   as_echo='sh -c $as_echo_body as_echo'
> fi
> 
> # The user is always right.
> if test "${PATH_SEPARATOR+set}" != set; then
>   PATH_SEPARATOR=:
>   (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
>     (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
>       PATH_SEPARATOR=';'
>   }
> fi
> 
> # Support unset when possible.
> if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
>   as_unset=unset
> else
>   as_unset=false
> fi
> 
> 
> # IFS
> # We need space, tab and new line, in precisely that order.  Quoting is
> # there to prevent editors from complaining about space-tab.
> # (If _AS_PATH_WALK were called with IFS unset, it would disable word
> # splitting by setting IFS to empty value.)
> IFS=" ""	$as_nl"
> 
> # Find who we are.  Look in the path if we contain no directory separator.
> case $0 in
>   *[\\/]* ) as_myself=$0 ;;
>   *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> for as_dir in $PATH
4198,4208c9422,9424
<   case "\$ac_option" in
<   -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
<     echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
<     exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
<   -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
<     echo "$CONFIG_STATUS generated by autoconf version 2.13"
<     exit 0 ;;
<   -help | --help | --hel | --he | --h)
<     echo "\$ac_cs_usage"; exit 0 ;;
<   *) echo "\$ac_cs_usage"; exit 1 ;;
<   esac
---
>   IFS=$as_save_IFS
>   test -z "$as_dir" && as_dir=.
>   test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
4209a9426
> IFS=$as_save_IFS
4211,4212c9428,9438
< ac_given_srcdir=$srcdir
< ac_given_INSTALL="$INSTALL"
---
>      ;;
> esac
> # We did not find ourselves, most probably we were run as `sh COMMAND'
> # in which case we are not to be found in the path.
> if test "x$as_myself" = x; then
>   as_myself=$0
> fi
> if test ! -f "$as_myself"; then
>   $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
>   { (exit 1); exit 1; }
> fi
4214,4393c9440,9577
< trap 'rm -fr `echo "icudefs.mk \
< 		Makefile \
< 		data/icupkg.inc \
< 		config/Makefile.inc \
< 		data/Makefile \
< 		stubdata/Makefile \
< 		common/Makefile \
< 		i18n/Makefile \
< 		layout/Makefile \
< 		layoutex/Makefile \
< 		io/Makefile \
< 		extra/Makefile \
< 		extra/uconv/Makefile extra/scrptrun/Makefile \
< 		tools/Makefile tools/ctestfw/Makefile \
< 		tools/makeconv/Makefile \
< 		tools/genrb/Makefile \
< 		tools/genuca/Makefile \
< 		tools/genccode/Makefile \
< 		tools/gencmn/Makefile \
< 		tools/gencnval/Makefile \
< 		tools/gennames/Makefile \
< 		tools/gentest/Makefile \
< 		tools/gennorm/Makefile \
< 		tools/genprops/Makefile \
< 		tools/gencase/Makefile \
< 		tools/genpname/Makefile \
< 		tools/genbrk/Makefile \
< 		tools/gensprep/Makefile \
< 		tools/icuswap/Makefile \
< 		tools/pkgdata/Makefile \
< 		tools/toolutil/Makefile \
< 		tools/dumpce/Makefile \
< 		test/Makefile \
< 		test/testdata/Makefile \
< 		test/testdata/pkgdata.inc \
< 		test/hdrtst/Makefile \
< 		test/intltest/Makefile \
< 		test/cintltst/Makefile \
< 		test/iotest/Makefile \
< 		test/thaitest/Makefile \
< 		test/testmap/Makefile \
< 		test/letest/Makefile \
< 		test/threadtest/Makefile \
< 		samples/Makefile samples/date/Makefile \
< 		samples/cal/Makefile samples/layout/Makefile \
< 		common/unicode/platform.h common/icucfg.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
< EOF
< cat >> $CONFIG_STATUS <<EOF
< 
< # Protect against being on the right side of a sed subst in config.status.
< sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
<  s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
< $ac_vpsub
< $extrasub
< s%@SHELL@%$SHELL%g
< s%@CFLAGS@%$CFLAGS%g
< s%@CPPFLAGS@%$CPPFLAGS%g
< s%@CXXFLAGS@%$CXXFLAGS%g
< s%@FFLAGS@%$FFLAGS%g
< s%@DEFS@%$DEFS%g
< s%@LDFLAGS@%$LDFLAGS%g
< s%@LIBS@%$LIBS%g
< s%@exec_prefix@%$exec_prefix%g
< s%@prefix@%$prefix%g
< s%@program_transform_name@%$program_transform_name%g
< s%@bindir@%$bindir%g
< s%@sbindir@%$sbindir%g
< s%@libexecdir@%$libexecdir%g
< s%@datadir@%$datadir%g
< s%@sysconfdir@%$sysconfdir%g
< s%@sharedstatedir@%$sharedstatedir%g
< s%@localstatedir@%$localstatedir%g
< s%@libdir@%$libdir%g
< s%@includedir@%$includedir%g
< s%@oldincludedir@%$oldincludedir%g
< s%@infodir@%$infodir%g
< s%@mandir@%$mandir%g
< s%@PACKAGE@%$PACKAGE%g
< s%@VERSION@%$VERSION%g
< s%@LIB_VERSION@%$LIB_VERSION%g
< s%@LIB_VERSION_MAJOR@%$LIB_VERSION_MAJOR%g
< s%@UNICODE_VERSION@%$UNICODE_VERSION%g
< s%@CC@%$CC%g
< s%@CXX@%$CXX%g
< s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
< s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
< s%@INSTALL_DATA@%$INSTALL_DATA%g
< s%@STRIP@%$STRIP%g
< s%@U_MAKE@%$U_MAKE%g
< s%@DOXYGEN@%$DOXYGEN%g
< s%@host@%$host%g
< s%@host_alias@%$host_alias%g
< s%@host_cpu@%$host_cpu%g
< s%@host_vendor@%$host_vendor%g
< s%@host_os@%$host_os%g
< s%@EXEEXT@%$EXEEXT%g
< s%@ARFLAGS@%$ARFLAGS%g
< s%@COMPILE_LINK_ENVVAR@%$COMPILE_LINK_ENVVAR%g
< s%@LIB_M@%$LIB_M%g
< s%@ENABLE_SHARED@%$ENABLE_SHARED%g
< s%@ENABLE_STATIC@%$ENABLE_STATIC%g
< s%@ENABLE_DEBUG@%$ENABLE_DEBUG%g
< s%@ENABLE_RELEASE@%$ENABLE_RELEASE%g
< s%@RANLIB@%$RANLIB%g
< s%@AR@%$AR%g
< s%@U_DISABLE_RENAMING@%$U_DISABLE_RENAMING%g
< s%@U_ENABLE_TRACING@%$U_ENABLE_TRACING%g
< s%@ENABLE_RPATH@%$ENABLE_RPATH%g
< s%@U_INLINE@%$U_INLINE%g
< s%@THREADS_TRUE@%$THREADS_TRUE%g
< s%@ICU_USE_THREADS@%$ICU_USE_THREADS%g
< s%@HAVE_MMAP@%$HAVE_MMAP%g
< s%@GENCCODE_ASSEMBLY@%$GENCCODE_ASSEMBLY%g
< s%@CPP@%$CPP%g
< s%@U_HAVE_INTTYPES_H@%$U_HAVE_INTTYPES_H%g
< s%@CXXCPP@%$CXXCPP%g
< s%@U_IOSTREAM_SOURCE@%$U_IOSTREAM_SOURCE%g
< s%@U_IS_BIG_ENDIAN@%$U_IS_BIG_ENDIAN%g
< s%@U_HAVE_NL_LANGINFO@%$U_HAVE_NL_LANGINFO%g
< s%@U_HAVE_NL_LANGINFO_CODESET@%$U_HAVE_NL_LANGINFO_CODESET%g
< s%@U_NL_LANGINFO_CODESET@%$U_NL_LANGINFO_CODESET%g
< s%@U_HAVE_NAMESPACE@%$U_HAVE_NAMESPACE%g
< s%@U_OVERRIDE_CXX_ALLOCATION@%$U_OVERRIDE_CXX_ALLOCATION%g
< s%@U_HAVE_PLACEMENT_NEW@%$U_HAVE_PLACEMENT_NEW%g
< s%@U_HAVE_POPEN@%$U_HAVE_POPEN%g
< s%@U_HAVE_TZSET@%$U_HAVE_TZSET%g
< s%@U_TZSET@%$U_TZSET%g
< s%@U_HAVE_TZNAME@%$U_HAVE_TZNAME%g
< s%@U_TZNAME@%$U_TZNAME%g
< s%@U_HAVE_TIMEZONE@%$U_HAVE_TIMEZONE%g
< s%@U_TIMEZONE@%$U_TIMEZONE%g
< s%@HAVE_INT8_T@%$HAVE_INT8_T%g
< s%@HAVE_UINT8_T@%$HAVE_UINT8_T%g
< s%@HAVE_INT16_T@%$HAVE_INT16_T%g
< s%@HAVE_UINT16_T@%$HAVE_UINT16_T%g
< s%@HAVE_INT32_T@%$HAVE_INT32_T%g
< s%@HAVE_UINT32_T@%$HAVE_UINT32_T%g
< s%@HAVE_INT64_T@%$HAVE_INT64_T%g
< s%@HAVE_UINT64_T@%$HAVE_UINT64_T%g
< s%@U_HAVE_WCHAR_H@%$U_HAVE_WCHAR_H%g
< s%@U_HAVE_WCSCPY@%$U_HAVE_WCSCPY%g
< s%@U_SIZEOF_WCHAR_T@%$U_SIZEOF_WCHAR_T%g
< s%@EXTRAS_TRUE@%$EXTRAS_TRUE%g
< s%@ICUIO_TRUE@%$ICUIO_TRUE%g
< s%@LAYOUT_TRUE@%$LAYOUT_TRUE%g
< s%@thesysconfdir@%$thesysconfdir%g
< s%@thedatadir@%$thedatadir%g
< s%@thelibdir@%$thelibdir%g
< s%@pkgicudatadir@%$pkgicudatadir%g
< s%@thepkgicudatadir@%$thepkgicudatadir%g
< s%@DATA_PACKAGING_CPPFLAGS@%$DATA_PACKAGING_CPPFLAGS%g
< s%@DATA_PACKAGING_MODE@%$DATA_PACKAGING_MODE%g
< s%@ICULIBSUFFIX@%$ICULIBSUFFIX%g
< s%@U_HAVE_LIB_SUFFIX@%$U_HAVE_LIB_SUFFIX%g
< s%@ICULIBSUFFIXCNAME@%$ICULIBSUFFIXCNAME%g
< s%@TESTS_TRUE@%$TESTS_TRUE%g
< s%@SAMPLES_TRUE@%$SAMPLES_TRUE%g
< s%@ICUDATA_CHAR@%$ICUDATA_CHAR%g
< s%@platform@%$platform%g
< s%@platform_make_fragment_name@%$platform_make_fragment_name%g
< s%@platform_make_fragment@%$platform_make_fragment%g
< s%@ld_rpath_suf@%$ld_rpath_suf%g
< s%@AIX_SHLIB@%$AIX_SHLIB%g
< 
< 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_cmds=90 # Maximum number of lines to put in a sed script.
< ac_file=1 # Number of current file.
< ac_beg=1 # First line for current file.
< ac_end=$ac_max_sed_cmds # 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" conftest.subs > conftest.s$ac_file
---
> # Work around bugs in pre-3.0 UWIN ksh.
> for as_var in ENV MAIL MAILPATH
> do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
> done
> PS1='$ '
> PS2='> '
> PS4='+ '
> 
> # NLS nuisances.
> LC_ALL=C
> export LC_ALL
> LANGUAGE=C
> export LANGUAGE
> 
> # Required to use basename.
> if expr a : '\(a\)' >/dev/null 2>&1 &&
>    test "X`expr 00001 : '.*\(...\)'`" = X001; then
>   as_expr=expr
> else
>   as_expr=false
> fi
> 
> if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
>   as_basename=basename
> else
>   as_basename=false
> fi
> 
> 
> # Name of the executable.
> as_me=`$as_basename -- "$0" ||
> $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
> 	 X"$0" : 'X\(//\)$' \| \
> 	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
> $as_echo X/"$0" |
>     sed '/^.*\/\([^/][^/]*\)\/*$/{
> 	    s//\1/
> 	    q
> 	  }
> 	  /^X\/\(\/\/\)$/{
> 	    s//\1/
> 	    q
> 	  }
> 	  /^X\/\(\/\).*/{
> 	    s//\1/
> 	    q
> 	  }
> 	  s/.*/./; q'`
> 
> # CDPATH.
> $as_unset CDPATH
> 
> 
> 
>   as_lineno_1=$LINENO
>   as_lineno_2=$LINENO
>   test "x$as_lineno_1" != "x$as_lineno_2" &&
>   test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
> 
>   # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
>   # uniformly replaced by the line number.  The first 'sed' inserts a
>   # line-number line after each line using $LINENO; the second 'sed'
>   # does the real work.  The second script uses 'N' to pair each
>   # line-number line with the line containing $LINENO, and appends
>   # trailing '-' during substitution so that $LINENO is not a special
>   # case at line end.
>   # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
>   # scripts with optimization help from Paolo Bonzini.  Blame Lee
>   # E. McMahon (1931-1989) for sed's syntax.  :-)
>   sed -n '
>     p
>     /[$]LINENO/=
>   ' <$as_myself |
>     sed '
>       s/[$]LINENO.*/&-/
>       t lineno
>       b
>       :lineno
>       N
>       :loop
>       s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
>       t loop
>       s/-\n.*//
>     ' >$as_me.lineno &&
>   chmod +x "$as_me.lineno" ||
>     { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
>    { (exit 1); exit 1; }; }
> 
>   # Don't try to exec as it changes $[0], causing all sort of problems
>   # (the dirname of $[0] is not the place where we might find the
>   # original and so on.  Autoconf is especially sensitive to this).
>   . "./$as_me.lineno"
>   # Exit status is that of the last command.
>   exit
> }
> 
> 
> if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
>   as_dirname=dirname
> else
>   as_dirname=false
> fi
> 
> ECHO_C= ECHO_N= ECHO_T=
> case `echo -n x` in
> -n*)
>   case `echo 'x\c'` in
>   *c*) ECHO_T='	';;	# ECHO_T is single tab character.
>   *)   ECHO_C='\c';;
>   esac;;
> *)
>   ECHO_N='-n';;
> esac
> if expr a : '\(a\)' >/dev/null 2>&1 &&
>    test "X`expr 00001 : '.*\(...\)'`" = X001; then
>   as_expr=expr
> else
>   as_expr=false
> fi
> 
> rm -f conf$$ conf$$.exe conf$$.file
> if test -d conf$$.dir; then
>   rm -f conf$$.dir/conf$$.file
> else
>   rm -f conf$$.dir
>   mkdir conf$$.dir 2>/dev/null
> fi
> if (echo >conf$$.file) 2>/dev/null; then
>   if ln -s conf$$.file conf$$ 2>/dev/null; then
>     as_ln_s='ln -s'
>     # ... but there are two gotchas:
>     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
>     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
>     # In both cases, we have to default to `cp -p'.
>     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
>       as_ln_s='cp -p'
>   elif ln conf$$.file conf$$ 2>/dev/null; then
>     as_ln_s=ln
4395c9579
<     sed "${ac_end}q" conftest.subs > conftest.s$ac_file
---
>     as_ln_s='cp -p'
4397,4472c9581,9585
<   if test ! -s conftest.s$ac_file; then
<     ac_more_lines=false
<     rm -f conftest.s$ac_file
<   else
<     if test -z "$ac_sed_cmds"; then
<       ac_sed_cmds="sed -f conftest.s$ac_file"
<     else
<       ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
<     fi
<     ac_file=`expr $ac_file + 1`
<     ac_beg=$ac_end
<     ac_end=`expr $ac_end + $ac_max_sed_cmds`
<   fi
< done
< if test -z "$ac_sed_cmds"; then
<   ac_sed_cmds=cat
< fi
< EOF
< 
< cat >> $CONFIG_STATUS <<EOF
< 
< CONFIG_FILES=\${CONFIG_FILES-"icudefs.mk \
< 		Makefile \
< 		data/icupkg.inc \
< 		config/Makefile.inc \
< 		data/Makefile \
< 		stubdata/Makefile \
< 		common/Makefile \
< 		i18n/Makefile \
< 		layout/Makefile \
< 		layoutex/Makefile \
< 		io/Makefile \
< 		extra/Makefile \
< 		extra/uconv/Makefile extra/scrptrun/Makefile \
< 		tools/Makefile tools/ctestfw/Makefile \
< 		tools/makeconv/Makefile \
< 		tools/genrb/Makefile \
< 		tools/genuca/Makefile \
< 		tools/genccode/Makefile \
< 		tools/gencmn/Makefile \
< 		tools/gencnval/Makefile \
< 		tools/gennames/Makefile \
< 		tools/gentest/Makefile \
< 		tools/gennorm/Makefile \
< 		tools/genprops/Makefile \
< 		tools/gencase/Makefile \
< 		tools/genpname/Makefile \
< 		tools/genbrk/Makefile \
< 		tools/gensprep/Makefile \
< 		tools/icuswap/Makefile \
< 		tools/pkgdata/Makefile \
< 		tools/toolutil/Makefile \
< 		tools/dumpce/Makefile \
< 		test/Makefile \
< 		test/testdata/Makefile \
< 		test/testdata/pkgdata.inc \
< 		test/hdrtst/Makefile \
< 		test/intltest/Makefile \
< 		test/cintltst/Makefile \
< 		test/iotest/Makefile \
< 		test/thaitest/Makefile \
< 		test/testmap/Makefile \
< 		test/letest/Makefile \
< 		test/threadtest/Makefile \
< 		samples/Makefile samples/date/Makefile \
< 		samples/cal/Makefile samples/layout/Makefile \
< 		common/unicode/platform.h"}
< EOF
< cat >> $CONFIG_STATUS <<\EOF
< for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
<   # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
<   case "$ac_file" in
<   *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
<        ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
<   *) ac_file_in="${ac_file}.in" ;;
<   esac
---
> else
>   as_ln_s='cp -p'
> fi
> rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
> rmdir conf$$.dir 2>/dev/null
4474c9587,9592
<   # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
---
> if mkdir -p . 2>/dev/null; then
>   as_mkdir_p=:
> else
>   test -d ./-p && rmdir ./-p
>   as_mkdir_p=false
> fi
4476,4483c9594,9598
<   # Remove last slash and all that follows it.  Not all systems have dirname.
<   ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
<   if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
<     # The file is in a subdirectory.
<     test ! -d "$ac_dir" && mkdir "$ac_dir"
<     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'`
---
> if test -x / >/dev/null 2>&1; then
>   as_test_x='test -x'
> else
>   if ls -dL / >/dev/null 2>&1; then
>     as_ls_L_option=L
4485c9600
<     ac_dir_suffix= ac_dots=
---
>     as_ls_L_option=
4486a9602,9637
>   as_test_x='
>     eval sh -c '\''
>       if test -d "$1"; then
> 	test -d "$1/.";
>       else
> 	case $1 in
> 	-*)set "./$1";;
> 	esac;
> 	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
> 	???[sx]*):;;*)false;;esac;fi
>     '\'' sh
>   '
> fi
> as_executable_p=$as_test_x
> 
> # Sed expression to map a string onto a valid CPP name.
> as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
> 
> # Sed expression to map a string onto a valid variable name.
> as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
> 
> 
> exec 6>&1
> 
> # Save the log message, to keep $[0] and so on meaningful, and to
> # report actual input values of CONFIG_FILES etc. instead of their
> # values after options handling.
> ac_log="
> This file was extended by $as_me, which was
> generated by GNU Autoconf 2.63.  Invocation command line was
> 
>   CONFIG_FILES    = $CONFIG_FILES
>   CONFIG_HEADERS  = $CONFIG_HEADERS
>   CONFIG_LINKS    = $CONFIG_LINKS
>   CONFIG_COMMANDS = $CONFIG_COMMANDS
>   $ $0 $@
4488,4496c9639,9650
<   case "$ac_given_srcdir" in
<   .)  srcdir=.
<       if test -z "$ac_dots"; then top_srcdir=.
<       else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
<   /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
<   *) # Relative path.
<     srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
<     top_srcdir="$ac_dots$ac_given_srcdir" ;;
<   esac
---
> on `(hostname || uname -n) 2>/dev/null | sed 1q`
> "
> 
> _ACEOF
> 
> case $ac_config_files in *"
> "*) set x $ac_config_files; shift; ac_config_files=$*;;
> esac
> 
> case $ac_config_headers in *"
> "*) set x $ac_config_headers; shift; ac_config_headers=$*;;
> esac
4498,4501d9651
<   case "$ac_given_INSTALL" in
<   [/$]*) INSTALL="$ac_given_INSTALL" ;;
<   *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
<   esac
4503,4509c9653,9718
<   echo creating "$ac_file"
<   rm -f "$ac_file"
<   configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
<   case "$ac_file" in
<   *Makefile*) ac_comsub="1i\\
< # $configure_input" ;;
<   *) ac_comsub= ;;
---
> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
> # Files that config.status was made for.
> config_files="$ac_config_files"
> config_headers="$ac_config_headers"
> 
> _ACEOF
> 
> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
> ac_cs_usage="\
> \`$as_me' instantiates files from templates according to the
> current configuration.
> 
> Usage: $0 [OPTION]... [FILE]...
> 
>   -h, --help       print this help, then exit
>   -V, --version    print version number and configuration settings, then exit
>   -q, --quiet, --silent
>                    do not print progress messages
>   -d, --debug      don't remove temporary files
>       --recheck    update $as_me by reconfiguring in the same conditions
>       --file=FILE[:TEMPLATE]
>                    instantiate the configuration file FILE
>       --header=FILE[:TEMPLATE]
>                    instantiate the configuration header FILE
> 
> Configuration files:
> $config_files
> 
> Configuration headers:
> $config_headers
> 
> Report bugs to <bug-autoconf@gnu.org>."
> 
> _ACEOF
> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
> ac_cs_version="\\
> config.status
> configured by $0, generated by GNU Autoconf 2.63,
>   with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
> 
> Copyright (C) 2008 Free Software Foundation, Inc.
> This config.status script is free software; the Free Software Foundation
> gives unlimited permission to copy, distribute and modify it."
> 
> ac_pwd='$ac_pwd'
> srcdir='$srcdir'
> INSTALL='$INSTALL'
> test -n "\$AWK" || AWK=awk
> _ACEOF
> 
> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
> # The default lists apply if the user does not specify any file.
> ac_need_defaults=:
> while test $# != 0
> do
>   case $1 in
>   --*=*)
>     ac_option=`expr "X$1" : 'X\([^=]*\)='`
>     ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
>     ac_shift=:
>     ;;
>   *)
>     ac_option=$1
>     ac_optarg=$2
>     ac_shift=shift
>     ;;
4512,4520c9721,9760
<   ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
<   sed -e "$ac_comsub
< s%@configure_input@%$configure_input%g
< s%@srcdir@%$srcdir%g
< s%@top_srcdir@%$top_srcdir%g
< s%@INSTALL@%$INSTALL%g
< " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
< fi; done
< rm -f conftest.s*
---
>   case $ac_option in
>   # Handling of the options.
>   -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
>     ac_cs_recheck=: ;;
>   --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
>     $as_echo "$ac_cs_version"; exit ;;
>   --debug | --debu | --deb | --de | --d | -d )
>     debug=: ;;
>   --file | --fil | --fi | --f )
>     $ac_shift
>     case $ac_optarg in
>     *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
>     esac
>     CONFIG_FILES="$CONFIG_FILES '$ac_optarg'"
>     ac_need_defaults=false;;
>   --header | --heade | --head | --hea )
>     $ac_shift
>     case $ac_optarg in
>     *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
>     esac
>     CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'"
>     ac_need_defaults=false;;
>   --he | --h)
>     # Conflict between --help and --header
>     { $as_echo "$as_me: error: ambiguous option: $1
> Try \`$0 --help' for more information." >&2
>    { (exit 1); exit 1; }; };;
>   --help | --hel | -h )
>     $as_echo "$ac_cs_usage"; exit ;;
>   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
>   | -silent | --silent | --silen | --sile | --sil | --si | --s)
>     ac_cs_silent=: ;;
> 
>   # This is an error.
>   -*) { $as_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"
>      ac_need_defaults=false ;;
4522,4553d9761
< # 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='\3'
< ac_dD='%g'
< # ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
< ac_uA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
< ac_uB='\([ 	]\)%\1#\2define\3'
< ac_uC=' '
< ac_uD='\4%g'
< # ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
< ac_eA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
< ac_eB='$%\1#\2define\3'
< ac_eC=' '
< ac_eD='%g'
< 
< if test "${CONFIG_HEADERS+set}" != set; then
< EOF
< cat >> $CONFIG_STATUS <<EOF
<   CONFIG_HEADERS="common/icucfg.h"
< EOF
< cat >> $CONFIG_STATUS <<\EOF
< fi
< for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
<   # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
<   case "$ac_file" in
<   *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
<        ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
<   *) ac_file_in="${ac_file}.in" ;;
4554a9763,9766
>   shift
> done
> 
> ac_configure_extra_args=
4556c9768,9782
<   echo creating $ac_file
---
> if $ac_cs_silent; then
>   exec 6>/dev/null
>   ac_configure_extra_args="$ac_configure_extra_args --silent"
> fi
> 
> _ACEOF
> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
> if \$ac_cs_recheck; then
>   set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
>   shift
>   \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
>   CONFIG_SHELL='$SHELL'
>   export CONFIG_SHELL
>   exec "\$@"
> fi
4558,4584c9784,9797
<   rm -f conftest.frag conftest.in conftest.out
<   ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
<   cat $ac_file_inputs > conftest.in
< 
< EOF
< 
< # Transform confdefs.h into a sed script conftest.vals that substitutes
< # the proper values into config.h.in to produce config.h.  And first:
< # Protect against being on the right side of a sed subst in config.status.
< # Protect against being in an unquoted here document in config.status.
< rm -f conftest.vals
< cat > conftest.hdr <<\EOF
< s/[\\&%]/\\&/g
< s%[\\$`]%\\&%g
< s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
< s%ac_d%ac_u%gp
< s%ac_u%ac_e%gp
< EOF
< sed -n -f conftest.hdr confdefs.h > conftest.vals
< rm -f conftest.hdr
< 
< # This sed command replaces #undef with comments.  This is necessary, for
< # example, in the case of _POSIX_SOURCE, which is predefined and required
< # on some systems where configure will not decide to define it.
< cat >> conftest.vals <<\EOF
< s%^[ 	]*#[ 	]*undef[ 	][ 	]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
< EOF
---
> _ACEOF
> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
> exec 5>>config.log
> {
>   echo
>   sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
> ## Running $as_me. ##
> _ASBOX
>   $as_echo "$ac_log"
> } >&5
> 
> _ACEOF
> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
> _ACEOF
4586,4587c9799
< # Break up conftest.vals because some shells have a limit on
< # the size of here documents, and old seds have small limits too.
---
> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
4589,4590c9801,9802
< rm -f conftest.tail
< while :
---
> # Handling of arguments.
> for ac_config_target in $ac_config_targets
4592,4616c9804,10076
<   ac_lines=`grep -c . conftest.vals`
<   # grep -c gives empty output for an empty file on some AIX systems.
<   if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
<   # Write a limited-size here document to conftest.frag.
<   echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
<   sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
<   echo 'CEOF
<   sed -f conftest.frag conftest.in > conftest.out
<   rm -f conftest.in
<   mv conftest.out conftest.in
< ' >> $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
< 
< cat >> $CONFIG_STATUS <<\EOF
<   rm -f conftest.frag conftest.h
<   echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
<   cat conftest.in >> conftest.h
<   rm -f conftest.in
<   if cmp -s $ac_file conftest.h 2>/dev/null; then
<     echo "$ac_file is unchanged"
<     rm -f conftest.h
---
>   case $ac_config_target in
>     "common/icucfg.h") CONFIG_HEADERS="$CONFIG_HEADERS common/icucfg.h" ;;
>     "icudefs.mk") CONFIG_FILES="$CONFIG_FILES icudefs.mk" ;;
>     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
>     "data/icupkg.inc") CONFIG_FILES="$CONFIG_FILES data/icupkg.inc" ;;
>     "config/Makefile.inc") CONFIG_FILES="$CONFIG_FILES config/Makefile.inc" ;;
>     "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;;
>     "stubdata/Makefile") CONFIG_FILES="$CONFIG_FILES stubdata/Makefile" ;;
>     "common/Makefile") CONFIG_FILES="$CONFIG_FILES common/Makefile" ;;
>     "i18n/Makefile") CONFIG_FILES="$CONFIG_FILES i18n/Makefile" ;;
>     "layout/Makefile") CONFIG_FILES="$CONFIG_FILES layout/Makefile" ;;
>     "layoutex/Makefile") CONFIG_FILES="$CONFIG_FILES layoutex/Makefile" ;;
>     "io/Makefile") CONFIG_FILES="$CONFIG_FILES io/Makefile" ;;
>     "extra/Makefile") CONFIG_FILES="$CONFIG_FILES extra/Makefile" ;;
>     "extra/uconv/Makefile") CONFIG_FILES="$CONFIG_FILES extra/uconv/Makefile" ;;
>     "extra/scrptrun/Makefile") CONFIG_FILES="$CONFIG_FILES extra/scrptrun/Makefile" ;;
>     "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;;
>     "tools/ctestfw/Makefile") CONFIG_FILES="$CONFIG_FILES tools/ctestfw/Makefile" ;;
>     "tools/makeconv/Makefile") CONFIG_FILES="$CONFIG_FILES tools/makeconv/Makefile" ;;
>     "tools/genrb/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genrb/Makefile" ;;
>     "tools/genuca/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genuca/Makefile" ;;
>     "tools/genccode/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genccode/Makefile" ;;
>     "tools/gencmn/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gencmn/Makefile" ;;
>     "tools/gencnval/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gencnval/Makefile" ;;
>     "tools/gennames/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gennames/Makefile" ;;
>     "tools/gentest/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gentest/Makefile" ;;
>     "tools/gennorm/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gennorm/Makefile" ;;
>     "tools/genprops/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genprops/Makefile" ;;
>     "tools/gencase/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gencase/Makefile" ;;
>     "tools/genpname/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genpname/Makefile" ;;
>     "tools/genbrk/Makefile") CONFIG_FILES="$CONFIG_FILES tools/genbrk/Makefile" ;;
>     "tools/gensprep/Makefile") CONFIG_FILES="$CONFIG_FILES tools/gensprep/Makefile" ;;
>     "tools/icuswap/Makefile") CONFIG_FILES="$CONFIG_FILES tools/icuswap/Makefile" ;;
>     "tools/pkgdata/Makefile") CONFIG_FILES="$CONFIG_FILES tools/pkgdata/Makefile" ;;
>     "tools/toolutil/Makefile") CONFIG_FILES="$CONFIG_FILES tools/toolutil/Makefile" ;;
>     "tools/dumpce/Makefile") CONFIG_FILES="$CONFIG_FILES tools/dumpce/Makefile" ;;
>     "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
>     "test/testdata/Makefile") CONFIG_FILES="$CONFIG_FILES test/testdata/Makefile" ;;
>     "test/testdata/pkgdata.inc") CONFIG_FILES="$CONFIG_FILES test/testdata/pkgdata.inc" ;;
>     "test/hdrtst/Makefile") CONFIG_FILES="$CONFIG_FILES test/hdrtst/Makefile" ;;
>     "test/intltest/Makefile") CONFIG_FILES="$CONFIG_FILES test/intltest/Makefile" ;;
>     "test/cintltst/Makefile") CONFIG_FILES="$CONFIG_FILES test/cintltst/Makefile" ;;
>     "test/iotest/Makefile") CONFIG_FILES="$CONFIG_FILES test/iotest/Makefile" ;;
>     "test/thaitest/Makefile") CONFIG_FILES="$CONFIG_FILES test/thaitest/Makefile" ;;
>     "test/testmap/Makefile") CONFIG_FILES="$CONFIG_FILES test/testmap/Makefile" ;;
>     "test/letest/Makefile") CONFIG_FILES="$CONFIG_FILES test/letest/Makefile" ;;
>     "test/threadtest/Makefile") CONFIG_FILES="$CONFIG_FILES test/threadtest/Makefile" ;;
>     "samples/Makefile") CONFIG_FILES="$CONFIG_FILES samples/Makefile" ;;
>     "samples/date/Makefile") CONFIG_FILES="$CONFIG_FILES samples/date/Makefile" ;;
>     "samples/cal/Makefile") CONFIG_FILES="$CONFIG_FILES samples/cal/Makefile" ;;
>     "samples/layout/Makefile") CONFIG_FILES="$CONFIG_FILES samples/layout/Makefile" ;;
>     "common/unicode/platform.h") CONFIG_FILES="$CONFIG_FILES common/unicode/platform.h" ;;
> 
>   *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
> $as_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
> fi
> 
> # Have a temporary directory for convenience.  Make it in the build tree
> # simply because there is no reason against having it here, and in addition,
> # creating and moving files from /tmp can sometimes cause problems.
> # Hook for its removal unless debugging.
> # Note that there is a small window in which the directory will not be cleaned:
> # after its creation but before its name has been assigned to `$tmp'.
> $debug ||
> {
>   tmp=
>   trap 'exit_status=$?
>   { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
> ' 0
>   trap '{ (exit 1); exit 1; }' 1 2 13 15
> }
> # Create a (secure) tmp directory for tmp files.
> 
> {
>   tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
>   test -n "$tmp" && test -d "$tmp"
> }  ||
> {
>   tmp=./conf$$-$RANDOM
>   (umask 077 && mkdir "$tmp")
> } ||
> {
>    $as_echo "$as_me: cannot create a temporary directory in ." >&2
>    { (exit 1); exit 1; }
> }
> 
> # Set up the scripts for CONFIG_FILES section.
> # No need to generate them if there are no CONFIG_FILES.
> # This happens for instance with `./config.status config.h'.
> if test -n "$CONFIG_FILES"; then
> 
> 
> ac_cr='
'
> ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
> if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
>   ac_cs_awk_cr='\\r'
> else
>   ac_cs_awk_cr=$ac_cr
> fi
> 
> echo 'BEGIN {' >"$tmp/subs1.awk" &&
> _ACEOF
> 
> 
> {
>   echo "cat >conf$$subs.awk <<_ACEOF" &&
>   echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
>   echo "_ACEOF"
> } >conf$$subs.sh ||
>   { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
> $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
>    { (exit 1); exit 1; }; }
> ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
> ac_delim='%!_!# '
> for ac_last_try in false false false false false :; do
>   . ./conf$$subs.sh ||
>     { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
> $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
>    { (exit 1); exit 1; }; }
> 
>   ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
>   if test $ac_delim_n = $ac_delim_num; then
>     break
>   elif $ac_last_try; then
>     { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
> $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
>    { (exit 1); exit 1; }; }
>   else
>     ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
>   fi
> done
> rm -f conf$$subs.sh
> 
> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
> cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
> _ACEOF
> sed -n '
> h
> s/^/S["/; s/!.*/"]=/
> p
> g
> s/^[^!]*!//
> :repl
> t repl
> s/'"$ac_delim"'$//
> t delim
> :nl
> h
> s/\(.\{148\}\).*/\1/
> t more1
> s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
> p
> n
> b repl
> :more1
> s/["\\]/\\&/g; s/^/"/; s/$/"\\/
> p
> g
> s/.\{148\}//
> t nl
> :delim
> h
> s/\(.\{148\}\).*/\1/
> t more2
> s/["\\]/\\&/g; s/^/"/; s/$/"/
> p
> b
> :more2
> s/["\\]/\\&/g; s/^/"/; s/$/"\\/
> p
> g
> s/.\{148\}//
> t delim
> ' <conf$$subs.awk | sed '
> /^[^""]/{
>   N
>   s/\n//
> }
> ' >>$CONFIG_STATUS || ac_write_fail=1
> rm -f conf$$subs.awk
> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
> _ACAWK
> cat >>"\$tmp/subs1.awk" <<_ACAWK &&
>   for (key in S) S_is_set[key] = 1
>   FS = ""
> 
> }
> {
>   line = $ 0
>   nfields = split(line, field, "@")
>   substed = 0
>   len = length(field[1])
>   for (i = 2; i < nfields; i++) {
>     key = field[i]
>     keylen = length(key)
>     if (S_is_set[key]) {
>       value = S[key]
>       line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
>       len += length(value) + length(field[++i])
>       substed = 1
>     } else
>       len += 1 + keylen
>   }
> 
>   print line
> }
> 
> _ACAWK
> _ACEOF
> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
> if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
>   sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
> else
>   cat
> fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
>   || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5
> $as_echo "$as_me: error: could not setup config files machinery" >&2;}
>    { (exit 1); exit 1; }; }
> _ACEOF
> 
> # 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
> 
> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
> fi # test -n "$CONFIG_FILES"
> 
> # Set up the scripts for CONFIG_HEADERS section.
> # No need to generate them if there are no CONFIG_HEADERS.
> # This happens for instance with `./config.status Makefile'.
> if test -n "$CONFIG_HEADERS"; then
> cat >"$tmp/defines.awk" <<\_ACAWK ||
> BEGIN {
> _ACEOF
> 
> # Transform confdefs.h into an awk script `defines.awk', embedded as
> # here-document in config.status, that substitutes the proper values into
> # config.h.in to produce config.h.
> 
> # Create a delimiter string that does not exist in confdefs.h, to ease
> # handling of long lines.
> ac_delim='%!_!# '
> for ac_last_try in false false :; do
>   ac_t=`sed -n "/$ac_delim/p" confdefs.h`
>   if test -z "$ac_t"; then
>     break
>   elif $ac_last_try; then
>     { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5
> $as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;}
>    { (exit 1); exit 1; }; }
4618,4622c10078,10451
<     # Remove last slash and all that follows it.  Not all systems have dirname.
<       ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
<       if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
<       # The file is in a subdirectory.
<       test ! -d "$ac_dir" && mkdir "$ac_dir"
---
>     ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
>   fi
> done
> 
> # For the awk script, D is an array of macro values keyed by name,
> # likewise P contains macro parameters if any.  Preserve backslash
> # newline sequences.
> 
> ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
> sed -n '
> s/.\{148\}/&'"$ac_delim"'/g
> t rset
> :rset
> s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
> t def
> d
> :def
> s/\\$//
> t bsnl
> s/["\\]/\\&/g
> s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
> D["\1"]=" \3"/p
> s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
> d
> :bsnl
> s/["\\]/\\&/g
> s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
> D["\1"]=" \3\\\\\\n"\\/p
> t cont
> s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
> t cont
> d
> :cont
> n
> s/.\{148\}/&'"$ac_delim"'/g
> t clear
> :clear
> s/\\$//
> t bsnlc
> s/["\\]/\\&/g; s/^/"/; s/$/"/p
> d
> :bsnlc
> s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
> b cont
> ' <confdefs.h | sed '
> s/'"$ac_delim"'/"\\\
> "/g' >>$CONFIG_STATUS || ac_write_fail=1
> 
> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
>   for (key in D) D_is_set[key] = 1
>   FS = ""
> }
> /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
>   line = \$ 0
>   split(line, arg, " ")
>   if (arg[1] == "#") {
>     defundef = arg[2]
>     mac1 = arg[3]
>   } else {
>     defundef = substr(arg[1], 2)
>     mac1 = arg[2]
>   }
>   split(mac1, mac2, "(") #)
>   macro = mac2[1]
>   prefix = substr(line, 1, index(line, defundef) - 1)
>   if (D_is_set[macro]) {
>     # Preserve the white space surrounding the "#".
>     print prefix "define", macro P[macro] D[macro]
>     next
>   } else {
>     # Replace #undef with comments.  This is necessary, for example,
>     # in the case of _POSIX_SOURCE, which is predefined and required
>     # on some systems where configure will not decide to define it.
>     if (defundef == "undef") {
>       print "/*", prefix defundef, macro, "*/"
>       next
>     }
>   }
> }
> { print }
> _ACAWK
> _ACEOF
> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
>   { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5
> $as_echo "$as_me: error: could not setup config headers machinery" >&2;}
>    { (exit 1); exit 1; }; }
> fi # test -n "$CONFIG_HEADERS"
> 
> 
> eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    "
> shift
> for ac_tag
> do
>   case $ac_tag in
>   :[FHLC]) ac_mode=$ac_tag; continue;;
>   esac
>   case $ac_mode$ac_tag in
>   :[FHL]*:*);;
>   :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5
> $as_echo "$as_me: error: invalid tag $ac_tag" >&2;}
>    { (exit 1); exit 1; }; };;
>   :[FH]-) ac_tag=-:-;;
>   :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
>   esac
>   ac_save_IFS=$IFS
>   IFS=:
>   set x $ac_tag
>   IFS=$ac_save_IFS
>   shift
>   ac_file=$1
>   shift
> 
>   case $ac_mode in
>   :L) ac_source=$1;;
>   :[FH])
>     ac_file_inputs=
>     for ac_f
>     do
>       case $ac_f in
>       -) ac_f="$tmp/stdin";;
>       *) # Look for the file first in the build tree, then in the source tree
> 	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
> 	 # because $ac_f cannot contain `:'.
> 	 test -f "$ac_f" ||
> 	   case $ac_f in
> 	   [\\/$]*) false;;
> 	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
> 	   esac ||
> 	   { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
> $as_echo "$as_me: error: cannot find input file: $ac_f" >&2;}
>    { (exit 1); exit 1; }; };;
>       esac
>       case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
>       ac_file_inputs="$ac_file_inputs '$ac_f'"
>     done
> 
>     # Let's still pretend it is `configure' which instantiates (i.e., don't
>     # use $as_me), people would be surprised to read:
>     #    /* config.h.  Generated by config.status.  */
>     configure_input='Generated from '`
> 	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
> 	`' by configure.'
>     if test x"$ac_file" != x-; then
>       configure_input="$ac_file.  $configure_input"
>       { $as_echo "$as_me:$LINENO: creating $ac_file" >&5
> $as_echo "$as_me: creating $ac_file" >&6;}
>     fi
>     # Neutralize special characters interpreted by sed in replacement strings.
>     case $configure_input in #(
>     *\&* | *\|* | *\\* )
>        ac_sed_conf_input=`$as_echo "$configure_input" |
>        sed 's/[\\\\&|]/\\\\&/g'`;; #(
>     *) ac_sed_conf_input=$configure_input;;
>     esac
> 
>     case $ac_tag in
>     *:-:* | *:-) cat >"$tmp/stdin" \
>       || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
> $as_echo "$as_me: error: could not create $ac_file" >&2;}
>    { (exit 1); exit 1; }; } ;;
>     esac
>     ;;
>   esac
> 
>   ac_dir=`$as_dirname -- "$ac_file" ||
> $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
> 	 X"$ac_file" : 'X\(//\)[^/]' \| \
> 	 X"$ac_file" : 'X\(//\)$' \| \
> 	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
> $as_echo X"$ac_file" |
>     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
> 	    s//\1/
> 	    q
> 	  }
> 	  /^X\(\/\/\)[^/].*/{
> 	    s//\1/
> 	    q
> 	  }
> 	  /^X\(\/\/\)$/{
> 	    s//\1/
> 	    q
> 	  }
> 	  /^X\(\/\).*/{
> 	    s//\1/
> 	    q
> 	  }
> 	  s/.*/./; q'`
>   { as_dir="$ac_dir"
>   case $as_dir in #(
>   -*) as_dir=./$as_dir;;
>   esac
>   test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
>     as_dirs=
>     while :; do
>       case $as_dir in #(
>       *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
>       *) as_qdir=$as_dir;;
>       esac
>       as_dirs="'$as_qdir' $as_dirs"
>       as_dir=`$as_dirname -- "$as_dir" ||
> $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
> 	 X"$as_dir" : 'X\(//\)[^/]' \| \
> 	 X"$as_dir" : 'X\(//\)$' \| \
> 	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
> $as_echo X"$as_dir" |
>     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
> 	    s//\1/
> 	    q
> 	  }
> 	  /^X\(\/\/\)[^/].*/{
> 	    s//\1/
> 	    q
> 	  }
> 	  /^X\(\/\/\)$/{
> 	    s//\1/
> 	    q
> 	  }
> 	  /^X\(\/\).*/{
> 	    s//\1/
> 	    q
> 	  }
> 	  s/.*/./; q'`
>       test -d "$as_dir" && break
>     done
>     test -z "$as_dirs" || eval "mkdir $as_dirs"
>   } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
> $as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
>    { (exit 1); exit 1; }; }; }
>   ac_builddir=.
> 
> case "$ac_dir" in
> .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
> *)
>   ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
>   # A ".." for each directory in $ac_dir_suffix.
>   ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
>   case $ac_top_builddir_sub in
>   "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
>   *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
>   esac ;;
> esac
> ac_abs_top_builddir=$ac_pwd
> ac_abs_builddir=$ac_pwd$ac_dir_suffix
> # for backward compatibility:
> ac_top_builddir=$ac_top_build_prefix
> 
> case $srcdir in
>   .)  # We are building in place.
>     ac_srcdir=.
>     ac_top_srcdir=$ac_top_builddir_sub
>     ac_abs_top_srcdir=$ac_pwd ;;
>   [\\/]* | ?:[\\/]* )  # Absolute name.
>     ac_srcdir=$srcdir$ac_dir_suffix;
>     ac_top_srcdir=$srcdir
>     ac_abs_top_srcdir=$srcdir ;;
>   *) # Relative name.
>     ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
>     ac_top_srcdir=$ac_top_build_prefix$srcdir
>     ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
> esac
> ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
> 
> 
>   case $ac_mode in
>   :F)
>   #
>   # CONFIG_FILE
>   #
> 
>   case $INSTALL in
>   [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
>   *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
>   esac
> _ACEOF
> 
> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
> # If the template does not know about datarootdir, expand it.
> # FIXME: This hack should be removed a few years after 2.60.
> ac_datarootdir_hack=; ac_datarootdir_seen=
> 
> ac_sed_dataroot='
> /datarootdir/ {
>   p
>   q
> }
> /@datadir@/p
> /@docdir@/p
> /@infodir@/p
> /@localedir@/p
> /@mandir@/p
> '
> case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
> *datarootdir*) ac_datarootdir_seen=yes;;
> *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
>   { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
> $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
> _ACEOF
> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
>   ac_datarootdir_hack='
>   s&@datadir@&$datadir&g
>   s&@docdir@&$docdir&g
>   s&@infodir@&$infodir&g
>   s&@localedir@&$localedir&g
>   s&@mandir@&$mandir&g
>     s&\\\${datarootdir}&$datarootdir&g' ;;
> esac
> _ACEOF
> 
> # Neutralize VPATH when `$srcdir' = `.'.
> # Shell code in configure.ac might set extrasub.
> # FIXME: do we really want to maintain this feature?
> cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
> ac_sed_extra="$ac_vpsub
> $extrasub
> _ACEOF
> cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
> :t
> /@[a-zA-Z_][a-zA-Z_0-9]*@/!b
> s|@configure_input@|$ac_sed_conf_input|;t t
> s&@top_builddir@&$ac_top_builddir_sub&;t t
> s&@top_build_prefix@&$ac_top_build_prefix&;t t
> s&@srcdir@&$ac_srcdir&;t t
> s&@abs_srcdir@&$ac_abs_srcdir&;t t
> s&@top_srcdir@&$ac_top_srcdir&;t t
> s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
> s&@builddir@&$ac_builddir&;t t
> s&@abs_builddir@&$ac_abs_builddir&;t t
> s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
> s&@INSTALL@&$ac_INSTALL&;t t
> $ac_datarootdir_hack
> "
> eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
>   || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
> $as_echo "$as_me: error: could not create $ac_file" >&2;}
>    { (exit 1); exit 1; }; }
> 
> test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
>   { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
>   { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
>   { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
> which seems to be undefined.  Please make sure it is defined." >&5
> $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
> which seems to be undefined.  Please make sure it is defined." >&2;}
> 
>   rm -f "$tmp/stdin"
>   case $ac_file in
>   -) cat "$tmp/out" && rm -f "$tmp/out";;
>   *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
>   esac \
>   || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
> $as_echo "$as_me: error: could not create $ac_file" >&2;}
>    { (exit 1); exit 1; }; }
>  ;;
>   :H)
>   #
>   # CONFIG_HEADER
>   #
>   if test x"$ac_file" != x-; then
>     {
>       $as_echo "/* $configure_input  */" \
>       && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
>     } >"$tmp/config.h" \
>       || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
> $as_echo "$as_me: error: could not create $ac_file" >&2;}
>    { (exit 1); exit 1; }; }
>     if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
>       { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5
> $as_echo "$as_me: $ac_file is unchanged" >&6;}
>     else
>       rm -f "$ac_file"
>       mv "$tmp/config.h" "$ac_file" \
> 	|| { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
> $as_echo "$as_me: error: could not create $ac_file" >&2;}
>    { (exit 1); exit 1; }; }
4624,4625c10453,10458
<     rm -f $ac_file
<     mv conftest.h $ac_file
---
>   else
>     $as_echo "/* $configure_input  */" \
>       && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
>       || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5
> $as_echo "$as_me: error: could not create -" >&2;}
>    { (exit 1); exit 1; }; }
4627c10460,10461
< fi; done
---
>  ;;
> 
4629,4630c10463,10465
< EOF
< cat >> $CONFIG_STATUS <<EOF
---
>   esac
> 
> done # for ac_tag
4632,4633d10466
< EOF
< cat >> $CONFIG_STATUS <<\EOF
4635,4636c10468,10469
< exit 0
< EOF
---
> { (exit 0); exit 0; }
> _ACEOF
4638,4639c10471,10502
< rm -fr confdefs* $ac_clean_files
< test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
---
> ac_clean_files=$ac_clean_files_save
> 
> test $ac_write_fail = 0 ||
>   { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5
> $as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;}
>    { (exit 1); exit 1; }; }
> 
> 
> # configure is writing to config.log, and then calls config.status.
> # config.status does its own redirection, appending to config.log.
> # Unfortunately, on DOS this fails, as config.log is still kept open
> # by configure, so config.status won't be able to write to it; its
> # output is simply discarded.  So we exec the FD to /dev/null,
> # effectively closing config.log, so it can be properly (re)opened and
> # appended to by config.status.  When coming back to configure, we
> # need to make the FD available again.
> if test "$no_create" != yes; then
>   ac_cs_success=:
>   ac_config_status_args=
>   test "$silent" = yes &&
>     ac_config_status_args="$ac_config_status_args --quiet"
>   exec 5>/dev/null
>   $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
>   exec 5>>config.log
>   # Use ||, not &&, to avoid exiting from the if with $? = 1, which
>   # would make configure fail if this is the last instruction.
>   $ac_cs_success || { (exit 1); exit 1; }
> fi
> if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
>   { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
> $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
> fi
