#!/bin/sh
#ident  "@(#)cfront:CC  1.20"

trap 'rm -f __err$$ $B$ISUF; exit' 1 2 3 15
LIB_ID=${LIB_ID-C}
LIBRARY=${LIBRARY--l${LIB_ID}}
NMFLAGS=${NMFLAGS--p}
C= EE=0 FON= XON=
O=
PON= R= SUF= X= Y= DASHR= PLUSI=
Z=
E=0
OF= CF= SF= IF=
P=
CPLUS="-Dc_plusplus=1 -D__COMPILEDIR__=\"`pwd`\""
OO="a.out"
I=${I-"/local/include/CC"}
ISUF="..c"
MVLIST=
ccC=${ccC-cc}
cfrontC=${cfrontC-/local/lib/cfront}
munchC=${munchC-/local/lib/munch}
cppC=${cppC-/lib/cpp}
G=0
for A do
	case $A in
	+V)     I="/usr/include"
		O="$O $A"
		;;
	+i)     PLUSI=1
		;;
	+x)     XON=1
		;;
	+*)     O="$O $A"
		;;
	-E)     PON=1
		;;
	-F)     FON=1
		;;
	-Fc)    FON=1
		O="$O +L"
		;;
	-C)     Y="$Y $A"
		O="$O +C"
		;;
	-I*)    Y="$Y $A"
		;;
	-D*)    Y="$Y $A"
		;;
	-U*)    Y="$Y $A"
		;;
	-p)     P="-p"
		;;
	-r)     DASHR=1
		Z="$Z $A"
		;;
	-S*)    SF=1
		;;
	-P*)    IF=1
		;;
	-c*)    CF=1
		;;
	-o*)    if [ "$A" != "-o" ]
		then
			OO=`echo $A | cut -d"o" -f2-`
			A="-o $OO"
		else
			OX=1
		fi
		OF="$OF $A"
		Z="$Z $A"
		;;
	-.c)    echo "bad suffix option: -.c" 1>&2
		;;
	-.*)    SUF=`expr "$A" : '-\(.*\)'`
		;;
	*.[Cc]) if      test -f $A
		then
			case "$A" in
			*.c)    B=`basename $A .c`
				;;
			*.C)    B=`basename $A .C`
				;;
			esac
			if      test $PON
			then
				if test $SUF
				then
					echo "$cppC $O  $A > $B$SUF:" 1>&2
					$cppC $Y $CPLUS -I$I  $A >$B$SUF
					E=$?
				else
					$cppC $Y $CPLUS -I$I  $A
					E=$?
				fi
				case $E in
				0)      ;;
				*)      G=0; break
					;;
				esac
			elif    test $FON
			then
				if test $SUF
				then
					echo "$cfrontC $O  $A > $B$SUF:" 1>&2
					$cppC -C $Y $CPLUS -I$I  $A | $cfrontC +L +f$A $O > $B$SUF
					E=$?
				else    
					$cppC -C $Y $CPLUS -I$I  $A | $cfrontC +L +f$A $O
					E=$?
				fi
				case $E in
				0)      ;;
				*)      G=0; break
					;;
				esac
			else
				echo "CC $O $A:" 1>&2
				$cppC -C $Y $CPLUS -I$I  $A | $cfrontC +L +f$A $O > $B$ISUF
				E=$?
				R=1
				C="$C $B$ISUF"
				case $E in
				0)      X="$X $B$ISUF"
					Z="$Z $B.o"
					MVLIST="$MVLIST $B"
					G=1
					;;
				127)    echo "Too many compilation errors" 1>&2
					G=0
					;;
				999)    echo "CC argument error" 1>&2
					G=0
					;;
				1)      echo "1 error" 1>&2
					G=0
					;;
				*)      echo "$E errors" 1>&2
					G=0
					;;
				esac
			fi
		else
			echo "$A not found" 1>&2
		fi
		;;
	*.i)    if test $PON
		then
			echo "CC -E $A incompatible: ignoring $A" 1>&2
		elif test $FON
		then
			echo "CC -F $A incompatible: ignoring $A" 1>&2
		else    
			B=`basename $A .i`
			echo "CC $O $A:" 1>&2
			$cfrontC +L +f$A $O < $A > $B$ISUF
			E=$?
			R=1
			C="$C $B$ISUF"
			case $E in
			0)      X="$X $B$ISUF"
				Z="$Z $B.o"
				MVLIST="$MVLIST $B"
				G=1
				;;
			*)      G=0
				;;
			esac
		fi
		;;
	*)      if test $XON
		then    
			O="$O +x$A"
			XON=""
		else
			Z="$Z $A"
			if test $OX
			then
				OO=$A
				OF="$OF $A"
				OX=""
			else
				G=1
				X="$X $A"
				
			fi
		fi
		;;
	esac
done

case $G in
0)      ;;
*)                                                      # generate code
	if test "$PLUSI"        #leave ..c's lying around
	then
					#remove #line's from the ..c's for sdb
		for f in $C
		do
			sed "/^#/d" $f >temp$$
			mv temp$$ $f
		done
	fi
	if test $SF                                     # -S: generate .s files
	then
		echo "$ccC $P -S $X" 1>&2
		$ccC $P -S $X 
		EE=$?
		for A in $MVLIST
		do
			mv $A..s $A.s
		done
	elif test $IF                                   # -P: generate .i file
	then
		echo "$ccC $P -P $X" 1>&2
		$ccC $P -P $X 
		EE=$?
		for A in $MVLIST
		do
			mv $A..i $A.i
		done
	elif test $CF                                   # -c: skip link edit
	then
		echo "$ccC $P -c $X" 1>&2
		$ccC $P -c $X
		EE=$?
		for A in $MVLIST
		do
			mv $A..o $A.o
		done
	else
		echo "$ccC $P $OF $X $LIBRARY" 1>&2
		$ccC $P -c $X >__err$$                  # compile, no load
		EE=$?
		for A in $MVLIST
		do
			mv $A..o $A.o
		done
		case $EE in
		0)      #echo "ld $Z $LIBRARY -lc"
			$ccC $P $Z $LIBRARY > __err$$           # load
			EE=$?
			if test $EE != 0 -o -s __err$$
			then
				cat __err$$
			elif test  "$DASHR" != 1                # find ctors/dtors
			then
				nm $NMFLAGS $OO | $munchC $P >__ctdt.c
				case $? in
				1)      $ccC -c __ctdt.c >/dev/null
					#echo "ld __ctdt.o $Z $LIBRARY -lc"
					$ccC $P __ctdt.o $Z  $LIBRARY           # re-load
					rm __ctdt.o
					EE=$?
					;;
				esac
				rm __ctdt.c
			fi
			;;
		esac
		rm __err$$
	fi
esac

if      test "$R" 
then
	if test ! "$PLUSI"
	then
		rm $C
	fi
fi

case $E in
0)      exit $EE
	;;
*)      exit $E
esac

