#! /bin/sh

# NOTE: you may need to adjust the references to /usr/local/... below
#	(or remove them if they're not needed on your system).
#	You may need to add something like "-Olimit 2000" to the -O
#	processing below or change it to something more suitable for your
#	system.  See also the comments starting with ### below.

#	Note that with some shells, invocations of the form
#		CFLAGS='system-specific stuff' fc ...
#	may be useful as way to pass system-specific stuff to the C compiler.
#	The script below simply appends to the initial CFLAGS value.

PATH=/usr/local/bin:/bin:/usr/bin

# f77-style shell script to compile and load fortran, C, and assembly codes

#	usage:	f77 [options] files [-l library]

#	Options:

#		-o objfile	Override default executable name a.out.

#		-a		use automatic variable storage (on the stack)
#				by default -- rather than static storage

#		-c		Do not call linker, leave relocatables in *.o.

#		-C		Check that subscripts are in bounds.

#		-S		leave assembler output on file.s

#		-L libdir	(passed to ld)

#		-l library	(passed to ld)

#		-u		complain about undeclared variables

#		-w		omit all warning messages

#		-w66		omit Fortran 66 compatibility warning messages

#		files		FORTRAN source files ending in .f .
#				FORTRAN with cpp preprocessor directives
#					ending in .F .
#				C source files ending in .c .
#				Assembly language files ending in .s .
#				efl source files ending in .e .
#				RATFOR files ending in .r .
#				Object files ending in .o .
#				Shared libraries ending in .so .

#				f2c prototype files ending in .P ; such
#				files only affect subsequent files.

#		-D def		passed to C compiler (for .c files)
#				or to cpp (for .F files)

#		-I includepath	passed to C compiler (for .c files)
#				or to cpp (for .F files), and to f2c

#		-m xxx		passed to C compiler as -mxxx

#		-N tnnn		allow nnn entries in table t

#		-P		emit .P files

#		-r8		promote real to double precision and
#				complex to double complex

#		-s		strip executable

#		-trapuv		Initialize floating-point variables to
#				signaling NaNs (on machines with IEEE
#				arithmetic) unless they appear in save,
#				common, or data statements.  Initialize
#				other kinds of variables to values that
#				may attract attention if used without
#				being assigned proper values.

#		-U def		passed to C compiler (for .c files)
#				or to cpp (for .F files) to remove def

#		-v		show current f2c version
#		--version	same as -v

s=/tmp/stderr_$$
t=/tmp/f77_$$.o
### On some systems (e.g., IRIX), -common prevents complaints
### about multiple definitions of COMMON blocks.
#CC=${CC_f2c:-'cc -common'}
CC=${CC_f2c:-'cc'}
EFL=${EFL:-efl}
EFLFLAGS=${EFLFLAGS:-'system=portable deltastno=10'}
RATFOR=${RATFOR:-ratfor}
RFLAGS=${RFLAGS:-'-6&'}
F2C=${F2C:-/usr/local/bin/f2c}
show_fc_help=0
case $1 in
	--help)		show_fc_help=1;;
	--version)	show_fc_help=2;;
	'-?')		show_fc_help=1;;
	-h)		show_fc_help=1;;
	-v)		show_fc_help=2;;
	esac
case $show_fc_help in
	1)
	echo 'f77 script based on f2c'
	echo 'For usage details, see comments at the beginning of' $0 .
	echo 'For pointers to f2c documentation, invoke' $F2C --help
	exit 0;;
	2)
	echo $0 'script based on f2c:'; $F2C -v
	exit 0;;
	esac
F2CFLAGS=${F2CFLAGS:='-ARw8 -Nn802 -Nq300 -Nx400'}
CPP=${CPP:-/lib/cpp}
rc=0
trap "rm -f $s $t; exit \$rc" 0
OUTF=a.out
OUTO=
cOPT=1
set -- `getopt acCD:gI:L:m:N:O:U:o:r:sSt:uw6 "$@"`
case $? in 0);; *) rc=$?; exit;; esac
CPPFLAGS=${CPPFLAGS:-'-I/usr/local/include'}
CFLAGSF2C=${CFLAGSF2C:-'-I/usr/local/include'}
OFILES=
trapuv=
strip=
LIBS="-lf2c -lm"
while
	test X"$1" != X--
do
	case "$1"
	in
	-a)	F2CFLAGS="$F2CFLAGS -a"
		shift;;

	-C)	F2CFLAGS="$F2CFLAGS -C"
		shift;;

	-c)	cOPT=0
		shift
		;;

	-D)	CPPFLAGS="$CPPFLAGS -D$2"
		shift 2
		;;

	-g)	CFLAGS="$CFLAGS -g"
		F2CFLAGS="$F2CFLAGS -g"
		shift;;

	-I)	CPPFLAGS="$CPPFLAGS -I$2"
		F2CFLAGS="$F2CFLAGS -I$2"
		shift 2
		;;

	-m)	CC="$CC -m$2"
		shift 2
		;;

	-U)	CPPFLAGS="$CPPFLAGS -U$2"
		shift 2
		;;

	-o)	OUTF=$2
		OUTO=$2
		shift 2
		;;

	-O)	case $2 in 1) O=-O1;; 2) O=-O2;; 3) O=-O3;; *) O=-O;; esac
		case $O in -O);; *) shift;; esac
		CFLAGS="$CFLAGS $O"
