#!/bin/bash

TMPFILE=/tmp/orca-macgen.$$
ERROUTPUT=/tmp/orca-asm-errs.$$

FILENAME="$1"
shift

DESTBASENAME="$1"
shift

if echo $FILENAME | grep -v '\.s$' > /dev/null
then
    echo Expected second argument to be a *.s file but got $FILENAME
    exit 1
fi

SRCBASENAME=`echo $FILENAME | sed 's/\.s$//'`
SRCMACROSNAME="${SRCBASENAME}.macros"
SRCROOTNAME="${SRCBASENAME}.ROOT"
SRCOBJNAME="${SRCBASENAME}.a"

DESTMACROSNAME="${DESTBASENAME}.macros"
DESTDEPSNAME="${DESTBASENAME}.macros.d"
DESTROOTNAME="${DESTBASENAME}.ROOT"
DESTOBJNAME="${DESTBASENAME}.a"

$ORCA --trace-gsos macgen $MACGENFLAGS "$FILENAME" "$SRCMACROSNAME" $MACGENMACROS < /dev/null 2> $TMPFILE
RESULT=$?

sed '/^[A-Za-z][A-Za-z]*(.*)$/d' $TMPFILE >&2

if [ "$RESULT" -ne 0 ]
then
    rm -f "$TMPFILE"
    rm -f "$SRCMACROSNAME"
    exit $RESULT
fi

DEPS=`awk '
    /^FastFileLoad/ {
        sub(/^FastFileLoad\(/, "");
        sub(/\)$/, "");
        print}' $TMPFILE | sort -u | while read FILE
    do
        if [ -f "$FILE" ]
        then
            echo $FILE
        fi
    done | tr '\012' ' '`

rm -f $TMPFILE

DIRNAME=`dirname $FILENAME`
BASENAME=`basename $FILENAME .s`

pushd "$DIRNAME" > /dev/null
$ORCA assemble $* keep="${BASENAME}" "${BASENAME}.s" 2> $ERROUTPUT
RESULT=$?
popd > /dev/null

if [ -s $ERROUTPUT ]
then
    RESULT=1
    awk '
        {
            print $0
        }
        
        /^Error /{
            $1=""
            $2=""
            LINENO=$3
            $3=""
            printf("%s/%s:%d:0: error: %s\n", PWD, FILE, LINENO, $0)
        }
    ' "PWD=`pwd`" "FILE=${BASENAME}.s" $ERROUTPUT
fi
rm -f $ERROUTPUT

if [ "$RESULT" -ne 0 ]
then
    rm -f "$SRCROOTNAME"
    rm -f "$SRCMACROSNAME"
    rm -f "$SRCOBJNAME"
    rm -f "$DESTROOTNAME"
    rm -f "$DESTMACROSNAME"
    rm -f "$DESTOBJNAME"
    rm -f "$DESTDEPSNAME"
    exit 1
fi

mkdir -p `dirname "$DESTROOTNAME"`
mv -f "$SRCROOTNAME" "$DESTROOTNAME" 2> /dev/null
mv -f "$SRCMACROSNAME" "$DESTMACROSNAME" 2> /dev/null
mv -f "$SRCOBJNAME" "$DESTOBJNAME" 2> /dev/null

cat > $DESTDEPSNAME << EOF
$DESTROOTNAME: $DEPS
EOF

exit 0
