#!/bin/sh
BDIR="$HOME/abc"
objs="$BDIR/brt.o $BDIR/lib.o"
BC="$BDIR/b"

# compile in.b [out.s]
compile() {
	if [ "${1##*.}" != "b" ]; then
		echo "Error: can only compile b files" >&2
		exit 1
	fi
	cout=$2
	[ "$cout" != "" ] || cout=${1%b}s
	tmp1=`mktemp`; tmp2=`mktemp`
	$BC $1 $tmp2 $tmp1
	retval=$?
	cat $tmp1 $tmp2 > $cout
	rm $tmp1 $tmp2
	[ $retval -eq 0 ] || rm $cout && return $retval
	echo $cout
	return $retval
}

# assemble in.{sb} [out.o]
assemble() {
	atmp=""
	ain=$1
	aout=$2;
	if [ "${1##*.}" = "b" ]; then
		[ "$aout" != "" ] || aout=${ain%b}o
		ain=`mktemp --suffix=.s`
		compile $1 $ain >/dev/null || return 1
		atmp="foo"
	elif [ "${1##*.}" = "s" ]; then
		[ "$aout" != "" ] || aout=${ain%s}o
	else
		echo "Error: can only compile b and s files" >&2
		exit 1
	fi
	as --32 -g $ain -o $aout
	[ "$atmp" != "" ] && rm $ain
	echo $aout
}

out=""
action="link"
while getopts "o:Sc" o
do	case "$o" in
	o)	out="$OPTARG";;
	S)	action=compile;;
	c)	action=assemble;;
	esac
done
shift $(($OPTIND - 1))

# ignore -o option if more than one file given and not linking objs
if [ $# -gt 1 ]; then
	if [ "$action" != "link" ]; then
		out=""
	fi
fi

[ $# -ne 1 ] && havelist=yes
tmpobjs=""
for i in $@; do
	if [ "$action" != "link" ]; then
		[ "$havelist" = "yes" ] && echo $i:
		$action $i $out >/dev/null
		[ $? -eq 0 ] || break=1
	else
		if [ "${i##*.}" = "o" ]; then
			objs="$objs $i"
		else
			[ "$havelist" = "yes" ] && echo $i:
			ltmp=`mktemp --suffix=.o`
			tmpobjs="$tmpobjs $ltmp"
			assemble $i $ltmp >/dev/null
			[ $? -eq 0 ] || break=1
		fi
	fi
done
if [ $break ]; then
	[ "$tmpobjs" = "" ] || rm $tmpobjs
	echo "Error" >&2
	exit 1
fi
if [ "$action" = "link" ]; then
	if [ "$out" = "" ]; then
		out="-o a.out"
	else
		out="-o $out"
	fi
	ld -m elf_i386 -T $BDIR/link.ld $out $objs $tmpobjs
	rm $tmpobjs
fi