]> mj.ucw.cz Git - eval.git/blob - bin/lib
090e752a6dd5059cc13ce47cfb9fed0501add962
[eval.git] / bin / lib
1 # The Evaluator -- Shell Function Library
2 # (c) 2001 Martin Mares <mj@ucw.cz>
3
4 # Logging functions.
5 # File handles used: fd1=log, fd2=progress
6
7 function log-init
8 {
9         exec >>$TDIR/log
10         HAVE_LOG=1
11 }
12
13 function pstart
14 {
15         echo >&2 -n "$@"
16 }
17
18 function pcont
19 {
20         echo >&2 -n "$@"
21 }
22
23 function pend
24 {
25         echo >&2 "$@"
26 }
27
28 function die
29 {
30         echo >&2 "$@"
31         [ -n "$HAVE_LOG" ] && echo "Fatal error: $@"
32         exit 1
33 }
34
35 # Sandbox subroutines
36
37 function box-init
38 {
39         pstart "Preparing sandbox... "
40         [ -n "$TEST_USER" ] || die "TEST_USER not set. Please fix."
41         if [ $TEST_USER == $EVAL_USER ] ; then
42                 pcont "running locally (INSECURE), "
43                 BOXDIR=box
44                 BOXCMD=bin/box
45                 mkdir -p box
46         else
47                 pcont "used account $TEST_USER, "
48                 BOXDIR=$MO_ROOT/$TEST_USER
49                 BOXCMD=bin/box-$TEST_USER
50         fi
51         [ -d $BOXDIR -a -f $BOXCMD ] || die "Sandbox set up incorrectly"
52         BOXCMD="$BOXCMD -c$BOXDIR"
53         echo "Sandbox directory: $BOXDIR"
54         echo "Sandbox command: $BOXCMD"
55         box-clean
56         pend "OK"
57 }
58
59 function box-clean
60 {
61         [ -n "$BOXCMD" ] || die "box-init not called"
62         # FIXME: Dot files
63         rm -rf $BOXDIR/*
64 }
65
66 # Initialization of testing directories
67
68 function dir-init
69 {
70         pstart "Initializing... "
71         PDIR=problems/$PROBLEM
72         SDIR=solutions/$CONTESTANT/$PROBLEM
73         TDIR=testing/$CONTESTANT/$PROBLEM
74         [ -d $PDIR ] || die "Problem $PROBLEM not known"
75         [ -d $SDIR ] || die "Solution of $PROBLEM not found"
76         mkdir -p $TDIR
77         rm -rf $TDIR
78         cp -a $SDIR $TDIR
79         cat >$TDIR/log <<EOF
80 Testing solution of $PROBLEM by $CONTESTANT
81 Test started at `date`
82 Contestant's solution directory: $SDIR
83 Problem directory: $PDIR
84 Testing directory: $TDIR
85 EOF
86         >$TDIR/points
87         pend "OK"
88 }
89
90 # Locating source file in SDIR, pass name in SRCN (without path) and extension in SRCEXT
91
92 function locate-source
93 {
94         pstart "Locating source... "
95         for a in $EXTENSIONS ; do
96                 if [ -f $SDIR/$PROBLEM.$a ] ; then
97                         [ -z "$SRCN" ] || die "Multiple source files found: $SDIR/$PROBLEM.$a and $SDIR/$SRCN. Please fix."
98                         SRCN=$PROBLEM.$a
99                         SRCEXT=$a
100                 fi
101         done
102         [ -n "$SRCN" ] || die "NOT FOUND"
103         pend $SRCN
104         echo "Found source file: $SDIR/$SRCN"
105 }
106
107 # Compilation (compile SDIR/SRCN with PDIR/EXTRAS to EXE=TDIR/PROBLEM)
108
109 function compile
110 {
111         pstart "Compiling... "
112         cp -a $SDIR/$SRCN $TDIR/$SRCN
113         if [ -n "$EXTRAS" ] ; then
114                 echo "Extras: $EXTRAS"
115                 for a in $EXTRAS ; do cp $PDIR/$a $TDIR/ ; done
116         fi
117         box-clean
118         for a in $SRCN $EXTRAS ; do cp $TDIR/$a $BOXDIR/ ; done
119         SRC=$SRCN
120         EXE=$PROBLEM
121         CCMD=COMP_$SRCEXT
122         CCMD="`eval echo ${!CCMD}`"
123         COMP_SANDBOX_OPTS="`eval echo $COMP_SANDBOX_OPTS`"
124         echo "Compiler command: $CCMD"
125         echo "Compiler sandbox options: $COMP_SANDBOX_OPTS"
126
127         echo "Compiler input files:"
128         ls -Al $BOXDIR
129         if ! $BOXCMD $COMP_SANDBOX_OPTS -- $CCMD 2>$TDIR/compile.out ; then
130                 COMPILE_MSG="`cat $TDIR/compile.out`"
131                 pend "FAILED: $COMPILE_MSG"
132                 echo "$COMPILE_MSG"
133                 return 1
134         fi
135         cat $TDIR/compile.out
136         echo "Compiler output files:"
137         ls -Al $BOXDIR
138         if [ ! -f $BOXDIR/$PROBLEM ] ; then
139                 pend "FAILED: Missing executable file"
140                 echo "Missing executable file"
141                 return 1
142         fi
143         EXE=$TDIR/$PROBLEM
144         cp -a $BOXDIR/$PROBLEM $EXE
145         echo "Compiled OK, result copied to $EXE"
146         pend "OK"
147 }
148
149 # Running of test program with file input/output
150
151 function test-run-with-files
152 {
153         pcont "<init> "
154         box-clean
155         echo "Executable file: $TDIR/$PROBLEM"
156         cp $TDIR/$PROBLEM $BOXDIR/
157         echo "Input: $TDIR/$PROBLEM"
158         cp $PDIR/$TEST.in $BOXDIR/$PROBLEM.in
159         echo "Input files:"
160         ls -Al $BOXDIR
161
162         pcont "<run> "
163         echo "Timeout: $TIME_LIMIT s"
164         echo "Memory: $MEM_LIMIT KB"
165         BOXOPTS="`eval echo $TEST_SANDBOX_OPTS`"
166         echo "Sandbox options: $BOXOPTS"
167         if ! $BOXCMD $BOXOPTS -- ./$PROBLEM 2>$TDIR/exec.out ; then
168                 TEST_MSG="`cat $TDIR/exec.out`"
169                 pend "$TEST_MSG"
170                 echo "$TEST_MSG"
171                 # FIXME: Better recognition of run-time errors
172                 echo >$PTSFILE "0 RT"
173                 return 1
174         fi
175         echo "Output files:"
176         ls -Al $BOXDIR
177         if [ ! -f $BOXDIR/$PROBLEM.out ] ; then
178                 pend "No output file."
179                 echo "No output file."
180                 echo >$PTSFILE "0 NO"
181                 return 1
182         fi
183                 cp $BOXDIR/$PROBLEM.out $TDIR/$PROBLEM.out
184 }