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# backgsub3:
63cat <<< 'xax
64xaax' > $TEMP0
65cat <<< '	xax
66	x&x
67	x&x
68	x\ax
69	x\ax
70	x\&x
71	xaax
72	x&&x
73	x&&x
74	x\a\ax
75	x\a\ax
76	x\&\&x' > $TEMP1
77$AWK '{	w = x = y = z = z1 = z2 = $0
78        gsub( /a/, "\&", w); print "	" w
79        gsub( /a/, "\\&", x); print "	" x
80        gsub( /a/, "\\\&", y); print "	" y
81        gsub( /a/, "\\\\&", z); print "	" z
82        gsub( /a/, "\\\\\&", z1); print "	" z1
83        gsub( /a/, "\\\\\\&", z2); print "	" z2
84}
85' $TEMP0 > $TEMP2
86diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk backgsub3'
87
88
89# backsub3:
90cat <<< 'xax
91xaax' > $TEMP0
92cat <<< '	xax
93	x&x
94	x&x
95	x\ax
96	x\ax
97	x\&x
98	xaax
99	x&ax
100	x&ax
101	x\aax
102	x\aax
103	x\&ax' > $TEMP1
104$AWK '{	w = x = y = z = z1 = z2 = $0
105        sub( /a/, "\&", w); print "	" w
106        sub( /a/, "\\&", x); print "	" x
107        sub( /a/, "\\\&", y); print "	" y
108        sub( /a/, "\\\\&", z); print "	" z
109        sub( /a/, "\\\\\&", z1); print "	" z1
110        sub( /a/, "\\\\\\&", z2); print "	" z2
111}
112' $TEMP0 > $TEMP2
113diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk backsub3'
114
115
116
117# dynlj:
118echo 'hello               world' > $TEMP1
119$AWK 'BEGIN { printf "%*sworld\n", -20, "hello" }' > $TEMP2
120diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk dynlj'
121
122# fsrs:
123echo 'a b
124c d
125e f
126
1271 2
1283 4
1295 6' > $TEMP0
130# note -n:
131echo -n 'a b
132c d
133e f1 2
1343 4
1355 6' > $TEMP1
136$AWK '
137BEGIN {
138       RS=""; FS="\n";
139       ORS=""; OFS="\n";
140      }
141{
142        split ($2,f," ")
143        print $0;
144}' $TEMP0 > $TEMP2
145diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk fsrs'
146
147# intest
148echo '0 1' > $TEMP1
149$AWK 'BEGIN {
150	bool = ((b = 1) in c);
151	print bool, b	# gawk-3.0.1 prints "0 "; should print "0 1"
152}' > $TEMP2
153diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk intest'
154
155# intprec:
156echo '0000000005:000000000e' > $TEMP1
157$AWK 'BEGIN { printf "%.10d:%.10x\n", 5, 14 }' > $TEMP2
158diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk intprec'
159
160# litoct:
161echo 'axb
162ab
163a*b' > $TEMP0
164echo 'no match
165no match
166match' > $TEMP1
167$AWK '{ if (/a\52b/) print "match" ; else print "no match" }' $TEMP0 > $TEMP2
168diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk litoct'
169
170# math:
171echo 'cos(0.785398) = 0.707107
172sin(0.785398) = 0.707107
173e = 2.718282
174log(e) = 1.000000
175sqrt(pi ^ 2) = 3.141593
176atan2(1, 1) = 0.785398' > $TEMP1
177$AWK 'BEGIN {
178	pi = 3.1415927
179	printf "cos(%f) = %f\n", pi/4, cos(pi/4)
180	printf "sin(%f) = %f\n", pi/4, sin(pi/4)
181	e = exp(1)
182	printf "e = %f\n", e
183	printf "log(e) = %f\n", log(e)
184	printf "sqrt(pi ^ 2) = %f\n", sqrt(pi ^ 2)
185	printf "atan2(1, 1) = %f\n", atan2(1, 1)
186}' > $TEMP2
187diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk math'
188
189# nlfldsep:
190echo 'some stuff
191more stuffA
192junk
193stuffA
194final' > $TEMP0
195echo '4
196some
197stuff
198more
199stuff
200
2012
202junk
203stuff
204
2051
206final
207' > $TEMP1
208$AWK 'BEGIN { RS = "A" }
209{print NF; for (i = 1; i <= NF; i++) print $i ; print ""}
210' $TEMP0 > $TEMP2
211diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk nlfldsep'
212
213# numsubstr:
214echo '5000
21510000
2165000' > $TEMP0
217echo '000
2181000
219000' > $TEMP1
220$AWK '{ print substr(1000+$1, 2) }' $TEMP0 > $TEMP2
221diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk numsubstr'
222
223# pcntplus:
224echo '+3 4' > $TEMP1
225$AWK 'BEGIN { printf "%+d %d\n", 3, 4 }' > $TEMP2
226diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk pcntplus'
227
228# prt1eval:
229echo 1 > $TEMP1
230$AWK 'function tst () {
231	sum += 1
232	return sum
233}
234BEGIN { OFMT = "%.0f" ; print tst() }
235' > $TEMP2
236diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk prt1eval'
237
238# reparse:
239echo '1 axbxc 2' > $TEMP0
240echo '1
2411 a b c 2
2421 a b' > $TEMP1
243$AWK '{	gsub(/x/, " ")
244	$0 = $0
245	print $1
246	print $0
247	print $1, $2, $3
248}' $TEMP0 > $TEMP2
249diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk reparse'
250
251# rswhite:
252echo '    a b
253c d' > $TEMP0
254echo '<    a b
255c d>' > $TEMP1
256$AWK 'BEGIN { RS = "" }
257{ printf("<%s>\n", $0) }' $TEMP0 > $TEMP2
258diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk rswhite'
259
260# splitvar:
261echo 'Here===Is=Some=====Data' > $TEMP0
262echo 4 > $TEMP1
263$AWK '{	sep = "=+"
264	n = split($0, a, sep)
265	print n
266}' $TEMP0 > $TEMP2
267diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk splitvar'
268
269# splitwht:
270echo '4
2715' > $TEMP1
272$AWK 'BEGIN {
273	str = "a   b\t\tc d"
274	n = split(str, a, " ")
275	print n
276	m = split(str, b, / /)
277	print m
278}' > $TEMP2
279diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk splitwht'
280
281# sprintfc:
282echo '65
28366
284foo' > $TEMP0
285echo 'A 65
286B 66
287f foo' > $TEMP1
288$AWK '{ print sprintf("%c", $1), $1 }' $TEMP0 > $TEMP2
289diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk sprintfc'
290
291# substr:
292echo 'xxA
293xxab
294xxbc
295xxab
296xx
297xx
298xxab
299xx
300xxef
301xx' > $TEMP1
302$AWK 'BEGIN {
303	x = "A"
304	printf("xx%-39s\n", substr(x,1,39))
305	print "xx" substr("abcdef", 0, 2)
306	print "xx" substr("abcdef", 2.3, 2)
307	print "xx" substr("abcdef", -1, 2)
308	print "xx" substr("abcdef", 1, 0)
309	print "xx" substr("abcdef", 1, -3)
310	print "xx" substr("abcdef", 1, 2.3)
311	print "xx" substr("", 1, 2)
312	print "xx" substr("abcdef", 5, 5)
313	print "xx" substr("abcdef", 7, 2)
314	exit (0)
315}' > $TEMP2
316diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk substr'
317
318# fldchg:
319echo 'aa aab c d e f' > $TEMP0
320echo '1: + +b c d e f
3212: + +b <c> d e f
3222a:%+%+b%<c>%d%e' > $TEMP1
323$AWK '{	gsub("aa", "+")
324	print "1:", $0
325	$3 = "<" $3 ">"
326	print "2:", $0
327	print "2a:" "%" $1 "%" $2 "%" $3 "%" $4 "%" $5
328}' $TEMP0 > $TEMP2
329diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk fldchg'
330
331# fldchgnf:
332echo 'a b c d' > $TEMP0
333echo 'a::c:d
3344' > $TEMP1
335$AWK '{ OFS = ":"; $2 = ""; print $0; print NF }' $TEMP0 > $TEMP2
336diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk fldchgnf'
337
338### # convfmt:
339### echo 'a = 123.46
340### a = 123.456
341### a = 123.456' > $TEMP1
342### $AWK 'BEGIN {
343### 	CONVFMT = "%2.2f"
344### 	a = 123.456
345### 	b = a ""                # give a string value also
346### 	a += 0                  # make a numeric only again
347### 	print "a = ", a
348### 	CONVFMT = "%.6g"
349### 	print "a = ", a
350### 	a += 0                  # make a numeric only again
351### 	print "a = ", a    # use a as string
352### }' > $TEMP2
353### diff $TEMP1 $TEMP2 || fail 'BAD: T.gawk convfmt'
354
355exit $RESULT
356