#!/bin/sh
# Copyright (C) 1992, 1993, 1994 Free Software Foundation
# 
# This file is part of the GNU IO Library.  This library is free
# software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2, or (at your option)
# any later version.
# 
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this library; see the file COPYING.  If not, write to the Free
# Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

#    Written by Per Bothner (bothner@cygnus.com)

# This is a shell-script that figures out various things about a
# system, and writes (to stdout) a C-style include files with
# suitable definitions, including all the standard Posix types.
# It works by compiling various test programs -- some are run through
# the C pre-processor, and the output examined.
# The test programs are only compiled, not executed, so the script
# should even if you're cross-compiling.
# It uses $CC (which defaults to cc) to compile C programs (extension .c),
# and $CXX (which defaults to gcc) to compile C++ programs (extension .C).
# The shell-script is written for libg++.a.

# Usage: gen-params [NAME1=name1 ...]
# - where an assignment (such as size_t="unsigned int" means to
# use that value, instead of trying to figure it out.

# Uncomment following line for debugging
# set -x

SED=sed

# Evaluate the arguments (which should be assignments):
for arg in "$@"; do
  # Quote arg (i.e. FOO=bar => FOO='bar'), then eval it.
  eval `echo "$arg" | ${SED} -e "s|^\(.*\)=\(.*\)|\1='\2'|"`
done

macro_prefix=${macro_prefix-"_G_"}
rootdir=`pwd`/..
gccdir=${gccdir-${rootdir}/gcc}
binutilsdir=${binutilsdir-${rootdir}/binutils}
CC=${CC-`if [ -f ${gccdir}/xgcc ] ; \
	then echo ${gccdir}/xgcc -B${gccdir}/ ; \
	else echo cc ; fi`}
CXX=${CXX-`if [ -f ${gccdir}/xgcc ] ; \
	then echo ${gccdir}/xgcc -B${gccdir}/ ; \
	else echo gcc ; fi`}
CPP=${CPP-`echo ${CC} -E`}
CONFIG_NM=${CONFIG_NM-`if [ -f ${binutilsdir}/nm.new ] ; \
	then echo ${binutilsdir}/nm.new ; \
	else echo nm ; fi`}

cat <<!EOF!
/* AUTOMATICALLY GENERATED; DO NOT EDIT! */ 
#ifndef ${macro_prefix}config_h
#define ${macro_prefix}config_h
!EOF!

if [ x"${LIB_VERSION}" != "x" ] ; then
  echo "#define ${macro_prefix}LIB_VERSION" '"'${LIB_VERSION}'"'
fi

# This program is used to test if the compiler prepends '_' before identifiers.
# It is also used to check the g++ uses '$' or '.' various places.

if test -z "${NAMES_HAVE_UNDERSCORE}" -o -z "${DOLLAR_IN_LABEL}" \
    -o -z "${VTABLE_LABEL_PREFIX}"; then
  cat >dummy.h <<!EOF!
#ifdef __GNUG__
#pragma interface
#endif
  struct filebuf {
      virtual int foo();
  };
!EOF!
  cat >dummy.C <<!EOF!
#ifdef __GNUG__
#pragma implementation
#endif
#include "dummy.h"
  int filebuf::foo() { return 0; }
  extern "C" int FUNC(int);
  int FUNC(int i) { return i+10; }
