#!/bin/bash

ZLIB=-1
BZLIB=-1
CCPOS="gcc cc `which gcc | grep -v which` `which cc | grep -v which` `ls /usr/bin/*cc* /usr/local/bin/*cc* /usr/etc/*cc* 2>/dev/null`"
DESTDIR="/usr/local/bin"
if [ "`uname -n`" = "rkeene" -o "`uname -n`" = "mobile-keene" -o "`uname -n`" = "super-475" ]; then
  DEBUG=
else
  DEBUG="#"
fi
TWO_BYTES_1="#"
TWO_BYTES_2="short"
FOUR_BYTES_1="#"
FOUR_BYTES_2="int"
NEED_UINT="#"
HAVE_GETOPT="."


while `[ "$1" != "" ]`; do
	CMD=`echo $1 | cut -f 1 -d =`
	ARG=`echo $1 | cut -f 2 -d =`
	case "$CMD" in
		--help)
			echo "Usage: $0 [options]"
			echo "Options: [defaults in brackets]"
			echo "Compilation:"
			echo "  -cc=CC                  Use CC as C compiler [gcc]"
			echo "Features and packages:"
			echo "  --with-bzlib		Use BZ2 compression"
			echo "  --with-getopt		Use getopt"
			echo "  --with-zlib             Use Zlib compression"
			exit
			;;
		--without-zlib)
			ZLIB=0
			;;
		--with-zlib)
			ZLIB=1
			;;
		--without-bzlib)
			BZLIB=0
			;;
		--with-bzlib)
			BZLIB=1
			;;
		--with-getopt)
			HAVE_GETOPT=""
			;;
		--without-getopt)
			HAVE_GETOPT="#"
			;;
		--cc)
			CCPOS=$ARG
			;;
		--debug)
			DEBUG=""
			;;
		--no-debug)
			DEBUG="#"
			;;
	esac
	shift
done

if [ "$DEBUG" = "" ]; then
  echo "Enabling developmental features (`uname -n`)"
fi

echo -e "int main(void) { return(0); }" > TEST.c

echo -n "Checking for a C compiler ... "
for i in $CCPOS; do
	$i TEST.c -o TEST 2>/dev/null
	if [ -e ./TEST ]; then
		CC=$i
		echo "ok ( $CC )"
		echo -n "Cross compiling ... "
		if `./TEST 2>/dev/null`; then
			CROSS_COMP=0
			echo "no"
		else
			CROSS_COMP=1
			echo "yes"
		fi
		rm -f TEST TEST.c 2>/dev/null
		break
	fi
done
rm -f TEST.c 2>/dev/null

if [ "$CC" = "" ]; then
	echo "none found."
	echo "ERROR: You need a C compiler to compile this."
	exit -1
fi

