Add regression tests for /bin/sh.
authorPeter Avalos <pavalos@dragonflybsd.org>
Sat, 12 Feb 2011 07:27:25 +0000 (21:27 -1000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Sat, 12 Feb 2011 07:28:20 +0000 (21:28 -1000)
Obtained-from: FreeBSD

237 files changed:
bin/sh/Makefile
tools/regression/bin/sh/Makefile [new file with mode: 0644]
tools/regression/bin/sh/builtins/alias.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/alias.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/builtins/alias.1 [new file with mode: 0644]
tools/regression/bin/sh/builtins/alias.1.stderr [new file with mode: 0644]
tools/regression/bin/sh/builtins/break1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/break2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/break2.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/builtins/break3.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/builtin1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/case1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/case2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/case3.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/cd1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/cd2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/command1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/command10.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/command11.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/command2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/command3.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/command3.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/builtins/command4.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/command5.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/command5.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/builtins/command6.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/command6.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/builtins/command7.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/command8.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/command9.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/dot1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/dot2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/eval1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/eval2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/eval3.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/eval4.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/eval5.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/exec1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/exec2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/exit1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/exit2.8 [new file with mode: 0644]
tools/regression/bin/sh/builtins/exit3.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/fc1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/fc2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/getopts1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/getopts1.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/builtins/getopts2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/getopts2.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/builtins/hash1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/hash1.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/builtins/hash2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/hash2.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/builtins/hash3.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/hash3.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/builtins/lineno.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/lineno.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/builtins/locale1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/printf1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/printf2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/printf3.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/printf4.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/read1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/read1.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/builtins/read2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/read3.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/read3.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/builtins/read4.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/read4.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/builtins/return1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/return2.1 [new file with mode: 0644]
tools/regression/bin/sh/builtins/return3.1 [new file with mode: 0644]
tools/regression/bin/sh/builtins/return4.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/return5.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/return6.4 [new file with mode: 0644]
tools/regression/bin/sh/builtins/return7.4 [new file with mode: 0644]
tools/regression/bin/sh/builtins/trap1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/trap2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/trap3.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/trap4.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/trap5.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/trap6.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/trap7.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/type1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/type1.0.stderr [new file with mode: 0644]
tools/regression/bin/sh/builtins/type2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/unalias.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/var-assign.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/var-assign2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/wait1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/wait2.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/wait3.0 [new file with mode: 0644]
tools/regression/bin/sh/errors/assignment-error1.0 [new file with mode: 0644]
tools/regression/bin/sh/errors/assignment-error2.0 [new file with mode: 0644]
tools/regression/bin/sh/errors/backquote-error1.0 [new file with mode: 0644]
tools/regression/bin/sh/errors/backquote-error2.0 [new file with mode: 0644]
tools/regression/bin/sh/errors/bad-binary1.126 [new file with mode: 0644]
tools/regression/bin/sh/errors/bad-keyword1.0 [new file with mode: 0644]
tools/regression/bin/sh/errors/bad-parm-exp1.0 [new file with mode: 0644]
tools/regression/bin/sh/errors/bad-parm-exp2.2 [new file with mode: 0644]
tools/regression/bin/sh/errors/bad-parm-exp2.2.stderr [new file with mode: 0644]
tools/regression/bin/sh/errors/bad-parm-exp3.2 [new file with mode: 0644]
tools/regression/bin/sh/errors/bad-parm-exp3.2.stderr [new file with mode: 0644]
tools/regression/bin/sh/errors/bad-parm-exp4.2 [new file with mode: 0644]
tools/regression/bin/sh/errors/bad-parm-exp4.2.stderr [new file with mode: 0644]
tools/regression/bin/sh/errors/bad-parm-exp5.2 [new file with mode: 0644]
tools/regression/bin/sh/errors/bad-parm-exp5.2.stderr [new file with mode: 0644]
tools/regression/bin/sh/errors/option-error.0 [new file with mode: 0644]
tools/regression/bin/sh/errors/redirection-error.0 [new file with mode: 0644]
tools/regression/bin/sh/errors/redirection-error2.2 [new file with mode: 0644]
tools/regression/bin/sh/errors/redirection-error3.0 [new file with mode: 0644]
tools/regression/bin/sh/errors/redirection-error4.0 [new file with mode: 0644]
tools/regression/bin/sh/errors/redirection-error5.0 [new file with mode: 0644]
tools/regression/bin/sh/errors/redirection-error6.0 [new file with mode: 0644]
tools/regression/bin/sh/errors/redirection-error7.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/fork1.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/fork2.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/func1.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/func2.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/func3.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/hash1.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/killed1.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/killed2.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/path1.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/redir1.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/redir2.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/redir3.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/redir4.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/redir5.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/shellproc1.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/unknown1.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/var-assign1.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/arith1.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/arith10.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/arith2.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/arith3.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/arith4.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/arith5.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/arith6.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/arith7.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/arith8.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/arith9.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/assign1.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/cmdsubst1.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/cmdsubst10.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/cmdsubst2.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/cmdsubst3.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/cmdsubst4.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/cmdsubst5.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/cmdsubst6.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/cmdsubst7.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/cmdsubst8.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/cmdsubst9.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/ifs1.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/ifs2.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/ifs3.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/pathname1.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/pathname2.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/pathname3.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/pathname4.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/plus-minus1.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/plus-minus2.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/plus-minus3.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/plus-minus4.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/plus-minus5.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/plus-minus6.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/plus-minus7.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/question1.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/set-u1.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/set-u2.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/tilde1.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/tilde2.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/trim1.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/trim2.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/trim3.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/trim4.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/trim5.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/trim6.0 [new file with mode: 0644]
tools/regression/bin/sh/parameters/exitstatus1.0 [new file with mode: 0644]
tools/regression/bin/sh/parameters/mail1.0 [new file with mode: 0644]
tools/regression/bin/sh/parameters/mail2.0 [new file with mode: 0644]
tools/regression/bin/sh/parameters/pwd1.0 [new file with mode: 0644]
tools/regression/bin/sh/parameters/pwd2.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/alias1.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/alias2.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/alias3.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/and-pipe-not.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/case1.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/case2.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/for1.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/func1.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/heredoc1.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/heredoc2.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/heredoc3.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/heredoc4.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/heredoc5.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/heredoc6.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/heredoc7.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/heredoc8.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/only-redir1.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/pipe-not1.0 [new file with mode: 0644]
tools/regression/bin/sh/regress.sh [new file with mode: 0644]
tools/regression/bin/sh/regress.t [new file with mode: 0644]
tools/regression/bin/sh/set-e/and1.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/and2.1 [new file with mode: 0644]
tools/regression/bin/sh/set-e/and3.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/and4.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/background1.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/cmd1.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/cmd2.1 [new file with mode: 0644]
tools/regression/bin/sh/set-e/elif1.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/elif2.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/eval1.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/eval2.1 [new file with mode: 0644]
tools/regression/bin/sh/set-e/for1.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/func1.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/func2.1 [new file with mode: 0644]
tools/regression/bin/sh/set-e/if1.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/if2.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/if3.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/not1.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/not2.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/or1.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/or2.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/or3.1 [new file with mode: 0644]
tools/regression/bin/sh/set-e/pipe1.1 [new file with mode: 0644]
tools/regression/bin/sh/set-e/pipe2.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/return1.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/semi1.1 [new file with mode: 0644]
tools/regression/bin/sh/set-e/semi2.1 [new file with mode: 0644]
tools/regression/bin/sh/set-e/subshell1.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/subshell2.1 [new file with mode: 0644]
tools/regression/bin/sh/set-e/until1.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/until2.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/until3.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/while1.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/while2.0 [new file with mode: 0644]
tools/regression/bin/sh/set-e/while3.0 [new file with mode: 0644]

index 6ec094f..21c858a 100644 (file)
@@ -66,4 +66,6 @@ syntax.c syntax.h: mksyntax.nx
 token.h: mktokens
        sh ${.CURDIR}/mktokens
 
+regress: sh
+       cd ${.CURDIR}/../../tools/regression/bin/sh && ${MAKE} SH=${.OBJDIR}/sh
 .include <bsd.prog.mk>
diff --git a/tools/regression/bin/sh/Makefile b/tools/regression/bin/sh/Makefile
new file mode 100644 (file)
index 0000000..724d50f
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/Makefile,v 1.2 2010/10/12 18:20:38 obrien Exp $
+
+# Allow one to specify the 'sh' to regress.
+SH?=   /bin/sh
+
+all:
+       env SH=${SH} ${SH} regress.sh
diff --git a/tools/regression/bin/sh/builtins/alias.0 b/tools/regression/bin/sh/builtins/alias.0
new file mode 100644 (file)
index 0000000..3585833
--- /dev/null
@@ -0,0 +1,9 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/alias.0,v 1.3 2009/03/22 21:12:00 stefanf Exp $
+set -e
+
+unalias -a
+alias foo=bar
+alias bar=
+alias quux="1 2 3"
+alias
+alias foo
diff --git a/tools/regression/bin/sh/builtins/alias.0.stdout b/tools/regression/bin/sh/builtins/alias.0.stdout
new file mode 100644 (file)
index 0000000..52efaf0
--- /dev/null
@@ -0,0 +1,4 @@
+bar=''
+foo=bar
+quux='1 2 3'
+foo=bar
diff --git a/tools/regression/bin/sh/builtins/alias.1 b/tools/regression/bin/sh/builtins/alias.1
new file mode 100644 (file)
index 0000000..841c7bc
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/alias.1,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+unalias -a
+alias foo
diff --git a/tools/regression/bin/sh/builtins/alias.1.stderr b/tools/regression/bin/sh/builtins/alias.1.stderr
new file mode 100644 (file)
index 0000000..5ea01d5
--- /dev/null
@@ -0,0 +1 @@
+alias: foo not found
diff --git a/tools/regression/bin/sh/builtins/break1.0 b/tools/regression/bin/sh/builtins/break1.0
new file mode 100644 (file)
index 0000000..e44a310
--- /dev/null
@@ -0,0 +1,16 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/break1.0,v 1.1 2010/08/15 21:06:53 jilles Exp $
+
+if [ "$1" != nested ]; then
+       while :; do
+               set -- nested
+               . "$0"
+               echo bad2
+               exit 2
+       done
+       exit 0
+fi
+# To trigger the bug, the following commands must be at the top level,
+# with newlines in between.
+break
+echo bad1
+exit 1
diff --git a/tools/regression/bin/sh/builtins/break2.0 b/tools/regression/bin/sh/builtins/break2.0
new file mode 100644 (file)
index 0000000..8722cde
--- /dev/null
@@ -0,0 +1,12 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/break2.0,v 1.1 2010/08/18 20:26:50 jilles Exp $
+
+# It is not immediately obvious that this should work, and someone probably
+# relies on it.
+
+while :; do
+       trap 'break' USR1
+       kill -USR1 $$
+       echo bad
+       exit 1
+done
+echo good
diff --git a/tools/regression/bin/sh/builtins/break2.0.stdout b/tools/regression/bin/sh/builtins/break2.0.stdout
new file mode 100644 (file)
index 0000000..12799cc
--- /dev/null
@@ -0,0 +1 @@
+good
diff --git a/tools/regression/bin/sh/builtins/break3.0 b/tools/regression/bin/sh/builtins/break3.0
new file mode 100644 (file)
index 0000000..6236bab
--- /dev/null
@@ -0,0 +1,15 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/break3.0,v 1.1 2010/08/22 11:04:30 jilles Exp $
+
+# We accept this and people might rely on it.
+# However, various other shells do not accept it.
+
+f() {
+       break
+       echo bad1
+}
+
+while :; do
+       f
+       echo bad2
+       exit 2
+done
diff --git a/tools/regression/bin/sh/builtins/builtin1.0 b/tools/regression/bin/sh/builtins/builtin1.0
new file mode 100644 (file)
index 0000000..a3e5bc5
--- /dev/null
@@ -0,0 +1,31 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/builtin1.0,v 1.1 2010/01/03 15:01:38 jilles Exp $
+
+failures=0
+
+check() {
+       if ! eval "[ $* ]"; then
+               echo "Failed: $*"
+               : $((failures += 1))
+       fi
+}
+
+builtin : || echo "Bad return code at $LINENO"
+builtin true || echo "Bad return code at $LINENO"
+builtin ls 2>/dev/null && echo "Bad return code at $LINENO"
+check '"$(builtin pwd)" = "$(pwd)"'
+check '-z "$(builtin :)"'
+check '-z "$(builtin true)"'
+check '-z "$( (builtin nosuchtool) 2>/dev/null)"'
+check '-z "$(builtin nosuchtool 2>/dev/null)"'
+check '-z "$(builtin nosuchtool 2>/dev/null; :)"'
+check '-z "$( (builtin ls) 2>/dev/null)"'
+check '-z "$(builtin ls 2>/dev/null)"'
+check '-z "$(builtin ls 2>/dev/null; :)"'
+check '-n "$( (builtin nosuchtool) 2>&1)"'
+check '-n "$(builtin nosuchtool 2>&1)"'
+check '-n "$(builtin nosuchtool 2>&1; :)"'
+check '-n "$( (builtin ls) 2>&1)"'
+check '-n "$(builtin ls 2>&1)"'
+check '-n "$(builtin ls 2>&1; :)"'
+
+exit $((failures > 0))
diff --git a/tools/regression/bin/sh/builtins/case1.0 b/tools/regression/bin/sh/builtins/case1.0
new file mode 100644 (file)
index 0000000..aa5a90e
--- /dev/null
@@ -0,0 +1,13 @@
+#$FreeBSD: src/tools/regression/bin/sh/builtins/case1.0,v 1.1 2007/10/04 16:14:48 stefanf Exp $
+f()
+{
+       false
+       case $1 in
+       foo) true ;;
+       bar) false ;;
+       esac
+}
+
+f foo || exit 1
+f bar && exit 1
+f quux || exit 1
diff --git a/tools/regression/bin/sh/builtins/case2.0 b/tools/regression/bin/sh/builtins/case2.0
new file mode 100644 (file)
index 0000000..c6bab2f
--- /dev/null
@@ -0,0 +1,106 @@
+# Generated by ./test-fnmatch -s 1, do not edit.
+# $FreeBSD: src/tools/regression/bin/sh/builtins/case2.0,v 1.1 2010/05/09 16:15:40 jilles Exp $
+failures=
+failed() { printf '%s\n' "Failed: $1 '$2' '$3'"; failures=x$failures; }
+testmatch() { eval "case \$2 in ''$1) ;; *) failed testmatch \"\$@\";; esac"; }
+testnomatch() { eval "case \$2 in ''$1) failed testnomatch \"\$@\";; esac"; }
+testmatch '' ''
+testmatch 'a' 'a'
+testnomatch 'a' 'b'
+testnomatch 'a' 'A'
+testmatch '*' 'a'
+testmatch '*' 'aa'
+testmatch '*a' 'a'
+testnomatch '*a' 'b'
+testnomatch '*a*' 'b'
+testmatch '*a*b*' 'ab'
+testmatch '*a*b*' 'qaqbq'
+testmatch '*a*bb*' 'qaqbqbbq'
+testmatch '*a*bc*' 'qaqbqbcq'
+testmatch '*a*bb*' 'qaqbqbb'
+testmatch '*a*bc*' 'qaqbqbc'
+testmatch '*a*bb' 'qaqbqbb'
+testmatch '*a*bc' 'qaqbqbc'
+testnomatch '*a*bb' 'qaqbqbbq'
+testnomatch '*a*bc' 'qaqbqbcq'
+testnomatch '*a*a*a*a*a*a*a*a*a*a*' 'aaaaaaaaa'
+testmatch '*a*a*a*a*a*a*a*a*a*a*' 'aaaaaaaaaa'
+testmatch '*a*a*a*a*a*a*a*a*a*a*' 'aaaaaaaaaaa'
+testnomatch '.*.*.*.*.*.*.*.*.*.*' '.........'
+testmatch '.*.*.*.*.*.*.*.*.*.*' '..........'
+testmatch '.*.*.*.*.*.*.*.*.*.*' '...........'
+testnomatch '*?*?*?*?*?*?*?*?*?*?*' '123456789'
+testnomatch '??????????*' '123456789'
+testnomatch '*??????????' '123456789'
+testmatch '*?*?*?*?*?*?*?*?*?*?*' '1234567890'
+testmatch '??????????*' '1234567890'
+testmatch '*??????????' '1234567890'
+testmatch '*?*?*?*?*?*?*?*?*?*?*' '12345678901'
+testmatch '??????????*' '12345678901'
+testmatch '*??????????' '12345678901'
+testmatch '[x]' 'x'
+testmatch '[*]' '*'
+testmatch '[?]' '?'
+testmatch '[' '['
+testmatch '[[]' '['
+testnomatch '[[]' 'x'
+testnomatch '[*]' ''
+testnomatch '[*]' 'x'
+testnomatch '[?]' 'x'
+testmatch '*[*]*' 'foo*foo'
+testnomatch '*[*]*' 'foo'
+testmatch '[0-9]' '0'
+testmatch '[0-9]' '5'
+testmatch '[0-9]' '9'
+testnomatch '[0-9]' '/'
+testnomatch '[0-9]' ':'
+testnomatch '[0-9]' '*'
+testnomatch '[!0-9]' '0'
+testnomatch '[!0-9]' '5'
+testnomatch '[!0-9]' '9'
+testmatch '[!0-9]' '/'
+testmatch '[!0-9]' ':'
+testmatch '[!0-9]' '*'
+testmatch '*[0-9]' 'a0'
+testmatch '*[0-9]' 'a5'
+testmatch '*[0-9]' 'a9'
+testnomatch '*[0-9]' 'a/'
+testnomatch '*[0-9]' 'a:'
+testnomatch '*[0-9]' 'a*'
+testnomatch '*[!0-9]' 'a0'
+testnomatch '*[!0-9]' 'a5'
+testnomatch '*[!0-9]' 'a9'
+testmatch '*[!0-9]' 'a/'
+testmatch '*[!0-9]' 'a:'
+testmatch '*[!0-9]' 'a*'
+testmatch '*[0-9]' 'a00'
+testmatch '*[0-9]' 'a55'
+testmatch '*[0-9]' 'a99'
+testmatch '*[0-9]' 'a0a0'
+testmatch '*[0-9]' 'a5a5'
+testmatch '*[0-9]' 'a9a9'
+testmatch '\*' '*'
+testmatch '\?' '?'
+testmatch '\[x]' '[x]'
+testmatch '\[' '['
+testmatch '\\' '\'
+testmatch '*\**' 'foo*foo'
+testnomatch '*\**' 'foo'
+testmatch '*\\*' 'foo\foo'
+testnomatch '*\\*' 'foo'
+testmatch '\(' '('
+testmatch '\a' 'a'
+testnomatch '\*' 'a'
+testnomatch '\?' 'a'
+testnomatch '\*' '\*'
+testnomatch '\?' '\?'
+testnomatch '\[x]' '\[x]'
+testnomatch '\[x]' '\x'
+testnomatch '\[' '\['
+testnomatch '\(' '\('
+testnomatch '\a' '\a'
+testmatch '.*' '.'
+testmatch '.*' '..'
+testmatch '.*' '.a'
+testmatch 'a*' 'a.'
+[ -z "$failures" ]
diff --git a/tools/regression/bin/sh/builtins/case3.0 b/tools/regression/bin/sh/builtins/case3.0
new file mode 100644 (file)
index 0000000..83d5835
--- /dev/null
@@ -0,0 +1,95 @@
+# Generated by ./test-fnmatch -s 2, do not edit.
+# $FreeBSD: src/tools/regression/bin/sh/builtins/case3.0,v 1.1 2010/05/09 16:15:40 jilles Exp $
+failures=
+failed() { printf '%s\n' "Failed: $1 '$2' '$3'"; failures=x$failures; }
+# We do not treat a backslash specially in this case,
+# but this is not the case in all shells.
+netestmatch() { case $2 in $1) ;; *) failed netestmatch "$@";; esac; }
+netestnomatch() { case $2 in $1) failed netestnomatch "$@";; esac; }
+netestmatch '' ''
+netestmatch 'a' 'a'
+netestnomatch 'a' 'b'
+netestnomatch 'a' 'A'
+netestmatch '*' 'a'
+netestmatch '*' 'aa'
+netestmatch '*a' 'a'
+netestnomatch '*a' 'b'
+netestnomatch '*a*' 'b'
+netestmatch '*a*b*' 'ab'
+netestmatch '*a*b*' 'qaqbq'
+netestmatch '*a*bb*' 'qaqbqbbq'
+netestmatch '*a*bc*' 'qaqbqbcq'
+netestmatch '*a*bb*' 'qaqbqbb'
+netestmatch '*a*bc*' 'qaqbqbc'
+netestmatch '*a*bb' 'qaqbqbb'
+netestmatch '*a*bc' 'qaqbqbc'
+netestnomatch '*a*bb' 'qaqbqbbq'
+netestnomatch '*a*bc' 'qaqbqbcq'
+netestnomatch '*a*a*a*a*a*a*a*a*a*a*' 'aaaaaaaaa'
+netestmatch '*a*a*a*a*a*a*a*a*a*a*' 'aaaaaaaaaa'
+netestmatch '*a*a*a*a*a*a*a*a*a*a*' 'aaaaaaaaaaa'
+netestnomatch '.*.*.*.*.*.*.*.*.*.*' '.........'
+netestmatch '.*.*.*.*.*.*.*.*.*.*' '..........'
+netestmatch '.*.*.*.*.*.*.*.*.*.*' '...........'
+netestnomatch '*?*?*?*?*?*?*?*?*?*?*' '123456789'
+netestnomatch '??????????*' '123456789'
+netestnomatch '*??????????' '123456789'
+netestmatch '*?*?*?*?*?*?*?*?*?*?*' '1234567890'
+netestmatch '??????????*' '1234567890'
+netestmatch '*??????????' '1234567890'
+netestmatch '*?*?*?*?*?*?*?*?*?*?*' '12345678901'
+netestmatch '??????????*' '12345678901'
+netestmatch '*??????????' '12345678901'
+netestmatch '[x]' 'x'
+netestmatch '[*]' '*'
+netestmatch '[?]' '?'
+netestmatch '[' '['
+netestmatch '[[]' '['
+netestnomatch '[[]' 'x'
+netestnomatch '[*]' ''
+netestnomatch '[*]' 'x'
+netestnomatch '[?]' 'x'
+netestmatch '*[*]*' 'foo*foo'
+netestnomatch '*[*]*' 'foo'
+netestmatch '[0-9]' '0'
+netestmatch '[0-9]' '5'
+netestmatch '[0-9]' '9'
+netestnomatch '[0-9]' '/'
+netestnomatch '[0-9]' ':'
+netestnomatch '[0-9]' '*'
+netestnomatch '[!0-9]' '0'
+netestnomatch '[!0-9]' '5'
+netestnomatch '[!0-9]' '9'
+netestmatch '[!0-9]' '/'
+netestmatch '[!0-9]' ':'
+netestmatch '[!0-9]' '*'
+netestmatch '*[0-9]' 'a0'
+netestmatch '*[0-9]' 'a5'
+netestmatch '*[0-9]' 'a9'
+netestnomatch '*[0-9]' 'a/'
+netestnomatch '*[0-9]' 'a:'
+netestnomatch '*[0-9]' 'a*'
+netestnomatch '*[!0-9]' 'a0'
+netestnomatch '*[!0-9]' 'a5'
+netestnomatch '*[!0-9]' 'a9'
+netestmatch '*[!0-9]' 'a/'
+netestmatch '*[!0-9]' 'a:'
+netestmatch '*[!0-9]' 'a*'
+netestmatch '*[0-9]' 'a00'
+netestmatch '*[0-9]' 'a55'
+netestmatch '*[0-9]' 'a99'
+netestmatch '*[0-9]' 'a0a0'
+netestmatch '*[0-9]' 'a5a5'
+netestmatch '*[0-9]' 'a9a9'
+netestmatch '\*' '\*'
+netestmatch '\?' '\?'
+netestmatch '\' '\'
+netestnomatch '\\' '\'
+netestmatch '\\' '\\'
+netestmatch '*\*' 'foo\foo'
+netestnomatch '*\*' 'foo'
+netestmatch '.*' '.'
+netestmatch '.*' '..'
+netestmatch '.*' '.a'
+netestmatch 'a*' 'a.'
+[ -z "$failures" ]
diff --git a/tools/regression/bin/sh/builtins/cd1.0 b/tools/regression/bin/sh/builtins/cd1.0
new file mode 100644 (file)
index 0000000..3637c65
--- /dev/null
@@ -0,0 +1,30 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/cd1.0,v 1.4 2010/10/11 23:24:57 obrien Exp $
+set -e
+
+P=${TMPDIR:-/tmp}
+cd $P
+T=$(mktemp -d sh-test.XXXXXX)
+
+chmod 0 $T
+if [ `id -u` -ne 0 ]; then
+       # Root can always cd, irregardless of directory permissions.
+       cd -L $T 2>/dev/null && exit 1
+       [ "$PWD" = "$P" ]
+       [ "$(pwd)" = "$P" ]
+       cd -P $T 2>/dev/null && exit 1
+       [ "$PWD" = "$P" ]
+       [ "$(pwd)" = "$P" ]
+fi
+
+chmod 755 $T
+cd $T
+mkdir -p 1/2/3
+ln -s 1/2 link1
+ln -s 2/3 1/link2
+(cd -L 1/../1 && [ "$(pwd -L)" = "$P/$T/1" ])
+(cd -L link1 && [ "$(pwd -L)" = "$P/$T/link1" ])
+(cd -L link1 && [ "$(pwd -P)" = "$P/$T/1/2" ])
+(cd -P link1 && [ "$(pwd -L)" = "$P/$T/1/2" ])
+(cd -P link1 && [ "$(pwd -P)" = "$P/$T/1/2" ])
+
+rm -rf ${P}/${T}
diff --git a/tools/regression/bin/sh/builtins/cd2.0 b/tools/regression/bin/sh/builtins/cd2.0
new file mode 100644 (file)
index 0000000..f1dbdc0
--- /dev/null
@@ -0,0 +1,16 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/cd2.0,v 1.2 2010/11/28 22:49:58 jilles Exp $
+set -e
+
+L=$(getconf PATH_MAX / 2>/dev/null) || L=4096
+[ "$L" -lt 100000 ] 2>/dev/null || L=4096
+L=$((L+100))
+T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX)
+trap 'rm -rf ${T}' 0
+cd $T
+D=$T
+while [ ${#D} -lt $L ]; do
+       mkdir veryverylongdirectoryname
+       cd veryverylongdirectoryname
+       D=$D/veryverylongdirectoryname
+done
+[ $(pwd | wc -c) -eq $((${#D} + 1)) ] # +\n
diff --git a/tools/regression/bin/sh/builtins/command1.0 b/tools/regression/bin/sh/builtins/command1.0
new file mode 100644 (file)
index 0000000..01b6c5b
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/command1.0,v 1.1 2005/10/28 14:02:42 stefanf Exp $
+true() {
+       false
+}
+command true
diff --git a/tools/regression/bin/sh/builtins/command10.0 b/tools/regression/bin/sh/builtins/command10.0
new file mode 100644 (file)
index 0000000..1a9c0e1
--- /dev/null
@@ -0,0 +1,14 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/command10.0,v 1.1 2010/03/06 17:31:09 jilles Exp $
+
+failures=0
+
+check() {
+       if ! eval "[ $* ]"; then
+               echo "Failed: $*"
+               : $((failures += 1))
+       fi
+}
+
+check '"$(f() { shift x; }; { command eval f 2>/dev/null; } >/dev/null; echo hi)" = hi'
+
+exit $((failures > 0))
diff --git a/tools/regression/bin/sh/builtins/command11.0 b/tools/regression/bin/sh/builtins/command11.0
new file mode 100644 (file)
index 0000000..cd22a3c
--- /dev/null
@@ -0,0 +1,14 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/command11.0,v 1.1 2010/03/14 14:24:35 jilles Exp $
+
+failures=0
+
+check() {
+       if ! eval "[ $* ]"; then
+               echo "Failed: $*"
+               : $((failures += 1))
+       fi
+}
+
+check '"$({ command eval \{ shift x\; \} 2\>/dev/null; } >/dev/null; echo hi)" = hi'
+
+exit $((failures > 0))
diff --git a/tools/regression/bin/sh/builtins/command2.0 b/tools/regression/bin/sh/builtins/command2.0
new file mode 100644 (file)
index 0000000..213b7a7
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/command2.0,v 1.1 2005/10/28 14:02:42 stefanf Exp $
+PATH=
+command -p cat < /dev/null
diff --git a/tools/regression/bin/sh/builtins/command3.0 b/tools/regression/bin/sh/builtins/command3.0
new file mode 100644 (file)
index 0000000..9f0ddff
--- /dev/null
@@ -0,0 +1,14 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/command3.0,v 1.2 2010/08/16 17:18:08 jilles Exp $
+command -v ls
+command -v true
+command -v /bin/ls
+
+fun() {
+       :
+}
+command -v fun
+command -v break
+command -v if
+
+alias foo=bar
+command -v foo
diff --git a/tools/regression/bin/sh/builtins/command3.0.stdout b/tools/regression/bin/sh/builtins/command3.0.stdout
new file mode 100644 (file)
index 0000000..239c53f
--- /dev/null
@@ -0,0 +1,7 @@
+/bin/ls
+true
+/bin/ls
+fun
+break
+if
+alias foo='bar '
diff --git a/tools/regression/bin/sh/builtins/command4.0 b/tools/regression/bin/sh/builtins/command4.0
new file mode 100644 (file)
index 0000000..266004f
--- /dev/null
@@ -0,0 +1,2 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/command4.0,v 1.1 2010/08/29 20:53:24 jilles Exp $
+! command -v nonexisting
diff --git a/tools/regression/bin/sh/builtins/command5.0 b/tools/regression/bin/sh/builtins/command5.0
new file mode 100644 (file)
index 0000000..5744051
--- /dev/null
@@ -0,0 +1,15 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/command5.0,v 1.2 2010/08/16 17:18:08 jilles Exp $
+command -V ls
+command -V true
+command -V /bin/ls
+
+fun() {
+       :
+}
+command -V fun
+command -V break
+command -V if
+command -V {
+
+alias foo=bar
+command -V foo
diff --git a/tools/regression/bin/sh/builtins/command5.0.stdout b/tools/regression/bin/sh/builtins/command5.0.stdout
new file mode 100644 (file)
index 0000000..4cb2b11
--- /dev/null
@@ -0,0 +1,8 @@
+ls is /bin/ls
+true is a shell builtin
+/bin/ls is /bin/ls
+fun is a shell function
+break is a special shell builtin
+if is a shell keyword
+{ is a shell keyword
+foo is an alias for bar 
diff --git a/tools/regression/bin/sh/builtins/command6.0 b/tools/regression/bin/sh/builtins/command6.0
new file mode 100644 (file)
index 0000000..eda5aef
--- /dev/null
@@ -0,0 +1,22 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/command6.0,v 1.3 2011/02/05 23:00:24 jilles Exp $
+PATH=/var/empty
+case $(command -pV ls) in
+*/var/empty/ls*)
+       echo "Failed: \$(command -pV ls) should not match */var/empty/ls*" ;;
+"ls is"*" "/*/ls) ;;
+*)
+       echo "Failed: \$(command -pV ls) match \"ls is\"*\" \"/*/ls" ;;
+esac
+command -pV true
+command -pV /bin/ls
+
+fun() {
+       :
+}
+command -pV fun
+command -pV break
+command -pV if
+command -pV {
+
+alias foo=bar
+command -pV foo
diff --git a/tools/regression/bin/sh/builtins/command6.0.stdout b/tools/regression/bin/sh/builtins/command6.0.stdout
new file mode 100644 (file)
index 0000000..df4d647
--- /dev/null
@@ -0,0 +1,7 @@
+true is a shell builtin
+/bin/ls is /bin/ls
+fun is a shell function
+break is a special shell builtin
+if is a shell keyword
+{ is a shell keyword
+foo is an alias for bar 
diff --git a/tools/regression/bin/sh/builtins/command7.0 b/tools/regression/bin/sh/builtins/command7.0
new file mode 100644 (file)
index 0000000..92fff56
--- /dev/null
@@ -0,0 +1,34 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/command7.0,v 1.2 2011/02/05 23:00:24 jilles Exp $
+
+failures=0
+
+check() {
+       if ! eval "[ $* ]"; then
+               echo "Failed: $*"
+               : $((failures += 1))
+       fi
+}
+
+check '"$(PATH=/libexec command -V ld-elf.so.1)" = "ld-elf.so.1 is /libexec/ld-elf.so.1"'
+check '"$(PATH=/libexec command -V ld-elf.so.1; :)" = "ld-elf.so.1 is /libexec/ld-elf.so.1"'
+check '"$(PATH=/libexec command -pv ld-elf.so.1)" = ""'
+check '"$(PATH=/libexec command -pv ld-elf.so.1; :)" = ""'
+
+PATH=/libexec:$PATH
+
+check '"$(command -V ld-elf.so.1)" = "ld-elf.so.1 is /libexec/ld-elf.so.1"'
+check '"$(command -V ld-elf.so.1; :)" = "ld-elf.so.1 is /libexec/ld-elf.so.1"'
+check '"$(command -pv ld-elf.so.1)" = ""'
+check '"$(command -pv ld-elf.so.1; :)" = ""'
+
+PATH=/libexec
+
+check '"$(command -v ls)" = ""'
+case $(command -pv ls) in
+/*/ls) ;;
+*)
+       echo "Failed: \$(command -pv ls) match /*/ls"
+       : $((failures += 1)) ;;
+esac
+
+exit $((failures > 0))
diff --git a/tools/regression/bin/sh/builtins/command8.0 b/tools/regression/bin/sh/builtins/command8.0
new file mode 100644 (file)
index 0000000..ee43085
--- /dev/null
@@ -0,0 +1,45 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/command8.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+IFS=,
+
+SPECIAL="break,\
+       :,\
+       continue,\
+       . /dev/null,\
+       eval,\
+       exec,\
+       export -p,\
+       readonly -p,\
+       set,\
+       shift 0,\
+       times,\
+       trap,\
+       unset foo"
+
+set -e
+
+# Check that special builtins can be executed via "command".
+
+set -- ${SPECIAL}
+for cmd in "$@"
+do
+       ${SH} -c "v=:; while \$v; do v=false; command ${cmd}; done" >/dev/null
+done
+
+while :; do
+       command break
+       echo Error on line $LINENO
+done
+
+set p q r
+command shift 2
+if [ $# -ne 1 ]; then
+       echo Error on line $LINENO
+fi
+
+(
+       command exec >/dev/null
+       echo Error on line $LINENO
+)
+
+set +e
+! command shift 2 2>/dev/null
diff --git a/tools/regression/bin/sh/builtins/command9.0 b/tools/regression/bin/sh/builtins/command9.0
new file mode 100644 (file)
index 0000000..9460f4b
--- /dev/null
@@ -0,0 +1,14 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/command9.0,v 1.1 2010/03/06 17:09:22 jilles Exp $
+
+failures=0
+
+check() {
+       if ! eval "[ $* ]"; then
+               echo "Failed: $*"
+               : $((failures += 1))
+       fi
+}
+
+check '"$({ command eval shift x 2>/dev/null; } >/dev/null; echo hi)" = hi'
+
+exit $((failures > 0))
diff --git a/tools/regression/bin/sh/builtins/dot1.0 b/tools/regression/bin/sh/builtins/dot1.0
new file mode 100644 (file)
index 0000000..8caf6b0
--- /dev/null
@@ -0,0 +1,21 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/dot1.0,v 1.1 2010/05/28 22:08:34 jilles Exp $
+
+failures=
+failure() {
+       echo "Error at line $1" >&2
+       failures=x$failures
+}
+
+T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX) || exit
+trap 'rm -rf $T' 0
+cd $T || exit 3
+unset x
+echo 'x=2' >testscript
+. ./testscript
+[ "$x" = 2 ] || failure $LINENO
+cd / || exit 3
+x=1
+PATH=$T:$PATH . testscript
+[ "$x" = 2 ] || failure $LINENO
+
+test -z "$failures"
diff --git a/tools/regression/bin/sh/builtins/dot2.0 b/tools/regression/bin/sh/builtins/dot2.0
new file mode 100644 (file)
index 0000000..40808a9
--- /dev/null
@@ -0,0 +1,21 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/dot2.0,v 1.1 2010/05/28 22:40:24 jilles Exp $
+
+failures=
+failure() {
+       echo "Error at line $1" >&2
+       failures=x$failures
+}
+
+T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX) || exit
+trap 'rm -rf $T' 0
+cd $T || exit 3
+unset x
+echo 'x=2' >testscript
+. -- ./testscript
+[ "$x" = 2 ] || failure $LINENO
+cd / || exit 3
+x=1
+PATH=$T:$PATH . -- testscript
+[ "$x" = 2 ] || failure $LINENO
+
+test -z "$failures"
diff --git a/tools/regression/bin/sh/builtins/eval1.0 b/tools/regression/bin/sh/builtins/eval1.0
new file mode 100644 (file)
index 0000000..388304f
--- /dev/null
@@ -0,0 +1,9 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/eval1.0,v 1.1 2009/05/31 17:23:27 stefanf Exp $
+set -e
+
+eval
+eval "" ""
+eval "true"
+! eval "false
+
+"
diff --git a/tools/regression/bin/sh/builtins/eval2.0 b/tools/regression/bin/sh/builtins/eval2.0
new file mode 100644 (file)
index 0000000..83d5873
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/eval2.0,v 1.1 2009/06/24 20:22:54 jilles Exp $
+
+eval '
+false
+
+' && exit 1
+exit 0
diff --git a/tools/regression/bin/sh/builtins/eval3.0 b/tools/regression/bin/sh/builtins/eval3.0
new file mode 100644 (file)
index 0000000..227839c
--- /dev/null
@@ -0,0 +1,9 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/eval3.0,v 1.1 2009/08/27 22:23:23 jilles Exp $
+
+eval 'false;' && exit 1
+eval 'true;' || exit 1
+eval 'false;
+' && exit 1
+eval 'true;
+' || exit 1
+exit 0
diff --git a/tools/regression/bin/sh/builtins/eval4.0 b/tools/regression/bin/sh/builtins/eval4.0
new file mode 100644 (file)
index 0000000..1311201
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/eval4.0,v 1.1 2010/08/01 22:39:07 jilles Exp $
+
+# eval should preserve $? from command substitutions when starting
+# the parsed command.
+[ $(eval 'echo $?' $(false)) = 1 ]
diff --git a/tools/regression/bin/sh/builtins/eval5.0 b/tools/regression/bin/sh/builtins/eval5.0
new file mode 100644 (file)
index 0000000..93ccf68
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/eval5.0,v 1.1 2010/08/03 22:17:29 jilles Exp $
+
+# eval should return 0 if no command was executed.
+eval $(false)
diff --git a/tools/regression/bin/sh/builtins/exec1.0 b/tools/regression/bin/sh/builtins/exec1.0
new file mode 100644 (file)
index 0000000..68f9606
--- /dev/null
@@ -0,0 +1,25 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/exec1.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+
+failures=
+failure() {
+       echo "Error at line $1" >&2
+       failures=x$failures
+}
+
+(
+       exec >/dev/null
+       echo bad
+)
+[ $? = 0 ] || failure $LINENO
+(
+       exec ${SH} -c 'exit 42'
+       echo bad
+)
+[ $? = 42 ] || failure $LINENO
+(
+       exec /var/empty/nosuch
+       echo bad
+) 2>/dev/null
+[ $? = 127 ] || failure $LINENO
+
+test -z "$failures"
diff --git a/tools/regression/bin/sh/builtins/exec2.0 b/tools/regression/bin/sh/builtins/exec2.0
new file mode 100644 (file)
index 0000000..9042176
--- /dev/null
@@ -0,0 +1,25 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/exec2.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+
+failures=
+failure() {
+       echo "Error at line $1" >&2
+       failures=x$failures
+}
+
+(
+       exec -- >/dev/null
+       echo bad
+)
+[ $? = 0 ] || failure $LINENO
+(
+       exec -- ${SH} -c 'exit 42'
+       echo bad
+)
+[ $? = 42 ] || failure $LINENO
+(
+       exec -- /var/empty/nosuch
+       echo bad
+) 2>/dev/null
+[ $? = 127 ] || failure $LINENO
+
+test -z "$failures"
diff --git a/tools/regression/bin/sh/builtins/exit1.0 b/tools/regression/bin/sh/builtins/exit1.0
new file mode 100644 (file)
index 0000000..74ea6ae
--- /dev/null
@@ -0,0 +1,6 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/exit1.0,v 1.1 2011/01/01 15:25:15 jilles Exp $
+
+# exit with an argument should overwrite the exit status in an EXIT trap.
+
+trap 'true; exit $?' 0
+false
diff --git a/tools/regression/bin/sh/builtins/exit2.8 b/tools/regression/bin/sh/builtins/exit2.8
new file mode 100644 (file)
index 0000000..8f45ec7
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/exit2.8,v 1.1 2011/01/08 23:00:38 jilles Exp $
+
+# exit without arguments is the same as exit $? outside a trap.
+
+trap 'true; true' 0
+(exit 8)
+exit
diff --git a/tools/regression/bin/sh/builtins/exit3.0 b/tools/regression/bin/sh/builtins/exit3.0
new file mode 100644 (file)
index 0000000..90d42b5
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/exit3.0,v 1.1 2011/01/08 23:08:13 jilles Exp $
+
+# exit without arguments differs from exit $? in an EXIT trap.
+
+trap 'false; exit' 0
diff --git a/tools/regression/bin/sh/builtins/fc1.0 b/tools/regression/bin/sh/builtins/fc1.0
new file mode 100644 (file)
index 0000000..dd1e8a7
--- /dev/null
@@ -0,0 +1,27 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/fc1.0,v 1.4 2010/10/12 18:20:38 obrien Exp $
+set -e
+trap 'echo Broken pipe -- test failed' PIPE
+
+P=${TMPDIR:-/tmp}
+cd $P
+T=$(mktemp -d sh-test.XXXXXX)
+cd $T
+
+mkfifo input output error
+HISTFILE=/dev/null ${SH} +m -i <input >output 2>error &
+{
+       # Syntax error
+       echo ')' >&3
+       # Read error message, shell will read new input now
+       read dummy <&5
+       # Execute bad command again
+       echo 'fc -e true' >&3
+       # Verify that the shell is still running
+       echo 'echo continued' >&3 || rc=3
+       echo 'exit' >&3 || rc=3
+       read line <&4 && [ "$line" = continued ] && : ${rc:=0}
+} 3>input 4<output 5<error
+
+rm input output error
+rmdir ${P}/${T}
+exit ${rc:-3}
diff --git a/tools/regression/bin/sh/builtins/fc2.0 b/tools/regression/bin/sh/builtins/fc2.0
new file mode 100644 (file)
index 0000000..c7cb66c
--- /dev/null
@@ -0,0 +1,34 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/fc2.0,v 1.3 2010/10/12 18:20:38 obrien Exp $
+set -e
+trap 'echo Broken pipe -- test failed' PIPE
+
+P=${TMPDIR:-/tmp}
+cd $P
+T=$(mktemp -d sh-test.XXXXXX)
+cd $T
+
+mkfifo input output error
+HISTFILE=/dev/null ${SH} +m -i <input >output 2>error &
+exec 3>input
+{
+       # Command not found, containing slash
+       echo '/var/empty/nonexistent' >&3
+       # Read error message, shell will read new input now
+       read dummy <&5
+       # Execute bad command again
+       echo 'fc -e true; echo continued' >&3
+       read dummy <&5
+       read line <&4 && [ "$line" = continued ] && : ${rc:=0}
+       exec 3>&-
+       # Old sh duplicates itself after the fc, producing another line
+       # of output.
+       if read line <&4; then
+               echo "Extraneous output: $line"
+               rc=1
+       fi
+} 4<output 5<error
+exec 3>&-
+
+rm input output error
+rmdir ${P}/${T}
+exit ${rc:-3}
diff --git a/tools/regression/bin/sh/builtins/getopts1.0 b/tools/regression/bin/sh/builtins/getopts1.0
new file mode 100644 (file)
index 0000000..4af8048
--- /dev/null
@@ -0,0 +1,25 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/getopts1.0,v 1.2 2010/10/14 23:28:31 obrien Exp $
+
+echo '-1-'
+set -- -abc
+getopts "ab:" OPTION
+echo ${OPTION}
+
+# In this case 'getopts' should realize that we have not provided the
+# required argument for "-b".
+# Note that Solaris 10's (UNIX 03) /usr/xpg4/bin/sh, /bin/sh, and /bin/ksh;
+# ksh93 20090505; pdksh 5.2.14p2; mksh R39c; bash 4.1 PL7; and zsh 4.3.10.
+# all recognize that "b" is missing its argument on the *first* iteration
+# of 'getopts' and do not produce the "a" in $OPTION.
+echo '-2-'
+set -- -ab
+getopts "ab:" OPTION
+echo ${OPTION}
+getopts "ab:" OPTION
+echo ${OPTION}
+
+# The 'shift' is aimed at causing an error.
+echo '-3-'
+shift 1
+getopts "ab:" OPTION
+echo ${OPTION}
diff --git a/tools/regression/bin/sh/builtins/getopts1.0.stdout b/tools/regression/bin/sh/builtins/getopts1.0.stdout
new file mode 100644 (file)
index 0000000..a0a347e
--- /dev/null
@@ -0,0 +1,8 @@
+-1-
+a
+-2-
+a
+No arg for -b option
+?
+-3-
+?
diff --git a/tools/regression/bin/sh/builtins/getopts2.0 b/tools/regression/bin/sh/builtins/getopts2.0
new file mode 100644 (file)
index 0000000..a95ec83
--- /dev/null
@@ -0,0 +1,6 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/getopts2.0,v 1.1 2008/08/27 20:26:34 stefanf Exp $
+set - -ax
+getopts ax option
+set -C
+getopts ax option
+echo $option
diff --git a/tools/regression/bin/sh/builtins/getopts2.0.stdout b/tools/regression/bin/sh/builtins/getopts2.0.stdout
new file mode 100644 (file)
index 0000000..587be6b
--- /dev/null
@@ -0,0 +1 @@
+x
diff --git a/tools/regression/bin/sh/builtins/hash1.0 b/tools/regression/bin/sh/builtins/hash1.0
new file mode 100644 (file)
index 0000000..4f0ac3b
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/hash1.0,v 1.1 2005/09/05 09:42:09 stefanf Exp $
+cat /dev/null
+hash
+hash -r
+hash
diff --git a/tools/regression/bin/sh/builtins/hash1.0.stdout b/tools/regression/bin/sh/builtins/hash1.0.stdout
new file mode 100644 (file)
index 0000000..3afc3e7
--- /dev/null
@@ -0,0 +1 @@
+/bin/cat
diff --git a/tools/regression/bin/sh/builtins/hash2.0 b/tools/regression/bin/sh/builtins/hash2.0
new file mode 100644 (file)
index 0000000..5b5f0a4
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/hash2.0,v 1.1 2005/09/05 09:42:09 stefanf Exp $
+hash
+hash cat
+hash
diff --git a/tools/regression/bin/sh/builtins/hash2.0.stdout b/tools/regression/bin/sh/builtins/hash2.0.stdout
new file mode 100644 (file)
index 0000000..3afc3e7
--- /dev/null
@@ -0,0 +1 @@
+/bin/cat
diff --git a/tools/regression/bin/sh/builtins/hash3.0 b/tools/regression/bin/sh/builtins/hash3.0
new file mode 100644 (file)
index 0000000..7eaeea0
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/hash3.0,v 1.1 2005/09/05 09:42:09 stefanf Exp $
+hash -v cat
+hash
diff --git a/tools/regression/bin/sh/builtins/hash3.0.stdout b/tools/regression/bin/sh/builtins/hash3.0.stdout
new file mode 100644 (file)
index 0000000..a34864c
--- /dev/null
@@ -0,0 +1,2 @@
+/bin/cat
+/bin/cat
diff --git a/tools/regression/bin/sh/builtins/lineno.0 b/tools/regression/bin/sh/builtins/lineno.0
new file mode 100644 (file)
index 0000000..c6ce0b7
--- /dev/null
@@ -0,0 +1,16 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/lineno.0,v 1.1 2008/05/15 19:58:44 stefanf Exp $
+echo $LINENO
+echo $LINENO
+
+f() {  
+       echo $LINENO
+       echo $LINENO
+}
+
+f
+
+echo ${LINENO:-foo}
+echo ${LINENO=foo}
+echo ${LINENO:+foo}
+echo ${LINENO+foo}
+echo ${#LINENO}
diff --git a/tools/regression/bin/sh/builtins/lineno.0.stdout b/tools/regression/bin/sh/builtins/lineno.0.stdout
new file mode 100644 (file)
index 0000000..82583a9
--- /dev/null
@@ -0,0 +1,9 @@
+2
+3
+2
+3
+12
+13
+foo
+foo
+2
diff --git a/tools/regression/bin/sh/builtins/locale1.0 b/tools/regression/bin/sh/builtins/locale1.0
new file mode 100644 (file)
index 0000000..181a6b8
--- /dev/null
@@ -0,0 +1,133 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/locale1.0,v 1.1 2010/05/05 21:48:40 jilles Exp $
+# Note: this test depends on strerror() using locale.
+
+failures=0
+
+check() {
+       if ! eval "[ $1 ]"; then
+               echo "Failed: $1 at $2"
+               : $((failures += 1))
+       fi
+}
+
+unset LANG LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY LC_NUMERIC LC_TIME LC_MESSAGES
+
+msgeng="No such file or directory"
+msgdut="Bestand of map niet gevonden"
+
+# Verify C locale error message.
+case $(command . /var/empty/foo 2>&1) in
+       *"$msgeng"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+# Various locale variables that should not affect the message.
+case $(LC_ALL=C command . /var/empty/foo 2>&1) in
+       *"$msgeng"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+case $(LC_ALL=C LANG=nl_NL.ISO8859-1 command . /var/empty/foo 2>&1) in
+       *"$msgeng"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+case $(LC_ALL=C LC_MESSAGES=nl_NL.ISO8859-1 command . /var/empty/foo 2>&1) in
+       *"$msgeng"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+case $(LC_CTYPE=nl_NL.ISO8859-1 command . /var/empty/foo 2>&1) in
+       *"$msgeng"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+# Verify Dutch message.
+case $(export LANG=nl_NL.ISO8859-1; command . /var/empty/foo 2>&1) in
+       *"$msgdut"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+case $(export LC_MESSAGES=nl_NL.ISO8859-1; command . /var/empty/foo 2>&1) in
+       *"$msgdut"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+case $(export LC_ALL=nl_NL.ISO8859-1; command . /var/empty/foo 2>&1) in
+       *"$msgdut"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+case $(LANG=nl_NL.ISO8859-1 command . /var/empty/foo 2>&1) in
+       *"$msgdut"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+case $(LC_MESSAGES=nl_NL.ISO8859-1 command . /var/empty/foo 2>&1) in
+       *"$msgdut"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+case $(LC_ALL=nl_NL.ISO8859-1 command . /var/empty/foo 2>&1) in
+       *"$msgdut"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+# Verify that command assignments do not set the locale persistently.
+case $(command . /var/empty/foo 2>&1) in
+       *"$msgeng"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+case $(LANG=nl_NL.ISO8859-1 command . /var/empty/foo 2>&1; command . /var/empty/foo 2>&1) in
+       *"$msgdut"*"$msgeng"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+case $(LC_MESSAGES=nl_NL.ISO8859-1 command . /var/empty/foo 2>&1; command . /var/empty/foo 2>&1) in
+       *"$msgdut"*"$msgeng"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+case $(LC_ALL=nl_NL.ISO8859-1 command . /var/empty/foo 2>&1; command . /var/empty/foo 2>&1) in
+       *"$msgdut"*"$msgeng"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+# Check special builtin; add colon invocation to avoid depending on certain fix.
+case $(LC_ALL=nl_NL.ISO8859-1 . /var/empty/foo 2>&1; :) in
+       *"$msgdut"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+# Assignments on special builtins are exported to that builtin; the export
+# is not persistent.
+case $(LC_ALL=nl_NL.ISO8859-1 . /dev/null; . /var/empty/foo 2>&1) in
+       *"$msgeng"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+case $(export LC_ALL; LC_ALL=nl_NL.ISO8859-1 . /dev/null; . /var/empty/foo 2>&1) in
+       *"$msgdut"*) ok=1 ;;
+       *) ok=0 ;;
+esac
+check '$ok -eq 1' $LINENO
+
+exit $((failures > 0))
diff --git a/tools/regression/bin/sh/builtins/printf1.0 b/tools/regression/bin/sh/builtins/printf1.0
new file mode 100644 (file)
index 0000000..288365b
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/printf1.0,v 1.1 2010/11/05 21:47:58 jilles Exp $
+
+[ "$(printf '%c\0%s%d' x '\' 010 | tr '\0' Z)" = 'xZ\8' ]
diff --git a/tools/regression/bin/sh/builtins/printf2.0 b/tools/regression/bin/sh/builtins/printf2.0
new file mode 100644 (file)
index 0000000..bb776af
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/printf2.0,v 1.1 2010/11/05 21:47:58 jilles Exp $
+
+[ "$(printf '%cZ%s%d' x '\' 010)" = 'xZ\8' ]
diff --git a/tools/regression/bin/sh/builtins/printf3.0 b/tools/regression/bin/sh/builtins/printf3.0
new file mode 100644 (file)
index 0000000..e4002d3
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/printf3.0,v 1.1 2010/12/20 23:06:57 jilles Exp $
+
+set -e
+v=$(! printf "%d" @wrong 2>/dev/null)
+[ "$v" = "0" ]
diff --git a/tools/regression/bin/sh/builtins/printf4.0 b/tools/regression/bin/sh/builtins/printf4.0
new file mode 100644 (file)
index 0000000..295f41c
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/printf4.0,v 1.1 2010/12/20 23:06:57 jilles Exp $
+
+set -e
+v=$(! printf "%d" 4wrong 2>/dev/null)
+[ "$v" = "4" ]
diff --git a/tools/regression/bin/sh/builtins/read1.0 b/tools/regression/bin/sh/builtins/read1.0
new file mode 100644 (file)
index 0000000..13376ad
--- /dev/null
@@ -0,0 +1,26 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/read1.0,v 1.2 2009/03/22 23:00:52 stefanf Exp $
+set -e
+
+echo "1 2 3"           | { read a; echo "x${a}x"; }
+echo "1 2 3"           | { read a b; echo "x${a}x${b}x"; }
+echo "1 2 3"           | { read a b c; echo "x${a}x${b}x${c}x"; }
+echo "1 2 3"           | { read a b c d; echo "x${a}x${b}x${c}x${d}x"; }
+
+echo " 1  2 3 "        | { read a b c; echo "x${a}x${b}x${c}x"; }
+echo " 1  2 3 "        | { unset IFS; read a b c; echo "x${a}x${b}x${c}x"; }
+echo " 1  2 3 "        | { IFS=$(printf ' \t\n') read a b c; echo "x${a}x${b}x${c}x"; }
+echo " 1  2 3 "        | { IFS= read a b; echo "x${a}x${b}x"; }
+
+echo " 1,2 3 "         | { IFS=' ,' read a b c; echo "x${a}x${b}x${c}x"; }
+echo ", 2 ,3"          | { IFS=' ,' read a b c; echo "x${a}x${b}x${c}x"; }
+echo " 1 ,,3"          | { IFS=' ,' read a b c; echo "x${a}x${b}x${c}x"; }
+echo " 1 , , 3"                | { IFS=' ,' read a b c; echo "x${a}x${b}x${c}x"; }
+echo " 1 ,2 3,"                | { IFS=' ,' read a b c; echo "x${a}x${b}x${c}x"; }
+echo " 1 ,2 3,,"       | { IFS=' ,' read a b c; echo "x${a}x${b}x${c}x"; }
+
+echo " 1,2 3 "         | { IFS=', ' read a b c; echo "x${a}x${b}x${c}x"; }
+echo ", 2 ,3"          | { IFS=', ' read a b c; echo "x${a}x${b}x${c}x"; }
+echo " 1 ,,3"          | { IFS=', ' read a b c; echo "x${a}x${b}x${c}x"; }
+echo " 1 , , 3"                | { IFS=', ' read a b c; echo "x${a}x${b}x${c}x"; }
+echo " 1 ,2 3,"                | { IFS=', ' read a b c; echo "x${a}x${b}x${c}x"; }
+echo " 1 ,2 3,,"       | { IFS=', ' read a b c; echo "x${a}x${b}x${c}x"; }
diff --git a/tools/regression/bin/sh/builtins/read1.0.stdout b/tools/regression/bin/sh/builtins/read1.0.stdout
new file mode 100644 (file)
index 0000000..dbcb1af
--- /dev/null
@@ -0,0 +1,20 @@
+x1 2 3x
+x1x2 3x
+x1x2x3x
+x1x2x3xx
+x1x2x3x
+x1x2x3x
+x1x2x3x
+x      1  2 3 xx
+x1x2x3x
+xx2x3x
+x1xx3x
+x1xx3x
+x1x2x3x
+x1x2x3,,x
+x1x2x3x
+xx2x3x
+x1xx3x
+x1xx3x
+x1x2x3x
+x1x2x3,,x
diff --git a/tools/regression/bin/sh/builtins/read2.0 b/tools/regression/bin/sh/builtins/read2.0
new file mode 100644 (file)
index 0000000..9cea29a
--- /dev/null
@@ -0,0 +1,31 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/read2.0,v 1.1 2010/09/03 21:17:33 jilles Exp $
+
+set -e
+{
+       echo 1
+       echo two
+       echo three
+} | {
+       read x
+       [ "$x" = 1 ]
+       (read x
+       [ "$x" = two ])
+       read x
+       [ "$x" = three ]
+}
+
+T=`mktemp sh-test.XXXXXX`
+trap 'rm -f "$T"' 0
+{
+       echo 1
+       echo two
+       echo three
+} >$T
+{
+       read x
+       [ "$x" = 1 ]
+       (read x
+       [ "$x" = two ])
+       read x
+       [ "$x" = three ]
+} <$T
diff --git a/tools/regression/bin/sh/builtins/read3.0 b/tools/regression/bin/sh/builtins/read3.0
new file mode 100644 (file)
index 0000000..3bd56ca
--- /dev/null
@@ -0,0 +1,11 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/read3.0,v 1.1 2010/09/08 18:32:23 jilles Exp $
+
+printf '%s\n' 'a\ b c' | { read a b; printf '%s\n' "x${a}x${b}x"; }
+printf '%s\n' 'a b\ c' | { read a b; printf '%s\n' "x${a}x${b}x"; }
+printf '%s\n' 'a\:b:c' | { IFS=: read a b; printf '%s\n' "x${a}x${b}x"; }
+printf '%s\n' 'a:b\:c' | { IFS=: read a b; printf '%s\n' "x${a}x${b}x"; }
+printf '%s\n' '\ a'    | { read a b; printf '%s\n' "x${a}x${b}x"; }
+printf '%s\n' '\:a'    | { IFS=: read a b; printf '%s\n' "x${a}x${b}x"; }
+printf '%s\n' '\\'     | { read a b; printf '%s\n' "x${a}x${b}x"; }
+printf '%s\n' '\\\ a'  | { read a b; printf '%s\n' "x${a}x${b}x"; }
+printf '%s\n' '\\\ a'  | { read -r a b; printf '%s\n' "x${a}x${b}x"; }
diff --git a/tools/regression/bin/sh/builtins/read3.0.stdout b/tools/regression/bin/sh/builtins/read3.0.stdout
new file mode 100644 (file)
index 0000000..8ed98ca
--- /dev/null
@@ -0,0 +1,9 @@
+xa bxcx
+xaxb cx
+xa:bxcx
+xaxb:cx
+x axx
+x:axx
+x\xx
+x\ axx
+x\\\xax
diff --git a/tools/regression/bin/sh/builtins/read4.0 b/tools/regression/bin/sh/builtins/read4.0
new file mode 100644 (file)
index 0000000..1a82a2c
--- /dev/null
@@ -0,0 +1,10 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/read4.0,v 1.1 2010/09/08 20:35:43 jilles Exp $
+
+printf '%s\n' '\a\ b c'        | { read a b; printf '%s\n' "x${a}x${b}x"; }
+printf '%s\n' '\a b\ c'        | { read a b; printf '%s\n' "x${a}x${b}x"; }
+printf '%s\n' '\a\:b:c'        | { IFS=: read a b; printf '%s\n' "x${a}x${b}x"; }
+printf '%s\n' '\a:b\:c'        | { IFS=: read a b; printf '%s\n' "x${a}x${b}x"; }
+printf '%s\n' '\\ a'   | { read a b; printf '%s\n' "x${a}x${b}x"; }
+printf '%s\n' '\\:a'   | { IFS=: read a b; printf '%s\n' "x${a}x${b}x"; }
+printf '%s\n' '\\\ a'  | { read a b; printf '%s\n' "x${a}x${b}x"; }
+printf '%s\n' '\\\:a'  | { IFS=: read a b; printf '%s\n' "x${a}x${b}x"; }
diff --git a/tools/regression/bin/sh/builtins/read4.0.stdout b/tools/regression/bin/sh/builtins/read4.0.stdout
new file mode 100644 (file)
index 0000000..a8747a4
--- /dev/null
@@ -0,0 +1,8 @@
+xa bxcx
+xaxb cx
+xa:bxcx
+xaxb:cx
+x\xax
+x\xax
+x\ axx
+x\:axx
diff --git a/tools/regression/bin/sh/builtins/return1.0 b/tools/regression/bin/sh/builtins/return1.0
new file mode 100644 (file)
index 0000000..9a08320
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/return1.0,v 1.1 2005/09/05 09:42:09 stefanf Exp $
+f() {
+       return 0
+       exit 1
+}
+
+f
diff --git a/tools/regression/bin/sh/builtins/return2.1 b/tools/regression/bin/sh/builtins/return2.1
new file mode 100644 (file)
index 0000000..3de71dd
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/return2.1,v 1.1 2005/09/05 09:42:10 stefanf Exp $
+f() {
+       true && return 1
+       return 0
+}
+
+f
diff --git a/tools/regression/bin/sh/builtins/return3.1 b/tools/regression/bin/sh/builtins/return3.1
new file mode 100644 (file)
index 0000000..18eb37b
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/return3.1,v 1.1 2005/09/05 09:42:10 stefanf Exp $
+return 1
+exit 0
diff --git a/tools/regression/bin/sh/builtins/return4.0 b/tools/regression/bin/sh/builtins/return4.0
new file mode 100644 (file)
index 0000000..d535650
--- /dev/null
@@ -0,0 +1,16 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/return4.0,v 1.1 2010/05/28 22:08:34 jilles Exp $
+
+failures=
+failure() {
+       echo "Error at line $1" >&2
+       failures=x$failures
+}
+
+T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX) || exit
+trap 'rm -rf $T' 0
+cd $T || exit 3
+echo 'return 42; exit 4' >testscript
+. ./testscript
+[ "$?" = 42 ] || failure $LINENO
+
+test -z "$failures"
diff --git a/tools/regression/bin/sh/builtins/return5.0 b/tools/regression/bin/sh/builtins/return5.0
new file mode 100644 (file)
index 0000000..f192cc6
--- /dev/null
@@ -0,0 +1,17 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/return5.0,v 1.1 2010/08/15 21:06:53 jilles Exp $
+
+if [ "$1" != nested ]; then
+       f() {
+               set -- nested
+               . "$0"
+               # Allow return to return from the function or the dot script.
+               return 4
+       }
+       f
+       exit $(($? ^ 4))
+fi
+# To trigger the bug, the following commands must be at the top level,
+# with newlines in between.
+return 4
+echo bad
+exit 1
diff --git a/tools/regression/bin/sh/builtins/return6.4 b/tools/regression/bin/sh/builtins/return6.4
new file mode 100644 (file)
index 0000000..aaa4907
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/return6.4,v 1.1 2010/09/11 15:07:40 jilles Exp $
+
+while return 4; do exit 3; done
diff --git a/tools/regression/bin/sh/builtins/return7.4 b/tools/regression/bin/sh/builtins/return7.4
new file mode 100644 (file)
index 0000000..1765ac3
--- /dev/null
@@ -0,0 +1,6 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/return7.4,v 1.1 2010/09/11 15:07:40 jilles Exp $
+
+f() {
+       while return 4; do exit 3; done
+}
+f
diff --git a/tools/regression/bin/sh/builtins/trap1.0 b/tools/regression/bin/sh/builtins/trap1.0
new file mode 100644 (file)
index 0000000..d18020c
--- /dev/null
@@ -0,0 +1,22 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/trap1.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+
+test "$(trap 'echo trapped' EXIT; :)" = trapped || exit 1
+
+test "$(trap 'echo trapped' EXIT; /usr/bin/true)" = trapped || exit 1
+
+result=$(${SH} -c 'trap "echo trapped" EXIT; /usr/bin/false')
+test $? -eq 1 || exit 1
+test "$result" = trapped || exit 1
+
+result=$(${SH} -c 'trap "echo trapped" EXIT; exec /usr/bin/false')
+test $? -eq 1 || exit 1
+test -z "$result" || exit 1
+
+result=0
+trap 'result=$((result+1))' INT
+kill -INT $$
+test "$result" -eq 1 || exit 1
+(kill -INT $$)
+test "$result" -eq 2 || exit 1
+
+exit 0
diff --git a/tools/regression/bin/sh/builtins/trap2.0 b/tools/regression/bin/sh/builtins/trap2.0
new file mode 100644 (file)
index 0000000..2b8366e
--- /dev/null
@@ -0,0 +1,52 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/trap2.0,v 1.1 2009/06/19 22:15:59 jilles Exp $
+# This is really a test for outqstr(), which is readily accessible via trap.
+
+runtest()
+{
+       teststring=$1
+       trap -- "$teststring" USR1
+       traps=$(trap)
+       if [ "$teststring" != "-" ] && [ -z "$traps" ]; then
+               # One possible reading of POSIX requires the above to return an
+               # empty string because backquote commands are executed in a
+               # subshell and subshells shall reset traps. However, an example
+               # in the normative description of the trap builtin shows the
+               # same usage as here, it is useful and our /bin/sh allows it.
+               echo '$(trap) is broken'
+               exit 1
+       fi
+       trap - USR1
+       eval "$traps"
+       traps2=$(trap)
+       if [ "$traps" != "$traps2" ]; then
+               echo "Mismatch for '$teststring'"
+               exit 1
+       fi
+}
+
+runtest 'echo'
+runtest 'echo hi'
+runtest "'echo' 'hi'"
+runtest '"echo" $PATH'
+runtest '\echo "$PATH"'
+runtest ' 0'
+runtest '0 '
+runtest ' 1'
+runtest '1 '
+i=1
+while [ $i -le 127 ]; do
+       c=$(printf \\"$(printf %o $i)")
+       if [ $i -lt 48 ] || [ $i -gt 57 ]; then
+               runtest "$c"
+       fi
+       runtest " $c$c"
+       runtest "a$c"
+       i=$((i+1))
+done
+IFS=,
+runtest ' '
+runtest ','
+unset IFS
+runtest ' '
+
+exit 0
diff --git a/tools/regression/bin/sh/builtins/trap3.0 b/tools/regression/bin/sh/builtins/trap3.0
new file mode 100644 (file)
index 0000000..d661a78
--- /dev/null
@@ -0,0 +1,12 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/trap3.0,v 1.1 2009/11/21 20:44:34 jilles Exp $
+
+{
+       trap '' garbage && exit 3
+       trap - garbage && exit 3
+       trap true garbage && exit 3
+       trap '' 99999 && exit 3
+       trap - 99999 && exit 3
+       trap true 99999 && exit 3
+} 2>/dev/null
+test -n "$(trap true garbage TERM 2>/dev/null || trap)" || exit 3
+exit 0
diff --git a/tools/regression/bin/sh/builtins/trap4.0 b/tools/regression/bin/sh/builtins/trap4.0
new file mode 100644 (file)
index 0000000..39d0cb7
--- /dev/null
@@ -0,0 +1,17 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/trap4.0,v 1.1 2011/01/05 23:17:29 jilles Exp $
+
+T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX)
+trap 'rm -rf $T' 0
+cd $T || exit 3
+mkfifo fifo1
+
+v=$(
+       exec 3>&1
+       : <fifo1 &
+       {
+               wait $!
+               trap 'trap "" PIPE; echo trapped >&3 2>/dev/null' PIPE
+               echo x 2>/dev/null
+       } >fifo1
+)
+test "$v" = trapped
diff --git a/tools/regression/bin/sh/builtins/trap5.0 b/tools/regression/bin/sh/builtins/trap5.0
new file mode 100644 (file)
index 0000000..2ec256c
--- /dev/null
@@ -0,0 +1,19 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/trap5.0,v 1.1 2011/01/15 21:09:00 jilles Exp $
+
+set -e
+trap - USR1
+initial=$(trap)
+trap -- -l USR1
+added=$(trap)
+[ -n "$added" ]
+trap - USR1
+second=$(trap)
+[ "$initial" = "$second" ]
+eval "$added"
+added2=$(trap)
+added3=$(trap --)
+[ "$added" = "$added2" ]
+[ "$added2" = "$added3" ]
+trap -- - USR1
+third=$(trap)
+[ "$initial" = "$third" ]
diff --git a/tools/regression/bin/sh/builtins/trap6.0 b/tools/regression/bin/sh/builtins/trap6.0
new file mode 100644 (file)
index 0000000..3d18966
--- /dev/null
@@ -0,0 +1,9 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/trap6.0,v 1.1 2011/01/16 13:56:41 jilles Exp $
+
+v=$(
+       ${SH} -c 'trap "echo ok; exit" USR1; kill -USR1 $$' &
+       # Suppress possible message about exit on signal
+       wait $! >/dev/null 2>&1
+)
+r=$(kill -l $?)
+[ "$v" = "ok" ] && { [ "$r" = "USR1" ] || [ "$r" = "usr1" ]; }
diff --git a/tools/regression/bin/sh/builtins/trap7.0 b/tools/regression/bin/sh/builtins/trap7.0
new file mode 100644 (file)
index 0000000..cb3433c
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/trap7.0,v 1.1 2011/01/27 23:08:20 jilles Exp $
+
+[ "$(trap 'echo trapped' EXIT)" = trapped ]
diff --git a/tools/regression/bin/sh/builtins/type1.0 b/tools/regression/bin/sh/builtins/type1.0
new file mode 100644 (file)
index 0000000..438886b
--- /dev/null
@@ -0,0 +1,8 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/type1.0,v 1.1 2007/01/11 00:25:20 stefanf Exp $
+command -v not-here && exit 1
+command -v /not-here && exit 1
+command -V not-here && exit 1
+command -V /not-here && exit 1
+type not-here && exit 1
+type /not-here && exit 1
+exit 0
diff --git a/tools/regression/bin/sh/builtins/type1.0.stderr b/tools/regression/bin/sh/builtins/type1.0.stderr
new file mode 100644 (file)
index 0000000..7853418
--- /dev/null
@@ -0,0 +1,4 @@
+not-here: not found
+/not-here: No such file or directory
+not-here: not found
+/not-here: No such file or directory
diff --git a/tools/regression/bin/sh/builtins/type2.0 b/tools/regression/bin/sh/builtins/type2.0
new file mode 100644 (file)
index 0000000..3999534
--- /dev/null
@@ -0,0 +1,26 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/type2.0,v 1.1 2009/12/31 17:44:24 jilles Exp $
+
+failures=0
+
+check() {
+       if ! eval "$*"; then
+               echo "Failed: $*"
+               : $((failures += 1))
+       fi
+}
+
+check 'PATH=/libexec type ld-elf.so.1 >/dev/null'
+check '! PATH=/libexec type ls 2>/dev/null'
+
+PATH=/libexec:$PATH
+
+check 'type ld-elf.so.1 >/dev/null'
+
+PATH=/libexec
+
+check 'type ld-elf.so.1 >/dev/null'
+check '! type ls 2>/dev/null'
+check 'PATH=/bin type ls >/dev/null'
+check '! PATH=/bin type ld-elf.so.1 2>/dev/null'
+
+exit $((failures > 0))
diff --git a/tools/regression/bin/sh/builtins/unalias.0 b/tools/regression/bin/sh/builtins/unalias.0
new file mode 100644 (file)
index 0000000..cd275ac
--- /dev/null
@@ -0,0 +1,21 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/unalias.0,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+
+alias false=true
+false
+unalias false
+false && exit 1
+unalias false && exit 1
+
+alias a1=foo a2=bar
+unalias a1 a2
+unalias a1 && exit 1
+unalias a2 && exit 1
+alias a2=bar
+unalias a1 a2 && exit 1
+
+alias a1=foo a2=bar
+unalias -a
+unalias a1 && exit 1
+unalias a2 && exit 1
+exit 0
diff --git a/tools/regression/bin/sh/builtins/var-assign.0 b/tools/regression/bin/sh/builtins/var-assign.0
new file mode 100644 (file)
index 0000000..08f6946
--- /dev/null
@@ -0,0 +1,55 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/var-assign.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+IFS=,
+
+SPECIAL="break,\
+       :,\
+       continue,\
+       . /dev/null,
+       eval,
+       exec,
+       export -p,
+       readonly -p,
+       set,
+       shift 0,
+       times,
+       trap,
+       unset foo"
+
+UTILS="alias,\
+       bg,\
+       bind,\
+       cd,\
+       command echo,\
+       echo,\
+       false,\
+       fc -l,\
+       fg,\
+       getopts a var,\
+       hash,\
+       jobs,\
+       printf a,\
+       pwd,\
+       read var < /dev/null,\
+       test,\
+       true,\
+       type ls,\
+       ulimit,\
+       umask,\
+       unalias -a,\
+       wait"
+
+set -e
+
+# For special built-ins variable assignments affect the shell environment.
+set -- ${SPECIAL}
+for cmd in "$@"
+do
+       ${SH} -c "VAR=1; VAR=0 ${cmd}; exit \${VAR}" >/dev/null 2>&1
+done
+
+# For other built-ins and utilites they do not.
+set -- ${UTILS}
+for cmd in "$@"
+do
+       ${SH} -c "VAR=0; VAR=1 ${cmd}; exit \${VAR}" >/dev/null 2>&1
+done
diff --git a/tools/regression/bin/sh/builtins/var-assign2.0 b/tools/regression/bin/sh/builtins/var-assign2.0
new file mode 100644 (file)
index 0000000..e8a103f
--- /dev/null
@@ -0,0 +1,55 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/var-assign2.0,v 1.3 2010/10/12 18:20:38 obrien Exp $
+IFS=,
+
+SPECIAL="break,\
+       :,\
+       continue,\
+       . /dev/null,\
+       eval,\
+       exec,\
+       export -p,\
+       readonly -p,\
+       set,\
+       shift 0,\
+       times,\
+       trap,\
+       unset foo"
+
+UTILS="alias,\
+       bg,\
+       bind,\
+       cd,\
+       command echo,\
+       echo,\
+       false,\
+       fc -l,\
+       fg,\
+       getopts a var,\
+       hash,\
+       jobs,\
+       printf a,\
+       pwd,\
+       read var < /dev/null,\
+       test,\
+       true,\
+       type ls,\
+       ulimit,\
+       umask,\
+       unalias -a,\
+       wait"
+
+set -e
+
+# With 'command', variable assignments do not affect the shell environment.
+
+set -- ${SPECIAL}
+for cmd in "$@"
+do
+       ${SH} -c "VAR=0; VAR=1 command ${cmd}; exit \${VAR}" >/dev/null 2>&1
+done
+
+set -- ${UTILS}
+for cmd in "$@"
+do
+       ${SH} -c "VAR=0; VAR=1 command ${cmd}; exit \${VAR}" >/dev/null 2>&1
+done
diff --git a/tools/regression/bin/sh/builtins/wait1.0 b/tools/regression/bin/sh/builtins/wait1.0
new file mode 100644 (file)
index 0000000..1030e6e
--- /dev/null
@@ -0,0 +1,23 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/wait1.0,v 1.1 2010/05/23 22:10:20 jilles Exp $
+
+failures=
+failure() {
+       echo "Error at line $1" >&2
+       failures=x$failures
+}
+
+exit 4 & p4=$!
+exit 8 & p8=$!
+wait $p4
+[ $? = 4 ] || failure $LINENO
+wait $p8
+[ $? = 8 ] || failure $LINENO
+
+exit 3 & p3=$!
+exit 7 & p7=$!
+wait $p7
+[ $? = 7 ] || failure $LINENO
+wait $p3
+[ $? = 3 ] || failure $LINENO
+
+test -z "$failures"
diff --git a/tools/regression/bin/sh/builtins/wait2.0 b/tools/regression/bin/sh/builtins/wait2.0
new file mode 100644 (file)
index 0000000..36c587f
--- /dev/null
@@ -0,0 +1,15 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/wait2.0,v 1.1 2010/05/23 22:10:20 jilles Exp $
+
+failures=
+failure() {
+       echo "Error at line $1" >&2
+       failures=x$failures
+}
+
+for i in 1 2 3 4 5 6 7 8 9 10; do
+       exit $i &
+done
+wait || failure $LINENO
+wait || failure $LINENO
+
+test -z "$failures"
diff --git a/tools/regression/bin/sh/builtins/wait3.0 b/tools/regression/bin/sh/builtins/wait3.0
new file mode 100644 (file)
index 0000000..ab34740
--- /dev/null
@@ -0,0 +1,21 @@
+# $FreeBSD: src/tools/regression/bin/sh/builtins/wait3.0,v 1.1 2010/11/19 21:15:06 jilles Exp $
+
+failures=
+failure() {
+       echo "Error at line $1" >&2
+       failures=x$failures
+}
+
+T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX)
+trap 'rm -rf $T' 0
+cd $T || exit 3
+mkfifo fifo1
+for i in 1 2 3 4 5 6 7 8 9 10; do
+       exit $i 4<fifo1 &
+done
+exec 3>fifo1
+wait || failure $LINENO
+(echo >&3) 2>/dev/null && failure $LINENO
+wait || failure $LINENO
+
+test -z "$failures"
diff --git a/tools/regression/bin/sh/errors/assignment-error1.0 b/tools/regression/bin/sh/errors/assignment-error1.0
new file mode 100644 (file)
index 0000000..bb7b128
--- /dev/null
@@ -0,0 +1,30 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/assignment-error1.0,v 1.3 2010/10/12 18:20:38 obrien Exp $
+IFS=,
+
+SPECIAL="break,\
+       :,\
+       continue,\
+       . /dev/null,\
+       eval,\
+       exec,\
+       export -p,\
+       readonly -p,\
+       set,\
+       shift,\
+       times,\
+       trap,\
+       unset foo"
+
+# If there is no command word, the shell must abort on an assignment error.
+${SH} -c "readonly a=0; a=2; exit 0" 2>/dev/null && exit 1
+
+# Special built-in utilities must abort on an assignment error.
+set -- ${SPECIAL}
+for cmd in "$@"
+do
+       ${SH} -c "readonly a=0; a=2 ${cmd}; exit 0" 2>/dev/null && exit 1
+done
+
+# Other utilities must not abort; we currently still execute them.
+${SH} -c 'readonly a=0; a=1 true; exit $a' 2>/dev/null || exit 1
+${SH} -c 'readonly a=0; a=1 command :; exit $a' 2>/dev/null || exit 1
diff --git a/tools/regression/bin/sh/errors/assignment-error2.0 b/tools/regression/bin/sh/errors/assignment-error2.0
new file mode 100644 (file)
index 0000000..b8507eb
--- /dev/null
@@ -0,0 +1,8 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/assignment-error2.0,v 1.1 2011/01/01 13:26:18 jilles Exp $
+
+set -e
+HOME=/
+readonly HOME
+cd /sbin
+{ HOME=/bin cd; } 2>/dev/null || :
+[ "$(pwd)" != /bin ]
diff --git a/tools/regression/bin/sh/errors/backquote-error1.0 b/tools/regression/bin/sh/errors/backquote-error1.0
new file mode 100644 (file)
index 0000000..a5fd585
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/backquote-error1.0,v 1.3 2010/10/12 18:20:38 obrien Exp $
+
+echo 'echo `for` echo ".BAD"CODE.' | ${SH} +m -i 2>&1 | grep -q BADCODE && exit 1
+exit 0
diff --git a/tools/regression/bin/sh/errors/backquote-error2.0 b/tools/regression/bin/sh/errors/backquote-error2.0
new file mode 100644 (file)
index 0000000..b2075b5
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/backquote-error2.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+
+${SH} -c 'echo `echo .BA"DCODE.`
+echo ".BAD"CODE.' 2>&1 | grep -q BADCODE && exit 1
+echo '`"`' | ${SH} -n 2>/dev/null && exit 1
+echo '`'"'"'`' | ${SH} -n 2>/dev/null && exit 1
+exit 0
diff --git a/tools/regression/bin/sh/errors/bad-binary1.126 b/tools/regression/bin/sh/errors/bad-binary1.126
new file mode 100644 (file)
index 0000000..1e41fd7
--- /dev/null
@@ -0,0 +1,12 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/bad-binary1.126,v 1.1 2011/02/05 12:54:59 jilles Exp $
+# Checking for binary "scripts" without magic number is permitted but not
+# required by POSIX. However, it is preferable to getting errors like
+# Syntax error: word unexpected (expecting ")")
+# from trying to execute ELF binaries for the wrong architecture.
+
+T=`mktemp -d "${TMPDIR:-/tmp}/sh-test.XXXXXXXX"` || exit
+trap 'rm -rf "${T}"' 0
+printf '\0echo bad\n' >"$T/testshellproc"
+chmod 755 "$T/testshellproc"
+PATH=$T:$PATH
+testshellproc 2>/dev/null
diff --git a/tools/regression/bin/sh/errors/bad-keyword1.0 b/tools/regression/bin/sh/errors/bad-keyword1.0
new file mode 100644 (file)
index 0000000..4630388
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/bad-keyword1.0,v 1.2 2010/12/12 21:18:16 jilles Exp $
+
+echo ':; fi' | ${SH} -n 2>/dev/null && exit 1
+exit 0
diff --git a/tools/regression/bin/sh/errors/bad-parm-exp1.0 b/tools/regression/bin/sh/errors/bad-parm-exp1.0
new file mode 100644 (file)
index 0000000..cab51eb
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/bad-parm-exp1.0,v 1.1 2006/11/05 18:41:23 stefanf Exp $
+false && {
+       ${}
+       ${foo/}
+       ${foo@bar}
+}
+:
diff --git a/tools/regression/bin/sh/errors/bad-parm-exp2.2 b/tools/regression/bin/sh/errors/bad-parm-exp2.2
new file mode 100644 (file)
index 0000000..3df05dd
--- /dev/null
@@ -0,0 +1,2 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/bad-parm-exp2.2,v 1.1 2006/11/05 18:41:23 stefanf Exp $
+${}
diff --git a/tools/regression/bin/sh/errors/bad-parm-exp2.2.stderr b/tools/regression/bin/sh/errors/bad-parm-exp2.2.stderr
new file mode 100644 (file)
index 0000000..d027a5a
--- /dev/null
@@ -0,0 +1 @@
+./errors/bad-parm-exp2.2: ${}: Bad substitution
diff --git a/tools/regression/bin/sh/errors/bad-parm-exp3.2 b/tools/regression/bin/sh/errors/bad-parm-exp3.2
new file mode 100644 (file)
index 0000000..ccf45a0
--- /dev/null
@@ -0,0 +1,2 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/bad-parm-exp3.2,v 1.1 2006/11/05 18:41:23 stefanf Exp $
+${foo/}
diff --git a/tools/regression/bin/sh/errors/bad-parm-exp3.2.stderr b/tools/regression/bin/sh/errors/bad-parm-exp3.2.stderr
new file mode 100644 (file)
index 0000000..ef40251
--- /dev/null
@@ -0,0 +1 @@
+./errors/bad-parm-exp3.2: ${foo/}: Bad substitution
diff --git a/tools/regression/bin/sh/errors/bad-parm-exp4.2 b/tools/regression/bin/sh/errors/bad-parm-exp4.2
new file mode 100644 (file)
index 0000000..7050181
--- /dev/null
@@ -0,0 +1,2 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/bad-parm-exp4.2,v 1.1 2006/11/05 18:41:23 stefanf Exp $
+${foo:@abc}
diff --git a/tools/regression/bin/sh/errors/bad-parm-exp4.2.stderr b/tools/regression/bin/sh/errors/bad-parm-exp4.2.stderr
new file mode 100644 (file)
index 0000000..89bd80f
--- /dev/null
@@ -0,0 +1 @@
+./errors/bad-parm-exp4.2: ${foo:@...}: Bad substitution
diff --git a/tools/regression/bin/sh/errors/bad-parm-exp5.2 b/tools/regression/bin/sh/errors/bad-parm-exp5.2
new file mode 100644 (file)
index 0000000..1243c89
--- /dev/null
@@ -0,0 +1,2 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/bad-parm-exp5.2,v 1.1 2006/11/05 18:41:23 stefanf Exp $
+${/}
diff --git a/tools/regression/bin/sh/errors/bad-parm-exp5.2.stderr b/tools/regression/bin/sh/errors/bad-parm-exp5.2.stderr
new file mode 100644 (file)
index 0000000..89b1997
--- /dev/null
@@ -0,0 +1 @@
+./errors/bad-parm-exp5.2: ${/}: Bad substitution
diff --git a/tools/regression/bin/sh/errors/option-error.0 b/tools/regression/bin/sh/errors/option-error.0
new file mode 100644 (file)
index 0000000..57a9d7b
--- /dev/null
@@ -0,0 +1,46 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/option-error.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+IFS=,
+
+SPECIAL="break abc,\
+       continue abc,\
+       .,
+       exit abc,
+       export -x,
+       readonly -x,
+       return abc,
+       set -z,
+       shift abc,
+       trap -y,
+       unset -y"
+
+UTILS="alias -y,\
+       cat -z,\
+       cd abc def,\
+       command break abc,\
+       expr 1 +,\
+       fc -z,\
+       getopts,\
+       hash -z,\
+       jobs -z,\
+       printf,\
+       pwd abc,\
+       read,\
+       test abc =,\
+       ulimit -z,\
+       umask -z,\
+       unalias -z,\
+       wait abc"
+
+# Special built-in utilities must abort on an option or operand error.
+set -- ${SPECIAL}
+for cmd in "$@"
+do
+       ${SH} -c "${cmd}; exit 0" 2>/dev/null && exit 1
+done
+
+# Other utilities must not abort.
+set -- ${UTILS}
+for cmd in "$@"
+do
+       ${SH} -c "${cmd}; exit 0" 2>/dev/null || exit 1
+done
diff --git a/tools/regression/bin/sh/errors/redirection-error.0 b/tools/regression/bin/sh/errors/redirection-error.0
new file mode 100644 (file)
index 0000000..028e384
--- /dev/null
@@ -0,0 +1,53 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/redirection-error.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+IFS=,
+
+SPECIAL="break,\
+       :,\
+       continue,\
+       . /dev/null,
+       eval,
+       exec,
+       export -p,
+       readonly -p,
+       set,
+       shift,
+       times,
+       trap,
+       unset foo"
+
+UTILS="alias,\
+       bg,\
+       bind,\
+       cd,\
+       command echo,\
+       echo,\
+       false,\
+       fc -l,\
+       fg,\
+       getopts a -a,\
+       hash,\
+       jobs,\
+       printf a,\
+       pwd,\
+       read var < /dev/null,\
+       test,\
+       true,\
+       type ls,\
+       ulimit,\
+       umask,\
+       unalias -a,\
+       wait"
+
+# Special built-in utilities must abort on a redirection error.
+set -- ${SPECIAL}
+for cmd in "$@"
+do
+       ${SH} -c "${cmd} > /; exit 0" 2>/dev/null && exit 1
+done
+
+# Other utilities must not abort.
+set -- ${UTILS}
+for cmd in "$@"
+do
+       ${SH} -c "${cmd} > /; exit 0" 2>/dev/null || exit 1
+done
diff --git a/tools/regression/bin/sh/errors/redirection-error2.2 b/tools/regression/bin/sh/errors/redirection-error2.2
new file mode 100644 (file)
index 0000000..0e428cc
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/redirection-error2.2,v 1.2 2010/10/12 18:20:38 obrien Exp $
+
+# sh should fail gracefully on this bad redirect
+${SH} -c 'echo 1 >&$a' 2>/dev/null
diff --git a/tools/regression/bin/sh/errors/redirection-error3.0 b/tools/regression/bin/sh/errors/redirection-error3.0
new file mode 100644 (file)
index 0000000..931b5bb
--- /dev/null
@@ -0,0 +1,54 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/redirection-error3.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+IFS=,
+
+SPECIAL="break,\
+       :,\
+       continue,\
+       . /dev/null,\
+       eval,\
+       exec,\
+       export -p,\
+       readonly -p,\
+       set,\
+       shift,\
+       times,\
+       trap,\
+       unset foo"
+
+UTILS="alias,\
+       bg,\
+       bind,\
+       cd,\
+       command echo,\
+       echo,\
+       false,\
+       fc -l,\
+       fg,\
+       getopts a -a,\
+       hash,\
+       jobs,\
+       printf a,\
+       pwd,\
+       read var < /dev/null,\
+       test,\
+       true,\
+       type ls,\
+       ulimit,\
+       umask,\
+       unalias -a,\
+       wait"
+
+# When used with 'command', neither special built-in utilities nor other
+# utilities must abort on a redirection error.
+
+set -- ${SPECIAL}
+for cmd in "$@"
+do
+       ${SH} -c "command ${cmd} > /; exit 0" 2>/dev/null || exit 1
+done
+
+set -- ${UTILS}
+for cmd in "$@"
+do
+       ${SH} -c "command ${cmd} > /; exit 0" 2>/dev/null || exit 1
+done
diff --git a/tools/regression/bin/sh/errors/redirection-error4.0 b/tools/regression/bin/sh/errors/redirection-error4.0
new file mode 100644 (file)
index 0000000..2c55605
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/redirection-error4.0,v 1.1 2010/03/13 22:53:17 jilles Exp $
+# A redirection error should not abort the shell if there is no command word.
+exec 2>/dev/null
+</var/empty/x
+</var/empty/x y=2
+y=2 </var/empty/x
+exit 0
diff --git a/tools/regression/bin/sh/errors/redirection-error5.0 b/tools/regression/bin/sh/errors/redirection-error5.0
new file mode 100644 (file)
index 0000000..b81f0da
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/redirection-error5.0,v 1.1 2010/03/14 13:51:12 jilles Exp $
+# A redirection error on a subshell should not abort the shell.
+exec 2>/dev/null
+( echo bad ) </var/empty/x
+exit 0
diff --git a/tools/regression/bin/sh/errors/redirection-error6.0 b/tools/regression/bin/sh/errors/redirection-error6.0
new file mode 100644 (file)
index 0000000..c6a9893
--- /dev/null
@@ -0,0 +1,12 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/redirection-error6.0,v 1.1 2010/03/14 14:24:35 jilles Exp $
+# A redirection error on a compound command should not abort the shell.
+exec 2>/dev/null
+{ echo bad; } </var/empty/x
+if :; then echo bad; fi </var/empty/x
+for i in 1; do echo bad; done </var/empty/x
+i=0
+while [ $i = 0 ]; do echo bad; i=1; done </var/empty/x
+i=0
+until [ $i != 0 ]; do echo bad; i=1; done </var/empty/x
+case i in *) echo bad ;; esac </var/empty/x
+exit 0
diff --git a/tools/regression/bin/sh/errors/redirection-error7.0 b/tools/regression/bin/sh/errors/redirection-error7.0
new file mode 100644 (file)
index 0000000..b5b9322
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/errors/redirection-error7.0,v 1.1 2010/12/31 18:20:17 jilles Exp $
+
+! dummy=$(
+       exec 3>&1 >&2 2>&3
+       ulimit -n 9
+       exec 9<.
+) && [ -n "$dummy" ]
diff --git a/tools/regression/bin/sh/execution/fork1.0 b/tools/regression/bin/sh/execution/fork1.0
new file mode 100644 (file)
index 0000000..d98d6a8
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/fork1.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+
+result=$(${SH} -c 'ps -p $$ -o comm=')
+test "$result" = "ps" || exit 1
+
+result=$(${SH} -c 'ps -p $$ -o comm=; :')
+test "$result" = "sh" || exit 1
diff --git a/tools/regression/bin/sh/execution/fork2.0 b/tools/regression/bin/sh/execution/fork2.0
new file mode 100644 (file)
index 0000000..4611d25
--- /dev/null
@@ -0,0 +1,9 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/fork2.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+
+result=$(${SH} -c '(/bin/sleep 1)& sleep 0.1; ps -p $! -o comm=; kill $!')
+test "$result" = sleep || exit 1
+
+result=$(${SH} -c '{ trap "echo trapped" EXIT; (/usr/bin/true); } & wait')
+test "$result" = trapped || exit 1
+
+exit 0
diff --git a/tools/regression/bin/sh/execution/func1.0 b/tools/regression/bin/sh/execution/func1.0
new file mode 100644 (file)
index 0000000..d53847b
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/func1.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+
+MALLOC_OPTIONS=J ${SH} -c 'g() { g() { :; }; :; }; g' &&
+MALLOC_OPTIONS=J ${SH} -c 'g() { unset -f g; :; }; g'
diff --git a/tools/regression/bin/sh/execution/func2.0 b/tools/regression/bin/sh/execution/func2.0
new file mode 100644 (file)
index 0000000..5607568
--- /dev/null
@@ -0,0 +1,12 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/func2.0,v 1.2 2010/08/16 17:18:08 jilles Exp $
+# The empty pairs of braces here are to test that this does not cause a crash.
+
+f() { }
+f
+hash -v f >/dev/null
+f() { { }; }
+f
+hash -v f >/dev/null
+f() { { } }
+f
+hash -v f >/dev/null
diff --git a/tools/regression/bin/sh/execution/func3.0 b/tools/regression/bin/sh/execution/func3.0
new file mode 100644 (file)
index 0000000..4b9cb0d
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/func3.0,v 1.2 2010/12/12 21:18:16 jilles Exp $
+
+# This may fail when parsing or when defining the function, or the definition
+# may silently do nothing. In no event may the function be executed.
+
+${SH} -c 'unset() { echo overriding function executed, bad; }; v=1; unset v; exit "${v-0}"' 2>/dev/null
+:
diff --git a/tools/regression/bin/sh/execution/hash1.0 b/tools/regression/bin/sh/execution/hash1.0
new file mode 100644 (file)
index 0000000..9b7e6bf
--- /dev/null
@@ -0,0 +1,12 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/hash1.0,v 1.1 2011/02/05 14:01:46 jilles Exp $
+
+T=`mktemp -d "${TMPDIR:-/tmp}/sh-test.XXXXXXXX"` || exit
+trap 'rm -rf "${T}"' 0
+PATH=$T:$PATH
+ls -ld . >/dev/null
+cat <<EOF >"$T/ls"
+:
+EOF
+chmod 755 "$T/ls"
+PATH=$PATH
+ls -ld .
diff --git a/tools/regression/bin/sh/execution/killed1.0 b/tools/regression/bin/sh/execution/killed1.0
new file mode 100644 (file)
index 0000000..78c6ccf
--- /dev/null
@@ -0,0 +1,8 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/killed1.0,v 1.1 2011/01/18 21:18:31 jilles Exp $
+# Sometimes the "Killed" message is not flushed soon enough and it
+# is redirected along with the output of a builtin.
+# Do not change the semicolon to a newline as it would hide the bug.
+
+exec 3>&1
+exec >/dev/null 2>&1
+${SH} -c 'kill -9 $$'; : >&3 2>&3
diff --git a/tools/regression/bin/sh/execution/killed2.0 b/tools/regression/bin/sh/execution/killed2.0
new file mode 100644 (file)
index 0000000..7d6b9c7
--- /dev/null
@@ -0,0 +1,10 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/killed2.0,v 1.1 2011/01/30 22:57:52 jilles Exp $
+# Most shells print a message when a foreground job is killed by a signal.
+# POSIX allows this, provided the message is sent to stderr, not stdout.
+# Some trickery is needed to capture the message as redirecting stderr of
+# the command itself does not affect it. The colon command ensures that
+# the subshell forks for ${SH}.
+
+exec 3>&1
+r=`(${SH} -c 'kill $$'; :) 2>&1 >&3`
+[ -n "$r" ]
diff --git a/tools/regression/bin/sh/execution/path1.0 b/tools/regression/bin/sh/execution/path1.0
new file mode 100644 (file)
index 0000000..6e666c6
--- /dev/null
@@ -0,0 +1,15 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/path1.0,v 1.1 2011/01/09 21:07:30 jilles Exp $
+# Some builtins should not be overridable via PATH.
+
+set -e
+T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX)
+trap 'rm -rf ${T}' 0
+echo '#!/bin/sh
+echo bad' >"$T/cd"
+chmod 755 "$T/cd"
+cd /bin
+oPATH=$PATH
+PATH=$T:$PATH:%builtin
+cd /
+PATH=$oPATH
+[ "$(pwd)" = / ]
diff --git a/tools/regression/bin/sh/execution/redir1.0 b/tools/regression/bin/sh/execution/redir1.0
new file mode 100644 (file)
index 0000000..63a4c3b
--- /dev/null
@@ -0,0 +1,27 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/redir1.0,v 1.2 2010/08/16 22:23:19 jilles Exp $
+trap ': $((brokenpipe+=1))' PIPE
+
+P=${TMPDIR:-/tmp}
+cd $P
+T=$(mktemp -d sh-test.XXXXXX)
+cd $T
+
+brokenpipe=0
+mkfifo fifo1 fifo2
+read dummy >fifo2 <fifo1 &
+{
+       exec 4>fifo2
+} 3<fifo2 # Formerly, sh would keep fd 3 and a duplicate of it open.
+echo dummy >fifo1
+if [ $brokenpipe -ne 0 ]; then
+       rc=3
+fi
+wait
+echo dummy >&4 2>/dev/null
+if [ $brokenpipe -eq 1 ]; then
+       : ${rc:=0}
+fi
+
+rm fifo1 fifo2
+rmdir ${P}/${T}
+exit ${rc:-3}
diff --git a/tools/regression/bin/sh/execution/redir2.0 b/tools/regression/bin/sh/execution/redir2.0
new file mode 100644 (file)
index 0000000..ba2f6a8
--- /dev/null
@@ -0,0 +1,29 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/redir2.0,v 1.3 2010/10/12 18:20:38 obrien Exp $
+trap ': $((brokenpipe+=1))' PIPE
+
+P=${TMPDIR:-/tmp}
+cd $P
+T=$(mktemp -d sh-test.XXXXXX)
+cd $T
+
+brokenpipe=0
+mkfifo fifo1 fifo2
+{
+       {
+               exec ${SH} -c 'exec <fifo1; read dummy'
+       } 7<&- # fifo2 should be kept open, but not passed to programs
+       true
+} 7<fifo2 &
+
+exec 4>fifo2
+exec 3>fifo1
+echo dummy >&4 2>/dev/null
+if [ $brokenpipe -eq 1 ]; then
+       : ${rc:=0}
+fi
+echo dummy >&3
+wait
+
+rm fifo1 fifo2
+rmdir ${P}/${T}
+exit ${rc:-3}
diff --git a/tools/regression/bin/sh/execution/redir3.0 b/tools/regression/bin/sh/execution/redir3.0
new file mode 100644 (file)
index 0000000..31e8ab6
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/redir3.0,v 1.1 2010/10/24 19:56:34 jilles Exp $
+
+3>&- 3>&-
diff --git a/tools/regression/bin/sh/execution/redir4.0 b/tools/regression/bin/sh/execution/redir4.0
new file mode 100644 (file)
index 0000000..7cde409
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/redir4.0,v 1.1 2010/10/24 20:09:49 jilles Exp $
+
+{ echo bad 0>&3; } 2>/dev/null 3>/dev/null 3>&-
+exit 0
diff --git a/tools/regression/bin/sh/execution/redir5.0 b/tools/regression/bin/sh/execution/redir5.0
new file mode 100644 (file)
index 0000000..2de097d
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/redir5.0,v 1.1 2011/02/05 15:02:19 jilles Exp $
+
+{ (echo bad) >/dev/null; } </dev/null
diff --git a/tools/regression/bin/sh/execution/shellproc1.0 b/tools/regression/bin/sh/execution/shellproc1.0
new file mode 100644 (file)
index 0000000..0cc8898
--- /dev/null
@@ -0,0 +1,11 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/shellproc1.0,v 1.1 2011/02/02 22:03:18 jilles Exp $
+
+T=`mktemp -d "${TMPDIR:-/tmp}/sh-test.XXXXXXXX"` || exit
+trap 'rm -rf "${T}"' 0
+cat <<EOF >"$T/testshellproc"
+printf 'this '
+echo is a test
+EOF
+chmod 755 "$T/testshellproc"
+PATH=$T:$PATH
+[ "`testshellproc`" = "this is a test" ]
diff --git a/tools/regression/bin/sh/execution/unknown1.0 b/tools/regression/bin/sh/execution/unknown1.0
new file mode 100644 (file)
index 0000000..540db75
--- /dev/null
@@ -0,0 +1,29 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/unknown1.0,v 1.1 2009/10/06 22:00:14 jilles Exp $
+
+nosuchtool 2>/dev/null
+[ $? -ne 127 ] && exit 1
+/var/empty/nosuchtool 2>/dev/null
+[ $? -ne 127 ] && exit 1
+(nosuchtool) 2>/dev/null
+[ $? -ne 127 ] && exit 1
+(/var/empty/nosuchtool) 2>/dev/null
+[ $? -ne 127 ] && exit 1
+/ 2>/dev/null
+[ $? -ne 126 ] && exit 1
+PATH=/usr bin 2>/dev/null
+[ $? -ne 126 ] && exit 1
+
+dummy=$(nosuchtool 2>/dev/null)
+[ $? -ne 127 ] && exit 1
+dummy=$(/var/empty/nosuchtool 2>/dev/null)
+[ $? -ne 127 ] && exit 1
+dummy=$( (nosuchtool) 2>/dev/null)
+[ $? -ne 127 ] && exit 1
+dummy=$( (/var/empty/nosuchtool) 2>/dev/null)
+[ $? -ne 127 ] && exit 1
+dummy=$(/ 2>/dev/null)
+[ $? -ne 126 ] && exit 1
+dummy=$(PATH=/usr bin 2>/dev/null)
+[ $? -ne 126 ] && exit 1
+
+exit 0
diff --git a/tools/regression/bin/sh/execution/var-assign1.0 b/tools/regression/bin/sh/execution/var-assign1.0
new file mode 100644 (file)
index 0000000..f29f8e5
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/execution/var-assign1.0,v 1.1 2010/09/11 14:15:50 jilles Exp $
+
+[ "$(HOME=/etc HOME=/ cd && pwd)" = / ]
diff --git a/tools/regression/bin/sh/expansion/arith1.0 b/tools/regression/bin/sh/expansion/arith1.0
new file mode 100644 (file)
index 0000000..5428393
--- /dev/null
@@ -0,0 +1,30 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/arith1.0,v 1.1 2009/12/30 15:59:40 jilles Exp $
+
+failures=0
+
+check() {
+       if [ $(($1)) != $2 ]; then
+               failures=$((failures+1))
+               echo "For $1, expected $2 actual $(($1))"
+       fi
+}
+
+check "0&&0" 0
+check "1&&0" 0
+check "0&&1" 0
+check "1&&1" 1
+check "2&&2" 1
+check "1&&2" 1
+check "1<<40&&1<<40" 1
+check "1<<40&&4" 1
+
+check "0||0" 0
+check "1||0" 1
+check "0||1" 1
+check "1||1" 1
+check "2||2" 1
+check "1||2" 1
+check "1<<40||1<<40" 1
+check "1<<40||4" 1
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/expansion/arith10.0 b/tools/regression/bin/sh/expansion/arith10.0
new file mode 100644 (file)
index 0000000..3450870
--- /dev/null
@@ -0,0 +1,35 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/arith10.0,v 1.1 2011/02/08 23:23:55 jilles Exp $
+
+failures=0
+
+check() {
+       if [ $(($1)) != $2 ]; then
+               failures=$((failures+1))
+               echo "For $1, expected $2 actual $(($1))"
+       fi
+}
+
+readonly ro=4
+rw=1
+check "0 && 0 / 0" 0
+check "1 || 0 / 0" 1
+check "0 && (ro = 2)" 0
+check "ro" 4
+check "1 || (ro = -1)" 1
+check "ro" 4
+check "0 && (rw += 1)" 0
+check "rw" 1
+check "1 || (rw += 1)" 1
+check "rw" 1
+check "0 ? 44 / 0 : 51" 51
+check "0 ? ro = 3 : 52" 52
+check "ro" 4
+check "0 ? rw += 1 : 52" 52
+check "rw" 1
+check "1 ? 68 : 30 / 0" 68
+check "2 ? 1 : (ro += 2)" 1
+check "ro" 4
+check "4 ? 1 : (rw += 1)" 1
+check "rw" 1
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/expansion/arith2.0 b/tools/regression/bin/sh/expansion/arith2.0
new file mode 100644 (file)
index 0000000..36d378c
--- /dev/null
@@ -0,0 +1,77 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/arith2.0,v 1.3 2010/07/02 21:31:24 jilles Exp $
+
+failures=0
+
+check() {
+       if [ $(($1)) != $2 ]; then
+               failures=$((failures+1))
+               echo "For $1, expected $2 actual $(($1))"
+       fi
+}
+
+# variables
+unset v
+check "v=2" 2
+check "v" 2
+check "$(($v))" 2
+check "v+=1" 3
+check "v" 3
+
+# constants
+check "4611686018427387904" 4611686018427387904
+check "0x4000000000000000" 4611686018427387904
+check "0400000000000000000000" 4611686018427387904
+check "0x4Ab0000000000000" 5381801554707742720
+check "010" 8
+
+# try out all operators
+v=42
+check "!v" 0
+check "!!v" 1
+check "!0" 1
+check "~0" -1
+check "~(-1)" 0
+check "-0" 0
+check "-v" -42
+check "v*v" 1764
+check "v/2" 21
+check "v%10" 2
+check "v+v" 84
+check "v-4" 38
+check "v<<1" 84
+check "v>>1" 21
+check "v<43" 1
+check "v>42" 0
+check "v<=43" 1
+check "v>=43" 0
+check "v==41" 0
+check "v!=42" 0
+check "v&3" 2
+check "v^3" 41
+check "v|3" 43
+check "v>=40&&v<=44" 1
+check "v<40||v>44" 0
+check "(v=42)&&(v+=1)==43" 1
+check "v" 43
+check "(v=42)&&(v-=1)==41" 1
+check "v" 41
+check "(v=42)&&(v*=2)==84" 1
+check "v" 84
+check "(v=42)&&(v/=10)==4" 1
+check "v" 4
+check "(v=42)&&(v%=10)==2" 1
+check "v" 2
+check "(v=42)&&(v<<=1)==84" 1
+check "v" 84
+check "(v=42)&&(v>>=2)==10" 1
+check "v" 10
+check "(v=42)&&(v&=32)==32" 1
+check "v" 32
+check "(v=42)&&(v^=32)==10" 1
+check "v" 10
+check "(v=42)&&(v|=32)==42" 1
+check "v" 42
+
+# missing: ternary
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/expansion/arith3.0 b/tools/regression/bin/sh/expansion/arith3.0
new file mode 100644 (file)
index 0000000..dabf7d4
--- /dev/null
@@ -0,0 +1,14 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/arith3.0,v 1.1 2010/02/17 22:25:22 jilles Exp $
+
+failures=0
+
+check() {
+       if [ $(($1)) != $2 ]; then
+               failures=$((failures+1))
+               echo "For $1, expected $2 actual $(($1))"
+       fi
+}
+
+check "1 << 1 + 1 | 1" 5
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/expansion/arith4.0 b/tools/regression/bin/sh/expansion/arith4.0
new file mode 100644 (file)
index 0000000..e3dbe86
--- /dev/null
@@ -0,0 +1,20 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/arith4.0,v 1.1 2010/04/04 16:29:48 jilles Exp $
+
+failures=0
+
+check() {
+       if [ $(($1)) != $2 ]; then
+               failures=$((failures+1))
+               echo "For $1, expected $2 actual $(($1))"
+       fi
+}
+
+check '20 / 2 / 2' 5
+check '20 - 2 - 2' 16
+unset a b c d
+check "a = b = c = d = 1" 1
+check "a == 1 && b == 1 && c == 1 && d == 1" 1
+check "a += b += c += d" 4
+check "a == 4 && b == 3 && c == 2 && d == 1" 1
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/expansion/arith5.0 b/tools/regression/bin/sh/expansion/arith5.0
new file mode 100644 (file)
index 0000000..e9b78a1
--- /dev/null
@@ -0,0 +1,17 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/arith5.0,v 1.1 2010/04/04 16:48:33 jilles Exp $
+
+failures=0
+
+check() {
+       if [ "$2" != "$3" ]; then
+               failures=$((failures+1))
+               echo "For $1, expected $3 actual $2"
+       fi
+}
+
+unset a
+check '$((1+${a:-$((7+2))}))' "$((1+${a:-$((7+2))}))" 10
+check '$((1+${a:=$((2+2))}))' "$((1+${a:=$((2+2))}))" 5
+check '$a' "$a" 4
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/expansion/arith6.0 b/tools/regression/bin/sh/expansion/arith6.0
new file mode 100644 (file)
index 0000000..0ebcff1
--- /dev/null
@@ -0,0 +1,16 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/arith6.0,v 1.1 2010/11/19 22:25:32 jilles Exp $
+
+v1=1\ +\ 1
+v2=D
+v3=C123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+f() { v4="$*"; }
+
+while [ ${#v2} -lt 1250 ]; do
+       eval $v2=$((3+${#v2})) $v3=$((4-${#v2}))
+       eval f $(($v2+ $v1 +$v3))
+       if [ $v4 -ne 9 ]; then
+               echo bad: $v4 -ne 9 at ${#v2}
+       fi
+       v2=x$v2
+       v3=y$v3
+done
diff --git a/tools/regression/bin/sh/expansion/arith7.0 b/tools/regression/bin/sh/expansion/arith7.0
new file mode 100644 (file)
index 0000000..e3513ab
--- /dev/null
@@ -0,0 +1,12 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/arith7.0,v 1.1 2010/12/12 16:56:16 jilles Exp $
+
+v=1+
+v=$v$v$v$v
+v=$v$v$v$v
+v=$v$v$v$v
+v=$v$v$v$v
+v=$v$v$v$v
+[ "$(cat <<EOF
+$(($v 1))
+EOF
+)" = 1025 ]
diff --git a/tools/regression/bin/sh/expansion/arith8.0 b/tools/regression/bin/sh/expansion/arith8.0
new file mode 100644 (file)
index 0000000..c1c34ba
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/arith8.0,v 1.1 2010/12/18 23:03:51 jilles Exp $
+
+v=$( (eval ': $((08))') 2>&1 >/dev/null)
+[ $? -ne 0 ] && [ -n "$v" ]
diff --git a/tools/regression/bin/sh/expansion/arith9.0 b/tools/regression/bin/sh/expansion/arith9.0
new file mode 100644 (file)
index 0000000..b92cbff
--- /dev/null
@@ -0,0 +1,20 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/arith9.0,v 1.1 2011/02/08 23:23:55 jilles Exp $
+
+failures=0
+
+check() {
+       if [ $(($1)) != $2 ]; then
+               failures=$((failures+1))
+               echo "For $1, expected $2 actual $(($1))"
+       fi
+}
+
+check "0 ? 44 : 51" 51
+check "1 ? 68 : 30" 68
+check "2 ? 1 : -5" 1
+check "0 ? 4 : 0 ? 5 : 6" 6
+check "0 ? 4 : 1 ? 5 : 6" 5
+check "1 ? 4 : 0 ? 5 : 6" 4
+check "1 ? 4 : 1 ? 5 : 6" 4
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/expansion/assign1.0 b/tools/regression/bin/sh/expansion/assign1.0
new file mode 100644 (file)
index 0000000..f713cf8
--- /dev/null
@@ -0,0 +1,37 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/assign1.0,v 1.1 2010/03/07 18:43:29 jilles Exp $
+
+e= q='?' a='*' t=texttext s='ast*que?non' p='/et[c]/' w='a b c' b='{{(#)}}'
+h='##'
+failures=''
+ok=''
+
+testcase() {
+       code="$1"
+       expected="$2"
+       oIFS="$IFS"
+       eval "$code"
+       IFS='|'
+       result="$#|$*"
+       IFS="$oIFS"
+       if [ "x$result" = "x$expected" ]; then
+               ok=x$ok
+       else
+               failures=x$failures
+               echo "For $code, expected $expected actual $result"
+       fi
+}
+
+testcase 'v=; set -- ${v=a b} $v'              '0|'
+testcase 'unset v; set -- ${v=a b} $v'         '4|a|b|a|b'
+testcase 'v=; set -- ${v:=a b} $v'             '4|a|b|a|b'
+testcase 'v=; set -- "${v:=a b}" "$v"'         '2|a b|a b'
+# expect sensible behaviour, although it disagrees with POSIX
+testcase 'v=; set -- ${v:=a\ b} $v'            '4|a|b|a|b'
+testcase 'v=; set -- ${v:=$p} $v'              '2|/etc/|/etc/'
+testcase 'v=; set -- "${v:=$p}" "$v"'          '2|/et[c]/|/et[c]/'
+testcase 'v=; set -- "${v:=a\ b}" "$v"'                '2|a\ b|a\ b'
+testcase 'v=; set -- ${v:="$p"} $v'            '2|/etc/|/etc/'
+# whether $p is quoted or not shouldn't really matter
+testcase 'v=; set -- "${v:="$p"}" "$v"'                '2|/et[c]/|/et[c]/'
+
+test "x$failures" = x
diff --git a/tools/regression/bin/sh/expansion/cmdsubst1.0 b/tools/regression/bin/sh/expansion/cmdsubst1.0
new file mode 100644 (file)
index 0000000..65b1e21
--- /dev/null
@@ -0,0 +1,48 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/cmdsubst1.0,v 1.1 2010/01/01 18:17:46 jilles Exp $
+
+failures=0
+
+check() {
+       if ! eval "[ $* ]"; then
+               echo "Failed: $*"
+               : $((failures += 1))
+       fi
+}
+
+check '"$(echo abcde)" = "abcde"'
+check '"$(echo abcde; :)" = "abcde"'
+
+check '"$(printf abcde)" = "abcde"'
+check '"$(printf abcde; :)" = "abcde"'
+
+# regular
+check '-n "$(umask)"'
+check '-n "$(umask; :)"'
+check '-n "$(umask 2>&1)"'
+check '-n "$(umask 2>&1; :)"'
+
+# special
+check '-n "$(times)"'
+check '-n "$(times; :)"'
+check '-n "$(times 2>&1)"'
+check '-n "$(times 2>&1; :)"'
+
+# regular
+check '".$(umask -@ 2>&1)." = ".umask: Illegal option -@."'
+check '".$(umask -@ 2>&1; :)." = ".umask: Illegal option -@."'
+check '".$({ umask -@; } 2>&1)." = ".umask: Illegal option -@."'
+
+# special
+check '".$(shift xyz 2>&1)." = ".shift: Illegal number: xyz."'
+check '".$(shift xyz 2>&1; :)." = ".shift: Illegal number: xyz."'
+check '".$({ shift xyz; } 2>&1)." = ".shift: Illegal number: xyz."'
+
+v=1
+check '-z "$(v=2 :)"'
+check '"$v" = 1'
+check '-z "$(v=3)"'
+check '"$v" = 1'
+check '"$(v=4 eval echo \$v)" = 4'
+check '"$v" = 1'
+
+exit $((failures > 0))
diff --git a/tools/regression/bin/sh/expansion/cmdsubst10.0 b/tools/regression/bin/sh/expansion/cmdsubst10.0
new file mode 100644 (file)
index 0000000..5d222ea
--- /dev/null
@@ -0,0 +1,51 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/cmdsubst10.0,v 1.1 2010/12/30 22:33:55 jilles Exp $
+
+a1=$(alias)
+: $(alias testalias=abcd)
+a2=$(alias)
+[ "$a1" = "$a2" ] || echo Error at line $LINENO
+
+alias testalias2=abcd
+a1=$(alias)
+: $(unalias testalias2)
+a2=$(alias)
+[ "$a1" = "$a2" ] || echo Error at line $LINENO
+
+[ "$(command -V pwd)" = "$(command -V pwd; exit $?)" ] || echo Error at line $LINENO
+
+v=1
+: $(export v=2)
+[ "$v" = 1 ] || echo Error at line $LINENO
+
+rotest=1
+: $(readonly rotest=2)
+[ "$rotest" = 1 ] || echo Error at line $LINENO
+
+set +u
+: $(set -u)
+case $- in
+*u*) echo Error at line $LINENO ;;
+esac
+set +u
+
+set +u
+: $(set -o nounset)
+case $- in
+*u*) echo Error at line $LINENO ;;
+esac
+set +u
+
+set +u
+: $(command set -u)
+case $- in
+*u*) echo Error at line $LINENO ;;
+esac
+set +u
+
+umask 77
+u1=$(umask)
+: $(umask 022)
+u2=$(umask)
+[ "$u1" = "$u2" ] || echo Error at line $LINENO
+
+dummy=$(exit 3); [ $? -eq 3 ] || echo Error at line $LINENO
diff --git a/tools/regression/bin/sh/expansion/cmdsubst2.0 b/tools/regression/bin/sh/expansion/cmdsubst2.0
new file mode 100644 (file)
index 0000000..b624a8b
--- /dev/null
@@ -0,0 +1,43 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/cmdsubst2.0,v 1.1 2010/03/12 23:23:46 jilles Exp $
+
+failures=0
+
+check() {
+       if ! eval "[ $* ]"; then
+               echo "Failed: $*"
+               : $((failures += 1))
+       fi
+}
+
+check '`echo /et[c]/` = "/etc/"'
+check '`printf /var/empty%s /et[c]/` = "/var/empty/etc/"'
+check '"`echo /et[c]/`" = "/etc/"'
+check '`echo "/et[c]/"` = "/etc/"'
+check '`printf /var/empty%s "/et[c]/"` = "/var/empty/et[c]/"'
+check '`printf /var/empty/%s \"/et[c]/\"` = "/var/empty/\"/et[c]/\""'
+check '"`echo \"/et[c]/\"`" = "/et[c]/"'
+check '"`echo "/et[c]/"`" = "/et[c]/"'
+check '`echo $$` = $$'
+check '"`echo $$`" = $$'
+check '`echo \$\$` = $$'
+check '"`echo \$\$`" = $$'
+
+# Command substitutions consisting of a single builtin may be treated
+# differently.
+check '`:; echo /et[c]/` = "/etc/"'
+check '`:; printf /var/empty%s /et[c]/` = "/var/empty/etc/"'
+check '"`:; echo /et[c]/`" = "/etc/"'
+check '`:; echo "/et[c]/"` = "/etc/"'
+check '`:; printf /var/empty%s "/et[c]/"` = "/var/empty/et[c]/"'
+check '`:; printf /var/empty/%s \"/et[c]/\"` = "/var/empty/\"/et[c]/\""'
+check '"`:; echo \"/et[c]/\"`" = "/et[c]/"'
+check '"`:; echo "/et[c]/"`" = "/et[c]/"'
+check '`:; echo $$` = $$'
+check '"`:; echo $$`" = $$'
+check '`:; echo \$\$` = $$'
+check '"`:; echo \$\$`" = $$'
+
+check '`set -f; echo /et[c]/` = "/etc/"'
+check '"`set -f; echo /et[c]/`" = "/et[c]/"'
+
+exit $((failures > 0))
diff --git a/tools/regression/bin/sh/expansion/cmdsubst3.0 b/tools/regression/bin/sh/expansion/cmdsubst3.0
new file mode 100644 (file)
index 0000000..f897fcb
--- /dev/null
@@ -0,0 +1,20 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/cmdsubst3.0,v 1.1 2010/12/16 23:28:20 jilles Exp $
+
+e=
+for i in 0 1 2 3; do
+       for j in 0 1 2 3 4 5 6 7; do
+               for k in 0 1 2 3 4 5 6 7; do
+                       case $i$j$k in
+                       000) continue ;;
+                       esac
+                       e="$e\n\\$i$j$k"
+               done
+       done
+done
+e1=$(printf "$e")
+e2="$(printf "$e")"
+[ "${#e1}" = 510 ] || echo length bad
+[ "$e1" = "$e2" ] || echo e1 != e2
+[ "$e1" = "$(printf "$e")" ] || echo quoted bad
+IFS=
+[ "$e1" = $(printf "$e") ] || echo unquoted bad
diff --git a/tools/regression/bin/sh/expansion/cmdsubst4.0 b/tools/regression/bin/sh/expansion/cmdsubst4.0
new file mode 100644 (file)
index 0000000..a1fa7f2
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/cmdsubst4.0,v 1.1 2010/12/27 23:56:03 jilles Exp $
+
+exec 2>/dev/null
+! y=$(: </var/empty/nonexistent)
diff --git a/tools/regression/bin/sh/expansion/cmdsubst5.0 b/tools/regression/bin/sh/expansion/cmdsubst5.0
new file mode 100644 (file)
index 0000000..9a41750
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/cmdsubst5.0,v 1.1 2010/12/28 13:28:24 jilles Exp $
+
+unset v
+exec 2>/dev/null
+! y=$(: ${v?})
diff --git a/tools/regression/bin/sh/expansion/cmdsubst6.0 b/tools/regression/bin/sh/expansion/cmdsubst6.0
new file mode 100644 (file)
index 0000000..a6afa20
--- /dev/null
@@ -0,0 +1,53 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/cmdsubst6.0,v 1.1 2010/12/28 14:58:08 jilles Exp $
+# This tests if the cmdsubst optimization is still used if possible.
+
+failures=''
+ok=''
+
+testcase() {
+       code="$1"
+
+       unset v
+       eval "pid=\$(dummy=$code echo \$(\$SH -c echo\ \\\$PPID))"
+
+       if [ "$pid" = "$$" ]; then
+               ok=x$ok
+       else
+               failures=x$failures
+               echo "Failure for $code"
+       fi
+}
+
+unset v
+w=1
+testcase '$w'
+testcase '1${w+1}'
+testcase '1${w-1}'
+testcase '1${v+1}'
+testcase '1${v-1}'
+testcase '1${w:+1}'
+testcase '1${w:-1}'
+testcase '1${v:+1}'
+testcase '1${v:-1}'
+testcase '${w?}'
+testcase '${w:?}'
+testcase '${w#x}'
+testcase '${w##x}'
+testcase '${w%x}'
+testcase '${w%%x}'
+
+testcase '$((w))'
+testcase '$(((w+4)*2/3))'
+testcase '$((w==1))'
+testcase '$((w>=0 && w<=5 && w!=2))'
+testcase '$((${#w}))'
+testcase '$((${#IFS}))'
+testcase '$((${#w}>=1))'
+testcase '$(($$))'
+testcase '$(($#))'
+testcase '$(($?))'
+
+testcase '$(: $((w=4)))'
+testcase '$(: ${v=2})'
+
+test "x$failures" = x
diff --git a/tools/regression/bin/sh/expansion/cmdsubst7.0 b/tools/regression/bin/sh/expansion/cmdsubst7.0
new file mode 100644 (file)
index 0000000..f892200
--- /dev/null
@@ -0,0 +1,31 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/cmdsubst7.0,v 1.1 2010/12/28 21:27:08 jilles Exp $
+
+failures=''
+ok=''
+
+testcase() {
+       code="$1"
+
+       unset v
+       eval ": \$($code)"
+
+       if [ "${v:+bad}" = "" ]; then
+               ok=x$ok
+       else
+               failures=x$failures
+               echo "Failure for $code"
+       fi
+}
+
+testcase ': ${v=0}'
+testcase ': ${v:=0}'
+testcase ': $((v=1))'
+testcase ': $((v+=1))'
+w='v=1'
+testcase ': $(($w))'
+testcase ': $((${$+v=1}))'
+testcase ': $((v${$+=1}))'
+testcase ': $((v $(echo =) 1))'
+testcase ': $(($(echo $w)))'
+
+test "x$failures" = x
diff --git a/tools/regression/bin/sh/expansion/cmdsubst8.0 b/tools/regression/bin/sh/expansion/cmdsubst8.0
new file mode 100644 (file)
index 0000000..e59e0c5
--- /dev/null
@@ -0,0 +1,17 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/cmdsubst8.0,v 1.1 2010/12/30 15:04:59 jilles Exp $
+# Not required by POSIX (although referenced in a non-normative section),
+# but possibly useful.
+
+: hi there &
+p=$!
+q=$(jobs -l $p)
+
+# Change tabs to spaces.
+set -f
+set -- $q
+r="$*"
+
+case $r in
+*" $p "*) ;;
+*) echo Pid missing; exit 3 ;;
+esac
diff --git a/tools/regression/bin/sh/expansion/cmdsubst9.0 b/tools/regression/bin/sh/expansion/cmdsubst9.0
new file mode 100644 (file)
index 0000000..101b97c
--- /dev/null
@@ -0,0 +1,11 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/cmdsubst9.0,v 1.1 2010/12/30 15:04:59 jilles Exp $
+
+set -e
+
+cd /
+dummy=$(cd /bin)
+[ "$(pwd)" = / ]
+
+v=1
+dummy=$(eval v=2)
+[ "$v" = 1 ]
diff --git a/tools/regression/bin/sh/expansion/ifs1.0 b/tools/regression/bin/sh/expansion/ifs1.0
new file mode 100644 (file)
index 0000000..e329a1c
--- /dev/null
@@ -0,0 +1,35 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/ifs1.0,v 1.1 2009/06/25 17:36:08 jilles Exp $
+
+c=: e= s=' '
+failures=''
+ok=''
+
+check_result() {
+       if [ "x$2" = "x$3" ]; then
+               ok=x$ok
+       else
+               failures=x$failures
+               echo "For $1, expected $3 actual $2"
+       fi
+}
+
+IFS='  
+'
+set -- a ''
+set -- "$@"
+check_result 'set -- "$@"' "($#)($1)($2)" "(2)(a)()"
+
+set -- a ''
+set -- "$@"$e
+check_result 'set -- "$@"$e' "($#)($1)($2)" "(2)(a)()"
+
+set -- a ''
+set -- "$@"$s
+check_result 'set -- "$@"$s' "($#)($1)($2)" "(2)(a)()"
+
+IFS="$c"
+set -- a ''
+set -- "$@"$c
+check_result 'set -- "$@"$c' "($#)($1)($2)" "(2)(a)()"
+
+test "x$failures" = x
diff --git a/tools/regression/bin/sh/expansion/ifs2.0 b/tools/regression/bin/sh/expansion/ifs2.0
new file mode 100644 (file)
index 0000000..188c369
--- /dev/null
@@ -0,0 +1,24 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/ifs2.0,v 1.1 2010/08/15 17:14:05 jilles Exp $
+
+failures=0
+i=1
+set -f
+while [ "$i" -le 127 ]; do
+       # A different byte still in the range 1..127.
+       i2=$((i^2+(i==2)))
+       # Add a character to work around command substitution's removal of
+       # final newlines, then remove it again.
+       c=$(printf \\"$(printf %o@ "$i")")
+       c=${c%@}
+       c2=$(printf \\"$(printf %o@ "$i2")")
+       c2=${c2%@}
+       IFS=$c
+       set -- $c2$c$c2$c$c2
+       if [ "$#" -ne 3 ] || [ "$1" != "$c2" ] || [ "$2" != "$c2" ] ||
+           [ "$3" != "$c2" ]; then
+               echo "Bad results for separator $i (word $i2)" >&2
+               : $((failures += 1))
+       fi
+       i=$((i+1))
+done
+exit $((failures > 0))
diff --git a/tools/regression/bin/sh/expansion/ifs3.0 b/tools/regression/bin/sh/expansion/ifs3.0
new file mode 100644 (file)
index 0000000..9bd9d5b
--- /dev/null
@@ -0,0 +1,21 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/ifs3.0,v 1.1 2010/08/22 13:09:12 jilles Exp $
+
+failures=0
+unset LC_ALL
+export LC_CTYPE=en_US.ISO8859-1
+i=128
+set -f
+while [ "$i" -le 255 ]; do
+       i2=$((i^2))
+       c=$(printf \\"$(printf %o "$i")")
+       c2=$(printf \\"$(printf %o "$i2")")
+       IFS=$c
+       set -- $c2$c$c2$c$c2
+       if [ "$#" -ne 3 ] || [ "$1" != "$c2" ] || [ "$2" != "$c2" ] ||
+           [ "$3" != "$c2" ]; then
+               echo "Bad results for separator $i (word $i2)" >&2
+               : $((failures += 1))
+       fi
+       i=$((i+1))
+done
+exit $((failures > 0))
diff --git a/tools/regression/bin/sh/expansion/pathname1.0 b/tools/regression/bin/sh/expansion/pathname1.0
new file mode 100644 (file)
index 0000000..4938ef0
--- /dev/null
@@ -0,0 +1,61 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/pathname1.0,v 1.1 2010/05/11 22:28:55 jilles Exp $
+
+failures=0
+
+check() {
+       testcase=$1
+       expect=$2
+       eval "set -- $testcase"
+       actual="$*"
+       if [ "$actual" != "$expect" ]; then
+               failures=$((failures+1))
+               printf '%s\n' "For $testcase, expected $expect actual $actual"
+       fi
+}
+
+set -e
+T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX)
+trap 'rm -rf $T' 0
+cd -P $T
+
+mkdir testdir testdir2 'testdir/*' 'testdir/?' testdir/a testdir/b testdir2/b
+mkdir testdir2/.c
+touch testf 'testdir/*/1' 'testdir/?/1' testdir/a/1 testdir/b/1 testdir2/b/.a
+
+check '' ''
+check 'testdir/b' 'testdir/b'
+check 'testdir/c' 'testdir/c'
+check '\*' '*'
+check '\?' '?'
+check '*' 'testdir testdir2 testf'
+check '*""' 'testdir testdir2 testf'
+check '""*' 'testdir testdir2 testf'
+check '*/' 'testdir/ testdir2/'
+check 'testdir*/a' 'testdir/a'
+check 'testdir*/b' 'testdir/b testdir2/b'
+check '*/.c' 'testdir2/.c'
+check 'testdir2/*' 'testdir2/b'
+check 'testdir2/b/*' 'testdir2/b/*'
+check 'testdir/*' 'testdir/* testdir/? testdir/a testdir/b'
+check 'testdir/*/1' 'testdir/*/1 testdir/?/1 testdir/a/1 testdir/b/1'
+check '"testdir/"*/1' 'testdir/*/1 testdir/?/1 testdir/a/1 testdir/b/1'
+check 'testdir/\*/*' 'testdir/*/1'
+check 'testdir/\?/*' 'testdir/?/1'
+check 'testdir/"?"/*' 'testdir/?/1'
+check '"testdir"/"?"/*' 'testdir/?/1'
+check '"testdir"/"?"*/*' 'testdir/?/1'
+check '"testdir"/*"?"/*' 'testdir/?/1'
+check '"testdir/?"*/*' 'testdir/?/1'
+check 'testdir/\*/' 'testdir/*/'
+check 'testdir/\?/' 'testdir/?/'
+check 'testdir/"?"/' 'testdir/?/'
+check '"testdir"/"?"/' 'testdir/?/'
+check '"testdir"/"?"*/' 'testdir/?/'
+check '"testdir"/*"?"/' 'testdir/?/'
+check '"testdir/?"*/' 'testdir/?/'
+check 'testdir/[*]/' 'testdir/*/'
+check 'testdir/[?]/' 'testdir/?/'
+check 'testdir/[*?]/' 'testdir/*/ testdir/?/'
+check '[tz]estdir/[*]/' 'testdir/*/'
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/expansion/pathname2.0 b/tools/regression/bin/sh/expansion/pathname2.0
new file mode 100644 (file)
index 0000000..ab60f6b
--- /dev/null
@@ -0,0 +1,31 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/pathname2.0,v 1.1 2010/05/11 23:19:28 jilles Exp $
+
+failures=0
+
+check() {
+       testcase=$1
+       expect=$2
+       eval "set -- $testcase"
+       actual="$*"
+       if [ "$actual" != "$expect" ]; then
+               failures=$((failures+1))
+               printf '%s\n' "For $testcase, expected $expect actual $actual"
+       fi
+}
+
+set -e
+T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX)
+trap 'rm -rf $T' 0
+cd -P $T
+
+mkdir testdir testdir2 'testdir/*' 'testdir/?' testdir/a testdir/b testdir2/b
+mkdir testdir2/.c
+touch testf 'testdir/*/1' 'testdir/?/1' testdir/a/1 testdir/b/1 testdir2/b/.a
+
+check '*\/' 'testdir/ testdir2/'
+check '"testdir/"*"/1"' 'testdir/*/1 testdir/?/1 testdir/a/1 testdir/b/1'
+check '"testdir/"*"/"*' 'testdir/*/1 testdir/?/1 testdir/a/1 testdir/b/1'
+check '"testdir/"*\/*' 'testdir/*/1 testdir/?/1 testdir/a/1 testdir/b/1'
+check '"testdir"*"/"*"/"*' 'testdir/*/1 testdir/?/1 testdir/a/1 testdir/b/1'
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/expansion/pathname3.0 b/tools/regression/bin/sh/expansion/pathname3.0
new file mode 100644 (file)
index 0000000..dc77365
--- /dev/null
@@ -0,0 +1,29 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/pathname3.0,v 1.1 2010/08/10 22:45:59 jilles Exp $
+
+v=12345678
+v=$v$v$v$v
+v=$v$v$v$v
+v=$v$v$v$v
+v=$v$v$v$v
+v=$v$v$v$v
+# 8192 bytes
+v=${v##???}
+[ /*/$v = "/*/$v" ] || exit 1
+
+s=////
+s=$s$s$s$s
+s=$s$s$s$s
+s=$s$s$s$s
+s=$s$s$s$s
+# 1024 bytes
+s=${s##??????????}
+[ /var/empt[y]/$s/$v = "/var/empt[y]/$s/$v" ] || exit 2
+while [ ${#s} -lt 1034 ]; do
+       set -- /.${s}et[c]
+       [ ${#s} -gt 1018 ] || [ "$1" = /.${s}etc ] || exit 3
+       set -- /.${s}et[c]/
+       [ ${#s} -gt 1017 ] || [ "$1" = /.${s}etc/ ] || exit 4
+       set -- /.${s}et[c]/.
+       [ ${#s} -gt 1016 ] || [ "$1" = /.${s}etc/. ] || exit 5
+       s=$s/
+done
diff --git a/tools/regression/bin/sh/expansion/pathname4.0 b/tools/regression/bin/sh/expansion/pathname4.0
new file mode 100644 (file)
index 0000000..8f90e46
--- /dev/null
@@ -0,0 +1,28 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/pathname4.0,v 1.1 2010/08/22 21:18:21 jilles Exp $
+
+failures=0
+
+check() {
+       testcase=$1
+       expect=$2
+       eval "set -- $testcase"
+       actual="$*"
+       if [ "$actual" != "$expect" ]; then
+               failures=$((failures+1))
+               printf '%s\n' "For $testcase, expected $expect actual $actual"
+       fi
+}
+
+set -e
+T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX)
+trap 'rm -rf $T' 0
+cd -P $T
+
+mkdir !!a
+touch !!a/fff
+
+chmod u-r .
+check '!!a/ff*' '!!a/fff'
+chmod u+r .
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/expansion/plus-minus1.0 b/tools/regression/bin/sh/expansion/plus-minus1.0
new file mode 100644 (file)
index 0000000..0ccbc43
--- /dev/null
@@ -0,0 +1,76 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/plus-minus1.0,v 1.3 2010/12/27 15:57:41 emaste Exp $
+
+e= q='?' a='*' t=texttext s='ast*que?non' p='/et[c]/' w='a b c' b='{{(#)}}'
+h='##'
+failures=''
+ok=''
+
+testcase() {
+       code="$1"
+       expected="$2"
+       oIFS="$IFS"
+       eval "$code"
+       IFS='|'
+       result="$#|$*"
+       IFS="$oIFS"
+       if [ "x$result" = "x$expected" ]; then
+               ok=x$ok
+       else
+               failures=x$failures
+               echo "For $code, expected $expected actual $result"
+       fi
+}
+
+testcase 'set -- a b'                          '2|a|b'
+testcase 'set --'                              '0|'
+testcase 'set -- ${e}'                         '0|'
+testcase 'set -- "${e}"'                       '1|'
+
+testcase 'set -- $p'                           '1|/etc/'
+testcase 'set -- "$p"'                         '1|/et[c]/'
+testcase 'set -- ${s+$p}'                      '1|/etc/'
+testcase 'set -- "${s+$p}"'                    '1|/et[c]/'
+testcase 'set -- ${s+"$p"}'                    '1|/et[c]/'
+# Dquotes in dquotes is undefined for Bourne shell operators
+#testcase 'set -- "${s+"$p"}"'                 '1|/et[c]/'
+testcase 'set -- ${e:-$p}'                     '1|/etc/'
+testcase 'set -- "${e:-$p}"'                   '1|/et[c]/'
+testcase 'set -- ${e:-"$p"}'                   '1|/et[c]/'
+# Dquotes in dquotes is undefined for Bourne shell operators
+#testcase 'set -- "${e:-"$p"}"'                        '1|/et[c]/'
+testcase 'set -- ${e:+"$e"}'                   '0|'
+testcase 'set -- ${e:+$w"$e"}'                 '0|'
+testcase 'set -- ${w:+"$w"}'                   '1|a b c'
+testcase 'set -- ${w:+$w"$w"}'                 '3|a|b|ca b c'
+
+testcase 'set -- "${s+a b}"'                   '1|a b'
+testcase 'set -- "${e:-a b}"'                  '1|a b'
+testcase 'set -- ${e:-\}}'                     '1|}'
+testcase 'set -- ${e:+{}}'                     '1|}'
+testcase 'set -- "${e:+{}}"'                   '1|}'
+
+testcase 'set -- ${e+x}${e+x}'                 '1|xx'
+testcase 'set -- "${e+x}"${e+x}'               '1|xx'
+testcase 'set -- ${e+x}"${e+x}"'               '1|xx'
+testcase 'set -- "${e+x}${e+x}"'               '1|xx'
+testcase 'set -- "${e+x}""${e+x}"'             '1|xx'
+
+testcase 'set -- ${e:-${e:-$p}}'               '1|/etc/'
+testcase 'set -- "${e:-${e:-$p}}"'             '1|/et[c]/'
+testcase 'set -- ${e:-"${e:-$p}"}'             '1|/et[c]/'
+testcase 'set -- ${e:-${e:-"$p"}}'             '1|/et[c]/'
+testcase 'set -- ${e:-${e:-${e:-$w}}}'         '3|a|b|c'
+testcase 'set -- ${e:-${e:-${e:-"$w"}}}'       '1|a b c'
+testcase 'set -- ${e:-${e:-"${e:-$w}"}}'       '1|a b c'
+testcase 'set -- ${e:-"${e:-${e:-$w}}"}'       '1|a b c'
+testcase 'set -- "${e:-${e:-${e:-$w}}}"'       '1|a b c'
+
+testcase 'shift $#; set -- ${1+"$@"}'          '0|'
+testcase 'set -- ""; set -- ${1+"$@"}'         '1|'
+testcase 'set -- "" a; set -- ${1+"$@"}'       '2||a'
+testcase 'set -- a ""; set -- ${1+"$@"}'       '2|a|'
+testcase 'set -- a b; set -- ${1+"$@"}'                '2|a|b'
+testcase 'set -- a\ b; set -- ${1+"$@"}'       '1|a b'
+testcase 'set -- " " ""; set -- ${1+"$@"}'     '2| |'
+
+test "x$failures" = x
diff --git a/tools/regression/bin/sh/expansion/plus-minus2.0 b/tools/regression/bin/sh/expansion/plus-minus2.0
new file mode 100644 (file)
index 0000000..5166181
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/plus-minus2.0,v 1.1 2010/04/03 20:55:56 jilles Exp $
+
+e=
+test "${e:-\}}" = '}'
diff --git a/tools/regression/bin/sh/expansion/plus-minus3.0 b/tools/regression/bin/sh/expansion/plus-minus3.0
new file mode 100644 (file)
index 0000000..78e9a2a
--- /dev/null
@@ -0,0 +1,44 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/plus-minus3.0,v 1.1 2010/04/18 22:13:45 jilles Exp $
+
+e= q='?' a='*' t=texttext s='ast*que?non' p='/et[c]/' w='a b c' b='{{(#)}}'
+h='##'
+failures=''
+ok=''
+
+testcase() {
+       code="$1"
+       expected="$2"
+       oIFS="$IFS"
+       eval "$code"
+       IFS='|'
+       result="$#|$*"
+       IFS="$oIFS"
+       if [ "x$result" = "x$expected" ]; then
+               ok=x$ok
+       else
+               failures=x$failures
+               echo "For $code, expected $expected actual $result"
+       fi
+}
+
+# We follow original ash behaviour for quoted ${var+-=?} expansions:
+# a double-quote in one switches back to unquoted state.
+# This allows expanding a variable as a single word if it is set
+# and substituting multiple words otherwise.
+# It is also close to the Bourne and Korn shells.
+# POSIX leaves this undefined, and various other shells treat
+# such double-quotes as introducing a second level of quoting
+# which does not do much except quoting close braces.
+
+testcase 'set -- "${p+"/et[c]/"}"'             '1|/etc/'
+testcase 'set -- "${p-"/et[c]/"}"'             '1|/et[c]/'
+testcase 'set -- "${p+"$p"}"'                  '1|/etc/'
+testcase 'set -- "${p-"$p"}"'                  '1|/et[c]/'
+testcase 'set -- "${p+"""/et[c]/"}"'           '1|/etc/'
+testcase 'set -- "${p-"""/et[c]/"}"'           '1|/et[c]/'
+testcase 'set -- "${p+"""$p"}"'                        '1|/etc/'
+testcase 'set -- "${p-"""$p"}"'                        '1|/et[c]/'
+testcase 'set -- "${p+"\@"}"'                  '1|@'
+testcase 'set -- "${p+"'\''/et[c]/'\''"}"'     '1|/et[c]/'
+
+test "x$failures" = x
diff --git a/tools/regression/bin/sh/expansion/plus-minus4.0 b/tools/regression/bin/sh/expansion/plus-minus4.0
new file mode 100644 (file)
index 0000000..dd51741
--- /dev/null
@@ -0,0 +1,38 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/plus-minus4.0,v 1.1 2010/08/08 17:03:23 jilles Exp $
+
+# These may be a bit unclear in the POSIX spec or the proposed revisions,
+# and conflict with bash's interpretation, but I think ksh93's interpretation
+# makes most sense. In particular, it makes no sense to me that single-quotes
+# must match but are not removed.
+
+e= q='?' a='*' t=texttext s='ast*que?non' p='/et[c]/' w='a b c' b='{{(#)}}'
+h='##'
+failures=''
+ok=''
+
+testcase() {
+       code="$1"
+       expected="$2"
+       oIFS="$IFS"
+       eval "$code"
+       IFS='|'
+       result="$#|$*"
+       IFS="$oIFS"
+       if [ "x$result" = "x$expected" ]; then
+               ok=x$ok
+       else
+               failures=x$failures
+               echo "For $code, expected $expected actual $result"
+       fi
+}
+
+testcase 'set -- ${e:-'"'"'}'"'"'}'            '1|}'
+testcase "set -- \${e:-\\'}"                   "1|'"
+testcase "set -- \${e:-\\'\\'}"                        "1|''"
+testcase "set -- \"\${e:-'}\""                 "1|'"
+testcase "set -- \"\${e:-'}'}\""               "1|''}"
+testcase "set -- \"\${e:-''}\""                        "1|''"
+testcase 'set -- ${e:-\a}'                     '1|a'
+testcase 'set -- "${e:-\a}"'                   '1|\a'
+
+test "x$failures" = x
diff --git a/tools/regression/bin/sh/expansion/plus-minus5.0 b/tools/regression/bin/sh/expansion/plus-minus5.0
new file mode 100644 (file)
index 0000000..48bce15
--- /dev/null
@@ -0,0 +1,31 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/plus-minus5.0,v 1.1 2010/10/28 22:34:49 jilles Exp $
+
+e= q='?' a='*' t=texttext s='ast*que?non' p='/et[c]/' w='a b c' b='{{(#)}}'
+h='##'
+failures=''
+ok=''
+
+testcase() {
+       code="$1"
+       expected="$2"
+       oIFS="$IFS"
+       eval "$code"
+       IFS='|'
+       result="$#|$*"
+       IFS="$oIFS"
+       if [ "x$result" = "x$expected" ]; then
+               ok=x$ok
+       else
+               failures=x$failures
+               echo "For $code, expected $expected actual $result"
+       fi
+}
+
+testcase 'set -- ${e:-"{x}"}'                  '1|{x}'
+testcase 'set -- "${e:-"{x}"}"'                        '1|{x}'
+testcase 'set -- ${h+"{x}"}'                   '1|{x}'
+testcase 'set -- "${h+"{x}"}"'                 '1|{x}'
+testcase 'set -- ${h:-"{x}"}'                  '1|##'
+testcase 'set -- "${h:-"{x}"}"'                        '1|##'
+
+test "x$failures" = x
diff --git a/tools/regression/bin/sh/expansion/plus-minus6.0 b/tools/regression/bin/sh/expansion/plus-minus6.0
new file mode 100644 (file)
index 0000000..371f57b
--- /dev/null
@@ -0,0 +1,34 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/plus-minus6.0,v 1.1 2010/10/29 13:42:18 jilles Exp $
+
+failures=0
+unset LC_ALL
+export LC_CTYPE=en_US.ISO8859-1
+nl='
+'
+i=1
+set -f
+while [ "$i" -le 255 ]; do
+       # A different byte still in the range 1..255.
+       i2=$((i^2+(i==2)))
+       # Add a character to work around command substitution's removal of
+       # final newlines, then remove it again.
+       c=$(printf \\"$(printf %o@ "$i")")
+       c=${c%@}
+       c2=$(printf \\"$(printf %o@ "$i2")")
+       c2=${c2%@}
+       case $c in
+               [\'$nl'$}();&|\"`']) c=M
+       esac
+       case $c2 in
+               [\'$nl'$}();&|\"`']) c2=N
+       esac
+       IFS=$c
+       command eval "set -- \${\$+$c2$c$c2$c$c2}"
+       if [ "$#" -ne 3 ] || [ "$1" != "$c2" ] || [ "$2" != "$c2" ] ||
+           [ "$3" != "$c2" ]; then
+               echo "Bad results for separator $i (word $i2)" >&2
+               : $((failures += 1))
+       fi
+       i=$((i+1))
+done
+exit $((failures > 0))
diff --git a/tools/regression/bin/sh/expansion/plus-minus7.0 b/tools/regression/bin/sh/expansion/plus-minus7.0
new file mode 100644 (file)
index 0000000..66389f4
--- /dev/null
@@ -0,0 +1,26 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/plus-minus7.0,v 1.1 2010/12/27 15:57:41 emaste Exp $
+
+e= s='foo'
+failures=''
+ok=''
+
+testcase() {
+       code="$1"
+       expected="$2"
+       oIFS="$IFS"
+       eval "$code"
+       IFS='|'
+       result="$#|$*"
+       IFS="$oIFS"
+       if [ "x$result" = "x$expected" ]; then
+               ok=x$ok
+       else
+               failures=x$failures
+               echo "For $code, expected $expected actual $result"
+       fi
+}
+
+testcase 'set -- ${s+a b}'                     '2|a|b'
+testcase 'set -- ${e:-a b}'                    '2|a|b'
+
+test "x$failures" = x
diff --git a/tools/regression/bin/sh/expansion/question1.0 b/tools/regression/bin/sh/expansion/question1.0
new file mode 100644 (file)
index 0000000..38ffd5c
--- /dev/null
@@ -0,0 +1,22 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/question1.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+
+x=a\ b
+[ "$x" = "${x?}" ] || exit 1
+set -- ${x?}
+{ [ "$#" = 2 ] && [ "$1" = a ] && [ "$2" = b ]; } || exit 1
+unset x
+(echo ${x?abcdefg}) 2>&1 | grep -q abcdefg || exit 1
+${SH} -c 'unset foo; echo ${foo?}' 2>/dev/null && exit 1
+${SH} -c 'foo=; echo ${foo:?}' 2>/dev/null && exit 1
+${SH} -c 'foo=; echo ${foo?}' >/dev/null || exit 1
+${SH} -c 'foo=1; echo ${foo:?}' >/dev/null || exit 1
+${SH} -c 'echo ${!?}' 2>/dev/null && exit 1
+${SH} -c ':& echo ${!?}' >/dev/null || exit 1
+${SH} -c 'echo ${#?}' >/dev/null || exit 1
+${SH} -c 'echo ${*?}' 2>/dev/null && exit 1
+${SH} -c 'echo ${*?}' ${SH} x >/dev/null || exit 1
+${SH} -c 'echo ${1?}' 2>/dev/null && exit 1
+${SH} -c 'echo ${1?}' ${SH} x >/dev/null || exit 1
+${SH} -c 'echo ${2?}' ${SH} x 2>/dev/null && exit 1
+${SH} -c 'echo ${2?}' ${SH} x y >/dev/null || exit 1
+exit 0
diff --git a/tools/regression/bin/sh/expansion/set-u1.0 b/tools/regression/bin/sh/expansion/set-u1.0
new file mode 100644 (file)
index 0000000..4b2c882
--- /dev/null
@@ -0,0 +1,29 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/set-u1.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+
+${SH} -uc 'unset foo; echo $foo' 2>/dev/null && exit 1
+${SH} -uc 'foo=; echo $foo' >/dev/null || exit 1
+${SH} -uc 'foo=1; echo $foo' >/dev/null || exit 1
+# -/+/= are unaffected by set -u
+${SH} -uc 'unset foo; echo ${foo-}' >/dev/null || exit 1
+${SH} -uc 'unset foo; echo ${foo+}' >/dev/null || exit 1
+${SH} -uc 'unset foo; echo ${foo=}' >/dev/null || exit 1
+# length/trimming are affected
+${SH} -uc 'unset foo; echo ${#foo}' 2>/dev/null && exit 1
+${SH} -uc 'foo=; echo ${#foo}' >/dev/null || exit 1
+${SH} -uc 'unset foo; echo ${foo#?}' 2>/dev/null && exit 1
+${SH} -uc 'foo=1; echo ${foo#?}' >/dev/null || exit 1
+${SH} -uc 'unset foo; echo ${foo##?}' 2>/dev/null && exit 1
+${SH} -uc 'foo=1; echo ${foo##?}' >/dev/null || exit 1
+${SH} -uc 'unset foo; echo ${foo%?}' 2>/dev/null && exit 1
+${SH} -uc 'foo=1; echo ${foo%?}' >/dev/null || exit 1
+${SH} -uc 'unset foo; echo ${foo%%?}' 2>/dev/null && exit 1
+${SH} -uc 'foo=1; echo ${foo%%?}' >/dev/null || exit 1
+
+${SH} -uc 'echo $!' 2>/dev/null && exit 1
+${SH} -uc ':& echo $!' >/dev/null || exit 1
+${SH} -uc 'echo $#' >/dev/null || exit 1
+${SH} -uc 'echo $1' 2>/dev/null && exit 1
+${SH} -uc 'echo $1' ${SH} x >/dev/null || exit 1
+${SH} -uc 'echo $2' ${SH} x 2>/dev/null && exit 1
+${SH} -uc 'echo $2' ${SH} x y >/dev/null || exit 1
+exit 0
diff --git a/tools/regression/bin/sh/expansion/set-u2.0 b/tools/regression/bin/sh/expansion/set-u2.0
new file mode 100644 (file)
index 0000000..9326143
--- /dev/null
@@ -0,0 +1,12 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/set-u2.0,v 1.1 2009/10/24 21:20:04 jilles Exp $
+
+set -u
+: $* $@ "$@" "$*"
+set -- x
+: $* $@ "$@" "$*"
+shift $#
+: $* $@ "$@" "$*"
+set -- y
+set --
+: $* $@ "$@" "$*"
+exit 0
diff --git a/tools/regression/bin/sh/expansion/tilde1.0 b/tools/regression/bin/sh/expansion/tilde1.0
new file mode 100644 (file)
index 0000000..b5e8911
--- /dev/null
@@ -0,0 +1,56 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/tilde1.0,v 1.2 2010/04/03 21:56:24 jilles Exp $
+
+HOME=/tmp
+roothome=~root
+if [ "$roothome" = "~root" ]; then
+       echo "~root is not expanded!"
+       exit 2
+fi
+
+testcase() {
+       code="$1"
+       expected="$2"
+       oIFS="$IFS"
+       eval "$code"
+       IFS='|'
+       result="$#|$*"
+       IFS="$oIFS"
+       if [ "x$result" = "x$expected" ]; then
+               ok=x$ok
+       else
+               failures=x$failures
+               echo "For $code, expected $expected actual $result"
+       fi
+}
+
+testcase 'set -- ~'                            '1|/tmp'
+testcase 'set -- ~/foo'                                '1|/tmp/foo'
+testcase 'set -- x~'                           '1|x~'
+testcase 'set -- ~root'                                "1|$roothome"
+h=~
+testcase 'set -- "$h"'                         '1|/tmp'
+ooIFS=$IFS
+IFS=m
+testcase 'set -- ~'                            '1|/tmp'
+testcase 'set -- ~/foo'                                '1|/tmp/foo'
+testcase 'set -- $h'                           '2|/t|p'
+IFS=$ooIFS
+t=\~
+testcase 'set -- $t'                           '1|~'
+r=$(cat <<EOF
+~
+EOF
+)
+testcase 'set -- $r'                           '1|~'
+r=$(cat <<EOF
+${t+~}
+EOF
+)
+testcase 'set -- $r'                           '1|~'
+r=$(cat <<EOF
+${t+~/.}
+EOF
+)
+testcase 'set -- $r'                           '1|~/.'
+
+test "x$failures" = x
diff --git a/tools/regression/bin/sh/expansion/tilde2.0 b/tools/regression/bin/sh/expansion/tilde2.0
new file mode 100644 (file)
index 0000000..49fd9f7
--- /dev/null
@@ -0,0 +1,90 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/tilde2.0,v 1.1 2010/04/03 22:04:44 jilles Exp $
+
+HOME=/tmp
+roothome=~root
+if [ "$roothome" = "~root" ]; then
+       echo "~root is not expanded!"
+       exit 2
+fi
+
+testcase() {
+       code="$1"
+       expected="$2"
+       oIFS="$IFS"
+       eval "$code"
+       IFS='|'
+       result="$#|$*"
+       IFS="$oIFS"
+       if [ "x$result" = "x$expected" ]; then
+               ok=x$ok
+       else
+               failures=x$failures
+               echo "For $code, expected $expected actual $result"
+       fi
+}
+
+testcase 'set -- ${$+~}'                       '1|/tmp'
+testcase 'set -- ${$+~/}'                      '1|/tmp/'
+testcase 'set -- ${$+~/foo}'                   '1|/tmp/foo'
+testcase 'set -- ${$+x~}'                      '1|x~'
+testcase 'set -- ${$+~root}'                   "1|$roothome"
+testcase 'set -- ${$+"~"}'                     '1|~'
+testcase 'set -- ${$+"~/"}'                    '1|~/'
+testcase 'set -- ${$+"~/foo"}'                 '1|~/foo'
+testcase 'set -- ${$+"x~"}'                    '1|x~'
+testcase 'set -- ${$+"~root"}'                 "1|~root"
+testcase 'set -- "${$+~}"'                     '1|~'
+testcase 'set -- "${$+~/}"'                    '1|~/'
+testcase 'set -- "${$+~/foo}"'                 '1|~/foo'
+testcase 'set -- "${$+x~}"'                    '1|x~'
+testcase 'set -- "${$+~root}"'                 "1|~root"
+testcase 'set -- ${HOME#~}'                    '0|'
+h=~
+testcase 'set -- "$h"'                         '1|/tmp'
+f=~/foo
+testcase 'set -- "$f"'                         '1|/tmp/foo'
+testcase 'set -- ${f#~}'                       '1|/foo'
+testcase 'set -- ${f#~/}'                      '1|foo'
+
+ooIFS=$IFS
+IFS=m
+testcase 'set -- ${$+~}'                       '1|/tmp'
+testcase 'set -- ${$+~/foo}'                   '1|/tmp/foo'
+testcase 'set -- ${$+$h}'                      '2|/t|p'
+testcase 'set -- ${HOME#~}'                    '0|'
+IFS=$ooIFS
+
+t=\~
+testcase 'set -- ${$+$t}'                      '1|~'
+r=$(cat <<EOF
+${HOME#~}
+EOF
+)
+testcase 'set -- $r'                           '0|'
+r=$(cat <<EOF
+${HOME#'~'}
+EOF
+)
+testcase 'set -- $r'                           '1|/tmp'
+r=$(cat <<EOF
+${t#'~'}
+EOF
+)
+testcase 'set -- $r'                           '0|'
+r=$(cat <<EOF
+${roothome#~root}
+EOF
+)
+testcase 'set -- $r'                           '0|'
+r=$(cat <<EOF
+${f#~}
+EOF
+)
+testcase 'set -- $r'                           '1|/foo'
+r=$(cat <<EOF
+${f#~/}
+EOF
+)
+testcase 'set -- $r'                           '1|foo'
+
+test "x$failures" = x
diff --git a/tools/regression/bin/sh/expansion/trim1.0 b/tools/regression/bin/sh/expansion/trim1.0
new file mode 100644 (file)
index 0000000..1af67b0
--- /dev/null
@@ -0,0 +1,85 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/trim1.0,v 1.1 2010/04/03 20:14:10 jilles Exp $
+
+e= q='?' a='*' t=texttext s='ast*que?non' p='/et[c]/' w='a b c' b='{{(#)}}'
+h='##'
+failures=''
+ok=''
+
+testcase() {
+       code="$1"
+       expected="$2"
+       oIFS="$IFS"
+       eval "$code"
+       IFS='|'
+       result="$#|$*"
+       IFS="$oIFS"
+       if [ "x$result" = "x$expected" ]; then
+               ok=x$ok
+       else
+               failures=x$failures
+               echo "For $code, expected $expected actual $result"
+       fi
+}
+
+testcase 'set -- ${t%t}'                       '1|texttex'
+testcase 'set -- "${t%t}"'                     '1|texttex'
+testcase 'set -- ${t%e*}'                      '1|textt'
+testcase 'set -- "${t%e*}"'                    '1|textt'
+testcase 'set -- ${t%%e*}'                     '1|t'
+testcase 'set -- "${t%%e*}"'                   '1|t'
+testcase 'set -- ${t%%*}'                      '0|'
+testcase 'set -- "${t%%*}"'                    '1|'
+testcase 'set -- ${t#t}'                       '1|exttext'
+testcase 'set -- "${t#t}"'                     '1|exttext'
+testcase 'set -- ${t#*x}'                      '1|ttext'
+testcase 'set -- "${t#*x}"'                    '1|ttext'
+testcase 'set -- ${t##*x}'                     '1|t'
+testcase 'set -- "${t##*x}"'                   '1|t'
+testcase 'set -- ${t##*}'                      '0|'
+testcase 'set -- "${t##*}"'                    '1|'
+testcase 'set -- ${t%e$a}'                     '1|textt'
+
+set -f
+testcase 'set -- ${s%[?]*}'                    '1|ast*que'
+testcase 'set -- "${s%[?]*}"'                  '1|ast*que'
+testcase 'set -- ${s%[*]*}'                    '1|ast'
+testcase 'set -- "${s%[*]*}"'                  '1|ast'
+set +f
+
+testcase 'set -- $b'                           '1|{{(#)}}'
+testcase 'set -- ${b%\}}'                      '1|{{(#)}'
+testcase 'set -- ${b#{}'                       '1|{(#)}}'
+testcase 'set -- "${b#{}"'                     '1|{(#)}}'
+# Parentheses are special in ksh, check that they can be escaped
+testcase 'set -- ${b%\)*}'                     '1|{{(#'
+testcase 'set -- ${b#{}'                       '1|{(#)}}'
+testcase 'set -- $h'                           '1|##'
+testcase 'set -- ${h#\#}'                      '1|#'
+testcase 'set -- ${h###}'                      '1|#'
+testcase 'set -- "${h###}"'                    '1|#'
+testcase 'set -- ${h%#}'                       '1|#'
+testcase 'set -- "${h%#}"'                     '1|#'
+
+set -f
+testcase 'set -- ${s%"${s#?}"}'                        '1|a'
+testcase 'set -- ${s%"${s#????}"}'             '1|ast*'
+testcase 'set -- ${s%"${s#????????}"}'         '1|ast*que?'
+testcase 'set -- ${s#"${s%?}"}'                        '1|n'
+testcase 'set -- ${s#"${s%????}"}'             '1|?non'
+testcase 'set -- ${s#"${s%????????}"}'         '1|*que?non'
+set +f
+testcase 'set -- "${s%"${s#?}"}"'              '1|a'
+testcase 'set -- "${s%"${s#????}"}"'           '1|ast*'
+testcase 'set -- "${s%"${s#????????}"}"'       '1|ast*que?'
+testcase 'set -- "${s#"${s%?}"}"'              '1|n'
+testcase 'set -- "${s#"${s%????}"}"'           '1|?non'
+testcase 'set -- "${s#"${s%????????}"}"'       '1|*que?non'
+testcase 'set -- ${p#${p}}'                    '1|/etc/'
+testcase 'set -- "${p#${p}}"'                  '1|/et[c]/'
+testcase 'set -- ${p#*[[]}'                    '1|c]/'
+testcase 'set -- "${p#*[[]}"'                  '1|c]/'
+testcase 'set -- ${p#*\[}'                     '1|c]/'
+testcase 'set -- ${p#*"["}'                    '1|c]/'
+testcase 'set -- "${p#*"["}"'                  '1|c]/'
+
+test "x$failures" = x
diff --git a/tools/regression/bin/sh/expansion/trim2.0 b/tools/regression/bin/sh/expansion/trim2.0
new file mode 100644 (file)
index 0000000..fa07c94
--- /dev/null
@@ -0,0 +1,55 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/trim2.0,v 1.1 2010/04/03 21:07:50 jilles Exp $
+
+e= q='?' a='*' t=texttext s='ast*que?non' p='/et[c]/' w='a b c' b='{{(#)}}'
+h='##'
+failures=''
+ok=''
+
+testcase() {
+       code="$1"
+       expected="$2"
+       oIFS="$IFS"
+       eval "$code"
+       IFS='|'
+       result="$#|$*"
+       IFS="$oIFS"
+       if [ "x$result" = "x$expected" ]; then
+               ok=x$ok
+       else
+               failures=x$failures
+               echo "For $code, expected $expected actual $result"
+       fi
+}
+
+set -f
+testcase 'set -- $s'                           '1|ast*que?non'
+testcase 'set -- ${s%\?*}'                     '1|ast*que'
+testcase 'set -- "${s%\?*}"'                   '1|ast*que'
+testcase 'set -- ${s%\**}'                     '1|ast'
+testcase 'set -- "${s%\**}"'                   '1|ast'
+testcase 'set -- ${s%"$q"*}'                   '1|ast*que'
+testcase 'set -- "${s%"$q"*}"'                 '1|ast*que'
+testcase 'set -- ${s%"$a"*}'                   '1|ast'
+testcase 'set -- "${s%"$a"*}"'                 '1|ast'
+testcase 'set -- ${s%"$q"$a}'                  '1|ast*que'
+testcase 'set -- "${s%"$q"$a}"'                        '1|ast*que'
+testcase 'set -- ${s%"$a"$a}'                  '1|ast'
+testcase 'set -- "${s%"$a"$a}"'                        '1|ast'
+set +f
+
+testcase 'set -- "${b%\}}"'                    '1|{{(#)}'
+# Parentheses are special in ksh, check that they can be escaped
+testcase 'set -- "${b%\)*}"'                   '1|{{(#'
+testcase 'set -- "${h#\#}"'                    '1|#'
+
+testcase 'set -- ${p%"${p#?}"}'                        '1|/'
+testcase 'set -- ${p%"${p#??????}"}'           '1|/etc'
+testcase 'set -- ${p%"${p#???????}"}'          '1|/etc/'
+testcase 'set -- "${p%"${p#?}"}"'              '1|/'
+testcase 'set -- "${p%"${p#??????}"}"'         '1|/et[c]'
+testcase 'set -- "${p%"${p#???????}"}"'                '1|/et[c]/'
+testcase 'set -- ${p#"${p}"}'                  '0|'
+testcase 'set -- "${p#"${p}"}"'                        '1|'
+testcase 'set -- "${p#*\[}"'                   '1|c]/'
+
+test "x$failures" = x
diff --git a/tools/regression/bin/sh/expansion/trim3.0 b/tools/regression/bin/sh/expansion/trim3.0
new file mode 100644 (file)
index 0000000..7e9ed9a
--- /dev/null
@@ -0,0 +1,46 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/trim3.0,v 1.1 2010/04/23 17:26:49 jilles Exp $
+
+e= q='?' a='*' t=texttext s='ast*que?non' p='/et[c]/' w='a b c' b='{{(#)}}'
+h='##' c='\\\\'
+failures=''
+ok=''
+
+testcase() {
+       code="$1"
+       expected="$2"
+       oIFS="$IFS"
+       eval "$code"
+       IFS='|'
+       result="$#|$*"
+       IFS="$oIFS"
+       if [ "x$result" = "x$expected" ]; then
+               ok=x$ok
+       else
+               failures=x$failures
+               echo "For $code, expected $expected actual $result"
+       fi
+}
+
+# This doesn't make much sense, but it fails in dash so I'm adding it here:
+testcase 'set -- "${w%${w#???}}"'              '1|a b'
+
+testcase 'set -- ${p#/et[}'                    '1|c]/'
+testcase 'set -- "${p#/et[}"'                  '1|c]/'
+testcase 'set -- "${p%${p#????}}"'             '1|/et['
+
+testcase 'set -- ${b%'\'}\''}'                 '1|{{(#)}'
+
+testcase 'set -- ${c#\\}'                      '1|\\\'
+testcase 'set -- ${c#\\\\}'                    '1|\\'
+testcase 'set -- ${c#\\\\\\}'                  '1|\'
+testcase 'set -- ${c#\\\\\\\\}'                        '0|'
+testcase 'set -- "${c#\\}"'                    '1|\\\'
+testcase 'set -- "${c#\\\\}"'                  '1|\\'
+testcase 'set -- "${c#\\\\\\}"'                        '1|\'
+testcase 'set -- "${c#\\\\\\\\}"'              '1|'
+testcase 'set -- "${c#"$c"}"'                  '1|'
+testcase 'set -- ${c#"$c"}'                    '0|'
+testcase 'set -- "${c%"$c"}"'                  '1|'
+testcase 'set -- ${c%"$c"}'                    '0|'
+
+test "x$failures" = x
diff --git a/tools/regression/bin/sh/expansion/trim4.0 b/tools/regression/bin/sh/expansion/trim4.0
new file mode 100644 (file)
index 0000000..9eeab6e
--- /dev/null
@@ -0,0 +1,15 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/trim4.0,v 1.1 2010/10/13 23:29:09 obrien Exp $
+
+v1=/homes/SOME_USER
+v2=
+v3=C123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+
+# Trigger bug in VSTRIMRIGHT processing STADJUST() call in expand.c:subevalvar()
+while [ ${#v2} -lt 2000 ]; do
+       v4="${v2} ${v1%/*} $v3"
+       if [ ${#v4} -ne $((${#v2} + ${#v3} + 8)) ]; then
+               echo bad: ${#v4} -ne $((${#v2} + ${#v3} + 8))
+       fi
+       v2=x$v2
+       v3=y$v3
+done
diff --git a/tools/regression/bin/sh/expansion/trim5.0 b/tools/regression/bin/sh/expansion/trim5.0
new file mode 100644 (file)
index 0000000..4f3abc9
--- /dev/null
@@ -0,0 +1,28 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/trim5.0,v 1.1 2010/10/28 21:51:14 jilles Exp $
+
+e= q='?' a='*' t=texttext s='ast*que?non' p='/et[c]/' w='a b c' b='{{(#)}}'
+h='##'
+failures=''
+ok=''
+
+testcase() {
+       code="$1"
+       expected="$2"
+       oIFS="$IFS"
+       eval "$code"
+       IFS='|'
+       result="$#|$*"
+       IFS="$oIFS"
+       if [ "x$result" = "x$expected" ]; then
+               ok=x$ok
+       else
+               failures=x$failures
+               echo "For $code, expected $expected actual $result"
+       fi
+}
+
+testcase 'set -- "${b%'\'}\''}"'               '1|{{(#)}'
+testcase 'set -- ${b%"}"}'                     '1|{{(#)}'
+testcase 'set -- "${b%"}"}"'                   '1|{{(#)}'
+
+test "x$failures" = x
diff --git a/tools/regression/bin/sh/expansion/trim6.0 b/tools/regression/bin/sh/expansion/trim6.0
new file mode 100644 (file)
index 0000000..690473b
--- /dev/null
@@ -0,0 +1,22 @@
+# $FreeBSD: src/tools/regression/bin/sh/expansion/trim6.0,v 1.1 2010/10/29 19:34:57 jilles Exp $
+
+e=
+for i in 0 1 2 3; do
+       for j in 0 1 2 3 4 5 6 7; do
+               for k in 0 1 2 3 4 5 6 7; do
+                       case $i$j$k in
+                       000) continue ;;
+                       esac
+                       e="$e\\$i$j$k"
+               done
+       done
+done
+e=$(printf "$e")
+v=@$e@$e@
+y=${v##*"$e"}
+yq="${v##*"$e"}"
+[ "$y" = @ ] || echo "error when unquoted in non-splitting context"
+[ "$yq" = @ ] || echo "error when quoted in non-splitting context"
+[ "${v##*"$e"}" = @ ] || echo "error when quoted in splitting context"
+IFS=
+[ ${v##*"$e"} = @ ] || echo "error when unquoted in splitting context"
diff --git a/tools/regression/bin/sh/parameters/exitstatus1.0 b/tools/regression/bin/sh/parameters/exitstatus1.0
new file mode 100644 (file)
index 0000000..6236e07
--- /dev/null
@@ -0,0 +1,9 @@
+# $FreeBSD: src/tools/regression/bin/sh/parameters/exitstatus1.0,v 1.1 2008/11/23 20:27:03 stefanf Exp $
+f() {
+       [ $? = $1 ] || exit 1
+}
+
+true
+f 0
+false
+f 1
diff --git a/tools/regression/bin/sh/parameters/mail1.0 b/tools/regression/bin/sh/parameters/mail1.0
new file mode 100644 (file)
index 0000000..7d1ee16
--- /dev/null
@@ -0,0 +1,15 @@
+# $FreeBSD: src/tools/regression/bin/sh/parameters/mail1.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# Test that a non-interactive shell does not access $MAIL.
+
+goodfile=/var/empty/sh-test-goodfile
+mailfile=/var/empty/sh-test-mailfile
+T=$(mktemp sh-test.XXXXXX) || exit
+MAIL=$mailfile ktrace -i -f "$T" ${SH} -c "[ -s $goodfile ]" 2>/dev/null
+if ! grep -q $goodfile "$T"; then
+       # ktrace problem
+       rc=0
+elif ! grep -q $mailfile "$T"; then
+       rc=0
+fi
+rm "$T"
+exit ${rc:-3}
diff --git a/tools/regression/bin/sh/parameters/mail2.0 b/tools/regression/bin/sh/parameters/mail2.0
new file mode 100644 (file)
index 0000000..88c3fa4
--- /dev/null
@@ -0,0 +1,15 @@
+# $FreeBSD: src/tools/regression/bin/sh/parameters/mail2.0,v 1.3 2010/10/12 18:20:38 obrien Exp $
+# Test that an interactive shell accesses $MAIL.
+
+goodfile=/var/empty/sh-test-goodfile
+mailfile=/var/empty/sh-test-mailfile
+T=$(mktemp sh-test.XXXXXX) || exit
+ENV=$goodfile MAIL=$mailfile ktrace -i -f "$T" ${SH} +m -i </dev/null >/dev/null 2>&1
+if ! grep -q $goodfile "$T"; then
+       # ktrace problem
+       rc=0
+elif grep -q $mailfile "$T"; then
+       rc=0
+fi
+rm "$T"
+exit ${rc:-3}
diff --git a/tools/regression/bin/sh/parameters/pwd1.0 b/tools/regression/bin/sh/parameters/pwd1.0
new file mode 100644 (file)
index 0000000..a39fb59
--- /dev/null
@@ -0,0 +1,11 @@
+# $FreeBSD: src/tools/regression/bin/sh/parameters/pwd1.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# Check that bogus PWD values are not accepted from the environment.
+
+cd / || exit 3
+failures=0
+[ "$(PWD=foo ${SH} -c 'pwd')" = / ] || : $((failures += 1))
+[ "$(PWD=/var/empty ${SH} -c 'pwd')" = / ] || : $((failures += 1))
+[ "$(PWD=/var/empty/foo ${SH} -c 'pwd')" = / ] || : $((failures += 1))
+[ "$(PWD=/bin/ls ${SH} -c 'pwd')" = / ] || : $((failures += 1))
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/parameters/pwd2.0 b/tools/regression/bin/sh/parameters/pwd2.0
new file mode 100644 (file)
index 0000000..af1c86b
--- /dev/null
@@ -0,0 +1,24 @@
+# $FreeBSD: src/tools/regression/bin/sh/parameters/pwd2.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# Check that PWD is exported and accepted from the environment.
+set -e
+
+T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX)
+trap 'rm -rf $T' 0
+cd -P $T
+TP=$(pwd)
+mkdir test1
+ln -s test1 link
+cd link
+[ "$PWD" = "$TP/link" ]
+[ "$(pwd)" = "$TP/link" ]
+[ "$(pwd -P)" = "$TP/test1" ]
+[ "$(${SH} -c pwd)" = "$TP/link" ]
+[ "$(${SH} -c pwd\ -P)" = "$TP/test1" ]
+cd ..
+[ "$(pwd)" = "$TP" ]
+cd -P link
+[ "$PWD" = "$TP/test1" ]
+[ "$(pwd)" = "$TP/test1" ]
+[ "$(pwd -P)" = "$TP/test1" ]
+[ "$(${SH} -c pwd)" = "$TP/test1" ]
+[ "$(${SH} -c pwd\ -P)" = "$TP/test1" ]
diff --git a/tools/regression/bin/sh/parser/alias1.0 b/tools/regression/bin/sh/parser/alias1.0
new file mode 100644 (file)
index 0000000..2116a97
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/alias1.0,v 1.1 2010/10/24 16:55:17 jilles Exp $
+
+alias alias0=exit
+eval 'alias0 0'
+exit 1
diff --git a/tools/regression/bin/sh/parser/alias2.0 b/tools/regression/bin/sh/parser/alias2.0
new file mode 100644 (file)
index 0000000..a77a6ff
--- /dev/null
@@ -0,0 +1,6 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/alias2.0,v 1.1 2010/10/24 16:55:17 jilles Exp $
+
+alias alias0=exit
+x=alias0
+eval 'case $x in alias0) exit 0;; esac'
+exit 1
diff --git a/tools/regression/bin/sh/parser/alias3.0 b/tools/regression/bin/sh/parser/alias3.0
new file mode 100644 (file)
index 0000000..6d40ad2
--- /dev/null
@@ -0,0 +1,6 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/alias3.0,v 1.1 2010/11/02 23:44:29 jilles Exp $
+
+alias alias0=exit
+x=alias0
+eval 'case $x in "alias0") alias0 0;; esac'
+exit 1
diff --git a/tools/regression/bin/sh/parser/and-pipe-not.0 b/tools/regression/bin/sh/parser/and-pipe-not.0
new file mode 100644 (file)
index 0000000..a038917
--- /dev/null
@@ -0,0 +1,2 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/and-pipe-not.0,v 1.1 2009/04/13 19:12:28 stefanf Exp $
+true && ! true | false
diff --git a/tools/regression/bin/sh/parser/case1.0 b/tools/regression/bin/sh/parser/case1.0
new file mode 100644 (file)
index 0000000..337eaa1
--- /dev/null
@@ -0,0 +1,14 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/case1.0,v 1.1 2010/05/09 17:10:50 jilles Exp $
+
+keywords='if then else elif fi while until for do done { } case esac ! in'
+
+# Keywords can be used unquoted in case statements, except the keyword
+# esac as the first pattern of a '|' alternation without a starting '('.
+# (POSIX doesn't seem to require (esac) to work.)
+for k in $keywords; do
+       eval "case $k in (foo|$k) ;; *) echo bad ;; esac"
+       eval "case $k in ($k) ;; *) echo bad ;; esac"
+       eval "case $k in foo|$k) ;; *) echo bad ;; esac"
+       [ "$k" = esac ] && continue
+       eval "case $k in $k) ;; *) echo bad ;; esac"
+done
diff --git a/tools/regression/bin/sh/parser/case2.0 b/tools/regression/bin/sh/parser/case2.0
new file mode 100644 (file)
index 0000000..cbf6c41
--- /dev/null
@@ -0,0 +1,32 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/case2.0,v 1.1 2010/05/09 17:10:50 jilles Exp $
+
+# Pretty much only ash derivatives can parse all of this.
+
+f1() {
+       x=$(case x in
+               (x|esac) ;;
+               (*) echo bad >&2 ;;
+       esac)
+}
+f1
+f2() {
+       x=$(case x in
+               (x|esac) ;;
+               (*) echo bad >&2
+       esac)
+}
+f2
+f3() {
+       x=$(case x in
+               x|esac) ;;
+               *) echo bad >&2 ;;
+       esac)
+}
+f3
+f4() {
+       x=$(case x in
+               x|esac) ;;
+               *) echo bad >&2
+       esac)
+}
+f4
diff --git a/tools/regression/bin/sh/parser/for1.0 b/tools/regression/bin/sh/parser/for1.0
new file mode 100644 (file)
index 0000000..470cd00
--- /dev/null
@@ -0,0 +1,29 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/for1.0,v 1.2 2009/12/06 23:31:23 jilles Exp $
+
+nl='
+'
+list=' a b c'
+for s1 in "$nl" " "; do
+       for s2 in "$nl" ";" ";$nl"; do
+               for s3 in "$nl" " "; do
+                       r=''
+                       eval "for i${s1}in ${list}${s2}do${s3}r=\"\$r \$i\"; done"
+                       [ "$r" = "$list" ] || exit 1
+               done
+       done
+done
+set -- $list
+for s2 in "$nl" " " ";" ";$nl"; do # s2=";" and ";$nl" are extensions to POSIX
+       for s3 in "$nl" " "; do
+               r=''
+               eval "for i${s2}do${s3}r=\"\$r \$i\"; done"
+               [ "$r" = "$list" ] || exit 1
+       done
+done
+for s1 in "$nl" " "; do
+       for s2 in "$nl" ";" ";$nl"; do
+               for s3 in "$nl" " "; do
+                       eval "for i${s1}in${s2}do${s3}exit 1; done"
+               done
+       done
+done
diff --git a/tools/regression/bin/sh/parser/func1.0 b/tools/regression/bin/sh/parser/func1.0
new file mode 100644 (file)
index 0000000..a8d1000
--- /dev/null
@@ -0,0 +1,25 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/func1.0,v 1.1 2010/10/24 20:45:13 jilles Exp $
+# POSIX does not require these bytes to work in function names,
+# but making them all work seems a good goal.
+
+failures=0
+unset LC_ALL
+export LC_CTYPE=en_US.ISO8859-1
+i=128
+set -f
+while [ "$i" -le 255 ]; do
+       c=$(printf \\"$(printf %o "$i")")
+       ok=0
+       eval "$c() { ok=1; }"
+       $c
+       ok1=$ok
+       ok=0
+       "$c"
+       if [ "$ok" != 1 ] || [ "$ok1" != 1 ]; then
+               echo "Bad results for character $i" >&2
+               : $((failures += 1))
+       fi
+       unset -f $c
+       i=$((i+1))
+done
+exit $((failures > 0))
diff --git a/tools/regression/bin/sh/parser/heredoc1.0 b/tools/regression/bin/sh/parser/heredoc1.0
new file mode 100644 (file)
index 0000000..f453508
--- /dev/null
@@ -0,0 +1,85 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/heredoc1.0,v 1.1 2010/03/07 15:08:42 jilles Exp $
+
+failures=0
+
+check() {
+       if ! eval "[ $* ]"; then
+               echo "Failed: $*"
+               : $((failures += 1))
+       fi
+}
+
+check '"$(cat <<EOF
+hi
+EOF
+)" = hi'
+
+check '"$(cat <<EOF
+${$+hi}
+EOF
+)" = hi'
+
+unset yy
+check '"$(cat <<EOF
+${yy-hi}
+EOF
+)" = hi'
+
+check '"$(cat <<EOF
+${$+hi
+there}
+EOF
+)" = "hi
+there"'
+
+check '"$(cat <<EOF
+$((1+1))
+EOF
+)" = 2'
+
+check '"$(cat <<EOF
+$(echo hi)
+EOF
+)" = hi'
+
+check '"$(cat <<EOF
+`echo hi`
+EOF
+)" = hi'
+
+check '"$(cat <<\EOF
+${$+hi}
+EOF
+)" = "\${\$+hi}"'
+
+check '"$(cat <<\EOF
+$(
+EOF
+)" = \$\('
+
+check '"$(cat <<\EOF
+`
+EOF
+)" = \`'
+
+check '"$(cat <<EOF
+"
+EOF
+)" = \"'
+
+check '"$(cat <<\EOF
+"
+EOF
+)" = \"'
+
+check '"$(cat <<esac
+'"'"'
+esac
+)" = "'"'"'"'
+
+check '"$(cat <<\)
+'"'"'
+)
+)" = "'"'"'"'
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/parser/heredoc2.0 b/tools/regression/bin/sh/parser/heredoc2.0
new file mode 100644 (file)
index 0000000..04a481d
--- /dev/null
@@ -0,0 +1,39 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/heredoc2.0,v 1.2 2010/08/16 21:14:49 jilles Exp $
+
+failures=0
+
+check() {
+       if ! eval "[ $* ]"; then
+               echo "Failed: $*"
+               : $((failures += 1))
+       fi
+}
+
+s='ast*que?non' sq=\' dq=\"
+
+check '"$(cat <<EOF
+${s}
+EOF
+)" = "ast*que?non"'
+
+check '"$(cat <<EOF
+${s+'$sq'x'$sq'}
+EOF
+)" = ${sq}x${sq}'
+
+check '"$(cat <<EOF
+${s#ast}
+EOF
+)" = "*que?non"'
+
+check '"$(cat <<EOF
+${s##"ast"}
+EOF
+)" = "*que?non"'
+
+check '"$(cat <<EOF
+${s##'$sq'ast'$sq'}
+EOF
+)" = "*que?non"'
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/parser/heredoc3.0 b/tools/regression/bin/sh/parser/heredoc3.0
new file mode 100644 (file)
index 0000000..5165a5a
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/heredoc3.0,v 1.1 2010/05/09 17:10:50 jilles Exp $
+
+# This may be expected to work, but pretty much only ash derivatives allow it.
+
+test "$(cat <<EOF)" = "hi there"
+hi there
+EOF
diff --git a/tools/regression/bin/sh/parser/heredoc4.0 b/tools/regression/bin/sh/parser/heredoc4.0
new file mode 100644 (file)
index 0000000..91f5756
--- /dev/null
@@ -0,0 +1,44 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/heredoc4.0,v 1.1 2010/05/30 14:11:27 jilles Exp $
+
+failures=0
+
+check() {
+       if ! eval "[ $* ]"; then
+               echo "Failed: $*"
+               : $((failures += 1))
+       fi
+}
+
+f() {
+       cat <<EOF && echo `echo bar`
+foo
+EOF
+}
+check '"`f`" = "foo
+bar"'
+
+f() {
+       cat <<EOF && echo $(echo bar)
+foo
+EOF
+}
+check '"$(f)" = "foo
+bar"'
+
+f() {
+       echo `echo bar` && cat <<EOF
+foo
+EOF
+}
+check '"`f`" = "bar
+foo"'
+
+f() {
+       echo $(echo bar) && cat <<EOF
+foo
+EOF
+}
+check '"$(f)" = "bar
+foo"'
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/parser/heredoc5.0 b/tools/regression/bin/sh/parser/heredoc5.0
new file mode 100644 (file)
index 0000000..031a14d
--- /dev/null
@@ -0,0 +1,56 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/heredoc5.0,v 1.1 2010/05/30 14:11:27 jilles Exp $
+
+failures=0
+
+check() {
+       if ! eval "[ $* ]"; then
+               echo "Failed: $*"
+               : $((failures += 1))
+       fi
+}
+
+f() {
+       cat <<EOF && echo `cat <<EOF
+bar
+EOF
+`
+foo
+EOF
+}
+check '"`f`" = "foo
+bar"'
+
+f() {
+       cat <<EOF && echo $(cat <<EOF
+bar
+EOF
+)
+foo
+EOF
+}
+check '"$(f)" = "foo
+bar"'
+
+f() {
+       echo `cat <<EOF
+bar
+EOF
+` && cat <<EOF
+foo
+EOF
+}
+check '"`f`" = "bar
+foo"'
+
+f() {
+       echo $(cat <<EOF
+bar
+EOF
+) && cat <<EOF
+foo
+EOF
+}
+check '"$(f)" = "bar
+foo"'
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/parser/heredoc6.0 b/tools/regression/bin/sh/parser/heredoc6.0
new file mode 100644 (file)
index 0000000..5c4895a
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/heredoc6.0,v 1.1 2010/05/30 14:20:32 jilles Exp $
+
+r=
+! command eval ": <<EOF; )" 2>/dev/null; command eval : hi \${r:=0}
+exit ${r:-3}
diff --git a/tools/regression/bin/sh/parser/heredoc7.0 b/tools/regression/bin/sh/parser/heredoc7.0
new file mode 100644 (file)
index 0000000..dc4fba4
--- /dev/null
@@ -0,0 +1,19 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/heredoc7.0,v 1.1 2010/07/25 22:25:52 jilles Exp $
+
+# Some of these created malformed parse trees with null pointers for here
+# documents, causing the here document writing process to segfault.
+eval ': <<EOF'
+eval ': <<EOF;'
+eval '`: <<EOF`'
+eval '`: <<EOF;`'
+eval '`: <<EOF`;'
+eval '`: <<EOF;`;'
+
+# Some of these created malformed parse trees with null pointers for here
+# documents, causing sh to segfault.
+eval ': <<\EOF'
+eval ': <<\EOF;'
+eval '`: <<\EOF`'
+eval '`: <<\EOF;`'
+eval '`: <<\EOF`;'
+eval '`: <<\EOF;`;'
diff --git a/tools/regression/bin/sh/parser/heredoc8.0 b/tools/regression/bin/sh/parser/heredoc8.0
new file mode 100644 (file)
index 0000000..a0ec6f7
--- /dev/null
@@ -0,0 +1,20 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/heredoc8.0,v 1.1 2010/08/16 21:14:49 jilles Exp $
+
+failures=0
+
+check() {
+       if ! eval "[ $* ]"; then
+               echo "Failed: $*"
+               : $((failures += 1))
+       fi
+}
+
+s='ast*que?non' sq=\' dq=\"
+
+# This is possibly useful but differs from other shells.
+check '"$(cat <<EOF
+${s+"x"}
+EOF
+)" = ${dq}x${dq}'
+
+exit $((failures != 0))
diff --git a/tools/regression/bin/sh/parser/only-redir1.0 b/tools/regression/bin/sh/parser/only-redir1.0
new file mode 100644 (file)
index 0000000..a2bab15
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/only-redir1.0,v 1.1 2010/07/18 12:45:31 jilles Exp $
+</dev/null &
+wait $!
diff --git a/tools/regression/bin/sh/parser/pipe-not1.0 b/tools/regression/bin/sh/parser/pipe-not1.0
new file mode 100644 (file)
index 0000000..8a01ecb
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/parser/pipe-not1.0,v 1.1 2010/10/24 17:06:49 jilles Exp $
+
+: | ! : | false
diff --git a/tools/regression/bin/sh/regress.sh b/tools/regression/bin/sh/regress.sh
new file mode 100644 (file)
index 0000000..89a76e6
--- /dev/null
@@ -0,0 +1,43 @@
+# $FreeBSD: src/tools/regression/bin/sh/regress.sh,v 1.4 2010/10/12 18:20:38 obrien Exp $
+
+if [ -z "${SH}" ]; then
+       echo '${SH} is not set, please correct and re-run.'
+       exit 1
+fi
+export SH=${SH}
+
+COUNTER=1
+
+do_test() {
+       local c
+       c=${COUNTER}
+       COUNTER=$((COUNTER+1))
+       ${SH} $1 > tmp.stdout 2> tmp.stderr
+       if [ $? -ne $2 ]; then
+               echo "not ok ${c} - ${1} # wrong exit status"
+               rm tmp.stdout tmp.stderr
+               return
+       fi
+       for i in stdout stderr; do
+               if [ -f ${1}.${i} ]; then
+                       if ! cmp -s tmp.${i} ${1}.${i}; then
+                               echo "not ok ${c} - ${1} # wrong output on ${i}"
+                               rm tmp.stdout tmp.stderr
+                               return
+                       fi
+               elif [ -s tmp.${i} ]; then
+                       echo "not ok ${c} - ${1} # wrong output on ${i}"
+                       rm tmp.stdout tmp.stderr
+                       return
+               fi
+       done
+       echo "ok ${c} - ${1}"
+       rm tmp.stdout tmp.stderr
+}
+
+TESTS=$(find -Es . -regex ".*\.[0-9]+")
+printf "1..%d\n" $(echo ${TESTS} | wc -w)
+
+for i in ${TESTS} ; do
+       do_test ${i} ${i##*.}
+done
diff --git a/tools/regression/bin/sh/regress.t b/tools/regression/bin/sh/regress.t
new file mode 100644 (file)
index 0000000..5f475a7
--- /dev/null
@@ -0,0 +1,8 @@
+#!/bin/sh
+# $FreeBSD: src/tools/regression/bin/sh/regress.t,v 1.3 2010/10/15 20:01:35 jilles Exp $
+
+export SH="${SH:-sh}"
+
+cd `dirname $0`
+
+${SH} regress.sh
diff --git a/tools/regression/bin/sh/set-e/and1.0 b/tools/regression/bin/sh/set-e/and1.0
new file mode 100644 (file)
index 0000000..c6bbe13
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/and1.0,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+true && true
diff --git a/tools/regression/bin/sh/set-e/and2.1 b/tools/regression/bin/sh/set-e/and2.1
new file mode 100644 (file)
index 0000000..78919d4
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/and2.1,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+true && false
+exit 0
diff --git a/tools/regression/bin/sh/set-e/and3.0 b/tools/regression/bin/sh/set-e/and3.0
new file mode 100644 (file)
index 0000000..273d03b
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/and3.0,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+false && true
+exit 0
diff --git a/tools/regression/bin/sh/set-e/and4.0 b/tools/regression/bin/sh/set-e/and4.0
new file mode 100644 (file)
index 0000000..5f91ab9
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/and4.0,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+false && false
+exit 0
diff --git a/tools/regression/bin/sh/set-e/background1.0 b/tools/regression/bin/sh/set-e/background1.0
new file mode 100644 (file)
index 0000000..fee9b11
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/background1.0,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+false &
diff --git a/tools/regression/bin/sh/set-e/cmd1.0 b/tools/regression/bin/sh/set-e/cmd1.0
new file mode 100644 (file)
index 0000000..f9d84eb
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/cmd1.0,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+true
diff --git a/tools/regression/bin/sh/set-e/cmd2.1 b/tools/regression/bin/sh/set-e/cmd2.1
new file mode 100644 (file)
index 0000000..bd548a4
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/cmd2.1,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+false
+exit 0
diff --git a/tools/regression/bin/sh/set-e/elif1.0 b/tools/regression/bin/sh/set-e/elif1.0
new file mode 100644 (file)
index 0000000..7c6e4f1
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/elif1.0,v 1.2 2010/08/16 17:18:08 jilles Exp $
+set -e
+if false; then
+       :
+elif false; then
+       :
+fi
diff --git a/tools/regression/bin/sh/set-e/elif2.0 b/tools/regression/bin/sh/set-e/elif2.0
new file mode 100644 (file)
index 0000000..b7f097f
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/elif2.0,v 1.2 2010/08/16 17:18:08 jilles Exp $
+set -e
+if false; then
+       :
+elif false; false; then
+       :
+fi
diff --git a/tools/regression/bin/sh/set-e/eval1.0 b/tools/regression/bin/sh/set-e/eval1.0
new file mode 100644 (file)
index 0000000..aa377c7
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/eval1.0,v 1.1 2009/05/31 17:23:27 stefanf Exp $
+set -e
+eval false || true
diff --git a/tools/regression/bin/sh/set-e/eval2.1 b/tools/regression/bin/sh/set-e/eval2.1
new file mode 100644 (file)
index 0000000..dfed4aa
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/eval2.1,v 1.1 2009/05/31 17:23:27 stefanf Exp $
+set -e
+eval false
+exit 0
diff --git a/tools/regression/bin/sh/set-e/for1.0 b/tools/regression/bin/sh/set-e/for1.0
new file mode 100644 (file)
index 0000000..bbb8e54
--- /dev/null
@@ -0,0 +1,9 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/for1.0,v 1.1 2005/09/05 09:42:10 stefanf Exp $
+set -e
+f() {
+       for i in a b c; do
+               false
+               true
+       done
+}
+f || true
diff --git a/tools/regression/bin/sh/set-e/func1.0 b/tools/regression/bin/sh/set-e/func1.0
new file mode 100644 (file)
index 0000000..1122736
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/func1.0,v 1.1 2005/09/05 09:42:10 stefanf Exp $
+set -e
+f() {
+       false
+       true
+}
+f || true
diff --git a/tools/regression/bin/sh/set-e/func2.1 b/tools/regression/bin/sh/set-e/func2.1
new file mode 100644 (file)
index 0000000..8893af1
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/func2.1,v 1.1 2005/09/05 09:42:10 stefanf Exp $
+set -e
+f() {
+       false
+       exit 0
+}
+f
diff --git a/tools/regression/bin/sh/set-e/if1.0 b/tools/regression/bin/sh/set-e/if1.0
new file mode 100644 (file)
index 0000000..6cf2bc2
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/if1.0,v 1.2 2010/08/16 17:18:08 jilles Exp $
+set -e
+if false; then
+       :
+fi
diff --git a/tools/regression/bin/sh/set-e/if2.0 b/tools/regression/bin/sh/set-e/if2.0
new file mode 100644 (file)
index 0000000..0b0af9f
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/if2.0,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+# PR 28852
+if true; then
+       false && true
+fi
+exit 0
diff --git a/tools/regression/bin/sh/set-e/if3.0 b/tools/regression/bin/sh/set-e/if3.0
new file mode 100644 (file)
index 0000000..41a6039
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/if3.0,v 1.3 2010/08/16 17:18:08 jilles Exp $
+set -e
+if false; false; then
+       :
+fi
diff --git a/tools/regression/bin/sh/set-e/not1.0 b/tools/regression/bin/sh/set-e/not1.0
new file mode 100644 (file)
index 0000000..9cc4ba1
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/not1.0,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+! true
+exit 0
diff --git a/tools/regression/bin/sh/set-e/not2.0 b/tools/regression/bin/sh/set-e/not2.0
new file mode 100644 (file)
index 0000000..43e2e4d
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/not2.0,v 1.2 2009/05/31 17:23:27 stefanf Exp $
+set -e
+! false
+! eval false
diff --git a/tools/regression/bin/sh/set-e/or1.0 b/tools/regression/bin/sh/set-e/or1.0
new file mode 100644 (file)
index 0000000..b05614b
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/or1.0,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+true || false
diff --git a/tools/regression/bin/sh/set-e/or2.0 b/tools/regression/bin/sh/set-e/or2.0
new file mode 100644 (file)
index 0000000..82a47aa
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/or2.0,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+false || true
diff --git a/tools/regression/bin/sh/set-e/or3.1 b/tools/regression/bin/sh/set-e/or3.1
new file mode 100644 (file)
index 0000000..87b7146
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/or3.1,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+false || false
+exit 0
diff --git a/tools/regression/bin/sh/set-e/pipe1.1 b/tools/regression/bin/sh/set-e/pipe1.1
new file mode 100644 (file)
index 0000000..5a6b9e2
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/pipe1.1,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+true | false
+exit 0
diff --git a/tools/regression/bin/sh/set-e/pipe2.0 b/tools/regression/bin/sh/set-e/pipe2.0
new file mode 100644 (file)
index 0000000..d21fd77
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/pipe2.0,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+false | true
diff --git a/tools/regression/bin/sh/set-e/return1.0 b/tools/regression/bin/sh/set-e/return1.0
new file mode 100644 (file)
index 0000000..f4f65c6
--- /dev/null
@@ -0,0 +1,11 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/return1.0,v 1.2 2005/09/04 21:29:09 stefanf Exp $
+set -e
+
+# PR 77067, 85267
+f() {
+       return 1
+       true
+}
+
+f || true
+exit 0
diff --git a/tools/regression/bin/sh/set-e/semi1.1 b/tools/regression/bin/sh/set-e/semi1.1
new file mode 100644 (file)
index 0000000..3740f08
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/semi1.1,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+false; true
+exit 0
diff --git a/tools/regression/bin/sh/set-e/semi2.1 b/tools/regression/bin/sh/set-e/semi2.1
new file mode 100644 (file)
index 0000000..73edf81
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/semi2.1,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+true; false
+exit 0
diff --git a/tools/regression/bin/sh/set-e/subshell1.0 b/tools/regression/bin/sh/set-e/subshell1.0
new file mode 100644 (file)
index 0000000..59f5e71
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/subshell1.0,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+(true)
diff --git a/tools/regression/bin/sh/set-e/subshell2.1 b/tools/regression/bin/sh/set-e/subshell2.1
new file mode 100644 (file)
index 0000000..28d7523
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/subshell2.1,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+(false)
+exit 0
diff --git a/tools/regression/bin/sh/set-e/until1.0 b/tools/regression/bin/sh/set-e/until1.0
new file mode 100644 (file)
index 0000000..1df7c1f
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/until1.0,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+until false; do
+       break
+done
diff --git a/tools/regression/bin/sh/set-e/until2.0 b/tools/regression/bin/sh/set-e/until2.0
new file mode 100644 (file)
index 0000000..1505818
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/until2.0,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+set -e
+until false; false; do
+       break
+done
diff --git a/tools/regression/bin/sh/set-e/until3.0 b/tools/regression/bin/sh/set-e/until3.0
new file mode 100644 (file)
index 0000000..f58b45a
--- /dev/null
@@ -0,0 +1,9 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/until3.0,v 1.1 2005/09/05 09:42:10 stefanf Exp $
+set -e
+f() {
+       until false; do
+               false
+               break
+       done
+}
+f || true
diff --git a/tools/regression/bin/sh/set-e/while1.0 b/tools/regression/bin/sh/set-e/while1.0
new file mode 100644 (file)
index 0000000..4bfcb24
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/while1.0,v 1.2 2010/08/16 17:18:08 jilles Exp $
+set -e
+while false; do
+       :
+done
diff --git a/tools/regression/bin/sh/set-e/while2.0 b/tools/regression/bin/sh/set-e/while2.0
new file mode 100644 (file)
index 0000000..e678e79
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/while2.0,v 1.2 2010/08/16 17:18:08 jilles Exp $
+set -e
+while false; false; do
+       :
+done
diff --git a/tools/regression/bin/sh/set-e/while3.0 b/tools/regression/bin/sh/set-e/while3.0
new file mode 100644 (file)
index 0000000..78bc1f5
--- /dev/null
@@ -0,0 +1,9 @@
+# $FreeBSD: src/tools/regression/bin/sh/set-e/while3.0,v 1.1 2005/09/05 09:42:10 stefanf Exp $
+set -e
+f() {
+       while true; do
+               false
+               break
+       done
+}
+f || true