!EOF!

  if ${CXX} -O -c dummy.C ; then
    if test -z "${NAMES_HAVE_UNDERSCORE}" ; then
      if test "`${CONFIG_NM} dummy.o | grep _FUNC`" != ""; then
        NAMES_HAVE_UNDERSCORE=1
      elif test "`${CONFIG_NM} dummy.o | grep FUNC`" != ""; then
        NAMES_HAVE_UNDERSCORE=0
      else
        echo "${CONFIG_NM} failed to find FUNC in dummy.o!" 1>&2; exit -1;
      fi
    fi
    echo "#define ${macro_prefix}NAMES_HAVE_UNDERSCORE ${NAMES_HAVE_UNDERSCORE}"

    if test -z "${VTABLE_LABEL_PREFIX}" ; then
      # Determine how virtual function tables are named.  This is fragile,
      # because different nm's produce output in different formats.
      ${CONFIG_NM} dummy.o >TMP
      if [ -n "`${SED} -n -e 's/ virtual table/nope/p' <TMP`" ] ; then
	${CONFIG_NM} --no-cplus dummy.o >TMP 2>/dev/null ||
	  ${CONFIG_NM} --no-demangle dummy.o >TMP 2>/dev/null ||
	  ${CONFIG_NM} dummy.o >TMP 2>/dev/null
      fi
      # First we look for a pattern that matches historical output from g++.
      # We surround the actual label name by <> to separate it from
      # other nm junk. 
      ${SED} -n -e 's/_*vt[$_.]7*filebuf/<&>/p' <TMP >dummy.out
      # For paranoia's sake (e.g. if we're using some other C++ compiler)
      # we try a more general pattern, and append the result.
      grep -v foo <TMP \
	| ${SED} -n -e 's/[a-zA-Z0-9_.$]*filebuf[a-zA-Z0-9_.$]*/<&>/p' \
	>>dummy.out
      # Now we get rid of the <>, and any other junk on the nm output line.
      # (We get rid of <filebuf> in case nm included debugging output for
      # class filebuf itself.)  Finally, we select the first line of
      # the result, and hope that's what we wanted!
      vtab_name=`${SED} -n -e '/<filebuf>/d' -e 's/^.*<\(.*\)>.*$/\1/p' \
        <dummy.out | ${SED} -n -e '1p'`
      case "${vtab_name}" in
        *7filebuf) echo "#define ${macro_prefix}VTABLE_LABEL_HAS_LENGTH 1" ;;
        *) echo "#define ${macro_prefix}VTABLE_LABEL_HAS_LENGTH 0" ;;
      esac
      VTABLE_LABEL_PREFIX=`echo $vtab_name | ${SED} -e 's/7*filebuf//'`
    fi
    echo "#define ${macro_prefix}VTABLE_LABEL_PREFIX" '"'"${VTABLE_LABEL_PREFIX}"'"'
    if [ "${VTABLE_LABEL_PREFIX}" = "__vt_" -o \
        "${VTABLE_LABEL_PREFIX}" = "___vt_" ] ; then
      echo "#define ${macro_prefix}USING_THUNKS"
    fi

    # VTABLE_LABEL_PREFIX_ID is the same as VTABLE_LABEL_PREFIX,
    # but the former is a C identifier, while the latter is a quoted
    # st
    if [ -z ""`echo ${VTABLE_LABEL_PREFIX} | ${SED} -e 's/[a-zA-Z0-9_]//g'` ] ; then
      if [ "${NAMES_HAVE_UNDERSCORE}" = "1" ] ; then
	VTABLE_LABEL_PREFIX=`echo ${VTABLE_LABEL_PREFIX} | ${SED} -e 's/^_//'`
      fi
      echo "#define ${macro_prefix}VTABLE_LABEL_PREFIX_ID ${VTABLE_LABEL_PREFIX}"
    fi

#    if test -n "${DOLLAR_IN_LABEL}" ; then
#      echo "#define ${macro_prefix}DOLLAR_IN_LABEL ${DOLLAR_IN_LABEL}"
#    elif test "`${CONFIG_NM} dummy.o | grep 'vt[$$]7filebuf'`" != ""; then
#      echo "#define ${macro_prefix}DOLLAR_IN_LABEL 1"
#    elif test "`${CONFIG_NM} dummy.o | grep 'vt[.]7filebuf'`" != ""; then
#      echo "#define ${macro_prefix}DOLLAR_IN_LABEL 0"
#    elif test "`${CONFIG_NM} dummy.o | grep 'vtbl__7filebuf'`" != ""; then
#      echo "#define ${macro_prefix}DOLLAR_IN_LABEL 0"
#    else
#      echo "gen-params: ${CONFIG_NM} failed to find vt[.\$]filebuf in dummy.o!" 1>&2; exit 1
#    fi
  else
    # The compile failed for some reason (no C++?)
    echo "gen-params: could not compile dummy.C with ${CXX}" 1>&2; exit 1;
  fi
fi

# A little test program to check if struct stat has st_blksize.
cat >dummy.c <<!EOF!
#include <sys/types.h>
#include <sys/stat.h>
int BLKSIZE(struct stat *st)
{
    return st->st_blksize;
}
!EOF!

if ${CC} -c dummy.c >/dev/null 2>&1 ; then
  echo "#define ${macro_prefix}HAVE_ST_BLKSIZE 1"
