function locate-source
{
pstart "Finding source... "
- SBASE=${1:-$PROBLEM}
+ if [ -n "$1" ] ; then
+ SRCBASE=$(echo $1 | sed 's/\.\([^.]\+\)//')
+ SRCEXT=$(echo $1 | sed 's/.*\.\([^.]\+\)/\1/')
+ if [ -n "$SRCEXT" ] ; then
+ # Full name given, so just check the extension and existence
+ SRCN=$1
+ if [ ${SRCN:0:1} == / ] ; then
+ SRCN=${SRCN:1}
+ SDIR=
+ fi
+ [ -f "$SDIR/$SRCN" ] || die "Cannot find source file $SDIR/$SRCN"
+ SRCEXT_OK=
+ for a in $EXTENSIONS ; do
+ if [ $a == $SRCEXT ] ; then
+ pend $SDIR/$SRCN
+ echo "Explicitly set source file: $SDIR/$SRCN"
+ return 0
+ fi
+ done
+ die "Unknown extension .$SRCEXT"
+ fi
+ else
+ SBASE=$PROBLEM
+ fi
for a in $EXTENSIONS ; do
if [ -f $SDIR/$SBASE.$a ] ; then
[ -z "$SRCN" ] || die "Multiple source files found: $SDIR/$PROBLEM.$a and $SDIR/$SRCN. Please fix."
function compile
{
pstart "Compiling... "
- cp -a $SDIR/$SRCN $TDIR/$SRCN
+ # Beware, the original SRCN can be a strange user-supplied name
+ SRC=$PROBLEM.$SRCEXT
+ cp -a $SDIR/$SRCN $TDIR/$SRC
if [ -n "$COMP_EXTRAS" ] ; then
echo "Extras: $COMP_EXTRAS"
for a in $COMP_EXTRAS ; do cp $PDIR/$a $TDIR/ ; done
fi
box-clean
- for a in $SRCN $COMP_EXTRAS ; do cp $TDIR/$a $BOXDIR/ ; done
- SRC=$SRCN
+ for a in $SRC $COMP_EXTRAS ; do cp $TDIR/$a $BOXDIR/ ; done
EXE=$PROBLEM
CCMD=COMP_$SRCEXT
CCMD=`eval echo ${!CCMD}`
;;
stdio) echo "Input file: <stdin> (from $PDIR/$TEST.in)"
ln $PDIR/$TEST.in $TDIR/$TEST.in
- BOX_EXTRAS="$BOX_EXTRAS -i$TDIR/$TEST.in"
+ cp $PDIR/$TEST.in $BOXDIR/.stdin
+ BOX_EXTRAS="$BOX_EXTRAS -i.stdin"
;;
none) echo "Input file: <none>"
;;
BOX_EXTRAS="$BOX_EXTRAS -o/dev/null"
;;
stdio) echo "Output file: <stdout>"
- BOX_EXTRAS="$BOX_EXTRAS -o$TDIR/$TEST.out"
+ BOX_EXTRAS="$BOX_EXTRAS -o.stdout"
;;
none) echo "Output file: <none>"
;;
file) [ -f $BOXDIR/$PROBLEM.out ] || test-result 0 "No output file."
cp $BOXDIR/$PROBLEM.out $TDIR/$TEST.out
;;
- stdio) [ -f $TDIR/$TEST.out ] || test-result 0 "No output file."
+ stdio) [ -f $BOXDIR/.stdout ] || test-result 0 "No output file."
+ cp $BOXDIR/.stdout $TDIR/$TEST.out
;;
esac
}
BOXOPTS="`eval echo $TEST_SANDBOX_OPTS`$BOX_EXTRAS"
echo "Sandbox options: $BOXOPTS"
if ! $BOXCMD $BOXOPTS -- ./$PROBLEM 2>$TMPDIR/exec.out ; then
- MSG=`head -1 $TMPDIR/exec.out`
+ cat $TMPDIR/exec.out
+ MSG=`tail -1 $TMPDIR/exec.out`
test-result 0 "$MSG"
fi
cat $TMPDIR/exec.out
ICCMD=`eval echo $IA_CHECK`
echo "Interactive checker: $ICCMD"
if ! $HDIR/bin/iwrapper $BOXCMD $BOXOPTS -- ./$PROBLEM @@ $ICCMD 2>$TMPDIR/exec.out ; then
- MSG="`head -1 $TMPDIR/exec.out`"
+ cat $TMPDIR/exec.out
+ MSG="`tail -1 $TMPDIR/exec.out`"
test-result 0 "$MSG"
fi
cat $TMPDIR/exec.out
SCHECK=`eval echo $SYNTAX_CHECK`
echo "Syntax check command: $SCHECK"
if ! eval $SCHECK 2>$TMPDIR/exec.out ; then
- MSG=`head -1 $TMPDIR/exec.out`
+ cat $TMPDIR/exec.out
+ MSG=`tail -1 $TMPDIR/exec.out`
if [ -z "$MSG" ] ; then MSG="Wrong syntax." ; fi
test-result 0 "$MSG"
fi
OCHECK=`eval echo $OUTPUT_CHECK`
echo "Output check command: $OCHECK"
if ! eval $OCHECK 2>$TMPDIR/exec.out ; then
- MSG=`head -1 $TMPDIR/exec.out`
+ cat $TMPDIR/exec.out
+ MSG=`tail -1 $TMPDIR/exec.out`
if [ -z "$MSG" ] ; then MSG="Wrong answer." ; fi
test-result 0 "$MSG"
fi
- MSG=`head -1 $TMPDIR/exec.out`
+ cat $TMPDIR/exec.out
+ MSG=`tail -1 $TMPDIR/exec.out`
if [ -z "$MSG" ] ; then MSG="OK" ; fi
test-result $POINTS_PER_TEST "$MSG"
}
function public-setup
{
- HDIR=$MO_PUBLIC
- PDIR=$MO_PUBLIC/problems/$PROBLEM
+ HDIR=$MO_ROOT
+ PDIR=$MO_ROOT/problems/$PROBLEM
SDIR=.
TDIR=~/.test
TMPDIR=~/.test
BOXDIR=~/.box
mkdir -p $BOXDIR
rm -rf $BOXDIR/*
- BOXCMD="$MO_PUBLIC/bin/box -c$BOXDIR"
+ BOXCMD="$MO_ROOT/bin/box -c$BOXDIR"
exec >log
pend "OK (see 'log' for details)"
}
function open-locate
{
[ -f $PDIR/$TEST.in ] || die "Unknown test $TEST"
- SRCN=$SDIR/$PROBLEM$TEST.out
+ if [ -n "$1" ] ; then
+ SRCN=$1
+ else
+ SRCN=$SDIR/$PROBLEM$TEST.out
+ fi
[ -f $SRCN ] || fatal "Output file $SRCN not found"
}