login

#! /bin/sh

if [ $# -eq 0 ]; then
    printf "%s\n" "neatcc -- neatas/ncc/nld wrapper" >&2
    exit 1
fi

if [ "$NAS" = "" ]; then NAS="neatas"; fi
if [ "$NCC" = "" ]; then NCC="ncc"; fi
if [ "$NLD" = "" ]; then NLD="nld"; fi
if [ "$NHD" = "" ]; then NHD="."; fi
if [ "$NLC" = "" ]; then NLC="."; fi

if [ "$1" = "-v" ]; then
    printf "%s\n" "neatcc -- neatas/ncc/nld wrapper"
    printf "assembler: %s\n" "$NAS"
    printf "compiler: %s\n" "$NCC"
    printf "linker: %s\n" "$NLD"
    printf "headers: %s\n" "$NHD"
    printf "libc: %s\n" "$NLC"
    exit 0
fi

nccargs=" -I$NHD"
nldargs=""
asm_sources=""
c_sources=""
objects=""
link="yes"
run="no"

waiting_arg="neither"
for arg in "$@"; do
    case $waiting_arg in
        neither)
            if [ ${arg#-} != $arg ]; then   # $arg starts with slash
                case ${arg#-} in
                    I*|D*|O*|W*)
                        nccargs="$nccargs $arg"
                        if [ ${#arg} -eq 2 ]; then
                            waiting_arg="ncc"
                        fi
                    ;;
                    c)
                        link="no"
                    ;;
                    E)
                        nccargs="$nccargs $arg"
                        link="no"
                    ;;
                    l*|L*|m*|e*|o*)
                        nldargs="$nldargs $arg"
                        if [ ${#arg} -eq 2 ]; then
                            waiting_arg="nld"
                        fi
                    ;;
                    s|g|p)
                        nldargs="$nldargs $arg"
                    ;;
                    r)
                        run="yes"
                    ;;
                    R)
                        run="yes"
                        waiting_arg="run"
                    ;;
                    *)
                        printf "unknown option: %s\n" $arg >&2
                        exit 2
                esac
            else
                case "$arg" in
                    *.s)
                        asm_sources="$asm_sources $arg"
                        object=${arg%.s}.o
                    ;;
                    *.c)
                        c_sources="$c_sources $arg"
                        object=${arg%.c}.o
                    ;;
                    *.o)
                        object="$arg"
                    ;;
                    *)
                        printf "invalid argument: %s\n" $arg >&2
                        exit 2
                esac
                objects="$objects $object"
            fi
        ;;
        ncc)
            nccargs="$nccargs$arg"
            waiting_arg="neither"
        ;;
        nld)
            nldargs="$nldargs $arg"
            waiting_arg="neither"
        ;;
        run)
            rargs="$arg"
            waiting_arg="neither"
    esac
done

if [ -n "$asm_sources" ]; then
    $NAS $asm_sources || exit
fi
if [ -n "$c_sources" ]; then
    $NCC$nccargs $c_sources || exit
fi
if [ $link = "yes" ]; then
    for obj in start.o libc.a; do
        if [ ! -f "$NLC/$obj" ]; then
            printf "$obj not found in '%s'\n" "$NLC" >&2
            printf "make sure to set \$NLC to neatlibc location\n" >&2
            exit 2
        fi
    done
    nldargs="$nldargs $objects $NLC/start.o $NLC/libc.a"
    if [ $run = "yes" ]; then
        tmpbin="/tmp/tmp.out"
        nldargs="$nldargs -o$tmpbin"
    fi
    $NLD$nldargs || exit
    if [ -n "$asm_sources$c_sources" ]; then
        rm -f $objects
    fi
    if [ $run = "yes" ]; then
        $tmpbin $rargs
        stt=$?
        rm -f $tmpbin
        exit $stt
    fi
fi