xref: /freebsd/contrib/one-true-awk/testdir/T.argv (revision 17853db4b0dc36ed32af039cd803f13b692913da)
1echo T.argv: misc tests of argc and argv
2
3awk=${awk-../a.out}
4
5echo >foo1
6echo >foo2
7$awk '
8BEGIN {
9	for (i = 1; i < ARGC-1; i++)
10		printf "%s ", ARGV[i]
11	if (ARGC > 1)
12		printf "%s", ARGV[i]
13	printf "\n"
14	exit
15}' * >foo1
16echo * >foo2
17diff foo1 foo2 || echo 'BAD: T.argv (echo1 *)'
18
19$awk '
20BEGIN {
21	for (i = 1; i < ARGC; i++) {
22		printf "%s", ARGV[i]
23		if (i < ARGC-1)
24			printf " "
25	}
26	printf "\n"
27	exit
28}' * >foo1
29echo * >foo2
30diff foo1 foo2 || echo 'BAD: T.argv (echo2 *)'
31
32$awk '
33BEGIN {
34	print ARGC
35	ARGV[ARGC-1] = ""
36	for (i=0; i < ARGC; i++)
37		print ARGV[i]
38	exit
39}
40' a bc def gh >foo1
41echo "5
42$awk
43a
44bc
45def
46" >foo2
47diff foo1 foo2 || echo 'BAD: T.argv (argc *)'
48
49echo '1
502
513' >foo0
52echo 'foo1
53foo2
54foo3' >foo1
55$awk '{print L $0}' L=foo <foo0 >foo2
56diff foo1 foo2 || echo 'BAD: T.argv (L=foo <foo1)'
57
58echo '1
592
603' >foo0
61echo 'foo1
62foo2
63foo3' >foo1
64$awk '{print L $0}' L=foo foo0 >foo2
65diff foo1 foo2 || echo 'BAD: T.argv (L=foo foo1)'
66
67echo '1
682
693' >foo0
70echo 'foo1
71foo2
72foo3' >foo1
73cat foo0 | $awk '{print L $0}' L=foo - >foo2
74diff foo1 foo2 || echo 'BAD: T.argv (L=foo -)'
75
76echo '1
772
783' >foo0
79echo 'foo1
80foo2
81foo3
82glop1
83glop2
84glop3' >foo1
85$awk '{print L $0}' L=foo foo0 L=glop foo0 >foo2
86diff foo1 foo2 || echo 'BAD: T.argv (L=foo L=glop)'
87
88echo '1
892
903' >foo0
91echo '111
92112
93113
94221
95222
96223' >foo1
97$awk '{print L $0}' L=11 foo0 L=22 foo0 >foo2
98diff foo1 foo2 || echo 'BAD: T.argv (L=11 L=22)'
99
100echo >foo0
101echo 'name=value
102name=value' >foo1
103$awk 'BEGIN { print ARGV[1] } { print ARGV[1] }' name=value foo0 >foo2
104diff foo1 foo2 || echo 'BAD: T.argv assignment operand modified'
105
106echo 3.345 >foo1
107$awk 'BEGIN { print ARGV[1] + ARGV[2]}' 1 2.345 >foo2
108diff foo1 foo2 || echo 'BAD: T.argv (ARGV[1] + ARGV[2])'
109
110echo 3.345 >foo1
111x1=1 x2=2.345 $awk 'BEGIN { print ENVIRON["x1"] + ENVIRON["x2"]}' 1 2.345 >foo2
112diff foo1 foo2 || echo 'BAD: T.argv (ENVIRON[x1] + ENVIRON[x2])'
113
114
115echo 'foo1' >foo1
116echo 'foo2' >foo2
117echo 'foo3' >foo3
118$awk 'BEGIN { ARGV[2] = "" }
119	{ print }' foo1 foo2 foo3 >foo4
120echo 'foo1
121foo3' >foo5
122diff foo4 foo5 || echo 'BAD: T.argv zap ARGV[2]'
123
124echo hi > foo1 ; mv foo1 foo2
125$awk 'BEGIN { ARGV[1] = "foo2" ; print FILENAME }
126             { print FILENAME }' foo1 >foo3
127echo '
128foo2' >foo4
129diff foo3 foo4 || echo 'BAD: T.argv startup FILENAME'
130	# assumes that startup FILENAME is ""
131
132
133# test data balanced on pinhead...
134echo 'ARGV[3] is /dev/null
135ARGV[0] is ../a.out
136ARGV[1] is /dev/null' >foo1
137
138$awk 'BEGIN {   # this is a variant of arnolds original example
139        ARGV[1] = "/dev/null"
140        ARGV[2] = "glotch"  # file open must skipped deleted argv
141        ARGV[3] = "/dev/null"
142        ARGC = 4
143        delete ARGV[2]
144}
145# note that input is read here
146END {
147        for (i in ARGV)
148                printf("ARGV[%d] is %s\n", i, ARGV[i])
149}' >foo2
150diff foo1 foo2 || echo 'BAD: T.argv delete ARGV[2]'
151
152# deleting ARGV used to trigger a use-after-free crash when awk
153# iterates over it to read files.
154echo >foo1
155echo >foo2
156echo >foo3
157
158$awk 'BEGIN {
159	delete ARGV
160	ARGV[0] = "awk"
161	ARGV[1] = "/dev/null"
162	ARGC = 2
163} {
164	# this should not be executed
165	print "FILENAME: " FILENAME
166	fflush()
167}' foo1 foo2 foo3 >foo4
168
169awkstatus=$?
170diff /dev/null foo4
171if [ $? -ne 0 ] || [ $awkstatus -ne 0 ]; then
172	echo 'BAD: T.argv delete ARGV'
173fi
174