#! /bin/sh
#
#	makesort sortfile [debug] [-o proc_name] [-xC] [-xS spec_file] [-check]
#
# Last Edited 23rd Jan 1996        Steve Chappell	

#	home directory for sunsort source
SORT_VERS=
SUNSORT_HOME=${SUNSORT_HOME:-`dirname $0`}
SUNSORT_LIB=${SUNSORT_LIB:-"${SUNSORT_HOME}/sunsort_lib"}
SUNSORT_SRC=${SUNSORT_SRC:-"${SUNSORT_HOME}/sunsort_src"}
SORT_SUBS_DIR="${SUNSORT_HOME}/sort-subs"
SORT_DIR=${SORT_DIR:-"."}
CALIB_DIR=${CALIB_DIR:-"${SORT_DIR}/calib-inputs"}

USAGE="makesort usage: $0 sort_file [debug] [check] [-o proc_name] [-xC] [-xS spec_file]"

#	check that at least one argument has been passed
if [ $# -eq 0 ] 
then
    echo "makesort: Sort file not specified"
    echo "$USAGE"
    exit 1
fi

#	assume the first argument names the sort file
if [ ! -f "$1" ]
then
    echo "makesort: file '$1' not found ... exiting"
    exit 2
fi
SORT_FILE="$1"
shift

#	default values 
F_flags='-O4 -s -e'
C_flags='-xO4'

SORT_LIBS="-lsortsubs -lsunsort -lthread"
SORT_PROC="sunsort_proc"
SORT_OUT="-o "$SORT_PROC
MAKE_SORT_FLAG=
SORT_EXTRA_FLAGS=
SORT_C_SOURCE=false
SUBS_MAKE_FLAG="subs"
SPEC_FILE=
SORT_BARE=false
SORT_SPEC_FLAG=
EXTRA_OBJS=
EXTRA_DEFS=
SORT_CHECK=false

#	scan through the rest of the argument list
while [ $# -gt 0 ]
do
    case $1 in
    debug|DEBUG)
	F_flags='-C -g -e'
	C_flags='-g'
	SORT_LIBS="-ldbx_sunsort 
	-ldbx_sortsubs
	-lthread"
	SUBS_MAKE_FLAG="debug"
	shift
	;;
    check|CHECK)
	SORT_CHECK=true
	shift
	;;
    -o)
	if [ ".$2" != "." ]
	then
	    SORT_PROC="$2"
	    SORT_OUT="-o "$SORT_PROC
	    shift
	fi
	shift
	;;
    
    -xC)
	SORT_C_SOURCE=true
	MAKE_SORT_FLAG="${MAKE_SORT_FLAG} -C"
	shift
	;;
    
    -xS)
	if [ ".$2" != "." ]
	then
	    SPEC_FILE="$2"
	    if [ ! -f "$2" ]
	    then
		echo "makesort: file '$SPEC_FILE' not found ... exiting"
		exit 2
	    else
		SORT_BARE=true
		SORT_SPEC_FLAG="-S"
		shift
	    fi
	fi
	shift
	;;
    -D*)
	EXTRA_DEFS="$EXTRA_DEFS $1"
	shift
	;;
    *)
	echo "makesort: Unrecognised option '$1' passing it to compiler"
	SORT_EXTRA_FLAGS="${SORT_EXTRA_FLAGS} $1"
	shift
	;;
    esac
done

C_flags="$C_flags $EXTRA_DEFS"
F_flags="$F_flags $EXTRA_DEFS"

#    echo "spectrum file = $SPEC_FILE"

#use sort file to produce "spectra" and "sort.f/c"
echo "makesort: Generating sort procedure files..."

MAKE_STRING="${SUNSORT_HOME}/make_sort$SORT_VERS $SORT_FILE\
    $MAKE_SORT_FLAG $SORT_SPEC_FLAG" 
#        echo "$MAKE_STRING"
# This bit of magic ensures that the file date on .sunsort_initadc.i only
# changes if the contents of the file changes. This stops dependent files
# being recompiled by make every time.
test -r $SORT_DIR/.sunsort_initadc.i \
    || touch $SORT_DIR/.sunsort_initadc.i
mv $SORT_DIR/.sunsort_initadc.i $SORT_DIR/.sunsort_initadc.bak
$MAKE_STRING
MAKESTATUS=$?
cmp -s $SORT_DIR/.sunsort_initadc.i $SORT_DIR/.sunsort_initadc.bak \
    && mv $SORT_DIR/.sunsort_initadc.bak $SORT_DIR/.sunsort_initadc.i
