#!/bin/bash

ZLIB=-1
BZLIB=-1
CVERS="#"
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`" = "trinity" ]; 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[=path]     Use BZ2 compression"
			echo "  --with-getopt           Use getopt"
			echo "  --with-zlib[=path]      Use Zlib compression"
			echo "  --with-check-version	Check version at runtime"
			exit
			;;
		--without-z*)
			ZLIB=0
			;;
		--with-z*)
			ZLIBPATH=$ARG
			ZLIB=1
			;;
		--without-b*)
			BZLIB=0
			;;
		--with-b*)
			BZLIBPATH=$ARG
			BZLIB=1
			;;
		--with-g*)
			HAVE_GETOPT=""
			;;
		--without-g*)
			HAVE_GETOPT="#"
			;;
		--cc)
			CCPOS=$ARG
			;;
		--d*)
			DEBUG=""
			;;
		--no-d*)
			DEBUG="#"
			;;
		--with-c*)
			CVERS=""
			;;
		--without-c*)
			CVERS="#"
			;;
	esac
	shift
done

if [ "$BZLIBPATH" != "" ]; then
  BZLIBINC="-I$BZLIBPATH"
  BZLIBLIB="-L$BZLIBPATH"
fi

if [ "$ZLIBPATH" != "" ]; then
  ZLIBINC="-I$ZLIBPATH"
  ZLIBLIB="-L$ZLIBPATH"
fi

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 2>/dev/null
		break
	fi
done

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

echo -n "Checking to see if CC accepts -Wall ... "
if $CC -Wall -o TEST TEST.c 2>/dev/null >/dev/null; then
  echo "yes"
  WALL="-Wall"
else
  echo "no"
fi

echo -n "Checking to see if CC accepts -Werror ... "
if $CC -Werror -o TEST TEST.c 2>/dev/null >/dev/null; then
  echo "yes"
  WERROR="-Werror"
else
  echo "no"
fi

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

echo -n "Checking to see if CC accepts double-slash ... "
echo -e "int main(void) {\n// Test\nreturn(0); }" > TEST.c
if $CC -o TEST TEST.c 2>/dev/null >/dev/null; then
  echo "yes"
else
  echo "no"
  . ./patch-dbl-slash
fi

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


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 $ZLIBINC 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
  echo -n "Checking for compress2 ... "

  echo -e "#include <zlib.h>\nint main(void) {\nchar bob[30], sally[60];\nunsigned long sLen=30, dLen=60;\ncompress2(sally,&dLen,bob,sLen,Z_BEST_COMPRESSION); return(0); }" > TEST.c

  if $CC $ZLIBINC $ZLIBLIB -lz TEST.c -o TEST 2>/dev/null >/dev/null; then
    COMPRESS2=""
  else
    COMPRESS2="#"
    echo -n "not "
  fi
  echo "found"
  rm -f TEST TEST.c 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 $BZLIBINC 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*
