#
# Run AVRASM (MS-DOS Atmel assembler) and filter error/warning messages
#

open(A,"<$ARGV[0]") || die "$ARGV[0]: $!" ;
$aline = 0 ;
select((select(STDERR), $| = 1)[0]);    # unbuffer output

if ($ARGV[3] eq '') {
    $cmd = "avrasm -g -w $ARGV[0] $ARGV[1] $ARGV[2]";
    print STDERR "$cmd\n";
    $cmd = "spawn \"$cmd\"";
    open(F,"$cmd|") || die "avrasm" ;
} else {
    $cmd = "avrasm -g -w $ARGV[0] $ARGV[1] $ARGV[2] 2>$ARGV[3]";
    print STDERR "$cmd\n";
    system("$cmd");
    open(F,"<$ARGV[3]") || die "avrasm" ;
}

$n_err = $errn = 0 ;
$curdir = `cd` ;
$curdir =~ s/[\r\n]//g ;
$curdir .= "\\" ;
$n_err = 0 ;
while (<F>)  {
    if (s/^([^\(]+)\(([^\)]+)\) :/&file_line($1,$2)/e)  {
        $n_err++ ;
        print ;
    }
    elsif (/word/i)  {
        print ;
    }
}
if (! -f $ARGV[2]) {
	$n_err = 1 if ($n_err == 0);
	print "Error: no output file ($ARGV[2]) produced!\n" ;
	print "(Hint: working directory path cannot contain >8 character names.)\n" ;
}
print "$n_err warnings/errors.\n" ;

sub file_line  {
    local($file,$line,$rec) = @_ ;   # file name/line number
    while ($aline < $line)  {   # need to advance
        $rec = scalar(<A>) ;    # get next record
        if ($rec =~ /^#line\s([0-9]+)\s\"([^\"]+)\"(\s([0-9]+))*/)  {   # #line directive
            $fn = $2 ;
            $fline = $1-1 ;
        }
        elsif ($rec =~ /^#line/)  {
            print "Bogus: $rec" ;
        }
        else  {
            $fline++ ;
        }
        $aline++ ;
    }
    "$curdir$fn($fline):" ;
}
