shithub: kwa

Download patch

ref: 34c2bbec85008430bd4858c2b12ce0dbbc47acb0
parent: 96c2be96e4beaac08d89af4dea8069d9ca1c4b09
author: qwx <qwx@sciops.net>
date: Thu Sep 25 16:45:32 EDT 2025

add T.argv test

--- /dev/null
+++ b/test/T.argv
@@ -1,0 +1,171 @@
+#!/bin/rc
+echo T.argv: misc tests of argc and argv
+
+echo >foo1
+echo >foo2
+$awk '
+BEGIN {
+	for (i = 1; i < ARGC-1; i++)
+		printf "%s ", ARGV[i]
+	if (ARGC > 1)
+		printf "%s", ARGV[i]
+	printf "\n"
+	exit
+}' * >foo1
+echo * >foo2
+diff foo1 foo2 || echo 'BAD: T.argv (echo1 *)'
+
+$awk '
+BEGIN {
+	for (i = 1; i < ARGC; i++) {
+		printf "%s", ARGV[i]
+		if (i < ARGC-1)
+			printf " "
+	}
+	printf "\n"
+	exit
+}' * >foo1
+echo * >foo2
+diff foo1 foo2 || echo 'BAD: T.argv (echo2 *)'
+
+$awk '
+BEGIN {
+	print ARGC
+	ARGV[ARGC-1] = ""
+	for (i=0; i < ARGC; i++)
+		print ARGV[i]
+	exit
+}
+' a bc def gh >foo1
+cat <<! >foo2
+5
+$awk
+a
+bc
+def
+!
+diff foo1 foo2 || echo 'BAD: T.argv (argc *)'
+
+echo '1
+2
+3' >foo0
+echo 'foo1
+foo2
+foo3' >foo1
+$awk '{print L $0}' 'L=foo' <foo0 >foo2
+diff foo1 foo2 || echo 'BAD: T.argv (L=foo <foo1)'
+
+echo '1
+2
+3' >foo0
+echo 'foo1
+foo2
+foo3' >foo1
+$awk '{print L $0}' 'L=foo' foo0 >foo2
+diff foo1 foo2 || echo 'BAD: T.argv (L=foo foo1)'
+
+echo '1
+2
+3' >foo0
+echo 'foo1
+foo2
+foo3' >foo1
+cat foo0 | $awk '{print L $0}' 'L=foo' - >foo2
+diff foo1 foo2 || echo 'BAD: T.argv (L=foo -)'
+
+echo '1
+2
+3' >foo0
+echo 'foo1
+foo2
+foo3
+glop1
+glop2
+glop3' >foo1
+$awk '{print L $0}' 'L=foo' foo0 'L=glop' foo0 >foo2
+diff foo1 foo2 || echo 'BAD: T.argv (L=foo L=glop)'
+
+echo '1
+2
+3' >foo0
+echo '111
+112
+113
+221
+222
+223' >foo1
+$awk '{print L $0}' 'L=11' foo0 'L=22' foo0 >foo2
+diff foo1 foo2 || echo 'BAD: T.argv (L=11 L=22)'
+
+echo >foo0
+echo 'name=value
+name=value' >foo1
+$awk 'BEGIN { print ARGV[1] } { print ARGV[1] }' 'name=value' foo0 >foo2
+diff foo1 foo2 || echo 'BAD: T.argv assignment operand modified'
+
+echo 3.345 >foo1
+$awk 'BEGIN { print ARGV[1] + ARGV[2]}' 1 2.345 >foo2
+diff foo1 foo2 || echo 'BAD: T.argv (ARGV[1] + ARGV[2])'
+
+echo 3.345 >foo1
+x1=1 x2=2.345 $awk 'BEGIN { print ENVIRON["x1"] + ENVIRON["x2"]}' 1 2.345 >foo2
+diff foo1 foo2 || echo 'BAD: T.argv (ENVIRON[x1] + ENVIRON[x2])'
+
+
+echo 'foo1' >foo1
+echo 'foo2' >foo2
+echo 'foo3' >foo3
+$awk 'BEGIN { ARGV[2] = "" }
+	{ print }' foo1 foo2 foo3 >foo4
+echo 'foo1
+foo3' >foo5
+diff foo4 foo5 || echo 'BAD: T.argv zap ARGV[2]'
+
+echo hi > foo1 ; mv foo1 foo2
+$awk 'BEGIN { ARGV[1] = "foo2" ; print FILENAME }
+             { print FILENAME }' foo1 >foo3
+echo '
+foo2' >foo4
+diff foo3 foo4 || echo 'BAD: T.argv startup FILENAME'
+	# assumes that startup FILENAME is ""
+
+
+# test data balanced on pinhead...
+echo 'ARGV[3] is /dev/null
+ARGV[0] is '^$awk^'
+ARGV[1] is /dev/null' >foo1
+
+$awk 'BEGIN {   # this is a variant of arnolds original example
+        ARGV[1] = "/dev/null"
+        ARGV[2] = "glotch"  # file open must skipped deleted argv
+        ARGV[3] = "/dev/null"
+        ARGC = 4
+        delete ARGV[2]
+}
+# note that input is read here
+END {
+        for (i in ARGV)
+                printf("ARGV[%d] is %s\n", i, ARGV[i])
+}' >foo2
+diff foo1 foo2 || echo 'BAD: T.argv delete ARGV[2]'
+
+# deleting ARGV used to trigger a use-after-free crash when awk
+# iterates over it to read files.
+echo >foo1
+echo >foo2
+echo >foo3
+
+$awk 'BEGIN {
+	delete ARGV
+	ARGV[0] = "awk"
+	ARGV[1] = "/dev/null"
+	ARGC = 2
+} {
+	# this should not be executed
+	print "FILENAME: " FILENAME
+	fflush()
+}' foo1 foo2 foo3 >foo4
+
+awkstatus=$status
+if(! ~ $awkstatus '' || ! diff /dev/null foo4)
+	echo 'BAD: T.argv delete ARGV'
--