if [ $MAKESTATUS -ne 0 ] 
then
    echo "makesort: make_sort $SORT_FILE $MAKE_SORT_FLAG FAILED ... exiting"
    exit 4; 
fi

#ensure that user can't go blindly on if makesort fails to produce output
rm $SORT_PROC 2> /dev/null 

# check that calibration subroutines are up to date
if [ -d $CALIB_DIR ]
then
    echo "makesort: Making calibration subroutines..."
    (cd ${CALIB_DIR}
    INCS="-I$SORT_SUBS_DIR -I$CALIB_DIR -I.. -I$SUNSORT_LIB -I$SUNSORT_SRC"
    make FFLAGS="$F_flags $INCS" CFLAGS="$C_flags $INCS" ${SUBS_MAKE_FLAG}
    )
    if [ $? -ne 0 ]
    then
	echo "makesort: compilation of sort subroutines FAILED ...exiting"
	exit 4
    fi
    EXTRA_OBJS="$EXTRAOBJS $CALIB_DIR/*.o"
fi

#Make the Sortfile
echo "makesort: Making SortFile..."

#make_sort produces generic names .sunsort_ sort.src/spectra/initadc.i
$SORT_BARE || SPEC_FILE=.sunsort_spectra
sed -e 's/	/ /g' -e 's/^ *\([0-9]*\) *\.\. */ \1 .. /' \
    -e 's/^\( [0-9]* \.\. [0-9]*\) *, */\1 , /' \
    -e 's/^\( [0-9]* \.\. [0-9]* \) *\([^,]\)/\1, 1 \2/' \
    -e 's/^\( [0-9]* \.\. [0-9]* , [0-9]* [^ ]*[^ 0-9][^ 0-9]*\)\([0-9][0-9]*\)/\1 \2/' $SPEC_FILE | \
    awk '{ if ($2 == "..") {j = $7;
	for(i=$1; i<=$3; i+=$5) {\
	    printf " %d %s%d %s\n", i, $6, j, $8; j++}} else print}' \
	> ${SORT_PROC}.spec
$SORT_BARE || rm -f .sunsort_spectra

#mv .sunsort_initadc.i .sunsort_initadc.i

#	finally make the sunsort executable
if $SORT_C_SOURCE 
then
    if $SORT_CHECK
    then
	COMMAND_STRING="lint -I$SUNSORT_SRC -I$SUNSORT_LIB -L$SUNSORT_LIB \
	    -x $EXTRA_DEFS ${SORT_PROC}.c -lsunsort -lm"
    else
	mv .sunsort_sort.src ${SORT_PROC}.c
	sed 's/^ */      /' << EOF > ${SORT_PROC}.vardec.f
      subroutine vardec
      include '.sunsort_initadc.i'
      return
      end
EOF
	
	f77 -c ${SORT_PROC}.vardec.f
	COMMAND_STRING="cc $C_flags ${SORT_PROC}.c ${SORT_PROC}.vardec.o \
	    -I$SUNSORT_LIB -I$SUNSORT_SRC -I$SORT_SUBS_DIR -I$CALIB_DIR \
	    $SORT_EXTRA_FLAGS $EXTRA_OBJS -L$SUNSORT_LIB $SORT_OUT $SORT_LIBS \
	    -lF77 -lsunmath -lm"
	fi
else
    mv .sunsort_sort.src ${SORT_PROC}.f
    if $SORT_CHECK
    then
	COMMAND_STRING="ftnchek -columns=132 $SUNSORT_LIB/externs.prj \
	    ${SORT_PROC}.f"
    else
	COMMAND_STRING="f77 $SORT_OUT $F_flags ${SORT_PROC}.f \
	    $EXTRA_OBJS -L$SUNSORT_LIB -I$SUNSORT_SRC -I$SORT_SUBS_DIR \
	    -I$CALIB_DIR $SORT_EXTRA_FLAGS $SORT_LIBS"
    fi
fi

echo "$COMMAND_STRING"
$COMMAND_STRING
if [ $? -ne 0 ] 
then
    $SORT_CHECK && exit 1
    echo "makesort: Dear $USER you may have a problem"
    echo "makesort: Exited with nonzero return code!"
    exit 6
fi

$SORT_CHECK && exit 0
echo 
echo "makesort: Sort Compiled OK [Load] to use it!"