else
  echo "#define ${macro_prefix}HAVE_ST_BLKSIZE 0"
fi

# A little test program to check if the name 'clog' is defined in libm,
# as it is under DEC UNIX.
cat >dummy.c <<!EOF!
int clog;
main () {}
!EOF!

if ${CC} dummy.c -lm 2>&1 >/dev/null | grep clog >/dev/null; then
  echo "#define ${macro_prefix}CLOG_CONFLICT 1"
fi

echo ""

# Next, generate definitions for the standard types (such as mode_t)
# compatible with those in the standard C header files.
# It works by a dummy program through the C pre-processor, and then
# using sed to search for typedefs in the output.

for hdr in wchar wctype; do
  eval $hdr=0
  cat >dummy.c <<EOF
#include <${hdr}.h>
EOF
  if ${CPP} dummy.c >/dev/null 2>&1 ; then eval $hdr=1; fi
done

cat >dummy.c <<!EOF!
#include <sys/types.h>
#include <stddef.h>
#ifdef __STDC__
#include <stdarg.h>
#else /* !__STDC__ */
#include <varargs.h>
#endif /* __STDC__ */
#include <stdio.h>
#include <time.h>
#include <signal.h>
#ifdef __STDC__
#include <limits.h>
#endif
#if WCHAR == 1
#include <wchar.h>
#endif
#if WCTYPE == 1
#include <wctype.h>
#endif
#ifdef size_t
typedef size_t Xsize_t;
#elif defined(__SIZE_TYPE__)
typedef __SIZE_TYPE__ Xsize_t;
#endif
#ifdef ptrdiff_t
typedef ptrdiff_t Xptrdiff_t;
#elif defined(__PTRDIFF_TYPE__)
typedef __PTRDIFF_TYPE__ Xptrdiff_t;
#endif
#ifdef wchar_t
typedef wchar_t Xwchar_t;
#elif defined(__WCHAR_TYPE__)
typedef __WCHAR_TYPE__ Xwchar_t;
#endif
#ifdef va_list
typedef va_list XXXva_list;
#endif
#ifdef BUFSIZ
long XBUFSIZ=BUFSIZ;
#endif
#ifdef FOPEN_MAX
long XFOPEN_MAX=FOPEN_MAX;
#endif
#ifdef FILENAME_MAX
long XFILENAME_MAX=FILENAME_MAX;
#endif
#ifdef SHRT_MAX
long XSHRT_MAX=SHRT_MAX;
#endif
#ifdef INT_MAX
long XINT_MAX=INT_MAX;
#endif
#ifdef LONG_MAX
long XLONG_MAX=LONG_MAX;
#endif
#ifdef LONG_LONG_MAX
long XLONG_LONG_MAX=LONG_LONG_MAX;
#endif
!EOF!

if ${CPP} dummy.c -DWCHAR=$wchar -DWCTYPE=$wctype >TMP ; then true
else
  echo "gen-params: could not invoke ${CPP} on dummy.c" 1>&2 ; exit 1
fi
tr '	' ' ' <TMP >dummy.out

for TYPE in dev_t clock_t fpos_t gid_t ino_t mode_t nlink_t off_t pid_t ptrdiff_t sigset_t size_t ssize_t time_t uid_t va_list wchar_t wint_t int16_t uint16_t int32_t uint_32_t u_int16_t u_int32_t; do
    eval IMPORTED=\$$TYPE
    if [ -n "${IMPORTED}" ] ; then
	eval "$TYPE='$IMPORTED'"
    else
	t=$TYPE
	VALUE=''

	# Follow `typedef VALUE TYPE' chains, but don't loop indefinitely.
	for iteration in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
	    # Search dummy.out for a typedef for X*$t.
	    sed_script="
		s/unsigned long long int/_G_ullong/g
		s/long long int/_G_llong/g
		s/unsigned long long/_G_ullong/g
		s/long long/_G_llong/g
		/.*typedef  *\\(.*[^ ]\\)  *X*$t *;.*/{s||\1|;p;q;}
		/.*typedef  *\\(.*[^ a-zA-Z0-9_]\\)X*$t *;.*/{s||\1|;p;q;}
	    "
	    t=`${SED} -n "$sed_script" <dummy.out`
	    case "$t" in
	      '')
		break;;
	      *)
		# Found a type $t; save it in VALUE.
		VALUE=$t
		# If it won't cause problems in matching,
		# look for a typedef for it in turn.
		case "$VALUE" in
		  *.* | */* | *\ * | *\** | *\[* | *\\*) break;;
		esac;;
	    esac
	done

	case "$VALUE" in
	  ?*) eval "$TYPE=\"$VALUE\""
	esac
    fi
done

# Look for some standard macros.
for NAME in BUFSIZ FOPEN_MAX FILENAME_MAX NULL; do
    eval IMPORTED=\$$NAME
    if [ -n "${IMPORTED}" ] ; then
	eval "$NAME='$IMPORTED /* specified */'"
    else
	rm -f TMP
	${SED} -n -e 's| *;|;|g' -e "s|long X${NAME}= *\(.*\);|\1|w TMP" \
	  <dummy.out>/dev/null
	# Now select the first definition.
	if [ -s TMP ]; then
	    eval "$NAME='"`${SED} -e '2,$d' <TMP`"'"
	fi
    fi
