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
11TEMP3=$WORKDIR/test.temp.3
12TEMP4=$WORKDIR/test.temp.4
13TEMP5=$WORKDIR/test.temp.5
14
15RESULT=0
16
17fail() {
18	echo "$1" >&2
19	RESULT=1
20}
21
22echo T.argv: misc tests of argc and argv
23
24echo > $TEMP1
25echo > $TEMP2
26$AWK '
27BEGIN {
28	for (i = 1; i < ARGC-1; i++)
29		printf "%s ", ARGV[i]
30	if (ARGC > 1)
31		printf "%s", ARGV[i]
32	printf "\n"
33	exit
34}' * > $TEMP1
35echo * > $TEMP2
36diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (echo1 *)'
37
38$AWK '
39BEGIN {
40	for (i = 1; i < ARGC; i++) {
41		printf "%s", ARGV[i]
42		if (i < ARGC-1)
43			printf " "
44	}
45	printf "\n"
46	exit
47}' * > $TEMP1
48echo * > $TEMP2
49diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (echo2 *)'
50
51$AWK '
52BEGIN {
53	print ARGC
54	ARGV[ARGC-1] = ""
55	for (i=0; i < ARGC; i++)
56		print ARGV[i]
57	exit
58}
59' a bc def gh > $TEMP1
60echo "5
61$AWK
62a
63bc
64def
65" > $TEMP2
66diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (argc *)'
67
68echo '1
692
703' > $TEMP0
71echo 'foo1
72foo2
73foo3' > $TEMP1
74$AWK '{print L $0}' L=foo <$TEMP0 > $TEMP2
75diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (L=foo <test.temp.1)'
76
77echo '1
782
793' > $TEMP0
80echo 'foo1
81foo2
82foo3' > $TEMP1
83$AWK '{print L $0}' L=foo $TEMP0 > $TEMP2
84diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (L=foo test.temp.1)'
85
86echo '1
872
883' > $TEMP0
89echo 'foo1
90foo2
91foo3' > $TEMP1
92cat $TEMP0 | $AWK '{print L $0}' L=foo - > $TEMP2
93diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (L=foo -)'
94
95echo '1
962
973' > $TEMP0
98echo 'foo1
99foo2
100foo3
101glop1
102glop2
103glop3' > $TEMP1
104$AWK '{print L $0}' L=foo $TEMP0 L=glop $TEMP0 > $TEMP2
105diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (L=foo L=glop)'
106
107echo '1
1082
1093' > $TEMP0
110echo '111
111112
112113
113221
114222
115223' > $TEMP1
116$AWK '{print L $0}' L=11 $TEMP0 L=22 $TEMP0 > $TEMP2
117diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (L=11 L=22)'
118
119echo 3.345 > $TEMP1
120$AWK 'BEGIN { print ARGV[1] + ARGV[2]}' 1 2.345 > $TEMP2
121diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (ARGV[1] + ARGV[2])'
122
123echo 3.345 > $TEMP1
124x1=1 x2=2.345 $AWK 'BEGIN { print ENVIRON["x1"] + ENVIRON["x2"]}' 1 2.345 > $TEMP2
125diff $TEMP1 $TEMP2 || fail 'BAD: T.argv (ENVIRON[x1] + ENVIRON[x2])'
126
127
128echo 'test.temp.1' > $TEMP1
129echo 'test.temp.2' > $TEMP2
130echo 'test.temp.3' > $TEMP3
131$AWK 'BEGIN { ARGV[2] = "" }
132	{ print }' $TEMP1 $TEMP2 $TEMP3 > $TEMP4
133echo 'test.temp.1
134test.temp.3' > $TEMP5
135diff $TEMP4 $TEMP5 || fail 'BAD: T.argv zap ARGV[2]'
136
137echo hi > $TEMP1 ; mv $TEMP1 $TEMP2
138$AWK 'BEGIN { ARGV[1] = "'$TEMP2'" ; print FILENAME }
139             { print FILENAME }' $TEMP1 > $TEMP3
140echo "
141$TEMP2" > $TEMP4
142diff $TEMP3 $TEMP4 || fail 'BAD: T.argv startup FILENAME'
143	# assumes that startup FILENAME is ""
144
145
146# test data balanced on pinhead...
147echo "ARGV[3] is /dev/null
148ARGV[0] is $AWK
149ARGV[1] is /dev/null" > $TEMP1
150
151$AWK 'BEGIN {   # this is a variant of arnolds original example
152        ARGV[1] = "/dev/null"
153        ARGV[2] = "glotch"  # file open must skipped deleted argv
154        ARGV[3] = "/dev/null"
155        ARGC = 4
156        delete ARGV[2]
157}
158# note that input is read here
159END {
160        for (i in ARGV)
161                printf("ARGV[%d] is %s\n", i, ARGV[i])
162}' > $TEMP2
163diff $TEMP1 $TEMP2 || fail 'BAD: T.argv delete ARGV[2]'
164
165exit $RESULT
166