#! /bin/sh

trap "rm -f tmp*; exit 0" 0
trap "rm -f tmp*; exit 1" 1 2 3 15

die()
{
	echo "$*"
	exit 1
}

yorn()
{
	while :
	do
		read ans
		case "${ans:-$1}" in
		[Yy]*)	return 0
			;;
		[Nn]*)	return 1
			;;
		*)	nonl "Please respond 'Y' or 'N': "
			;;
		esac
  done
}

find_exe()
{
for i in `echo $PATH |
	 sed -e 's/^:/.:/' \
		 -e 's/::/:.:/g' \
		 -e 's/:$/:./' \
		 -e 's/:/ /g`
do
	if [ -x "$i/$1" ]
	then
		return 0
	fi
done
return 1
}

case `echo -n` in
-n)	nonl() { echo "$*\c"; };;
*)	nonl() { echo -n "$*"; };;
esac

echo "\nXC Configuration Utility
\t-- by lar3ry gensch, ESQ, and jean-pierre radley"
echo "\nWhen a default answer is suggested [in brackets],"
echo "you may accept it by just hitting <ENTER>.\n"

need_answers=true

if [ -f configure.out ]
then
	echo "Configure has already been run."
	nonl "Do you wish to use the previous results? (Y/N) [N]: "
	if yorn N
	then
		. ./configure.out
		need_answers=false
  fi
fi

if $need_answers
then
	UUCPLIBDIR=/usr/lib/uucp

	if [ ! -d "$UUCPLIBDIR" ]
	then
		echo "*** Warning: Cannot determine UUCP lib directory"
		echo "***      Using $UUCPLIBDIR"
		echo
	fi

	if [ -f $UUCPLIBDIR/ungetty -a -f /xenix ]
	then
		DIDO="2"	
	elif [ -d /var/spool/locks -a -f /usr/include/sys/mkdev.h ]
	then
		DIDO="4"
	elif [ -f /unix ]
	then
		DIDO="3"
	else
		DIDO="0"
	fi

	echo "\nDetermining compile environment ..."

	while :
	do
		if find_exe gcc
		then
			CC=gcc
		elif find_exe cc
		then
			CC=cc
		else
			CC=""
		fi

		nonl "C compiler to use [${CC}]: "
		read cc

		[ -n "$cc" ] && CC="$cc"

		if find_exe $CC
		then
			break
		fi
	done

	echo
	echo "C Compiler is $CC"
	[ $CC = gcc ] && COPTS=-O2
	[ $CC = cc ] && COPTS=-O

	default="$COPTS"
	while :
	do
		echo
		nonl "Enter compiler options [$default]: "
		read ans

		[ -n "$ans" ] && COPTS="$ans"

		echo "main() { }" >tmp.c
		$CC $COPTS tmp.c -o tmp >/dev/null 2>&1 && break

		echo "Those options don't seem quite right... try again."
	done

	echo "\nDetermining where to find screen control functions ..."

	echo "main() { tgetent(); }" >tmp.c
	for LDFLAGS in -ltermcap -ltinfo -lcurses ""
	do
		$CC tmp.c -o tmp $LDFLAGS >/dev/null 2>&1 && break
	done
		
	if [ ! $LDFLAGS ]
	then
		echo "\n*** We tried -ltermcap, -ltinfo, and -lcurses without success."
		while :
		do
			nonl "Enter a '-lLIB' option for a screen control library: "
			read LDFLAGS

			$CC tmp.c -o tmp $LDFLAGS >/dev/null 2>&1 && break

			echo "That isn't finding the tgetent() function... try again.\n"
		done
	fi

	X=`expr "$COPTS" : '.*xenix`
	if [ $X = 0 -a \( -f /lib/libc_s.a -o -f /usr/lib/libc_s.a \) ]
	then
		LDFLAGS="$LDFLAGS -lc_s"
	fi

	echo "\nLDFLAGS = $LDFLAGS"

	echo "\nChecking run time library for functions ..."

	eval `for i in "dup2(i,j)" \
		"memset(s,c,i)" \
		"strchr(s,c)" \
		"strrchr(s,c)" \
		"strdup(s)" \
		"strstr(s,t)"
		do
			funct=\`echo "$i" | sed 's/(.*$//'\`

			cat >tmp.c <<!
int i,j;
char *s,*t;
char c;
main() { $i; }
!

			$CC $COPTS -o tmp tmp.c $LDFLAGS >/dev/null 2>&1 || rm -f tmp
			if [ -f tmp ]
			then
				val="1"
				echo "  $funct was found" 1>&2
			else
				val="0"
				echo "  $funct was not found" 1>&2
			fi

			rm -f tmp*
			echo "have_${funct}=$val"
		done`

	echo "\nChecking <sys/types.h> for typedefs ..."

	eval `for i in pid_t time_t ulong unchar ushort
		do
			if [ ! -f /usr/include/sys/types.h ]
			then
				echo "have_$i=false"
				continue
			fi

			cat >tmp.c <<!
#include <sys/types.h>
$i foo;
!

			$CC $COPTS -c tmp.c >/dev/null 2>&1
			if [ -f tmp.o ]
			then
				val=1
				echo "  $i was found" 1>&2
			else
				val=0
				echo "  $i was not found" 1>&2
			fi
			echo "have_$i=$val"
			rm -f tmp*
		done`

	echo "\nChecking for return type of signal() ..."
	cat >tmp.c <<!
