Home | History | Annotate | Line # | Download | only in testdir
T.misc revision 1.1.1.1.4.2
      1  1.1.1.1.4.2  martin #!/bin/sh
      2  1.1.1.1.4.2  martin 
      3  1.1.1.1.4.2  martin echo T.misc: miscellaneous buglets now watched for
      4  1.1.1.1.4.2  martin 
      5  1.1.1.1.4.2  martin awk=${awk-../a.out}
      6  1.1.1.1.4.2  martin 
      7  1.1.1.1.4.2  martin rm -f core
      8  1.1.1.1.4.2  martin 
      9  1.1.1.1.4.2  martin echo 'The big brown over the lazy doe
     10  1.1.1.1.4.2  martin The big brown over the lazy dog
     11  1.1.1.1.4.2  martin x
     12  1.1.1.1.4.2  martin The big brown over the lazy dog' >foo
     13  1.1.1.1.4.2  martin echo 'failed
     14  1.1.1.1.4.2  martin succeeded
     15  1.1.1.1.4.2  martin failed
     16  1.1.1.1.4.2  martin succeeded' >foo1
     17  1.1.1.1.4.2  martin $awk '{ if (match($0, /^The big brown over the lazy dog/) == 0) {
     18  1.1.1.1.4.2  martin 		printf("failed\n")
     19  1.1.1.1.4.2  martin 	} else {
     20  1.1.1.1.4.2  martin 		printf("succeeded\n")
     21  1.1.1.1.4.2  martin 	}
     22  1.1.1.1.4.2  martin } ' foo >foo2
     23  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc ghosh RE bug'
     24  1.1.1.1.4.2  martin 
     25  1.1.1.1.4.2  martin echo '123
     26  1.1.1.1.4.2  martin 1234567890
     27  1.1.1.1.4.2  martin 12345678901' >foo
     28  1.1.1.1.4.2  martin echo '12345678901' >foo1
     29  1.1.1.1.4.2  martin $awk 'length($0) > 10' foo >foo2
     30  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc last number bug'
     31  1.1.1.1.4.2  martin 
     32  1.1.1.1.4.2  martin # check some \ sequences in strings (ascii)
     33  1.1.1.1.4.2  martin echo HIJKL >foo1
     34  1.1.1.1.4.2  martin echo foo | $awk '{ print "H\x49\x4a\x4BL" }' >foo2
     35  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc hex string cvt'
     36  1.1.1.1.4.2  martin 
     37  1.1.1.1.4.2  martin echo 012x45 >foo1
     38  1.1.1.1.4.2  martin $awk 'BEGIN { print "0\061\62x\0645" }' >foo2
     39  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc oct string cvt'
     40  1.1.1.1.4.2  martin 
     41  1.1.1.1.4.2  martin # $i++ means ($i)++
     42  1.1.1.1.4.2  martin echo 3 5 | $awk '{ i = 1; print $i++ ; print $1, i }' >foo1
     43  1.1.1.1.4.2  martin echo '3
     44  1.1.1.1.4.2  martin 4 1' >foo2
     45  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc bad field increment'
     46  1.1.1.1.4.2  martin 
     47  1.1.1.1.4.2  martin # makes sure that fields are recomputed even if self-assignment
     48  1.1.1.1.4.2  martin # take into account that subtracting from NF now rebuilds the record
     49  1.1.1.1.4.2  martin echo 'a b c
     50  1.1.1.1.4.2  martin s p q r
     51  1.1.1.1.4.2  martin x y z' >foo
     52  1.1.1.1.4.2  martin echo 'a
     53  1.1.1.1.4.2  martin s p
     54  1.1.1.1.4.2  martin x' >foo1
     55  1.1.1.1.4.2  martin $awk '{ NF -= 2; $1 = $1; print }' <foo >foo2
     56  1.1.1.1.4.2  martin diff foo1 foo2 || echo 1>&2 "BAD: T.misc bad field self-assignment"
     57  1.1.1.1.4.2  martin 
     58  1.1.1.1.4.2  martin echo '1
     59  1.1.1.1.4.2  martin 1' >foo1
     60  1.1.1.1.4.2  martin $awk 'BEGIN {x = 1; print x; x = x; print x}' >foo2
     61  1.1.1.1.4.2  martin diff foo1 foo2 || echo 1>&2 "BAD: T.misc bad self-assignment"
     62  1.1.1.1.4.2  martin 
     63  1.1.1.1.4.2  martin echo 573109312 | $awk '{print $1*4}' >foo1
     64  1.1.1.1.4.2  martin echo 2292437248 >foo2
     65  1.1.1.1.4.2  martin diff foo1 foo2 || echo 1>&2 "BAD: T.misc bad overflow"
     66  1.1.1.1.4.2  martin 
     67  1.1.1.1.4.2  martin # note that there are 8-bit characters in the echo
     68  1.1.1.1.4.2  martin # some shells will probably screw this up.
     69  1.1.1.1.4.2  martin echo '#
     70  1.1.1.1.4.2  martin code  1
     71  1.1.1.1.4.2  martin code  2' |
     72  1.1.1.1.4.2  martin $awk '/^#/' >foo1
     73  1.1.1.1.4.2  martin echo '#' >foo2
     74  1.1.1.1.4.2  martin diff foo1 foo2 || echo 1>&2 "BAD: T.misc bad match of 8-bit char"
     75  1.1.1.1.4.2  martin 
     76  1.1.1.1.4.2  martin echo hello |
     77  1.1.1.1.4.2  martin $awk 'BEGIN	{ FILENAME = "/etc/passwd" }
     78  1.1.1.1.4.2  martin 	{ print $0 }' >/dev/null
     79  1.1.1.1.4.2  martin if test -r core; then echo 1>&2 "BAD: T.misc /etc/passwd dropped core"; fi
     80  1.1.1.1.4.2  martin 
     81  1.1.1.1.4.2  martin echo hello |
     82  1.1.1.1.4.2  martin $awk '  function foo(foo) {
     83  1.1.1.1.4.2  martin                 foo = 1
     84  1.1.1.1.4.2  martin                 foo()
     85  1.1.1.1.4.2  martin         }
     86  1.1.1.1.4.2  martin 	{ foo(bar) }
     87  1.1.1.1.4.2  martin ' >/dev/null 2>&1
     88  1.1.1.1.4.2  martin if test -r core; then
     89  1.1.1.1.4.2  martin 	echo 1>&2 "BAD: T.misc function foo(foo) dropped core"
     90  1.1.1.1.4.2  martin 	rm -f core
     91  1.1.1.1.4.2  martin fi
     92  1.1.1.1.4.2  martin 
     93  1.1.1.1.4.2  martin echo '2
     94  1.1.1.1.4.2  martin 10' |
     95  1.1.1.1.4.2  martin $awk '{ x[NR] = $0 }	# test whether $0 is NUM as well as STR
     96  1.1.1.1.4.2  martin END { if (x[1] > x[2]) print "BAD: T.misc: $0 is not NUM" }'
     97  1.1.1.1.4.2  martin 
     98  1.1.1.1.4.2  martin 
     99  1.1.1.1.4.2  martin $awk 'BEGIN {
    100  1.1.1.1.4.2  martin 	npad = substr("alexander" "           ",1,15)
    101  1.1.1.1.4.2  martin 	print npad
    102  1.1.1.1.4.2  martin 	}' >foo
    103  1.1.1.1.4.2  martin grep '\\' foo && echo 1>&2 "BAD: T.misc alexander fails"
    104  1.1.1.1.4.2  martin 
    105  1.1.1.1.4.2  martin # This should give an error about function arguments
    106  1.1.1.1.4.2  martin $awk '
    107  1.1.1.1.4.2  martin function foo(x) { print "x is" x }
    108  1.1.1.1.4.2  martin BEGIN { foo(foo) }
    109  1.1.1.1.4.2  martin ' 2>foo
    110  1.1.1.1.4.2  martin grep "can't use function foo" foo >/dev/null || echo 1>&2 "BAD: T.misc fcn args"
    111  1.1.1.1.4.2  martin 
    112  1.1.1.1.4.2  martin 
    113  1.1.1.1.4.2  martin # gawk defref test; should give error about undefined function
    114  1.1.1.1.4.2  martin $awk 'BEGIN { foo() }' 2>foo
    115  1.1.1.1.4.2  martin grep "calling undefined function foo" foo >/dev/null || echo 1>&2 "BAD: T.misc undefined function"
    116  1.1.1.1.4.2  martin 
    117  1.1.1.1.4.2  martin 
    118  1.1.1.1.4.2  martin # gawk arrayparm test; should give error about function 
    119  1.1.1.1.4.2  martin $awk '
    120  1.1.1.1.4.2  martin BEGIN {
    121  1.1.1.1.4.2  martin     foo[1]=1;
    122  1.1.1.1.4.2  martin     foo[2]=2;
    123  1.1.1.1.4.2  martin     bug1(foo);
    124  1.1.1.1.4.2  martin }
    125  1.1.1.1.4.2  martin function bug1(i) {
    126  1.1.1.1.4.2  martin     for (i in foo) {
    127  1.1.1.1.4.2  martin 	bug2(i);
    128  1.1.1.1.4.2  martin 	delete foo[i];
    129  1.1.1.1.4.2  martin 	print i,1,bot[1];
    130  1.1.1.1.4.2  martin     }
    131  1.1.1.1.4.2  martin }
    132  1.1.1.1.4.2  martin function bug2(arg) {
    133  1.1.1.1.4.2  martin     bot[arg]=arg;
    134  1.1.1.1.4.2  martin }
    135  1.1.1.1.4.2  martin ' 2>foo
    136  1.1.1.1.4.2  martin grep "can.t assign to foo" foo >/dev/null || echo 1>&2 "BAD: T.misc foo bug"
    137  1.1.1.1.4.2  martin 
    138  1.1.1.1.4.2  martin 
    139  1.1.1.1.4.2  martin # This should be a syntax error
    140  1.1.1.1.4.2  martin $awk '
    141  1.1.1.1.4.2  martin !x = y
    142  1.1.1.1.4.2  martin ' 2>foo
    143  1.1.1.1.4.2  martin grep "syntax error" foo >/dev/null || echo 1>&2 "BAD: T.misc syntax error !x=y fails"
    144  1.1.1.1.4.2  martin 
    145  1.1.1.1.4.2  martin # This should print bbb
    146  1.1.1.1.4.2  martin $awk '
    147  1.1.1.1.4.2  martin BEGIN { up[1] = "a"
    148  1.1.1.1.4.2  martin 	for (i in up) gsub("a", "A", x)
    149  1.1.1.1.4.2  martin 	print x x "bbb"
    150  1.1.1.1.4.2  martin 	exit
    151  1.1.1.1.4.2  martin       }
    152  1.1.1.1.4.2  martin ' >foo
    153  1.1.1.1.4.2  martin grep bbb foo >/dev/null || echo 1>&2 "BAD: T.misc gsub failed"
    154  1.1.1.1.4.2  martin 
    155  1.1.1.1.4.2  martin echo yes |
    156  1.1.1.1.4.2  martin $awk '
    157  1.1.1.1.4.2  martin BEGIN {
    158  1.1.1.1.4.2  martin 	printf "push return" >"/dev/null"
    159  1.1.1.1.4.2  martin 	getline ans <"/dev/null"
    160  1.1.1.1.4.2  martin } '
    161  1.1.1.1.4.2  martin if test -r core; then echo 1>&2 "BAD: T.misc getline ans dropped core"; fi
    162  1.1.1.1.4.2  martin 
    163  1.1.1.1.4.2  martin $awk 'BEGIN { unireghf() }
    164  1.1.1.1.4.2  martin function unireghf(hfeed) { hfeed[1] = 0 }'
    165  1.1.1.1.4.2  martin if test -r core; then echo 1>&2 "BAD: T.misc unireghf dropped core"; fi
    166  1.1.1.1.4.2  martin 
    167  1.1.1.1.4.2  martin echo x | $awk '/[/]/' 2>foo
    168  1.1.1.1.4.2  martin grep 'nonterminated character class' foo >/dev/null || error 'BAD: T.misc nonterminated fails'
    169  1.1.1.1.4.2  martin if test -r core; then echo 1>&2 "BAD: T.misc nonterminated dropped core"; fi
    170  1.1.1.1.4.2  martin 
    171  1.1.1.1.4.2  martin $awk '
    172  1.1.1.1.4.2  martin function f() { return 12345 }
    173  1.1.1.1.4.2  martin BEGIN { printf "<%s>\n", f() }
    174  1.1.1.1.4.2  martin ' >foo
    175  1.1.1.1.4.2  martin grep '<12345>' foo >/dev/null || echo 'BAD: T.misc <12345> fails'
    176  1.1.1.1.4.2  martin 
    177  1.1.1.1.4.2  martin echo 'abc
    178  1.1.1.1.4.2  martin def
    179  1.1.1.1.4.2  martin 
    180  1.1.1.1.4.2  martin ghi
    181  1.1.1.1.4.2  martin jkl' >foo
    182  1.1.1.1.4.2  martin $awk '
    183  1.1.1.1.4.2  martin BEGIN {	RS = ""
    184  1.1.1.1.4.2  martin 	while (getline <"foo")
    185  1.1.1.1.4.2  martin 		print
    186  1.1.1.1.4.2  martin }' >foo1
    187  1.1.1.1.4.2  martin $awk 'END {print NR}' foo1 | grep 4 >/dev/null || echo 'BAD: T.misc abcdef fails'
    188  1.1.1.1.4.2  martin 
    189  1.1.1.1.4.2  martin 
    190  1.1.1.1.4.2  martin # The following should not produce a warning about changing a constant
    191  1.1.1.1.4.2  martin # nor about a curdled tempcell list
    192  1.1.1.1.4.2  martin $awk 'function f(x) { x = 2 }
    193  1.1.1.1.4.2  martin BEGIN { f(1) }' >foo
    194  1.1.1.1.4.2  martin grep '^' foo && echo 'BAD: test constant change fails'
    195  1.1.1.1.4.2  martin 
    196  1.1.1.1.4.2  martin # The following should not produce a warning about a curdled tempcell list
    197  1.1.1.1.4.2  martin $awk 'function f(x) { x }
    198  1.1.1.1.4.2  martin BEGIN { f(1) }' >foo
    199  1.1.1.1.4.2  martin grep '^' foo && echo 'BAD: test tempcell list fails'
    200  1.1.1.1.4.2  martin 
    201  1.1.1.1.4.2  martin $awk 'BEGIN { print 9, a=10, 11; print a; exit }' >foo1
    202  1.1.1.1.4.2  martin echo '9 10 11
    203  1.1.1.1.4.2  martin 10' >foo2
    204  1.1.1.1.4.2  martin diff foo1 foo2 || echo 'BAD: T.misc (embedded expression)'
    205  1.1.1.1.4.2  martin 
    206  1.1.1.1.4.2  martin echo "abc defgh ijkl" | $awk '
    207  1.1.1.1.4.2  martin   { $1 = ""; line = $0; print line; print $0; $0 = line; print $0 }' >foo1
    208  1.1.1.1.4.2  martin echo " defgh ijkl
    209  1.1.1.1.4.2  martin  defgh ijkl
    210  1.1.1.1.4.2  martin  defgh ijkl" >foo2
    211  1.1.1.1.4.2  martin diff foo1 foo2 || echo 'BAD: T.misc (assignment to $0)'
    212  1.1.1.1.4.2  martin 
    213  1.1.1.1.4.2  martin $awk '
    214  1.1.1.1.4.2  martin function min(a, b)
    215  1.1.1.1.4.2  martin {
    216  1.1.1.1.4.2  martin 	if (a < b)
    217  1.1.1.1.4.2  martin 		return a
    218  1.1.1.1.4.2  martin 	else
    219  1.1.1.1.4.2  martin 		return b
    220  1.1.1.1.4.2  martin }
    221  1.1.1.1.4.2  martin BEGIN { exit }
    222  1.1.1.1.4.2  martin '
    223  1.1.1.1.4.2  martin if test -r core; then echo 1>&2 "BAD: T.misc function min dropped core"; fi
    224  1.1.1.1.4.2  martin 
    225  1.1.1.1.4.2  martin # The following should not give a syntax error message:
    226  1.1.1.1.4.2  martin $awk '
    227  1.1.1.1.4.2  martin function expand(chart) {
    228  1.1.1.1.4.2  martin 	getline chart < "CHAR.ticks"
    229  1.1.1.1.4.2  martin }
    230  1.1.1.1.4.2  martin ' >foo
    231  1.1.1.1.4.2  martin grep '^' foo >/dev/null && echo 'BAD: T.misc expand error'
    232  1.1.1.1.4.2  martin 
    233  1.1.1.1.4.2  martin $awk 'BEGIN { print 1e40 }' >/dev/null
    234  1.1.1.1.4.2  martin if test -r core; then echo 1>&2 "BAD: T.misc 1E40 dropped core"; fi
    235  1.1.1.1.4.2  martin 
    236  1.1.1.1.4.2  martin # The following syntax error should not dump core:
    237  1.1.1.1.4.2  martin $awk '
    238  1.1.1.1.4.2  martin $NF==3	{first=1}
    239  1.1.1.1.4.2  martin $NF==2 && first==0 && (abs($1-o1)>120||abs($2-o2)>120)	{print $0}
    240  1.1.1.1.4.2  martin $NF==2	{o1=%1; o2=$2; first=0}
    241  1.1.1.1.4.2  martin ' 2>/dev/null
    242  1.1.1.1.4.2  martin if test -r core; then echo 1>&2 "BAD: T.misc first/abs dropped core"; fi
    243  1.1.1.1.4.2  martin 
    244  1.1.1.1.4.2  martin # The following syntax error should not dump core:
    245  1.1.1.1.4.2  martin $awk '{ n = split($1, address, !); print address[1] }' 2>foo
    246  1.1.1.1.4.2  martin grep 'illegal statement' foo >/dev/null || echo 'BAD: T.misc split error'
    247  1.1.1.1.4.2  martin if test -r core; then echo 1>&2 "BAD: T.misc split! dropped core"; fi
    248  1.1.1.1.4.2  martin 
    249  1.1.1.1.4.2  martin # The following should cause a syntax error message
    250  1.1.1.1.4.2  martin $awk 'BEGIN {"hello"}' 2>foo
    251  1.1.1.1.4.2  martin grep 'illegal statement' foo >/dev/null || echo 'BAD: T.misc hello error'
    252  1.1.1.1.4.2  martin 
    253  1.1.1.1.4.2  martin # The following should give a syntax error message:
    254  1.1.1.1.4.2  martin $awk '
    255  1.1.1.1.4.2  martin function pile(c,     r) {
    256  1.1.1.1.4.2  martin 	r = ++pile[c]
    257  1.1.1.1.4.2  martin }
    258  1.1.1.1.4.2  martin 
    259  1.1.1.1.4.2  martin { pile($1) }
    260  1.1.1.1.4.2  martin ' 2>foo
    261  1.1.1.1.4.2  martin grep 'context is' foo >/dev/null || echo 'BAD: T.misc pile error'
    262  1.1.1.1.4.2  martin 
    263  1.1.1.1.4.2  martin # This should complain about missing atan2 argument:
    264  1.1.1.1.4.2  martin $awk 'BEGIN { atan2(1) }' 2>foo
    265  1.1.1.1.4.2  martin grep 'requires two arg' foo >/dev/null || echo 'BAD: T.misc atan2 error'
    266  1.1.1.1.4.2  martin 
    267  1.1.1.1.4.2  martin # This should not core dump:
    268  1.1.1.1.4.2  martin $awk 'BEGIN { f() }
    269  1.1.1.1.4.2  martin function f(A) { delete A[1] }
    270  1.1.1.1.4.2  martin '
    271  1.1.1.1.4.2  martin if test -r core; then echo 1>&2 "BAD: T.misc delete dropped core"; fi
    272  1.1.1.1.4.2  martin 
    273  1.1.1.1.4.2  martin # nasty one:  should not be able to overwrite constants
    274  1.1.1.1.4.2  martin $awk 'BEGIN { gsub(/ana/,"anda","banana")
    275  1.1.1.1.4.2  martin 		printf "the monkey ate a %s\n", "banana" }
    276  1.1.1.1.4.2  martin ' >/dev/null 2>foo
    277  1.1.1.1.4.2  martin grep 'syntax error' foo >/dev/null || echo 'BAD: T.misc gsub banana error'
    278  1.1.1.1.4.2  martin 
    279  1.1.1.1.4.2  martin # nasty one:  should not be able to overwrite constants
    280  1.1.1.1.4.2  martin $awk 'BEGIN { sub(/ana/,"anda","banana")
    281  1.1.1.1.4.2  martin 		printf "the monkey ate a %s\n", "banana" }
    282  1.1.1.1.4.2  martin ' >/dev/null 2>foo
    283  1.1.1.1.4.2  martin grep 'syntax error' foo >/dev/null || echo 'BAD: T.misc sub banana error'
    284  1.1.1.1.4.2  martin 
    285  1.1.1.1.4.2  martin # line numbers used to double-count comments
    286  1.1.1.1.4.2  martin $awk '#
    287  1.1.1.1.4.2  martin #
    288  1.1.1.1.4.2  martin #
    289  1.1.1.1.4.2  martin /x
    290  1.1.1.1.4.2  martin ' >/dev/null 2>foo
    291  1.1.1.1.4.2  martin grep 'line [45]' foo >/dev/null || echo 'BAD: T.misc lineno'
    292  1.1.1.1.4.2  martin 
    293  1.1.1.1.4.2  martin echo 'x