done

# These macros must be numerical constants; strip any trailing 'L's.
for NAME in SHRT_MAX INT_MAX LONG_MAX LONG_LONG_MAX; do
    eval IMPORTED=\$$NAME
    if [ -n "${IMPORTED}" ] ; then
	eval "$NAME='$IMPORTED /* specified */'"
    else
	rm -f TMP
	${SED} -n -e 's| *;|;|g' -e "s|long X${NAME}= *\([0-9]*\)L* *;|\1|w TMP" \
	  <dummy.out>/dev/null
	# Now select the first definition.
	if [ -s TMP ]; then
	    eval "$NAME='"`${SED} -e '2,$d' <TMP`"'"
	fi
    fi
done

# Figure out integral type sizes.

default_int16='short /* deduction failed */'
default_int32='long /* deduction failed */'
INT16=32767
INT32=2147483647

if [ "${SHRT_MAX}" = $INT16 ] ; then
  default_int16='short /* deduced */'
  if [ "${LONG_MAX}" = $INT32 ] ; then
    default_int32='long /* deduced */'
  elif [ "${INT_MAX}" = $INT32 ] ; then
    default_int32='int /* deduced */'
  fi
fi

[ -n "$u_int16_t" ] && uint16_t="$u_int16_t"
[ -n "$u_int32_t" ] && uint32_t="$u_int32_t"

[ -z  "$int16_t" ] &&  int16_t="$default_int16"
[ -z "$uint16_t" ] && uint16_t="unsigned $int16_t"
[ -z  "$int32_t" ] &&  int32_t="$default_int32"
[ -z "$uint32_t" ] && uint32_t="unsigned $int32_t"

cat <<!EOF!
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
typedef          int   ${macro_prefix}int8_t __attribute__((__mode__(__QI__)));
typedef unsigned int  ${macro_prefix}uint8_t __attribute__((__mode__(__QI__)));
typedef          int  ${macro_prefix}int16_t __attribute__((__mode__(__HI__)));
typedef unsigned int ${macro_prefix}uint16_t __attribute__((__mode__(__HI__)));
typedef          int  ${macro_prefix}int32_t __attribute__((__mode__(__SI__)));
typedef unsigned int ${macro_prefix}uint32_t __attribute__((__mode__(__SI__)));
typedef          int  ${macro_prefix}int64_t __attribute__((__mode__(__DI__)));
typedef unsigned int ${macro_prefix}uint64_t __attribute__((__mode__(__DI__)));
#if __GNUC__ > 2 || __GNUC_MINOR__ >= 8
__extension__ typedef long long ${macro_prefix}llong;
__extension__ typedef unsigned long long ${macro_prefix}ullong;
#endif
#else
typedef  $int16_t  ${macro_prefix}int16_t;
typedef $uint16_t ${macro_prefix}uint16_t;
typedef  $int32_t  ${macro_prefix}int32_t;
typedef $uint32_t ${macro_prefix}uint32_t;
#endif