#include <sys/types.h>
#include <signal.h>
#ifdef signal
#undef signal
#endif
extern void (*signal ()) ();
int main() { exit(0); }
int t() { int i; }
!

	$CC $COPTS -c tmp.c >/dev/null 2>&1
	if [ -f tmp.o ]
	then
		RETSIGTYPE=void
		echo "  signal() returns \"void\""
	else
		echo "  signal() returns \"int\""
		RETSIGTYPE=int
	fi

	rm -f tmp*

	echo "\nXC Local Configuration Section"

	while :
	do
		nonl "Enter user name to own xc [uucp]: "
		read ans
		OWNER="${ans:-uucp}"

		case "$OWNER" in
			*:*)	echo "Invalid user name"
				;;
			*)	grep "^${OWNER}:" /etc/passwd >/dev/null 2>&1 && break
				echo "User $OWNER not found in /etc/passwd"
				;;
		esac
	done

	while :
	do
		nonl "Enter group name to own xc [uucp]: "
		read ans
		GROUP="${ans:-uucp}"

		case "$GROUP" in
			*:*)	echo "Invalid group name"
				;;
			*)	grep "^${GROUP}:" /etc/group >/dev/null 2>&1 && break
				echo "Group $GROUP not found in /etc/group"
				;;
		esac
	done

	while :
	do
		nonl "Enter permissions for xc executable [4755]: "
		read ans
		BINMODE="${ans:-4755}"

		case "$BINMODE" in
			[0-1][0-7][0-7][0-7]|[0-7][0-7][0-7])
				echo "*** Warning permissions are not SUID or SGID"
				INSTALL="install"
				break
				;;
			[2-7][0-7][0-7][0-7])
				INSTALL="install.suid"
				INSTPREF="su to 'root', and then "
				break
				;;
			*)	echo "Invalid permissions"
				;;
		esac
	done

	echo

	for f in tbl col nroff
	do
		if find_exe $f
		then
			CATMAN=true
		else
			echo "*** Warning: Cannot find $f, so cannot format xc man page"
			CATMAN=false
		fi
	done

	if $CATMAN
	then
		MDIR=""
		MANDIR=""
		MANEXT=""

		for i in /usr/local/man /usr/catman /usr/man
		do
			if [ -d "$i" ]
			then
				MANDIR=$i
				break
			fi
		done

		if [ -z "$MANDIR" ]
		then
			echo "*** Warning: Cannot determine MANDIR"
			echo "       Using /usr/man/mann"
			MANDIR=/usr/man
			MDIR=mann
			MANEXT=n
		else
			eval `for i in cat man
			do
				for j in n l 1 L LOCAL
				do
					dir=${i}${j}
					if [ -d "$MANDIR/$dir" ]
					then
						echo MDIR=$dir
						echo MANEXT=$j
						break 2
					fi
					dir=${i}.${j}
					if [ -d "$MANDIR/$dir" ]
					then
						echo MDIR=$dir
						echo MANEXT=$j
						break 2
					fi
				done
			done`

			if [ -z "$MDIR" ]
			then
				echo "*** Warning: Could not locate online man pages"
				MDIR=mann
				MANEXT=n
			fi
		fi

		echo "Using MANDIR $MANDIR/$MDIR ..."

		case "$MDIR" in
			cat*)	CATMAN=true
				;;
			*)		CATMAN=false
				;;
		esac

		echo

		while :
		do
			if find_exe gzip
			then
				SHRINK=gzip
			elif find_exe compress
			then
				SHRINK=compress
			elif find_exe pack
			then
				SHRINK=pack
			fi

			nonl "Program to compact the man page [$SHRINK] ? "
			read ans
			SHRINK=${ans:-$SHRINK}

			[ $SHRINK = gzip ] && SHRINKOPTS=-9 || SHRINKOPTS=""
			if [ -n "$SHRINK" ]
			then
				nonl "Any options to use with \"$SHRINK\" [$SHRINKOPTS]? "
				read ans
				SHRINKOPTS=${ans:-$SHRINKOPTS}
			fi

			if find_exe $SHRINK
			then
				break
			fi
		done
	fi

	echo
	nonl "Do you wish to add DEBUG code into XC? (Y/N) [Y]: "
	if yorn Y
	then
		DEBUG="1"
	else
		DEBUG="0"
	  fi

	echo
	nonl "Do you wish to disallow shell escapes? (Y/N) [N]: "

	if yorn N
	then
		NOSHELL="1"
	else
		NOSHELL="0"
	fi

	echo
	nonl "Does dropping carrier cause your modem to hang up? (Y/N) [Y]: "

	if yorn Y
	then
		DTR_DROPS_CARRIER="1"
	else
		DTR_DROPS_CARRIER="0"
	fi

	echo
	default=""
	for i in /u/bin /usr/local/bin /usr/lbin /usr/bin/local
	do
		if [ -d "$i" ]
		then
			default="$i"
			break
		fi
	done

	while :
	do
		nonl "Enter installation directory [$default]: "
		read ans

		INSDIR="${ans:-$default}"

		case "$INSDIR" in
			/*)	[ -d "$INSDIR" ] && break
				echo "Directory $ans was not found"
				;;
			*)	echo "Directory $ans is not an absolute path"
				;;
		esac
	done

	echo
	default=""
	for i in /u/lib /usr/local/lib /usr/lib/local /usr/lib 
	do
		if [ -d "$i" ]
		then
		  default="$i/xc"
		  break
		fi
	done

	while :
	do
		nonl "Enter default XC data file directory [$default]: "
		read ans
		LIBDIR=${ans:-$default}

		case "$LIBDIR" in
			/*)	[ -d "$LIBDIR" ] && break
				parent=`dirname $LIBDIR`
				[ -d "$parent" -a ! -f $LIBDIR ] && break
				if [ -d "$parent" ]
				then
					echo "$LIBDIR is not a directory"
				else
					echo "Parent directory $parent not found"
				fi
				;;
			*)	echo "Directory $LIBDIR is not an absolute path"
				;;
		esac
	done

	DATE=`date`
	USER=`id | sed -e 's/[^(]*(//' -e s'/).*$//'`

	cat >./configure.out <<!
BINMODE="$BINMODE"
CATMAN="$CATMAN"
CC="$CC"
COPTS="$COPTS"
DATE="$DATE"
DEBUG="$DEBUG"
DIDO="$DIDO"
DTR_DROPS_CARRIER="$DTR_DROPS_CARRIER"
GROUP="$GROUP"
RETSIGTYPE="$RETSIGTYPE"
have_dup2="$have_dup2"
have_memset="$have_memset"
have_pid_t="$have_pid_t"
have_strchr="$have_strchr"
have_strdup="$have_strdup"
have_strrchr="$have_strrchr"
have_strstr="$have_strstr"
have_time_t="$have_time_t"
have_ulong="$have_ulong"
have_unchar="$have_unchar"
have_ushort="$have_ushort"
INSDIR="$INSDIR"
INSTALL="$INSTALL"
INSTPREF="$INSTPREF"
LDFLAGS="$LDFLAGS"
LIBDIR="$LIBDIR"
MANDIR="$MANDIR"
MANEXT="$MANEXT"
MDIR="$MDIR"
NOSHELL="$NOSHELL"
OWNER="$OWNER"
USER="$USER"
SHRINK="$SHRINK"
SHRINKOPTS="$SHRINKOPTS"
!
fi

set -e

echo "\nCreating xc.h ..."

sed "
s;{{DATE}};$DATE;g
s;{{DEBUG}};$DEBUG;g
s;{{DIDO}};$DIDO;g
s;{{DTR_DROPS_CARRIER}};$DTR_DROPS_CARRIER;g
s;{{HAVE_DUP2}};$have_dup2;g
s;{{HAVE_MEMSET}};$have_memset;g
s;{{HAVE_PID_T}};$have_pid_t;g
s;{{HAVE_TIME_T}};$have_time_t;g
s;{{HAVE_STRCHR}};$have_strchr;g
s;{{HAVE_STRDUP}};$have_strdup;g
s;{{HAVE_STRRCHR}};$have_strrchr;g
s;{{HAVE_STRSTR}};$have_strstr;g
s;{{HAVE_ULONG}};$have_ulong;g
s;{{HAVE_UNCHAR}};$have_unchar;g
s;{{HAVE_USHORT}};$have_ushort;g
s;{{LIBDIR}};$LIBDIR;g
s;{{NOSHELL}};$NOSHELL;g
s;{{RETSIGTYPE}};$RETSIGTYPE;g
s;{{USER}};$USER;g
" xc.h.in >xc.h

echo "\nCreating Makefile.xc ..."

sed "
s;{{BINMODE}};$BINMODE;g
s;{{CATMAN}};$CATMAN;g
s;{{CC}};$CC;g
s;{{COPTS}};$COPTS;g
s;{{DATE}};$DATE;g
s;{{GROUP}};$GROUP;g
s;{{INSDIR}};$INSDIR;g
s;{{INSTALL}};$INSTALL;g
s;{{INSTPREF}};$INSTPREF;g
s;{{LDFLAGS}};$LDFLAGS;g
s;{{LIBDIR}};$LIBDIR;g
s;{{MANDIR}};$MANDIR;g
s;{{MANEXT}};$MANEXT;g
s;{{MDIR}};$MDIR;g
s;{{OWNER}};$OWNER;g
s;{{USER}};$USER;g
s;{{SHRINK}};$SHRINK;g
s;{{SHRINKOPTS}};$SHRINKOPTS;g
" Makefile.in >Makefile.xc

echo "\nXC Configuration is now complete ...\nTry running \"make\"."

exit 0
