#!/bin/sh
PATH=/bin:/usr/bin
C= EE=0 FON= O= PON= SUF= X= Y=
Z=
E=0
CF=
P=
OO="a.out"
I="/usr/include/CC"
ISUF=".i"
ccC=${ccC-cc}
cfrontC=${cfrontC-cfront}
cppC=${cppC-/lib/cpp}
munchC=${munchC-/usr/lib/munch}
G=0
trap exit 1 2 13 15
trap '
	rm -f __err __ctdt.[co] $C
	case $E in
	0)	exit $EE
		;;
	*)	exit $E
	esac
' 0
for A do
	case $A in
	+V)	I="/usr/include"
		O="$O $A"
		;;
	+*)	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"
		;;
	-I*)	Y="$Y $A"
		;;
	-p)	P="-p"
		;;
	-c)	CF=1
		;;
	-o)	X="$X $A"
		Z="$Z $A"
		OX=1
		;;
	-.c)	echo "bad suffix option: -.c" 1>&2
		;;
	-.*)	SUF=`expr "$A" : '-\(.*\)'`
		;;
	*.c)	if	test -f $A
		then
			B=`basename $A .c`
			if	test $PON
			then
				if test $SUF
				then
					echo "$cppC $O $A > $B$SUF:" 1>&2
					$cppC $Y -I$I $A >$B$SUF
					E=$?
				else
					$cppC $Y -I$I $A
					E=$?
					case $E in
					0)	;;
					*)	break
						;;
					esac
				fi
			elif	test $FON
			then
				if test $SUF
				then
					echo "$cfrontC $O $A > $B$SUF:" 1>&2
					$cppC -C $Y -I$I $A | $cfrontC +f$A $O > $B$SUF
					E=$?
				else	
					$cppC -C $Y -I$I $A | $cfrontC +f$A $O
					E=$?
					case $E in
					0)	;;
					*)	break
						;;
					esac
				fi
			else
				C="$C $B$ISUF"
				echo "CC $O $A:" 1>&2
				$cppC -C $Y -I$I $A | $cfrontC +f$A $O > $B$ISUF
				E=$?
				case $E in
				0)	X="$X $B$ISUF"
					Z="$Z $B.o"
					G=1
					;;
				1)	echo "1 error" 1>&2
					;;
				*)	echo "$E errors" 1>&2
					;;
				esac
			fi
		else
			echo "$A not found" 1>&2
		fi
		;;
	*.i)	X="$X $A"
		B=`basename $A .i`
		Z="$Z $B.o"
		;;
	*)	X="$X $A"
		Z="$Z $A"
		if test $OX
		then
			OO=$A
			OX=""
		else
			G=1
		fi
		;;
	esac
done

case $G in
0)	;;
*)							# generate code
	if test $CF					# -c: skip link edit
	then
		echo "$ccC $P -c $X -lC" 1>&2
		$ccC $P -c $X -lC
		EE=$?
	else
		echo "$ccC $P $X -lC" 1>&2
		$ccC $P -c $X >__err			# compile, no load
		EE=$?
		case $EE in
		0)	#echo "ld $Z -lC -lc"
			$ccC $P $Z -lC > __err		# load
			EE=$?
			if test -s __err
			then
				cat __err
			else				# find ctors/dtors
				nm -gp $OO | $munchC $P >__ctdt.c
				case $? in
				1)	$ccC -c __ctdt.c >/dev/null
					#echo "ld $Z __ctdt.o -lC -lc"
					$ccC $P $Z __ctdt.o -lC		# re-load
					EE=$?
					;;
				esac
			fi
			;;
		*)	#echo "ld2 $Z -lC -lc"
			$ccC $P $Z -lC			# load
			EE=$?
		esac
	fi
esac
