scanner: testcase-generator von georg
[testub10.git] / scanner / georg_testcase-generator.sh
1 #! /bin/bash
2
3 [ "$SCRIPT" ]   || SCRIPT="$(basename $0)"
4 [ "$PROGRAM" ]  || PROGRAM='scanner'
5 [ "$DIGITS" ]   || DIGITS='3'
6
7 if ! test $# -eq 1
8 then
9         cat >&2 << EOF
10 Usage:
11         [ PATH="\$PATH:/a/b" ] [ PROGRAM='$PROGRAM' ] [ DIGITS='$DIGITS' ] \\
12         $SCRIPT hexcharset
13
14 Example:
15         PROGRAM='~/abgabe/scanner/scanner' DIGITS='6' \\
16         $SCRIPT 202f2a31 ## \$(echo -n ' /*1' | xxd -ps)
17         $SCRIPT 2009     ## \$(echo -ne ' \\t' | xxd -ps)
18         $SCRIPT 203a3d   ##  :=  ##  if0x1  #  \\t\\r
19         $SCRIPT 202f2a   ##  /*  ##  if39  ##  \\f\\b
20         $SCRIPT 202f2a31 ##  /*1  #  0x1  ### 0123
21         | sha1sum --check
22
23         scanner < 202f2a31.0.0 \\
24         | diff -u 202f2a31.0.1 - \\
25         || (echo >&2 ERROR ; false)
26
27 Result:
28         sha1sum hexcharset.retval.fileno
29
30 Warning: first character in hexcharset behaves slightly differently.
31 EOF
32         exit 1
33 fi
34
35 HEX="$1"
36 HEX=$(echo "$HEX" | xxd -r -ps | xxd -ps | head -1)
37 NUM=$(echo "$HEX" | xxd -r -ps | wc -c)
38
39 if ! test $NUM -ge 2
40 then
41         echo >&2 "ERROR: charset too small"
42         exit 1
43 fi
44
45 if ! test $NUM -le 16
46 then
47         echo >&2 "ERROR: charset too big"
48         exit 1
49 fi
50
51 if ! ( echo | $PROGRAM )
52 then
53         echo >&2 "ERROR: program failed"
54         exit 1
55 fi
56
57 MAX=$((NUM**(DIGITS)-1))
58 SRC=$(seq 0 $((NUM-1)) | sed -e "1iobase=$NUM" | bc | tr -d '\n')
59
60 rm -f $HEX.i.*
61 rm -f $HEX.*.*
62
63 for i in $(seq $MAX | sed -e "1iobase=$NUM" | bc)
64 do
65         echo $i | tr "$SRC" "$(echo $HEX | xxd -r -ps)" > $HEX.i.0
66
67         cat $HEX.i.0 | $PROGRAM >$HEX.i.1 2>$HEX.i.2
68         RET=$?
69
70         cat $HEX.i.0 >> $HEX.$RET.0
71         cat $HEX.i.1 >> $HEX.$RET.1
72         cat $HEX.i.2 >> $HEX.$RET.2
73 done
74
75 rm -f $HEX.i.*
76 sha1sum $HEX.*.*
77
78 # WISHLIST
79 # set -o pipefail
80 # MD5 SHA1
81 # *.[^0].* keep split
82 # find -iname "$HEX.*.*" -ls
83 # head $HEX.*.*
84 # SCRIPT
85 # multiple string args
86
87 ## Georg Schiesser <e0307201/AT/student.tuwien.ac.at> @ UBVL 2010S # GPLv2
88 ## vim: filetype=sh shiftwidth=8 tabstop=8 noexpandtab nopaste:
89 ## EOF