#		CFLAGS="$CFLAGS $O -Olimit 2000"
		shift
		;;

	-r)	case $2 in 8) F2CFLAGS="$F2CFLAGS -r8";;
			*) echo "Ignoring -r$2";; esac
		shift; shift
		;;

	-s)	strip=1
		shift
		;;

	-u)	F2CFLAGS="$F2CFLAGS -u"
		shift
		;;

	-w)	F2CFLAGS="$F2CFLAGS -w"
		case $2 in -6) F2CFLAGS="$F2CFLAGS"66; shift
			case $2 in -6) shift;; esac;; esac
		shift
		;;

	-L)	OFILES="$OFILES $1$2"
		shift 2
		case $cOPT in 1) cOPT=2;; esac
		;;

	-L*)	OFILES="$OFILES $1"
		shift
		case $cOPT in 1) cOPT=2;; esac
		;;

	-N)	F2CFLAGS="$F2CFLAGS $1""$2"
		shift 2
		;;

	-P)	F2CFLAGS="$F2CFLAGS $1"
		shift
		;;


	-S)	CFLAGS="$CFLAGS -S"
		cOPT=0
		shift
		;;

	-t)
		case $2 in
			rapuv)
				F2CFLAGS="$F2CFLAGS -trapuv"
				trapuv=1
#				LIBS="$LIBS -lfpe"
				shift 2;;
			*)
				echo "invalid parameter $1" 1>&2
				shift;;
			esac
		;;

	'')	echo $0: 'unexpected null argument'; exit 1;;

	*)
		echo "invalid parameter $1" 1>&2
		shift
		;;
	esac
done
shift
case $cOPT in 0) case $OUTO in '');; *) CFLAGS="$CFLAGS -o $OUTO";; esac;; esac
while
	test -n "$1"
do
	case "$1"
	in
	*.[fF])
		case "$1" in *.f) f=".f";; *.F) f=".F";; esac
		case "$1" in
			*.f)	b=`basename $1 .f`
				$F2C $F2CFLAGS $1
				rc=$?
				;;
			*.F)	b=`basename $1 .F`
				$CPP $CPPFLAGS $1 >$b.i
				rc=$?
				case $rc in 0)
					$F2C $F2CFLAGS <$b.i >$b.c
					rc=$?
					;;esac
				rm $b.i
				;;
			esac
		case $rc in 0);; *) exit;; esac
                $CC -c $CFLAGSF2C $CFLAGS $b.c 2>$s
		rc=$?
		sed '/parameter .* is not referenced/d;/warning: too many parameters/d' $s 1>&2
		case $rc in 0);; *) exit;; esac
		OFILES="$OFILES $b.o"
		rm $b.c
		case $cOPT in 1) cOPT=2;; esac
		shift
		;;
	*.e)
		b=`basename $1 .e`
		$EFL $EFLFLAGS $1 >$b.f
		case $? in 0);; *) rc=$?; exit;; esac
		$F2C $F2CFLAGS $b.f
		case $? in 0);; *) rc=$?; exit;; esac
                $CC -c $CFLAGSF2C $CFLAGS $b.c
		case $? in 0);; *) rc=$?; exit;; esac
		OFILES="$OFILES $b.o"
		rm $b.[cf]
		case $cOPT in 1) cOPT=2;; esac
		shift
		;;
	*.r)
		b=`basename $1 .r`
		$RATFOR $RFLAGS $1 >$b.f
		case $? in 0);; *) rc=$?; exit;; esac
		$F2C $F2CFLAGS $b.f
		case $? in 0);; *) rc=$?; exit;; esac
		$CC -c $CFLAGSF2C $CFLAGS $b.c
		case $? in 0);; *) rc=$?; exit;; esac
		OFILES="$OFILES $b.o"
		rm $b.[cf]
		case $cOPT in 1) cOPT=2;; esac
		shift
		;;
	*.s)
		echo $1: 1>&2
		OFILE=`basename $1 .s`.o
		${AS:-as} -o $OFILE $AFLAGS $1
		case $? in 0);; *) rc=$?; exit;; esac
		OFILES="$OFILES $OFILE"
		case $cOPT in 1) cOPT=2;; esac
		shift
		;;
	*.c)
		echo $1: 1>&2
		OFILE=`basename $1 .c`.o
                $CC -c $CFLAGSF2C $CPPFLAGS $CFLAGS $1
		rc=$?; case $rc in 0);; *) rc=$?; exit;; esac
		OFILES="$OFILES $OFILE"
		case $cOPT in 1) cOPT=2;; esac
		shift
		;;
	*.o)
		OFILES="$OFILES $1"
		case $cOPT in 1) cOPT=2;; esac
		shift
		;;
	*.so)
		OFILES="$OFILES $1"
		case $cOPT in 1) cOPT=2;; esac
		shift
		;;
	-[lL])
		OFILES="$OFILES $1$2"
		shift 2
		case $cOPT in 1) cOPT=2;; esac
		;;
	-[lL]*)
		OFILES="$OFILES $1"
		shift
		case $cOPT in 1) cOPT=2;; esac
		;;
	-o)
		case $cOPT in 0) CFLAGS="$CFLAGS -o $2";; *) OUTF=$2;; esac
		shift 2;;
	*.P)
		F2CFLAGS="$F2CFLAGS $1"
		shift
		;;
	*)
		OFILES="$OFILES $1"
		shift
		case $cOPT in 1) cOPT=2;; esac
		;;
	esac
done

### On some (IRIX) systems, -Wl,-dont_warn_unused prevents complaints
### about unnecessary -l options.

case $cOPT in 2)
#	case $trapuv in 1) OFILES="$OFILES -lfpe";; esac
#	$CC -Wl,-dont_warn_unused -o $OUTF -u MAIN__ -L/usr/local/lib $OFILES $LIBS
	$CC -o $OUTF -u MAIN__ -L/usr/local/lib $OFILES $LIBS
	case $strip in 1) strip $OUTF;; esac
	;; esac
rc=$?
exit $rc