typedef ${clock_t-int /* default */} ${macro_prefix}clock_t;
typedef ${dev_t-int /* default */} ${macro_prefix}dev_t;
typedef ${fpos_t-long /* default */} ${macro_prefix}fpos_t;
typedef ${gid_t-int /* default */} ${macro_prefix}gid_t;
typedef ${ino_t-int /* default */} ${macro_prefix}ino_t;
typedef ${mode_t-int /* default */} ${macro_prefix}mode_t;
typedef ${nlink_t-int /* default */} ${macro_prefix}nlink_t;
typedef ${off_t-long /* default */} ${macro_prefix}off_t;
typedef ${pid_t-int /* default */} ${macro_prefix}pid_t;
#ifndef __PTRDIFF_TYPE__
#define __PTRDIFF_TYPE__ ${ptrdiff_t-long int /* default */}
#endif
typedef __PTRDIFF_TYPE__ ${macro_prefix}ptrdiff_t;
typedef ${sigset_t-int /* default */} ${macro_prefix}sigset_t;
#ifndef __SIZE_TYPE__
#define __SIZE_TYPE__ ${size_t-unsigned long /* default */}
#endif
typedef __SIZE_TYPE__ ${macro_prefix}size_t;
typedef ${time_t-int /* default */} ${macro_prefix}time_t;
typedef ${uid_t-int /* default */} ${macro_prefix}uid_t;
typedef ${wchar_t-int /* default */} ${macro_prefix}wchar_t;

#define ${macro_prefix}BUFSIZ ${BUFSIZ-1024 /* default */}
#define ${macro_prefix}FOPEN_MAX ${FOPEN_MAX-32 /* default */}
#define ${macro_prefix}FILENAME_MAX ${FILENAME_MAX-1024 /* default */}
#if defined (__cplusplus) || defined (__STDC__)
#define ${macro_prefix}ARGS(ARGLIST) ARGLIST
#else
#define ${macro_prefix}ARGS(ARGLIST) ()
#endif
#if !defined (__GNUG__) || defined (__STRICT_ANSI__)
#define ${macro_prefix}NO_NRV
#endif
#if !defined (__GNUG__)
#define _G_NO_EXTERN_TEMPLATES
#endif
!EOF!

# ssize_t is the signed version of size_t
if [ -n "${ssize_t}" ] ; then
    echo "typedef ${ssize_t} ${macro_prefix}ssize_t;"
elif [ -z "${size_t}" ] ; then
    echo "typedef long ${macro_prefix}ssize_t;"
else
    # Remove "unsigned" from ${size_t} to get ${ssize_t}.
    tmp="`echo ${size_t} | ${SED} -e 's|unsigned||g' -e 's|  | |g'`"
    if [ -z "$tmp" ] ; then
	tmp=int
    else
	# check $tmp doesn't conflict with <unistd.h>
	echo "#include <unistd.h>
	extern $tmp read();" >dummy.c
	${CC} -c dummy.c >/dev/null 2>&1 || tmp=int
    fi
    echo "typedef $tmp /* default */ ${macro_prefix}ssize_t;"
fi

# wint_t is often the integral type to which wchar_t promotes.
if [ -z "${wint_t}" ] ; then
  for TYPE in int 'unsigned int' 'long int' 'long unsigned int'; do
    cat >dummy.C <<!EOF!
#ifndef __WCHAR_TYPE__
#define __WCHAR_TYPE__ ${wchar_t-int /* default */}
#endif
typedef __WCHAR_TYPE__ ${macro_prefix}wchar_t;
void foo ($TYPE);
void foo (double);
void bar (${macro_prefix}wchar_t w)
{
  foo (w);
}
!EOF!
    if ${CXX} -c dummy.C >/dev/null 2>&1 ; then  
      wint_t="$TYPE /* default */"
      break
    fi
  done
fi
echo "typedef ${wint_t-int /* wchar_t is broken */} ${macro_prefix}wint_t;"

# va_list can cause problems (e.g. some systems have va_list as a struct).
# Check to see if ${va_list-char*} really is compatible with stdarg.h.
cat >dummy.C <<!EOF!
#define X_va_list ${va_list-char* /* default */}
extern long foo(X_va_list ap); /* Check that X_va_list compiles on its own */
extern "C" {
#include <stdarg.h>
}
long foo(X_va_list ap) { return va_arg(ap, long); }
long bar(int i, ...)
{ va_list ap; long j; va_start(ap, i); j = foo(ap); va_end(ap); return j; }
!EOF!
if ${CXX} -c dummy.C >/dev/null 2>&1 ; then
  # Ok: We have something that works.
  echo "typedef ${va_list-char* /* default */} ${macro_prefix}va_list;"
else
  echo "#define ${macro_prefix}NEED_STDARG_H"
  # Check and see if we have __gnuc_va_list, as we might set up define
  # loops if we use va_list.
  cat >dummy.C <<!EOF!
