ref: eddb8fc8dc562d4689c694c14363d104d5accb0e
parent: c0526c8928a2b554d9421bca2fc04ba044fe06af
author: qwx <qwx@sciops.net>
date: Thu Sep 25 06:08:14 EDT 2025
port more tests most break our awk.
--- /dev/null
+++ b/test/Compare.T1
@@ -1,0 +1,7 @@
+#!/bin/rc
+rfork e
+oldawk=trueawk
+awk=kwa
+
+for(i in T.*)
+ ./$i
--- /dev/null
+++ b/test/T.-f-f
@@ -1,0 +1,30 @@
+#!/bin/rc
+echo T.-f-f: check multiple -f arguments
+
+echo 'begin
+end' >foo
+echo 'BEGIN { print "begin" }' >foo1+echo 'END { print "end" }' >foo2+echo xxx | $awk -f foo1 -f foo2 >foo3
+diff foo foo3 || echo 'BAD: T.-f-f multiple -fs'
+
+echo '/a/' | $awk -f - /lib/theo >foo1
+$awk '/a/' /lib/theo >foo2
+diff foo1 foo2 || echo 'BAD: T.-f-f -f -'
+
+cp /lib/theo foo1
+echo '/./ {' >foo2+echo 'print' >foo3
+echo '}' >foo4
+$awk -f foo2 -f foo3 -f foo4 /lib/theo >foo5
+diff foo1 foo5 || echo 'BAD: T.-f-f 3 files'
+
+echo '/./ {' >foo2+echo 'print' >foo3
+echo '
+
+
+
+]' >foo4
+$awk -f foo2 -f foo3 -f foo4 /lib/theo >foo5 >[2]foo6
+grep 'syntax error.*at foo4:' foo6 >/dev/null >[2=1] || echo 'BAD: T.-f-f source file name'
--- /dev/null
+++ b/test/T.arnold
@@ -1,0 +1,15 @@
+#!/bin/rc
+echo T.arnold: test fixes by Arnold Robbins 8/18
+# for which many thanks
+
+rm -rf arnold-fixes
+tar xf arnold-fixes.tar
+cd arnold-fixes
+
+for(i in *.awk){+ name=`{basename $i .awk}+ if(! ~ $name system-status){+ $awk -f $name.awk >foo.$name
+ diff $name.ok foo.$name || echo 'BAD: T.arnold ('^$name^')'+ }
+}
--- /dev/null
+++ b/test/T.csconcat
@@ -1,0 +1,28 @@
+#!/bin/rc
+echo T.csconcat: test constant string concatenation
+
+$awk '
+BEGIN {+ $0 = "aaa"
+ print "abcdef" " " $0
+}
+BEGIN { print "hello" "world"; print helloworld }+BEGIN {+ print " " "hello"
+ print "hello" " "
+ print "hello" " " "world"
+ print "hello" (" " "world")+}
+' > foo1
+
+cat << 'EOF' > foo2
+abcdef aaa
+helloworld
+
+ hello
+hello
+hello world
+hello world
+EOF
+
+diff foo1 foo2 || echo 'BAD: T.csconcat (1)'
--- /dev/null
+++ b/test/T.expr
@@ -1,0 +1,232 @@
+#!/bin/rc
+echo T.expr: tests of miscellaneous expressions
+
+$awk '
+BEGIN {+ FS = "\t"
+ awk = ENVIRON["awk"]
+}
+NF == 0 || $1 ~ /^#/ {+ next
+}
+$1 ~ /try/ { # new test+ nt++
+ sub(/try /, "")
+ prog = $0
+ printf("%3d %s\n", nt, prog)+ prog = sprintf("%s -F\"\\t\" ''%s''", awk, prog)+ # print "prog is", prog
+ nt2 = 0
+ while (getline > 0) {+ if (NF == 0) # blank line terminates a sequence
+ break
+ input = $1
+ for (i = 2; i < NF; i++) # input data
+ input = input "\t" $i
+ test = sprintf("echo ''%s'' | %s >foo1; ",+ input, prog)
+ if ($NF == "\"\"")
+ output = ">foo2;"
+ else
+ output = sprintf("echo ''%s'' >foo2; ", $NF)+ gsub(/\\t/, "\t", output)
+ gsub(/\\n/, "\n", output)
+ run = sprintf("cmp foo1 foo2 || echo test %d.%d failed",+ nt, ++nt2)
+ # print "input is", input
+ # print "test is", test
+ # print "output is", output
+ # print "run is", run
+ system(test output run)
+ }
+ tt += nt2
+}
+END { print tt, "tests" }+' <<'!!!!'
+# General format:
+# try program as rest of line
+# $1 $2 $3 output1 (\t for tab, \n for newline,
+# $1 $2 $3 output2 ("" for null)+# ... terminated by blank line
+
+# try another program...
+
+try { print ($1 == 1) ? "yes" : "no" }+1 yes
+1.0 yes
+1E0 yes
+0.1E1 yes
+10E-1 yes
+01 yes
+10 no
+10E-2 no
+
+try $1 > 0
+1 1
+2 2
+0 ""
+-1 ""
+1e0 1e0
+0e1 ""
+-2e64 ""
+3.1e4 3.1e4
+
+try { print NF }+ 0
+x 1
+x y 2
+ y 2
+x 2
+
+try { print NF, $NF }+ 0
+x 1 x
+x y 2 y
+x yy zzz 3 zzz
+
+# this horror prints $($2+1)
+try { i=1; print ($++$++i) }+1 1
+1 2 3 3
+abc abc
+
+# concatenate $1 and ++$2; print new $1 and concatenated value
+try { x = $1++++$2; print $1, x }+1 3 2 14
+
+# do we get the precedence of ! right?
+try $1 !$2
+0 0 0\t0
+0 1 0\t1
+1 0 1\t0
+1 1 1\t1
+
+# another ava special
+try { print ($1~/abc/ !$2) }+0 0 01
+0 1 00
+abc 0 11
+xabcd 1 10
+
+try { print !$1 + $2 }+1 3 3
+0 3 4
+-1 3 3
+
+# aside: !$1 = $2 is now a syntax error
+
+# the definition of "number" changes with isnumber.
+# 2e100 is ok according to strtod.
+# try 1
+
+try { print ($1 == $2) }+0 0 1
+0 1 0
+0 00 1
+0 "" 0
++0 -0 1
+1 1.0 1
+1 1e0 1
+2e10 2.00e10 1
+2e10 2e+10 1
+2e-10 2e-10 1
+2e10 2e-10 0
+2e10 20e9 1
+2e100 2.000e100 1
+2e1000 2.0e1000 0
+
+# this one (3 & 4) may "fail" if a negative 0 is printed as -0,
+# but i think this might be a type-coercion problem.
+
+try { print $1, +$1, -$1, - -$1 }+1 1 1 -1 1
+-1 -1 -1 1 -1
+0 0 0 0 0
+x x 0 0 0
+
+try { printf("a%*sb\n", $1, $2) }+1 x axb
+2 x a xb
+3 x a xb
+
+try { printf("a%-*sb\n", $1, $2) }+1 x axb
+2 x ax b
+3 x ax b
+
+try { printf("a%*.*sb\n", $1, $2, "hello") }+1 1 ahb
+2 1 a hb
+3 1 a hb
+
+try { printf("a%-*.*sb\n", $1, $2, "hello") }+1 1 ahb
+2 1 ah b
+3 1 ah b
+
+try { printf("%d %ld %lld %zd %jd %hd %hhd\n", $1, $1, $1, $1, $1, $1, $1) }+1 1 1 1 1 1 1 1
+10 10 10 10 10 10 10 10
+10000 10000 10000 10000 10000 10000 10000 10000
+
+try { printf("%x %lx %llx %zx %jx %hx %hhx\n", $1, $1, $1, $1, $1, $1, $1) }+1 1 1 1 1 1 1 1
+10 a a a a a a a
+10000 2710 2710 2710 2710 2710 2710 2710
+
+try { if ($1 ~ $2) print 1; else print 0 }+a \141 1
+a \142 0
+a \x61 1
+a \x061 0
+a \x62 0
+0 \060 1
+0 \60 1
+0 \0060 0
+Z \x5a 1
+Z \x5A 1
+
+try { print $1 ~ $2 }+a \141 1
+a \142 0
+a \x61 1
+a \x061 0
+a \x62 0
+0 \060 1
+0 \60 1
+0 \0060 0
+Z \x5a 1
+Z \x5A 1
+
+try { print $1 || $2 }+ 0
+1 1
+0 0 0
+1 0 1
+0 1 1
+1 1 1
+a b 1
+
+try { print $1 && $2 }+ 0
+1 0
+0 0 0
+1 0 0
+0 1 0
+1 1 1
+a b 1
+
+try { $1 = $2; $1 = $1; print $1 }+abc def def
+abc def ghi def
+
+# $f++ => ($f)++
+try { f = 1; $f++; print f, $f }+11 22 33 1 12
+
+# $f[1]++ => ($f[1])++
+try { f[1]=1; f[2]=2; print $f[1], $f[1]++, $f[2], f[1], f[2] }+111 222 333 111 111 222 2 2
+
+
+!!!!
--- /dev/null
+++ b/test/T.nextfile
@@ -1,0 +1,70 @@
+#!/bin/rc
+echo T.nextfile: tests of nextfile command
+
+# 1st lines of some files
+rm -f foo0
+for(i in T.*)
+ sed 1q $i >>foo0
+
+$awk '
+{ print $0; nextfile } # print first line, quit+' T.* >foo1
+diff foo0 foo1 || echo 'BAD: T.nextfile 1'
+
+$awk ' # same test but in a for loop
+{ print $0; + for (i = 1; i < 10; i++)
+ if (i == 1)
+ nextfile
+ print "nextfile for error"
+} # print first line, quit
+' T.* >foo1
+diff foo0 foo1 || echo 'BAD: T.nextfile 1f'
+
+$awk ' # same test but in a while loop
+{ print $0; + i = 1
+ while (i < 10)
+ if (i++ == 1)
+ nextfile
+ print "nextfile while error"
+} # print first line, quit
+' T.* >foo1
+diff foo0 foo1 || echo 'BAD: T.nextfile 1w'
+
+$awk ' # same test but in a do loop
+{ print $0; + i = 1
+ do {+ if (i++ == 1)
+ nextfile # print first line, quit
+ } while (i < 10)
+ print "nextfile do error"
+}
+' T.* >foo1
+diff foo0 foo1 || echo 'BAD: T.nextfile 1d'
+
+# 100 lines of some files
+rm -f foo0
+for(i in T.*)
+ sed 100q $i >>foo0
+
+$awk '
+{ print }+FNR == 100 { nextfile } # print first line, quit+' T.* >foo1
+diff foo0 foo1 || echo 'BAD: T.nextfile 2'
+
+>foo0 # empty
+$awk ' { nextfile; print $0 }' T.* >foo1+diff foo0 foo1 || echo 'BAD: T.nextfile 3'
+
+# skip weird args
+rm -f foo0
+for(i in T.*)
+ sed 1q $i >>foo0
+
+$awk '
+{ print $0; nextfile } # print first line, quit+' T.* >foo1
+diff foo0 foo1 || echo 'BAD: T.nextfile 4'
--- /dev/null
+++ b/test/T.re
@@ -1,0 +1,340 @@
+#!/bin/rc
+echo T.re: tests of regular expression code
+
+awk '
+BEGIN {+ FS = "\t"
+ awk = ENVIRON["awk"]
+}
+NF == 0 {+ next
+}
+$1 != "" { # new test+ re = $1
+}
+$2 != "" { # either ~ or !~+ op = $2
+ if (op == "~")
+ neg = "!"
+ else if (op == "!~")
+ neg = ""
+}
+$3 != "" { # new test string+ str = $3
+}
+$3 == "\"\"" { # explicit empty line+ $3 = ""
+}
+NF > 2 { # generate a test+ input = $3
+ test = sprintf("echo ''%s'' | %s ''%s/%s/ {print \"%d fails %s %s %s\"}''",+ input, awk, neg, re, NR, re, op, input)
+ # printf(" %3d %s %s %s:\n", NR, re, op, input)+ # print "test is |" test "|"
+ system(test)
+ nt++
+}
+END { print " " nt, "tests" }+' <<'!!!!'
+ ~ a
+ aa
+ aaa
+ ""
+a ~ a
+ ba
+ bab
+ !~ ""
+ x
+ xxxxx
+= ~ =
+ b=
+ b=b
+ !~ ""
+ x
+ xxxxx
+. ~ x
+ xxx
+ !~ ""
+.a ~ xa
+ xxa
+ xax
+ !~ a
+ ax
+ ""
+$ ~ x
+ ""
+.$ ~ x
+ xx
+ !~ ""
+a$ ~ a
+ ba
+ bbba
+ !~ ab
+ x
+ ""
+^ ~ x
+ ""
+ ^
+^a$ ~ a
+ !~ xa
+ ax
+ xax
+ ""
+^a.$ ~ ax
+ aa
+ !~ xa
+ aaa
+ axy
+ ""
+^$ ~ ""
+ !~ x
+ ^
+^.a ~ xa
+ xaa
+ !~ a
+ ""
+^.*a ~ a
+ xa
+ xxxxxxa
+ !~ ""
+^.+a ~ xa
+ xxxxxxa
+ !~ ""
+ a
+ ax
+a* ~ ""
+ a
+ aaaa
+ xa
+ xxxx
+aa* ~ a
+ aaa
+ xa
+ !~ xxxx
+ ""
+\$ ~ x$
+ $
+ $x
+ x$x
+ !~ ""
+ x
+\. ~ .
+ !~ x
+ ""
+xr+y ~ xry
+ xrry
+ xrrrrrry
+ !~ ry
+ xy
+ xr
+xr?y ~ xy
+ xry
+ !~ xrry
+a?b?c? ~ ""
+ x
+^a?b?x ~ x
+ ax
+ bx
+ abx
+ xa
+ !~ ""
+ ab
+ aba
+[0-9] ~ 1
+ 567
+ x0y
+ !~ abc
+ ""
+[^0-9] !~ 1
+ 567
+ ""
+ ~ abc
+ x0y
+[0-25-69] ~ 0
+ 1
+ 2
+ 5
+ 6
+ 9
+ !~ 3
+ 4
+ 7
+ 8
+[[:lower:]] ~ a
+ b
+ z
+ !~ A
+ Z
+ 1
+ :
+ [
+ ]
+[[:upper:]] ~ A
+ B
+ Z
+ !~ a
+ z
+ 1
+ :
+ [
+ ]
+[[:digit:]] ~ 0
+ 1
+ 9
+ !~ d
+ :
+ [
+ ]
+x[0-9]+y ~ x0y
+ x23y
+ x12345y
+ !~ 0y
+ xy
+x[0-9]?y ~ xy
+ x1y
+ !~ x23y
+x[[]y ~ x[y
+ !~ xy
+ x[[]y
+ x]y
+x[[-]y ~ x[y
+ x-y
+ !~ xy
+ x[[]y
+ x]y
+x[[-a]y ~ x[y
+ xay
+ x]y
+ !~ xy
+ x[[]y
+ x-y
+x[]-a]y ~ x]y
+ xay
+ !~ xy
+ x[y
+ x-y
+x[]]y ~ x]y
+ !~ xy
+ x[]]y
+ x[y
+x[^[]y ~ xay
+ !~ x[y
+x[-]y ~ x-y
+ !~ xy
+ x+y
+x[^-]y ~ x+y
+ !~ x-y
+ xy
+x[][]y ~ x[y
+ x]y
+ !~ xy
+ x][y
+ x[]y
+x[z-a]y ~ xy
+ !~ x
+ y
+ xay
+ xzy
+ x-y
+[0\-9] ~ 0
+ -
+ 9
+ !~ 1
+ ""
+[-1] ~ -
+ 1
+ !~ 0
+[0-] ~ 0
+ -
+ !~ 1
+[^-0] ~ x
+ ^
+ !~ -
+ 0
+ ""
+[^0-] ~ x
+ ^
+ !~ -
+ 0
+ ""
+x|y ~ x
+ y
+ xy
+ !~ a
+ ""
+^abc|xyz$ ~ abc
+ abcd
+ axyz
+ xyz
+ !~ xabc
+ xyza
+^(abc|xyz)$ ~ abc
+ xyz
+ !~ abcxyz
+ abcx
+ cxyz
+^x\|y$ ~ x|y
+ !~ xy
+^x\\y$ ~ x\y
+ !~ xy
+ x\\y
+ xay
+\141\142 ~ ab
+ xab
+ abx
+ !~ a
+ b
+ ax
+ axb
+x\056y ~ x.y
+ !~ x.
+ .x
+ xxx
+ xby because \056 is not the metacharacter .
+ xcy ditto
+[\60-\62\65-6\71] ~ 0
+ 1
+ 2
+ 5
+ 6
+ 9
+ !~ 3
+ 4
+ 7
+ 8
+[\60-2\65-6\71] ~ 0
+ 1
+ 2
+ 5
+ 6
+ 9
+ !~ 3
+ 4
+ 7
+ 8
+[\x30-\x32\x35-6\71] ~ 0
+ 1
+ 2
+ 5
+ 6
+ 9
+ !~ 3
+ 4
+ 7
+ 8
+[\x30-2\x35-6\x39] ~ 0
+ 1
+ 2
+ 5
+ 6
+ 9
+ !~ 3
+ 4
+ 7
+ 8
+\f !~ x
+\b !~ x
+\r !~ x
+\n !~ x
+...) ~ abc)
+!!!!
--- /dev/null
+++ b/test/T.redir
@@ -1,0 +1,37 @@
+#!/bin/rc
+echo T.redir: test redirections
+
+$awk '{ print >"foo" }' /lib/theo+diff foo /lib/theo || echo 'BAD: T.redir (print >"foo")'
+
+rm -f foo
+$awk '{ print >>"foo" }' /lib/theo+diff foo /lib/theo || echo 'BAD: T.redir (print >>"foo")'
+
+rm -f foo
+$awk 'NR%2 == 1 { print >>"foo" }+ NR%2 == 0 { print >"foo" }' /lib/theo+diff foo /lib/theo || echo 'BAD: T.redir (print > and >>"foo")'
+
+rm -f foo
+$awk '{ print | "cat >foo" }' /lib/theo+diff foo /lib/theo || echo 'BAD: T.redir (print | "cat >foo")'
+
+# tests flush of stdout before opening pipe
+echo ' head
+1
+2' >foo1
+$awk 'BEGIN { print " head"+ for (i = 1; i < 3; i++)
+ print i | "sort" }' >foo2
+diff foo1 foo2 || echo 'BAD: T.redir (buffering)'
+
+rm -f foo[12]
+$awk '{ print >"/fd/2" }' /lib/theo >foo1 >[2]foo2+diff foo2 /lib/theo || echo 'BAD: T.redir (print >"/fd/2")'
+diff foo1 /dev/null || echo 'BAD: T.redir (print >"/fd/2")'
+
+rm -f foo[12]
+$awk '{ print >"/fd/1" }' /lib/theo >foo1 >[2]foo2+diff foo1 /lib/theo || echo 'BAD: T.redir (print >"/fd/1")'
+diff foo2 /dev/null || echo 'BAD: T.redir (print >"/fd/2")'
--- /dev/null
+++ b/test/T.sub
@@ -1,0 +1,315 @@
+#!/bin/rc
+echo T.sub: tests of sub and gsub code
+
+# input lines are of form
+# pattern replacement input-string sub-output gsub-output
+
+awk '
+BEGIN {+ FS = "\t"
+ awk = ENVIRON["awk"]
+}
+NF == 0 { next }+$1 ~ /^#/ { next }+
+$1 != "" { # new pattern+ pat = $1
+}
+$2 != "" { # new replacement+ repl = $2
+}
+$3 != "" { # new input string+ str = $3
+}
+$4 != "" { # new sub output+ subout = $4
+}
+$5 != "" { # new gsub output+ gsubout = $5
+}
+NF < 5 { # weird input line+ printf("weird test spec `%s` ignored\n", $0) | "cat 1>&2"+ next
+}
+{ # "" => explicitly empty+ # printf(" %3d: %s %s %s %s %s:\n", NR, pat, repl, str, subout, gsubout)+ if (pat == "\"\"") pat = ""
+ if (repl == "\"\"") repl = ""
+ if (str == "\"\"") str = ""
+ if (subout == "\"\"") subout = ""
+ if (gsubout == "\"\"") gsubout = ""
+}
+{ # generate a test+ nt++
+ gsub(/\\/, "&&", repl) # in case of \ enclosed
+ test = sprintf("echo ''%s'' | %s ''\n", str, awk) \+ sprintf("{ temp = $0; sub(/%s/, \"%s\", temp)\n", pat, repl) \+ sprintf(" if (temp != \"%s\") print \" sub %d fails:\", temp, \"should be %s in %s\"\n",+ subout, nt, subout, (pat " " repl " " str " " subout)) \
+ sprintf(" gsub(/%s/, \"%s\")\n", pat, repl) \+ sprintf(" if ($0 != \"%s\") print \"gsub %d fails:\", $0, \"should be %s in %s\"\n}",+ gsubout, nt, gsubout, (pat " " repl " " str " " gsubout)) \
+ " ''"
+ # if (nt >= 55) print "test is: " test
+ system(test)
+}
+END { print nt, "tests" }+
+' <<'!!!!'
+a x aaa xaa xxx
+ axa xxa xxx
+ bbb bbb bbb
+ "" "" ""
+a xy aaa xyaa xyxyxy
+ axa xyxa xyxxy
+ bbb bbb bbb
+ "" "" ""
+. x aaa xaa xxx
+ axa xxa xxx
+ bbb xbb xxx
+ "" "" ""
+.a x a a a
+ ax ax ax
+ aa x x
+ aaab xab xab
+ aaaa xaa xx
+ "" "" ""
+$ x a ax ax
+ "" x x
+.$ x "" "" ""
+ a x x
+ ab ax ax
+a$ x "" "" ""
+ a x x
+ b b b
+ ab ab ab
+^ x "" x x
+ a xa xa
+^a$ xx a xx xx
+ "" "" ""
+ b b b
+ aa aa aa
+^a.$ xy a a a
+ "" "" ""
+ ab xy xy
+ ba ba ba
+^$ x "" x x
+ a a a
+^.a x aa x x
+ ba x x
+ ab ab ab
+ a a a
+^.*a xy "" "" ""
+ a xy xy
+ b b b
+ ba xy xy
+^.+a xy "" "" ""
+ a a a
+ bb bb bb
+ ba xy xy
+a &x&y a axay axay
+ aa axaya axayaxay
+
+a* x "" x x
+ z xz xzx
+ az xz xzx
+ aza xza xzx
+ b xxx bxxx bxbxbxb
+ x& paq xpaq xpxaqx
+ x\& paq x&paq x&px&qx&
+ x&y paq xypaq xypxayqxy
+ x\&y paq x&ypaq x&ypx&yqx&y
+a+ x& paq pxaq pxaq
+ x\& paq px&q px&q
+ x&y paq pxayq pxayq
+ x\&y paq px&yq px&yq
+aa* x a x x
+ aa x x
+ wawa wxwa wxwx
+\$ x "" "" ""
+ a a a
+ a$ ax ax
+ $$$ x$$ xxx
+ z$z$z zxz$z zxzxz
+\. x "" "" ""
+ a a a
+ a. ax ax
+ ... x.. xxx
+ z.z.z zxz.z zxzxz
+xr+y q xy xy xy
+ xry q q
+ xrry q q
+ xryWxry qWxry qWq
+xr?y q AxyB AqB AqB
+ AxryB AqB AqB
+ Axrry Axrry Axrry
+a?b?c? x "" x x
+ a x x
+ b x x
+ c x x
+ ac x x
+ acc xc xx
+^a?b?q x "" "" ""
+ q x x
+ a a a
+ aq x x
+ bq x x
+ abq x x
+ qab xab xab
+ abqabq xabq xabq
+[0-9] xyz 0 xyz xyz
+ 00 xyz0 xyzxyz
+ 000 xyz00 xyzxyzxyz
+ 0a xyza xyza
+ a0 axyz axyz
+ 0a0 xyza0 xyzaxyz
+ xx xx xx
+ "" "" ""
+^[0-9] xyz 0 xyz xyz
+ 00 xyz0 xyz0
+ 000 xyz00 xyz00
+ 0a xyza xyza
+ a0 a0 a0
+ xx xx xx
+ "" "" ""
+[0-9]$ xyz 0 xyz xyz
+ 00 0xyz 0xyz
+ 000 00xyz 00xyz
+ 0a 0a 0a
+ a0 axyz axyz
+ xx xx xx
+ "" "" ""
+[0-9]* xyz 0 xyz xyz
+ 000 xyz xyz
+ 0a xyza xyzaxyz
+ a0 xyza0 xyzaxyz
+ 0a0 xyza0 xyzaxyz
+ pq xyzpq xyzpxyzqxyz
+ "" xyz xyz
+
+"" <&> abc <>abc <>a<>b<>c<> fixed 2/07, we think
+"" <\&> abc <&>abc <&>a<&>b<&>c<&>
+"" <&&> abc <>abc <>a<>b<>c<>
+"" <&> "" <> <>
+
+d?abc <&> abc <abc> <abc>
+d? <&> abc <>abc <>a<>b<>c<>
+
+x[0-9]+y Q xy xy xy no change
+ x0y Q Q
+ x12y Q Q
+ x1y2 Q2 Q2
+ x1yax23y Qax23y QaQ
+
+# x[0-9]?y ~ xy
+# x1y
+# !~ x23y
+# x[[]y ~ x[y
+# !~ xy
+# x[[]y
+# x]y
+# x[^[]y ~ xay
+# !~ x[y
+# x[-]y ~ x-y
+# !~ xy
+# x+y
+# x[^-]y ~ x+y
+# !~ x-y
+# xy
+# [0\-9] ~ 0
+# -
+# 9
+# !~ 1
+# ""
+# [-1] ~ -
+# 1
+# !~ 0
+# [0-] ~ 0
+# -
+# !~ 1
+# [^-0] ~ x
+# ^
+# !~ -
+# 0
+# ""
+# [^0-] ~ x
+# ^
+# !~ -
+# 0
+# ""
+# x|y ~ x
+# y
+# xy
+# !~ a
+# ""
+# ^abc|xyz$ ~ abc
+# abcd
+# axyz
+# xyz
+# !~ xabc
+# xyza
+# ^(abc|xyz)$ ~ abc
+# xyz
+# !~ abcxyz
+# abcx
+# cxyz
+# ^x\|y$ ~ x|y
+# !~ xy
+# ^x\\y$ ~ x\y
+# !~ xy
+# x\\y
+# xay
+# \141\142 ~ ab
+# xab
+# abx
+# !~ a
+# b
+# ax
+# axb
+# x\056y ~ x.y
+# !~ x.
+# .x
+# xxx
+# xby because \056 is not the metacharacter .
+# xcy ditto
+# [\60-\62\65-6\71] ~ 0
+# 1
+# 2
+# 5
+# 6
+# 9
+# !~ 3
+# 4
+# 7
+# 8
+# [\60-2\65-6\71] ~ 0
+# 1
+# 2
+# 5
+# 6
+# 9
+# !~ 3
+# 4
+# 7
+# 8
+# [\x30-\x32\x35-6\71] ~ 0
+# 1
+# 2
+# 5
+# 6
+# 9
+# !~ 3
+# 4
+# 7
+# 8
+# [\x30-2\x35-6\x39] ~ 0
+# 1
+# 2
+# 5
+# 6
+# 9
+# !~ 3
+# 4
+# 7
+# 8
+!!!!
binary files /dev/null b/test/arnold-fixes.tar differ
--
⑨