#!/bin/sh
#
# THIS SCRIPT DOESN'T DO ANYTHING YET!
#
# Some things this script could/should do when finished
#
# * detect the compiler name (g++/c++/...)
# * detect whether its a GNU compiler or not (for compiler settings)
# * detect the host platform and base settings on this:
#   - #defines like -DUNIX and -DMACOSX
#   - required libs like -lmingw32
# * command line options to...
#   - override the host settings (for cross compiles
#   - select the desired backend (sdl, x11, ...)
#   - whether mad should be used (--enabled-mad) -> set LIBS/DEFINES
#   - whether to do a debug build (with -g) or an optimized build (-O3 etc.)
# * detect whether the chosen backend is available (e.g. call sdl-config)
# * detect whether mad/ALSA/vorbis/... are available
# * ....


#
# Check whether the given command is a working C++ compiler
#
test_compiler ()
{
cat <<EOF >tmp_cxx_compiler.cpp
class Foo {
  int a;
};
int main(int argc, char **argv)
{
	Foo *a = new Foo();
	delete a;
	return 0;
}
EOF
eval "$1 -o tmp_cxx_compiler tmp_cxx_compiler.cpp 2> /dev/null" && eval "./tmp_cxx_compiler 2> /dev/null" && rm tmp_cxx_compiler tmp_cxx_compiler.cpp
}

#
# Determine a data type with the given length
#
find_type_with_size ()
{
cat <<EOF >tmp_find_type_with_size.cpp
#include <stdio.h>
int main(int argc, char **argv)
{
	int size = argv[1][0] - '0';
	if (size == sizeof(int))
		printf("int\n");
	else if (size == sizeof(short))
		printf("short\n");
	else if (size == sizeof(char))
		printf("char\n");
	else if (size == sizeof(long))
		printf("long\n");
	else {
		printf("unknown\n");
		return 1;
	}

	return 0;
}
EOF
if eval "$CXX -o tmp_find_type_with_size tmp_find_type_with_size.cpp"; then
  datatype=`./tmp_find_type_with_size $1`
  if test "$datatype" = "unknown"; then
	echo "couldn't find data type with $1 bytes"
	exit 1
  fi
fi
rm tmp_find_type_with_size tmp_find_type_with_size.cpp
echo $datatype
}

#
# Greet user
#

echo "Running ScummVM configure..."
echo "/* This file is automatically generated by configure */" > config.h
echo "/* DO NOT EDIT MANUALLY */" >> config.h
echo "" >> config.h
echo "#ifndef CONFIG_H" >> config.h
echo "#define CONFIG_H" >> config.h
echo "" >> config.h


#
# Check any parameters we received
#
# TOOD: allow for multi value params, e.g. --target=dreamcast or --backend=morphos
#

for x in $@; do
    case x$x in
      x--with-alsa)
		echo "#define USE_ALSA" >> config.h
		LIBS="$LIBS -lasound"
		;;
      x--with-vorbis)
      		echo "#define USE_VORBIS" >> config.h
		LIBS="$LIBS -lvorbisfile -lvorbis"
		;;
      x--with-mad)
		echo "#define USE_MAD" >> config.h
		LIBS="$LIBS -lmad"
		;;
    esac;
done;

#
# Determine the C++ compiler
#
printf "Looking for C++ compiler... "
compilers="$CXX g++ c++"
CXX=
for compiler in $compilers; do
  if test_compiler $compiler; then
    CXX=$compiler
    echo $CXX
    break
  fi
done
if test -z $CXX; then
    echo "none found!"
    exit 1
fi

#
# Determine hosttype
#
# TODO - also add an command line option to override this?!?
# TODO - recognize more systems, e.g. *BSD
printf "Checking hosttype... "
hosttype=`uname -s`
echo $hosttype
case $hosttype in
	Linux)
		echo "#define UNIX" >> config.h
		;;
	Darwin)
		echo "#define UNIX" >> config.h
		echo "#define MACOSX" >> config.h
		;;
esac

#
# Check for endianess
#
printf "Checking endianess... "
cat <<EOF >tmp_endianess_check.cpp
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
	unsigned int data = 0x01234567;
	char *ptr = (char *)&data;
	if (ptr[0] == 0x01 && ptr[1] == 0x23 && ptr[2] == 0x45 && ptr[3] == 0x67)
		printf("big\n");
	else if (ptr[3] == 0x01 && ptr[2] == 0x23 && ptr[1] == 0x45 && ptr[0] == 0x67)
		printf("little\n");
	else
		printf("unknown\n");
	return 0;
}
EOF
$CXX -o tmp_endianess_check tmp_endianess_check.cpp
endianess=`./tmp_endianess_check`
echo $endianess;
case $endianess in
	big)
		echo "#define SCUMM_BIG_ENDIAN" >> config.h
		;;
	little)
		echo "#define SCUMM_LITTLE_ENDIAN" >> config.h
		;;
	*)
		exit 1
		;;
esac
rm tmp_endianess_check tmp_endianess_check.cpp

#
# Determine data type sizes
# TODO: proper error checking
#
printf "Type with 1 byte... "
type_1_byte=`find_type_with_size 1`
echo "$type_1_byte"

printf "Type with 2 bytes... "
type_2_byte=`find_type_with_size 2`
echo "$type_2_byte"

printf "Type with 4 bytes... "
type_4_byte=`find_type_with_size 4`
echo "$type_4_byte"

echo >> config.h
echo "/* Data types */" >> config.h
echo "typedef unsigned $type_1_byte byte;" >> config.h
echo "typedef unsigned int uint;" >> config.h
echo "typedef unsigned $type_1_byte uint8;" >> config.h
echo "typedef unsigned $type_2_byte uint16;" >> config.h
echo "typedef unsigned $type_4_byte uint32;" >> config.h
echo "typedef signed $type_1_byte int8;" >> config.h
echo "typedef signed $type_2_byte int16;" >> config.h
echo "typedef signed $type_4_byte int32;" >> config.h

#
# End of config.h
#
echo "" >> config.h
echo "#endif /* CONFIG_H */" >> config.h