#include <stdarg.h>
long foo(__gnuc_va_list ap) { return va_arg(ap, long); }
!EOF!
  if ${CXX} -c dummy.C >/dev/null 2>&1 ; then
    echo "#define ${macro_prefix}va_list __gnuc_va_list"
  else
    echo "#define ${macro_prefix}va_list va_list"
  fi
fi

cat >dummy.c <<!EOF!
#include <signal.h>
extern int (*signal())();
extern int dummy (int);
main()
{
    int (*oldsig)(int) = signal (1, dummy);
    (void) signal (2, oldsig);
    return 0;
}
!EOF!
if ${CC} -c dummy.c >/dev/null 2>&1 ; then
  echo "#define ${macro_prefix}signal_return_type int"
else
  echo "#define ${macro_prefix}signal_return_type void"
fi

# check sprintf return type

cat >dummy.c <<!EOF!
#include <stdio.h>
extern int sprintf(); char buf[100];
int main() { return sprintf(buf, "%d", 34); }
!EOF!
if ${CC} -c dummy.c >/dev/null 2>&1 ; then
  echo "#define ${macro_prefix}sprintf_return_type int"
else
  echo "#define ${macro_prefix}sprintf_return_type char*"
fi

if test -n "${HAVE_ATEXIT}" ; then
 echo "#define ${macro_prefix}HAVE_ATEXIT ${HAVE_ATEXIT}"
else
  cat >dummy.c <<!EOF!
#include <stdlib.h>
int main()
{
  atexit (0);
}
!EOF!
  if ${CC} dummy.c >/dev/null 2>&1 ; then
    echo "#define ${macro_prefix}HAVE_ATEXIT 1"
  else
    echo "#define ${macro_prefix}HAVE_ATEXIT 0"
  fi
fi


# *** Check for presence of certain include files ***

# check for sys/resource.h

if test -n "${HAVE_SYS_RESOURCE}" ; then
 echo "#define ${macro_prefix}HAVE_SYS_RESOURCE ${HAVE_SYS_RESOURCE}"
else
  cat >dummy.c <<!EOF!
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
  int main()
  {
    struct rusage res;
    getrusage(RUSAGE_SELF, &res);
    return (int)(res.ru_utime.tv_sec + (res.ru_utime.tv_usec / 1000000.0));
  }
!EOF!
  # Note: We link because some systems have sys/resource, but not getrusage().
  if ${CC} dummy.c >/dev/null 2>&1 ; then
    echo "#define ${macro_prefix}HAVE_SYS_RESOURCE 1"
  else
    echo "#define ${macro_prefix}HAVE_SYS_RESOURCE 0"
  fi
fi

# check for struct tms in sys/times.h

if test -n "${HAVE_SYS_TIMES}" ; then
 echo "#define ${macro_prefix}HAVE_SYS_TIMES ${HAVE_SYS_TIMES}"
else
 cat >dummy.c <<!EOF!
#include <sys/types.h>
#include <sys/times.h>
  int main()
  {
    struct tms s;
    return s.tms_utime;
  }
!EOF!
  if ${CC} -c dummy.c >/dev/null 2>&1 ; then
    echo "#define ${macro_prefix}HAVE_SYS_TIMES 1"
  else
    echo "#define ${macro_prefix}HAVE_SYS_TIMES 0"
  fi
fi

# check for sys/socket.h

if test -n "${HAVE_SYS_SOCKET}" ; then
 echo "#define ${macro_prefix}HAVE_SYS_SOCKET ${HAVE_SYS_SOCKET}"
else
  echo '#include <sys/types.h>' >dummy.c
  echo '#include <sys/socket.h>' >>dummy.c
  if ${CC} -c dummy.c >/dev/null 2>&1 ; then
    echo "#define ${macro_prefix}HAVE_SYS_SOCKET 1"
  else
    echo "#define ${macro_prefix}HAVE_SYS_SOCKET 0"
  fi
fi

# check for sys/cdefs.h

if test -n "${HAVE_SYS_CDEFS}" ; then
 echo "#define ${macro_prefix}HAVE_SYS_CDEFS ${HAVE_SYS_CDEFS}"
