X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=bin%2Flib;h=f0476f2ec699acbdf8f77cc47feb4211a7822a89;hb=47e0a8d998cecb070aa72f84921f3a874e062f4e;hp=c9a7f27a6e36be9494b8718cef9c1b6a711fcdb8;hpb=5fca32af49d84dcadf96317d54708c20a41ba151;p=moe.git diff --git a/bin/lib b/bin/lib index c9a7f27..f0476f2 100644 --- a/bin/lib +++ b/bin/lib @@ -1,5 +1,5 @@ # The Evaluator -- Shell Function Library -# (c) 2001--2007 Martin Mares +# (c) 2001--2008 Martin Mares # General settings shopt -s dotglob @@ -49,6 +49,27 @@ function try-ln ln $1 $2 2>/dev/null || cp $1 $2 } +# Expand occurrences of `$var' in a given variable + +function expand-var +{ + eval echo ${!1} +} + +# Given a , override each variable by _ + +function override-vars +{ + local OR V W + declare -a OR + # `${!${1}_@}' does not work, so we have to use eval + OR=($(eval echo '${!'$1'_@}')) + for V in "${OR[@]}" ; do + W=${V##$1_} + eval $W='"$'$V'"' + done +} + # Sandbox subroutines function box-init @@ -57,7 +78,7 @@ function box-init if [ -z "$TEST_USER" -o "$TEST_USER" == $EVAL_USER ] ; then pcont "running locally (INSECURE), " TEST_USER=$EVAL_USER - BOXDIR=box + BOXDIR=`pwd`/box BOXCMD=bin/box mkdir -p box else @@ -152,6 +173,7 @@ function locate-source function compile { pstart "Compiling... " + override-vars "EXT_$SRCEXT" # Beware, the original SRCN can be a strange user-supplied name SRC=$PROBLEM.$SRCEXT cp "$SDIR/$SRCN" $TDIR/$SRC @@ -162,9 +184,8 @@ function compile box-clean for a in $SRC $COMP_EXTRAS ; do cp $TDIR/$a $BOXDIR/ ; done EXE=$PROBLEM - CCMD=COMP_$SRCEXT - CCMD=`eval echo ${!CCMD}` - COMP_SANDBOX_OPTS=`eval echo $COMP_SANDBOX_OPTS` + CCMD=$(expand-var COMP) + COMP_SANDBOX_OPTS=$(expand-var COMP_SANDBOX_OPTS) echo "Compiler command: $CCMD" echo "Compiler sandbox options: $COMP_SANDBOX_OPTS" eval $COMP_SANDBOX_INIT @@ -195,6 +216,12 @@ function compile # Running of test program according to current task type (returns exit code and TEST_MSG) +function test-config +{ + [ -f $PDIR/$TEST.config ] && . $PDIR/$TEST.config + override-vars "TEST_$TEST" +} + function test-run { test-run-$TASK_TYPE @@ -268,7 +295,15 @@ function test-prolog esac if [ -n "$EV_PEDANT" -a $IN_TYPE != none ] ; then pcont " " - bin/pedant <$TDIR/$TEST.in | tr '\n' ' ' >&2 + if [ "$EV_PEDANT" = 1 ] ; then + EV_PEDANT=" " + fi + bin/pedant <$TDIR/$TEST.in >$TDIR/$TEST.pedant $EV_PEDANT + if [ -s $TDIR/$TEST.pedant ] ; then + pend + sed 's/^/\t/' <$TDIR/$TEST.pedant >&2 + pstart -e '\t' + fi fi case $OUT_TYPE in file) echo "Output file: $PROBLEM.out" @@ -301,6 +336,20 @@ function test-epilog cp $BOXDIR/.stdout $TDIR/$TEST.out ;; esac + + if [ -n "$OUTPUT_FILTER" -a "$OUT_TYPE" != none -a -z "$EV_NOFILTER" ] ; then + pcont " " + FILTER=$(expand-var OUTPUT_FILTER) + echo "Output filter command: $FILTER" + mv $TDIR/$TEST.out $TDIR/$TEST.raw + if ! eval $FILTER 2>$TMPDIR/exec.out ; then + cat $TMPDIR/exec.out + MSG=`tail -1 $TMPDIR/exec.out` + if [ -z "$MSG" ] ; then MSG="Filter failed" ; fi + test-result 0 "$MSG" + fi + cat $TMPDIR/exec.out + fi } # Running of test program with file input/output @@ -309,7 +358,7 @@ function test-run-file { test-prolog pcont " " - BOXOPTS="`eval echo $TEST_SANDBOX_OPTS`$BOX_EXTRAS" + BOXOPTS=$(expand-var TEST_SANDBOX_OPTS) echo "Sandbox options: $BOXOPTS" if ! $BOXCMD $BOXOPTS -- ./$PROBLEM 2>$TMPDIR/exec.out ; then cat $TMPDIR/exec.out @@ -326,9 +375,9 @@ function test-run-interactive { test-prolog pcont " " - BOXOPTS="`eval echo $TEST_SANDBOX_OPTS`$BOX_EXTRAS" + BOXOPTS=$(expand-var TEST_SANDBOX_OPTS) echo "Sandbox options: $BOXOPTS" - ICCMD=`eval echo $IA_CHECK` + ICCMD=$(expand-var IA_CHECK) echo "Interactive checker: $ICCMD" if ! $HDIR/bin/iwrapper $BOXCMD $BOXOPTS -- ./$PROBLEM @@ $ICCMD 2>$TMPDIR/exec.out ; then cat $TMPDIR/exec.out @@ -354,7 +403,7 @@ function syntax-check [ -n "$SYNTAX_CHECK" ] || return 0 [ -z "$EV_NOCHECK" ] || return 0 pcont " " - SCHECK=`eval echo $SYNTAX_CHECK` + SCHECK=$(expand-var SYNTAX_CHECK) echo "Syntax check command: $SCHECK" if ! eval $SCHECK 2>$TMPDIR/exec.out ; then cat $TMPDIR/exec.out @@ -373,7 +422,7 @@ function output-check if [ -n "$OUTPUT_CHECK" -a "$OUT_TYPE" != none -a -z "$EV_NOCHECK" ] ; then pcont " " [ -f $PDIR/$TEST.out ] && ln $PDIR/$TEST.out $TDIR/$TEST.ok - OCHECK=`eval echo $OUTPUT_CHECK` + OCHECK=$(expand-var OUTPUT_CHECK) echo "Output check command: $OCHECK" if ! eval $OCHECK 2>$TMPDIR/exec.out ; then cat $TMPDIR/exec.out