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