else
  echo '#include <sys/cdefs.h>' >dummy.c
  echo 'extern int myfunc __P((int, int));' >>dummy.c
  if ${CC} -c dummy.c >/dev/null 2>&1 ; then
    echo "#define ${macro_prefix}HAVE_SYS_CDEFS 1"
  else
    echo "#define ${macro_prefix}HAVE_SYS_CDEFS 0"
  fi
fi

# Check for a (Posix-compatible) sys/wait.h */

if test -n "${HAVE_SYS_WAIT}" ; then
 echo "#define ${macro_prefix}HAVE_SYS_WAIT ${HAVE_SYS_WAIT}"
else
  cat >dummy.c <<!EOF!
#include <sys/types.h>
#include <sys/wait.h>
  int f() { int i; wait(&i); return i; }
!EOF!
  if ${CC} -c dummy.c >/dev/null 2>&1 ; then
    echo "#define ${macro_prefix}HAVE_SYS_WAIT 1"
  else
    echo "#define ${macro_prefix}HAVE_SYS_WAIT 0"
  fi
fi

if test -n "${HAVE_UNISTD}" ; then
 echo "#define ${macro_prefix}HAVE_UNISTD ${HAVE_UNISTD}"
else
  echo '#include <unistd.h>' >dummy.c
  if ${CC} -c dummy.c >/dev/null 2>&1 ; then
    echo "#define ${macro_prefix}HAVE_UNISTD 1"
  else
    echo "#define ${macro_prefix}HAVE_UNISTD 0"
  fi
fi

if test -n "${HAVE_DIRENT}" ; then
 echo "#define ${macro_prefix}HAVE_DIRENT ${HAVE_DIRENT}"
else
  echo '#include <sys/types.h>
#include <dirent.h>' >dummy.c
  if ${CC} -c dummy.c >/dev/null 2>&1 ; then
    echo "#define ${macro_prefix}HAVE_DIRENT 1"
  else
    echo "#define ${macro_prefix}HAVE_DIRENT 0"
  fi
fi

if test -n "${HAVE_CURSES}" ; then
 echo "#define ${macro_prefix}HAVE_CURSES ${HAVE_CURSES}"
else
  echo '#include <curses.h>' >dummy.c
  if ${CC} -c dummy.c >/dev/null 2>&1 ; then
    echo "#define ${macro_prefix}HAVE_CURSES 1"
  else
    echo "#define ${macro_prefix}HAVE_CURSES 0"
  fi
fi

# There is no test for this at the moment; it is just set by the
# configuration files.
if test -n "${MATH_H_INLINES}" ; then
  echo "#define ${macro_prefix}MATH_H_INLINES ${MATH_H_INLINES}"
else
  echo "#define ${macro_prefix}MATH_H_INLINES 0"
fi

if test -n "${HAVE_BOOL}" ; then
 echo "#define ${macro_prefix}HAVE_BOOL ${HAVE_BOOL}"
else
  echo 'bool i=true,j=false;' >dummy.C
  if ${CXX} -c dummy.C >/dev/null 2>&1 ; then
    echo "#define ${macro_prefix}HAVE_BOOL 1"
  else
    echo "#define ${macro_prefix}HAVE_BOOL 0"
  fi
fi

if test -n "${NO_USE_DTOA}" ; then
    echo "#define ${macro_prefix}NO_USE_DTOA 1"
fi
if test -n "${USE_INT32_FLAGS}" ; then
    echo "#define ${macro_prefix}USE_INT32_FLAGS 1"
fi

# A little test program to check if __printf_fp is available.
cat >dummy.c <<EOF
int main()
{
    return __printf_fp ();
}
EOF

if ${CC} dummy.c >/dev/null 2>&1 ; then
  echo "#define ${macro_prefix}HAVE_PRINTF_FP 1"
  echo "#define ${macro_prefix}HAVE_LONG_DOUBLE_IO 1"
else
  echo "#define ${macro_prefix}HAVE_PRINTF_FP 0"
  echo "#define ${macro_prefix}HAVE_LONG_DOUBLE_IO 0"
fi

# Uncomment the following line if you don't have working templates.
# echo "#define ${macro_prefix}NO_TEMPLATES"

# Override bogus definitions of NULL in system headers.
cat <<EOF
#undef NULL
#define __need_NULL
#include <stddef.h>
EOF

rm -f dummy.C dummy.o dummy.c dummy.out TMP core a.out

echo "#endif /* !${macro_prefix}config_h */"
