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'
--
⑨