\y' >foo1
    297  1.1.1.1.4.2  martin $awk 'BEGIN { print "x\f\r\b\v\a\\y" }' >foo2
    298  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc weird chars'
    299  1.1.1.1.4.2  martin 
    300  1.1.1.1.4.2  martin echo 0 >foo1
    301  1.1.1.1.4.2  martin $awk '	BEGIN { exit }
    302  1.1.1.1.4.2  martin 	{ print }
    303  1.1.1.1.4.2  martin 	END { print NR }' >foo2
    304  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc BEGIN exit'
    305  1.1.1.1.4.2  martin 
    306  1.1.1.1.4.2  martin echo 1 >foo1
    307  1.1.1.1.4.2  martin $awk '	{ exit }
    308  1.1.1.1.4.2  martin 	END { print NR }' /etc/passwd >foo2
    309  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc immmediate exit'
    310  1.1.1.1.4.2  martin 
    311  1.1.1.1.4.2  martin echo 1 >foo1
    312  1.1.1.1.4.2  martin $awk '	{i = 1; while (i <= NF) {if (i == NF) exit; i++ } }
    313  1.1.1.1.4.2  martin 	END { print NR }' /etc/passwd >foo2
    314  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc immmediate exit 2'
    315  1.1.1.1.4.2  martin 
    316  1.1.1.1.4.2  martin echo 1 >foo1
    317  1.1.1.1.4.2  martin $awk '	function f() {
    318  1.1.1.1.4.2  martin 		i = 1; while (i <= NF) {if (i == NF) return NR; i++ }
    319  1.1.1.1.4.2  martin 	}
    320  1.1.1.1.4.2  martin 	{ if (f() == 1) exit }
    321  1.1.1.1.4.2  martin 	END { print NR }' /etc/passwd >foo2
    322  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc while return'
    323  1.1.1.1.4.2  martin 
    324  1.1.1.1.4.2  martin echo 1 >foo1
    325  1.1.1.1.4.2  martin $awk '	function f() {
    326  1.1.1.1.4.2  martin 		split("a b c", arr)
    327  1.1.1.1.4.2  martin 		for (i in arr) {if (i == 3) return NR; i++ }
    328  1.1.1.1.4.2  martin 	}
    329  1.1.1.1.4.2  martin 	{ if (f() == 1) exit }
    330  1.1.1.1.4.2  martin 	END { print NR }' /etc/passwd >foo2
    331  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc while return'
    332  1.1.1.1.4.2  martin 
    333  1.1.1.1.4.2  martin echo 1 >foo1
    334  1.1.1.1.4.2  martin $awk '	{i = 1; do { if (i == NF) exit; i++ } while (i <= NF) }
    335  1.1.1.1.4.2  martin 	END { print NR }' /etc/passwd >foo2
    336  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc immmediate exit 3'
    337  1.1.1.1.4.2  martin 
    338  1.1.1.1.4.2  martin echo 1 >foo1
    339  1.1.1.1.4.2  martin $awk '	function f() {
    340  1.1.1.1.4.2  martin 		i = 1; do { if (i == NF) return NR; i++ } while (i <= NF)
    341  1.1.1.1.4.2  martin 	}
    342  1.1.1.1.4.2  martin 	{ if (f() == 1) exit }
    343  1.1.1.1.4.2  martin 	END { print NR }' /etc/passwd >foo2
    344  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc do return'
    345  1.1.1.1.4.2  martin 
    346  1.1.1.1.4.2  martin echo 1 >foo1
    347  1.1.1.1.4.2  martin $awk '	{i = 1; do { if (i == NF) break; i++ } while (i <= NF); exit }
    348  1.1.1.1.4.2  martin 	END { print NR }' /etc/passwd >foo2
    349  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc immmediate exit 4'
    350  1.1.1.1.4.2  martin 
    351  1.1.1.1.4.2  martin echo 1 >foo1
    352  1.1.1.1.4.2  martin $awk '	{ n = split($0, x)
    353  1.1.1.1.4.2  martin 	  for (i in x) {
    354  1.1.1.1.4.2  martin 	 	if (i == 1)
    355  1.1.1.1.4.2  martin 			exit } }
    356  1.1.1.1.4.2  martin 	END { print NR }' /etc/passwd >foo2
    357  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc immmediate exit 5'
    358  1.1.1.1.4.2  martin 
    359  1.1.1.1.4.2  martin echo XXXXXXXX >foo1
    360  1.1.1.1.4.2  martin $awk 'BEGIN { s = "ab\fc\rd\be"
    361  1.1.1.1.4.2  martin 	t = s; 	gsub("[" s "]", "X", t); print t }' >foo2
    362  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc weird escapes in char class'
    363  1.1.1.1.4.2  martin 
    364  1.1.1.1.4.2  martin $awk '{}' /etc/passwd glop/glop >foo 2>foo2
    365  1.1.1.1.4.2  martin grep "can't open.*glop" foo2 >/dev/null || echo "BAD: T.misc can't open"
    366  1.1.1.1.4.2  martin 
    367  1.1.1.1.4.2  martin echo '
    368  1.1.1.1.4.2  martin 
    369  1.1.1.1.4.2  martin 
    370  1.1.1.1.4.2  martin a
    371  1.1.1.1.4.2  martin aa
    372  1.1.1.1.4.2  martin 
    373  1.1.1.1.4.2  martin b
    374  1.1.1.1.4.2  martin 
    375  1.1.1.1.4.2  martin 
    376  1.1.1.1.4.2  martin c
    377  1.1.1.1.4.2  martin 
    378  1.1.1.1.4.2  martin ' >foo
    379  1.1.1.1.4.2  martin echo 3 >foo1
    380  1.1.1.1.4.2  martin $awk 'BEGIN { RS = "" }; END { print NR }' foo >foo2
    381  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc RS botch'
    382  1.1.1.1.4.2  martin 
    383  1.1.1.1.4.2  martin $awk 'BEGIN \
    384  1.1.1.1.4.2  martin 	{
    385  1.1.1.1.4.2  martin 		print "hello, world"
    386  1.1.1.1.4.2  martin 	}
    387  1.1.1.1.4.2  martin }}}' >foo1 2>foo2
    388  1.1.1.1.4.2  martin grep 'source line 4' foo2 >/dev/null 2>&1 || echo 'BAD: T.misc continuation line number'
    389  1.1.1.1.4.2  martin 
    390  1.1.1.1.4.2  martin 
    391  1.1.1.1.4.2  martin echo 111 222 333 >foo
    392  1.1.1.1.4.2  martin $awk '{ f[1]=1; f[2]=2; print $f[1], $f[1]++, $f[2], f[1], f[2] }' foo >foo2
    393  1.1.1.1.4.2  martin echo 111 111 222 2 2 >foo1
    394  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc $f[1]++'
    395  1.1.1.1.4.2  martin 
    396  1.1.1.1.4.2  martin 
    397  1.1.1.1.4.2  martin # These should be syntax errors
    398  1.1.1.1.4.2  martin $awk . 2>foo
    399  1.1.1.1.4.2  martin grep "syntax error" foo >/dev/null || echo 1>&2 "BAD: T.misc syntax error . fails"
    400  1.1.1.1.4.2  martin 
    401  1.1.1.1.4.2  martin $awk .. 2>foo
    402  1.1.1.1.4.2  martin grep "syntax error" foo >/dev/null || echo 1>&2 "BAD: T.misc syntax error .. fails"
    403  1.1.1.1.4.2  martin 
    404  1.1.1.1.4.2  martin $awk .E. 2>foo
    405  1.1.1.1.4.2  martin grep "syntax error" foo >/dev/null || echo 1>&2 "BAD: T.misc syntax error .E. fails"
    406  1.1.1.1.4.2  martin 
    407  1.1.1.1.4.2  martin $awk .++. 2>foo
    408  1.1.1.1.4.2  martin grep "syntax error" foo >/dev/null || echo 1>&2 "BAD: T.misc syntax error .++. fails"
    409  1.1.1.1.4.2  martin 
    410  1.1.1.1.4.2  martin 
    411  1.1.1.1.4.2  martin 
    412  1.1.1.1.4.2  martin # These should be syntax errors
    413  1.1.1.1.4.2  martin $awk '$' 2>foo
    414  1.1.1.1.4.2  martin grep "unexpected" foo >/dev/null || echo 1>&2 "BAD: T.misc syntax error $ fails"
    415  1.1.1.1.4.2  martin 
    416  1.1.1.1.4.2  martin $awk '{print $' 2>foo
    417  1.1.1.1.4.2  martin grep "unexpected" foo >/dev/null || echo 1>&2 "BAD: T.misc syntax error $2 fails"
    418  1.1.1.1.4.2  martin 
    419  1.1.1.1.4.2  martin $awk '"' 2>foo
    420  1.1.1.1.4.2  martin grep "non-terminated" foo >/dev/null || echo 1>&2 "BAD: T.misc bare quote fails"
    421  1.1.1.1.4.2  martin 
    422  1.1.1.1.4.2  martin 
    423  1.1.1.1.4.2  martin # %c of 0 is explicit null byte
    424  1.1.1.1.4.2  martin 
    425  1.1.1.1.4.2  martin ./echo '3' >foo1
    426  1.1.1.1.4.2  martin $awk 'BEGIN {printf("%c%c\n", 0, 0) }' | wc | $awk '{print $3}' >foo2
    427  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc null byte'
    428  1.1.1.1.4.2  martin 
    429  1.1.1.1.4.2  martin # non-terminated RE
    430  1.1.1.1.4.2  martin 
    431  1.1.1.1.4.2  martin $awk /xyz >foo 2>&1
    432  1.1.1.1.4.2  martin grep "non-terminated" foo >/dev/null || echo 1>&2 "BAD: T.misc non-terminated RE"
    433  1.1.1.1.4.2  martin 
    434  1.1.1.1.4.2  martin # next several were infinite loops, found by brian tsang.
    435  1.1.1.1.4.2  martin # this is his example:
    436  1.1.1.1.4.2  martin 
    437  1.1.1.1.4.2  martin $awk 'BEGIN {
    438  1.1.1.1.4.2  martin     switch (substr("x",1,1)) {
    439  1.1.1.1.4.2  martin     case /ask.com/:
    440  1.1.1.1.4.2  martin 	break
    441  1.1.1.1.4.2  martin     case "google":
    442  1.1.1.1.4.2  martin 	break
    443  1.1.1.1.4.2  martin     }
    444  1.1.1.1.4.2  martin }' >foo 2>&1
    445  1.1.1.1.4.2  martin grep "illegal statement" foo >/dev/null || echo 1>&2 "BAD: T.misc looping syntax error 1"
    446  1.1.1.1.4.2  martin 
    447  1.1.1.1.4.2  martin $awk 'BEGIN { s { c /./ } }' >foo 2>&1
    448  1.1.1.1.4.2  martin grep "illegal statement" foo >/dev/null || echo 1>&2 "BAD: T.misc looping syntax error 2"
    449  1.1.1.1.4.2  martin 
    450  1.1.1.1.4.2  martin $awk 'BEGIN { s { c /../ } }' >foo 2>&1
    451  1.1.1.1.4.2  martin grep "illegal statement" foo >/dev/null || echo 1>&2 "BAD: T.misc looping syntax error 3"
    452  1.1.1.1.4.2  martin 
    453  1.1.1.1.4.2  martin $awk 'BEGIN {printf "%2$s %1$s\n", "a", "b"}' >foo 2>&1
    454  1.1.1.1.4.2  martin grep "'$' not permitted in awk formats" foo >/dev/null || echo 1>&2 "BAD: T.misc '$' not permitted in formats"
    455  1.1.1.1.4.2  martin 
    456  1.1.1.1.4.2  martin echo 'a
    457  1.1.1.1.4.2  martin b c
    458  1.1.1.1.4.2  martin de fg hi' >foo0
    459  1.1.1.1.4.2  martin $awk 'END { print NF, $0 }' foo0 >foo1
    460  1.1.1.1.4.2  martin awk '{ print NF, $0 }' foo0| tail -1 >foo2
    461  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc END must preserve $0'
    462  1.1.1.1.4.2  martin 
    463  1.1.1.1.4.2  martin echo 'fg hi' >foo0
    464  1.1.1.1.4.2  martin $awk 'END { print NF, $0 }' foo0 >foo1
    465  1.1.1.1.4.2  martin awk '{ print NF, $0 }' foo0| tail -1 >foo2
    466  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc END must preserve $0'
    467  1.1.1.1.4.2  martin 
    468  1.1.1.1.4.2  martin echo '' >foo0
    469  1.1.1.1.4.2  martin $awk 'END { print NF, $0 }' foo0 >foo1
    470  1.1.1.1.4.2  martin awk '{ print NF, $0 }' foo0| tail -1 >foo2
    471  1.1.1.1.4.2  martin cmp -s foo1 foo2 || echo 'BAD: T.misc END must preserve $0'
    472  1.1.1.1.4.2  martin 
    473  1.1.1.1.4.2  martin # Check for nonzero exit status on I/O error.
    474                      echo 'E 2' >foo1
    475                      (trap '' PIPE; "$awk" 'BEGIN { print "hi"; }' 2>/dev/null; echo "E $?" >foo2) | :
    476                      cmp -s foo1 foo2 || echo 'BAD: T.misc exit status on I/O error'
    477