if [ $CROSS_COMP = 0 ]; then

	echo -n "Checking sizeof long ... "
	echo -e "#include <stdio.h>\nvoid main(void) { printf(\"%i\",sizeof(long)); }" > TEST1.c
	echo -e "#include <unistd.h>\nvoid main(void) { char joe=(sizeof(long)+48); write(STDOUT_FILENO, &joe, 1); }" > TEST2.c
	$CC TEST1.c -o TEST 2>/dev/null >/dev/null
	if [ ! -e ./TEST ]; then
		$CC TEST2.c -o TEST 2>/dev/null >/dev/null
	fi
	if [ ! -e ./TEST ]; then
		echo "unknown"
		SLONG=-1
	else
		SLONG=`./TEST`
		echo "$SLONG"
	fi


	echo -n "Checking sizeof int ... "
	echo -e "#include <stdio.h>\nvoid main(void) { printf(\"%i\",sizeof(int)); }" > TEST1.c
	echo -e "#include <unistd.h>\nvoid main(void) { char joe=(sizeof(int)+48); write(STDOUT_FILENO, &joe, 1); }" > TEST2.c
	$CC TEST1.c -o TEST 2>/dev/null >/dev/null
	if [ ! -e ./TEST ]; then
		$CC TEST2.c -o TEST 2>/dev/null >/dev/null
	fi
	if [ ! -e ./TEST ]; then
		echo "unknown"
		SINT=-1
	else
		SINT=`./TEST`
		echo "$SINT"
	fi

	echo -n "Checking sizeof short ... "
	echo -e "#include <stdio.h>\nvoid main(void) { printf(\"%i\",sizeof(short)); }" > TEST1.c
	echo -e "#include <unistd.h>\nvoid main(void) { char joe=(sizeof(short)+48); write(STDOUT_FILENO, &joe, 1); }" > TEST2.c
	$CC TEST1.c -o TEST 2>/dev/null >/dev/null
	if [ ! -e ./TEST ]; then
		$CC TEST2.c -o TEST 2>/dev/null >/dev/null
	fi
	if [ ! -e ./TEST ]; then
		echo "unknown"
		SSHORT=-1
	else
		SSHORT=`./TEST`
		echo "$SSHORT"
	fi

	if [ $SLONG =  2 ]; then TWO_BYTES_1=""; TWO_BYTES_2="\"unsigned long\"";  fi
	if [ $SINT  =  2 ]; then TWO_BYTES_1=""; TWO_BYTES_2="\"unsigned int\"";   fi
	if [ $SSHORT = 2 ]; then TWO_BYTES_1=""; TWO_BYTES_2="\"unsigned short\""; fi
	if [ $SLONG =  4 ]; then FOUR_BYTES_1=""; FOUR_BYTES_2="\"unsigned long\"";  fi
	if [ $SINT  =  4 ]; then FOUR_BYTES_1=""; FOUR_BYTES_2="\"unsigned int\"";   fi


	rm -f TEST TEST1.c TEST2.c 2>/dev/null >/dev/null
fi

echo -n "Checking for uint ... "
echo -e "#include <sys/types.h>\nint main(void) { uint bob; return(bob=0); }" > TEST.c
if `$CC -Wall -Werror TEST.c -o TEST 2>/dev/null >/dev/null`; then
	NEED_UINT="#"
else
	NEED_UINT=""
	echo -n "not "
fi
echo "found."
rm -f TEST.c TEST


if [ "$ZLIB" -eq "-1" ]; then
	echo -n "Checking for zlib.h ... "

	echo -e "#include <zlib.h>\nint main(void) { return(0); }" > TEST.c	

	if `$CC TEST.c -o TEST 2>/dev/null`; then
		ZLIB=1
	else
		ZLIB=0
		echo -n "not "
	fi
	echo "found."
	rm -f TEST.c TEST 2>/dev/null
fi


if [ "$ZLIB" = 1 ]; then
	ZLIB=""
else
	ZLIB="#"
fi



if [ "$BZLIB" -eq "-1" ]; then
	echo -n "Checking for bzlib.h ... "

	echo -e "#include <stdio.h>\n#include <bzlib.h>\nint main(void) { return(0); }" > TEST.c	

	if `$CC TEST.c -o TEST 2>/dev/null`; then
		BZLIB=1
	else
		BZLIB=0
		echo -n "not "
	fi
	echo "found."
	rm -f TEST.c TEST 2>/dev/null
fi

if [ "$BZLIB" = 1 ]; then
	BZLIB=""
else
	BZLIB="#"
fi

if [ "$HAVE_GETOPT" = "." ]; then
	echo -n "Checking for getopt ... "

	echo -e "#include <unistd.h>\nextern char *optarg;\nextern int optind, opterr, optopt;\nint main (int argc, char **argv) {\n  char ch;\n  ch=getopt(argc,argv,\"a\");\n  return(0);\n}" > TEST.c

	if `$CC TEST.c -o TEST 2> /dev/null`; then
		HAVE_GETOPT=""
	else
		HAVE_GETOPT="#"
		echo -n "not "
	fi
	echo "found."

	rm -f TEST.c TEST 2>/dev/null
fi


. ./Makefile.in > Makefile
. comp_range/Makefile.in > comp_range/Makefile

rm -f ./TEST*
