1#!/bin/bash
2
3if [[ -z "$AWK" || -z "$WORKDIR" ]]; then
4    printf '$AWK and $WORKDIR must be set\n' >&2
5    exit 1
6fi
7
8TEMP0=$WORKDIR/test.temp.0
9TEMP1=$WORKDIR/test.temp.1
10TEMP2=$WORKDIR/test.temp.2
11
12RESULT=0
13
14fail() {
15	echo "$1" >&2
16	RESULT=1
17}
18
19echo T.gawk: tests adapted from gawk test suite
20# for which thanks.
21
22# arrayref:
23echo '1
241' > $TEMP1
25$AWK '
26	BEGIN { # foo[10] = 0		# put this line in and it will work
27		test(foo); print foo[1]
28		test2(foo2); print foo2[1]
29	}
30	function test(foo) { test2(foo) }
31	function test2(bar) { bar[1] = 1 }
32' > $TEMP2
33diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk arrayref'
34
35# asgext
36echo '1 2 3
371
381 2 3 4' > $TEMP0
39echo '3
401 2 3 a
41
421   a
433
441 2 3 a' > $TEMP1
45$AWK '{ print $3; $4 = "a"; print }' $TEMP0 > $TEMP2
46diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk asgext'
47
48# backgsub:
49cat <<< 'x\y
50x\\y' > $TEMP0
51cat <<< 'x\y
52xAy
53xAy
54xAAy' > $TEMP1
55$AWK '{	x = y = $0
56        gsub( /\\\\/, "A", x); print x
57        gsub( "\\\\", "A", y); print y
58}' $TEMP0 > $TEMP2
59diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk backgsub'
60
61
62# backgsub2:
63cat <<< 'x\y
64x\\y
65x\\\y' > $TEMP0
66cat <<< '	x\y
67	x\y
68	x\y
69	x\y
70	x\\y
71	x\\\y
72	x\\y
73	x\\\y
74	x\\\\y' > $TEMP1
75$AWK '{	w = x = y = z = $0
76        gsub( /\\\\/, "\\", w); print "	" w
77        gsub( /\\\\/, "\\\\", x); print "	" x
78        gsub( /\\\\/, "\\\\\\", y); print "	" y
79}
80' $TEMP0 > $TEMP2
81diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk backgsub2'
82
83
84# backgsub3:
85cat <<< 'xax
86xaax' > $TEMP0
87cat <<< '	xax
88	x&x
89	x&x
90	x\ax
91	x\ax
92	x\&x
93	xaax
94	x&&x
95	x&&x
96	x\a\ax
97	x\a\ax
98	x\&\&x' > $TEMP1
99$AWK '{	w = x = y = z = z1 = z2 = $0
100        gsub( /a/, "\&", w); print "	" w
101        gsub( /a/, "\\&", x); print "	" x
102        gsub( /a/, "\\\&", y); print "	" y
103        gsub( /a/, "\\\\&", z); print "	" z
104        gsub( /a/, "\\\\\&", z1); print "	" z1
105        gsub( /a/, "\\\\\\&", z2); print "	" z2
106}
107' $TEMP0 > $TEMP2
108diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk backgsub3'
109
110
111# backsub3:
112cat <<< 'xax
113xaax' > $TEMP0
114cat <<< '	xax
115	x&x
116	x&x
117	x\ax
118	x\ax
119	x\&x
120	xaax
121	x&ax
122	x&ax
123	x\aax
124	x\aax
125	x\&ax' > $TEMP1
126$AWK '{	w = x = y = z = z1 = z2 = $0
127        sub( /a/, "\&", w); print "	" w
128        sub( /a/, "\\&", x); print "	" x
129        sub( /a/, "\\\&", y); print "	" y
130        sub( /a/, "\\\\&", z); print "	" z
131        sub( /a/, "\\\\\&", z1); print "	" z1
132        sub( /a/, "\\\\\\&", z2); print "	" z2
133}
134' $TEMP0 > $TEMP2
135diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk backsub3'
136
137
138# backsub:
139cat <<< 'x\y
140x\\y' > $TEMP0
141cat <<< 'x\y
142x\\y
143x\\y
144x\\\y' > $TEMP1
145$AWK '{	x = y = $0
146        sub( /\\\\/, "\\\\", x); print x
147        sub( "\\\\", "\\\\", y); print y
148}' $TEMP0 > $TEMP2
149diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk backsub'
150
151
152
153
154# dynlj:
155echo 'hello               world' > $TEMP1
156$AWK 'BEGIN { printf "%*sworld\n", -20, "hello" }' > $TEMP2
157diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk dynlj'
158
159# fsrs:
160echo 'a b
161c d
162e f
163
1641 2
1653 4
1665 6' > $TEMP0
167# note -n:
168echo -n 'a b
169c d
170e f1 2
1713 4
1725 6' > $TEMP1
173$AWK '
174BEGIN {
175       RS=""; FS="\n";
176       ORS=""; OFS="\n";
177      }
178{
179        split ($2,f," ")
180        print $0;
181}' $TEMP0 > $TEMP2
182diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk fsrs'
183
184# intest
185echo '0 1' > $TEMP1
186$AWK 'BEGIN {
187	bool = ((b = 1) in c);
188	print bool, b	# gawk-3.0.1 prints "0 "; should print "0 1"
189}' > $TEMP2
190diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk intest'
191
192# intprec:
193echo '0000000005:000000000e' > $TEMP1
194$AWK 'BEGIN { printf "%.10d:%.10x\n", 5, 14 }' > $TEMP2
195diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk intprec'
196
197# litoct:
198echo 'axb
199ab
200a*b' > $TEMP0
201echo 'no match
202no match
203match' > $TEMP1
204$AWK '{ if (/a\52b/) print "match" ; else print "no match" }' $TEMP0 > $TEMP2
205diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk litoct'
206
207# math:
208echo 'cos(0.785398) = 0.707107
209sin(0.785398) = 0.707107
210e = 2.718282
211log(e) = 1.000000
212sqrt(pi ^ 2) = 3.141593
213atan2(1, 1) = 0.785398' > $TEMP1
214$AWK 'BEGIN {
215	pi = 3.1415927
216	printf "cos(%f) = %f\n", pi/4, cos(pi/4)
217	printf "sin(%f) = %f\n", pi/4, sin(pi/4)
218	e = exp(1)
219	printf "e = %f\n", e
220	printf "log(e) = %f\n", log(e)
221	printf "sqrt(pi ^ 2) = %f\n", sqrt(pi ^ 2)
222	printf "atan2(1, 1) = %f\n", atan2(1, 1)
223}' > $TEMP2
224diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk math'
225
226# nlfldsep:
227echo 'some stuff
228more stuffA
229junk
230stuffA
231final' > $TEMP0
232echo '4
233some
234stuff
235more
236stuff
237
2382
239junk
240stuff
241
2421
243final
244' > $TEMP1
245$AWK 'BEGIN { RS = "A" }
246{print NF; for (i = 1; i <= NF; i++) print $i ; print ""}
247' $TEMP0 > $TEMP2
248diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk nlfldsep'
249
250# numsubstr:
251echo '5000
25210000
2535000' > $TEMP0
254echo '000
2551000
256000' > $TEMP1
257$AWK '{ print substr(1000+$1, 2) }' $TEMP0 > $TEMP2
258diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk numsubstr'
259
260# pcntplus:
261echo '+3 4' > $TEMP1
262$AWK 'BEGIN { printf "%+d %d\n", 3, 4 }' > $TEMP2
263diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk pcntplus'
264
265# prt1eval:
266echo 1 > $TEMP1
267$AWK 'function tst () {
268	sum += 1
269	return sum
270}
271BEGIN { OFMT = "%.0f" ; print tst() }
272' > $TEMP2
273diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk prt1eval'
274
275# reparse:
276echo '1 axbxc 2' > $TEMP0
277echo '1
2781 a b c 2
2791 a b' > $TEMP1
280$AWK '{	gsub(/x/, " ")
281	$0 = $0
282	print $1
283	print $0
284	print $1, $2, $3
285}' $TEMP0 > $TEMP2
286diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk reparse'
287
288# rswhite:
289echo '    a b
290c d' > $TEMP0
291echo '<    a b
292c d>' > $TEMP1
293$AWK 'BEGIN { RS = "" }
294{ printf("<%s>\n", $0) }' $TEMP0 > $TEMP2
295diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk rswhite'
296
297# splitvar:
298echo 'Here===Is=Some=====Data' > $TEMP0
299echo 4 > $TEMP1
300$AWK '{	sep = "=+"
301	n = split($0, a, sep)
302	print n
303}' $TEMP0 > $TEMP2
304diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk splitvar'
305
306# splitwht:
307echo '4
3085' > $TEMP1
309$AWK 'BEGIN {
310	str = "a   b\t\tc d"
311	n = split(str, a, " ")
312	print n
313	m = split(str, b, / /)
314	print m
315}' > $TEMP2
316diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk splitwht'
317
318# sprintfc:
319echo '65
32066
321foo' > $TEMP0
322echo 'A 65
323B 66
324f foo' > $TEMP1
325$AWK '{ print sprintf("%c", $1), $1 }' $TEMP0 > $TEMP2
326diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk sprintfc'
327
328# substr:
329echo 'xxA
330xxab
331xxbc
332xxab
333xx
334xx
335xxab
336xx
337xxef
338xx' > $TEMP1
339$AWK 'BEGIN {
340	x = "A"
341	printf("xx%-39s\n", substr(x,1,39))
342	print "xx" substr("abcdef", 0, 2)
343	print "xx" substr("abcdef", 2.3, 2)
344	print "xx" substr("abcdef", -1, 2)
345	print "xx" substr("abcdef", 1, 0)
346	print "xx" substr("abcdef", 1, -3)
347	print "xx" substr("abcdef", 1, 2.3)
348	print "xx" substr("", 1, 2)
349	print "xx" substr("abcdef", 5, 5)
350	print "xx" substr("abcdef", 7, 2)
351	exit (0)
352}' > $TEMP2
353diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk substr'
354
355# fldchg:
356echo 'aa aab c d e f' > $TEMP0
357echo '1: + +b c d e f
3582: + +b <c> d e f
3592a:%+%+b%<c>%d%e' > $TEMP1
360$AWK '{	gsub("aa", "+")
361	print "1:", $0
362	$3 = "<" $3 ">"
363	print "2:", $0
364	print "2a:" "%" $1 "%" $2 "%" $3 "%" $4 "%" $5
365}' $TEMP0 > $TEMP2
366diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk fldchg'
367
368# fldchgnf:
369echo 'a b c d' > $TEMP0
370echo 'a::c:d
3714' > $TEMP1
372$AWK '{ OFS = ":"; $2 = ""; print $0; print NF }' $TEMP0 > $TEMP2
373diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk fldchgnf'
374
375# OFMT from arnold robbins 6/02:
376#	5.7 with OFMT = %0.f is 6
377echo '6' > $TEMP1
378$AWK 'BEGIN {
379	OFMT = "%.0f"
380	print 5.7
381}' > $TEMP2
382cmp -s $TEMP1 $TEMP2 || fail 'BAD: T.gawk ofmt'
383
384
385### don't know what this is supposed to do now.
386### # convfmt:
387### echo 'a = 123.46
388### a = 123.456
389### a = 123.456' > $TEMP1
390### $AWK 'BEGIN {
391### 	CONVFMT = "%2.2f"
392### 	a = 123.456
393### 	b = a ""                # give a string value also
394### 	a += 0                  # make a numeric only again
395### 	print "a = ", a
396### 	CONVFMT = "%.6g"
397### 	print "a = ", a
398### 	a += 0                  # make a numeric only again
399### 	print "a = ", a    # use a as string
400### }' > $TEMP2
401### diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk convfmt'
402
403exit $RESULT
404