shell: add 6856 $IFS tests to testsuites

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/shell/ash_test/ash-z_slow/many_ifs.right b/shell/ash_test/ash-z_slow/many_ifs.right
new file mode 100644
index 0000000..f3bdccc
--- /dev/null
+++ b/shell/ash_test/ash-z_slow/many_ifs.right
@@ -0,0 +1 @@
+# tests 6856 passed 6856 failed 0
diff --git a/shell/ash_test/ash-z_slow/many_ifs.tests b/shell/ash_test/ash-z_slow/many_ifs.tests
new file mode 100755
index 0000000..1f5b1b3
--- /dev/null
+++ b/shell/ash_test/ash-z_slow/many_ifs.tests
@@ -0,0 +1,257 @@
+# Usage: $SHELL ifs.sh
+#
+# This script generates 6856 tests for the set(1) and read(1)
+# builtins w.r.t. IFS whitespace and non-whitespace characters.
+# Each failed test produces one line on the standard output that
+# contains the test along with the expected and actual results.
+# The last output line contains the test result counts.  ordered>0
+# are the number of tests where IFS=": " produced different results
+# than IFS=" :".  If a test fails the same way for IFS=": " and
+# IFS=" :" then the second output line is suppressed.
+
+TESTS=6856
+
+ksh_read=0
+echo 1 | read ksh_read
+ksh_arith=0
+eval '((ksh_arith+=1))' 2>/dev/null
+
+failed=0
+ordered=0
+passed=0
+
+split()
+{
+	i=$1 s=$2 r=$3 S='' R=''
+	for ifs in ': ' ' :'
+	do	IFS=$ifs
+		set x $i
+		shift
+		IFS=' '
+		g="[$#]"
+		while	:
+		do	case $# in
+			0)	break ;;
+			esac
+			g="$g($1)"
+			shift
+		done
+		case $g in
+		"$s")	case $ksh_arith in
+			1)	((passed+=1)) ;;
+			*)	passed=`expr $passed + 1` ;;
+			esac
+			case $S in
+			'')	S=$g
+				;;
+			"$g")	;;
+			*)	case $ksh_arith in
+				1)	((ordered+=1)) ;;
+				*)	ordered=`expr $ordered + 1` ;;
+				esac
+				;;
+			esac
+			;;
+		"$S")	case $ksh_arith in
+			1)	((failed+=1)) ;;
+			*)	failed=`expr $failed + 1` ;;
+			esac
+			;;
+		*)	case $ksh_arith in
+			1)	((failed+=1)) ;;
+			*)	failed=`expr $failed + 1` ;;
+			esac
+			case $s in
+			"$S")	;;
+			?0*)	echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#]\" # expected \"$s\" got \"$g\"" ;;
+			?1*)	echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)\" # expected \"$s\" got \"$g\"" ;;
+			?2*)	echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)(\$2)\" # expected \"$s\" got \"$g\"" ;;
+			?3*)	echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)(\$2)(\$3)\" # expected \"$s\" got \"$g\"" ;;
+			*)	echo TEST ERROR i="'$i'" s="'$s'" ;;
+			esac
+			case $S in
+			'')	S=$g
+				;;
+			"$g")	;;
+			*)	case $ksh_arith in
+				1)	((ordered+=1)) ;;
+				*)	ordered=`expr $ordered + 1` ;;
+				esac
+				;;
+			esac
+		esac
+		case $ksh_read in
+		1)	echo "$i" | IFS=$ifs read x y; g="($x)($y)" ;;
+		*)	g=`export ifs; echo "$i" | ( IFS=$ifs; read x y; echo "($x)($y)" )` ;;
+		esac
+		case $g in
+		"$r")	case $ksh_arith in
+			1)	((passed+=1)) ;;
+			*)	passed=`expr $passed + 1` ;;
+			esac
+			case $R in
+			'')	R=$g
+				;;
+			"$g")	;;
+			*)	case $ksh_arith in
+				1)	((ordered+=1)) ;;
+				*)	ordered=`expr $ordered + 1` ;;
+				esac
+				;;
+			esac
+			;;
+		"$R")	case $ksh_arith in
+			1)	((failed+=1)) ;;
+			*)	failed=`expr $failed + 1` ;;
+			esac
+			;;
+		*)	case $ksh_arith in
+			1)	((failed+=1)) ;;
+			*)	failed=`expr $failed + 1` ;;
+			esac
+			case $r in
+			"$R")	;;
+			*)	echo "echo \"$i\" | ( IFS=\"$ifs\" read x y; echo \"(\$x)(\$y)\" ) # expected \"$r\" got \"$g\"" ;;
+			esac
+			case $R in
+			'')	R=$g
+				;;
+			"$g")	;;
+			*)	case $ksh_arith in
+				1)	((ordered+=1)) ;;
+				*)	ordered=`expr $ordered + 1` ;;
+				esac
+				;;
+			esac
+			;;
+		esac
+	done
+}
+
+for str in 	\
+	'-'	\
+	'a'	\
+	'- -'	\
+	'- a'	\
+	'a -'	\
+	'a b'	\
+	'- - -'	\
+	'- - a'	\
+	'- a -'	\
+	'- a b'	\
+	'a - -'	\
+	'a - b'	\
+	'a b -'	\
+	'a b c'	\
+
+do
+	IFS=' '
+	set x $str
+
+	shift
+	case $# in
+	0)	continue ;;
+	esac
+
+	f1=$1
+	case $f1 in
+	'-')	f1='' ;;
+	esac
+
+	shift
+	case $# in
+	0)	for d0 in '' ' '
+		do
+			for d1 in '' ' ' ':' ' :' ': ' ' : '
+			do
+				case $f1$d1 in
+				'')	split "$d0$f1$d1" "[0]" "()()" ;;
+				' ')	;;
+				*)	split "$d0$f1$d1" "[1]($f1)" "($f1)()" ;;
+				esac
+			done
+		done
+		continue
+		;;
+	esac
+	f2=$1
+	case $f2 in
+	'-')	f2='' ;;
+	esac
+
+	shift
+	case $# in
+	0)	for d0 in '' ' '
+		do
+			for d1 in ' ' ':' ' :' ': ' ' : '
+			do
+				case ' ' in
+				$f1$d1|$d1$f2)	continue ;;
+				esac
+				for d2 in '' ' ' ':' ' :' ': ' ' : '
+				do
+					case $f2$d2 in
+					'')	split "$d0$f1$d1$f2$d2" "[1]($f1)" "($f1)()" ;;
+					' ')	;;
+					*)	split "$d0$f1$d1$f2$d2" "[2]($f1)($f2)" "($f1)($f2)" ;;
+					esac
+				done
+			done
+		done
+		continue
+		;;
+	esac
+	f3=$1
+	case $f3 in
+	'-')	f3='' ;;
+	esac
+
+	shift
+	case $# in
+	0)	for d0 in '' ' '
+		do
+			for d1 in ':' ' :' ': ' ' : '
+			do
+				case ' ' in
+				$f1$d1|$d1$f2)	continue ;;
+				esac
+				for d2 in ' ' ':' ' :' ': ' ' : '
+				do
+					case $f2$d2 in
+					' ')	continue ;;
+					esac
+					case ' ' in
+					$f2$d2|$d2$f3)	continue ;;
+					esac
+					for d3 in '' ' ' ':' ' :' ': ' ' : '
+					do
+						case $f3$d3 in
+						'')	split "$d0$f1$d1$f2$d2$f3$d3" "[2]($f1)($f2)" "($f1)($f2)" ;;
+						' ')	;;
+						*)	x=$f2$d2$f3$d3
+							x=${x# } #was x=${x#' '} hush needs fixing for this to work
+							x=${x% } #was x=${x%' '}
+							split "$d0$f1$d1$f2$d2$f3$d3" "[3]($f1)($f2)($f3)" "($f1)($x)"
+							;;
+						esac
+					done
+				done
+			done
+		done
+		continue
+		;;
+	esac
+done
+case $ksh_arith in
+1)	((tests=passed+failed)) ;;
+*)	tests=`expr $passed + $failed` ;;
+esac
+case $ordered in
+0)	ordered="" ;;
+*)	ordered=" ordered $ordered" ;;
+esac
+case $tests in
+$TESTS)	fatal="" ;;
+*)	fatal=" -- fundamental IFS error -- $TESTS tests expected"
+esac
+echo "# tests $tests passed $passed failed $failed$ordered$fatal"
diff --git a/shell/hush_test/hush-z_slow/many_ifs.right b/shell/hush_test/hush-z_slow/many_ifs.right
new file mode 100644
index 0000000..f3bdccc
--- /dev/null
+++ b/shell/hush_test/hush-z_slow/many_ifs.right
@@ -0,0 +1 @@
+# tests 6856 passed 6856 failed 0
diff --git a/shell/hush_test/hush-z_slow/many_ifs.tests b/shell/hush_test/hush-z_slow/many_ifs.tests
new file mode 100755
index 0000000..1f5b1b3
--- /dev/null
+++ b/shell/hush_test/hush-z_slow/many_ifs.tests
@@ -0,0 +1,257 @@
+# Usage: $SHELL ifs.sh
+#
+# This script generates 6856 tests for the set(1) and read(1)
+# builtins w.r.t. IFS whitespace and non-whitespace characters.
+# Each failed test produces one line on the standard output that
+# contains the test along with the expected and actual results.
+# The last output line contains the test result counts.  ordered>0
+# are the number of tests where IFS=": " produced different results
+# than IFS=" :".  If a test fails the same way for IFS=": " and
+# IFS=" :" then the second output line is suppressed.
+
+TESTS=6856
+
+ksh_read=0
+echo 1 | read ksh_read
+ksh_arith=0
+eval '((ksh_arith+=1))' 2>/dev/null
+
+failed=0
+ordered=0
+passed=0
+
+split()
+{
+	i=$1 s=$2 r=$3 S='' R=''
+	for ifs in ': ' ' :'
+	do	IFS=$ifs
+		set x $i
+		shift
+		IFS=' '
+		g="[$#]"
+		while	:
+		do	case $# in
+			0)	break ;;
+			esac
+			g="$g($1)"
+			shift
+		done
+		case $g in
+		"$s")	case $ksh_arith in
+			1)	((passed+=1)) ;;
+			*)	passed=`expr $passed + 1` ;;
+			esac
+			case $S in
+			'')	S=$g
+				;;
+			"$g")	;;
+			*)	case $ksh_arith in
+				1)	((ordered+=1)) ;;
+				*)	ordered=`expr $ordered + 1` ;;
+				esac
+				;;
+			esac
+			;;
+		"$S")	case $ksh_arith in
+			1)	((failed+=1)) ;;
+			*)	failed=`expr $failed + 1` ;;
+			esac
+			;;
+		*)	case $ksh_arith in
+			1)	((failed+=1)) ;;
+			*)	failed=`expr $failed + 1` ;;
+			esac
+			case $s in
+			"$S")	;;
+			?0*)	echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#]\" # expected \"$s\" got \"$g\"" ;;
+			?1*)	echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)\" # expected \"$s\" got \"$g\"" ;;
+			?2*)	echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)(\$2)\" # expected \"$s\" got \"$g\"" ;;
+			?3*)	echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)(\$2)(\$3)\" # expected \"$s\" got \"$g\"" ;;
+			*)	echo TEST ERROR i="'$i'" s="'$s'" ;;
+			esac
+			case $S in
+			'')	S=$g
+				;;
+			"$g")	;;
+			*)	case $ksh_arith in
+				1)	((ordered+=1)) ;;
+				*)	ordered=`expr $ordered + 1` ;;
+				esac
+				;;
+			esac
+		esac
+		case $ksh_read in
+		1)	echo "$i" | IFS=$ifs read x y; g="($x)($y)" ;;
+		*)	g=`export ifs; echo "$i" | ( IFS=$ifs; read x y; echo "($x)($y)" )` ;;
+		esac
+		case $g in
+		"$r")	case $ksh_arith in
+			1)	((passed+=1)) ;;
+			*)	passed=`expr $passed + 1` ;;
+			esac
+			case $R in
+			'')	R=$g
+				;;
+			"$g")	;;
+			*)	case $ksh_arith in
+				1)	((ordered+=1)) ;;
+				*)	ordered=`expr $ordered + 1` ;;
+				esac
+				;;
+			esac
+			;;
+		"$R")	case $ksh_arith in
+			1)	((failed+=1)) ;;
+			*)	failed=`expr $failed + 1` ;;
+			esac
+			;;
+		*)	case $ksh_arith in
+			1)	((failed+=1)) ;;
+			*)	failed=`expr $failed + 1` ;;
+			esac
+			case $r in
+			"$R")	;;
+			*)	echo "echo \"$i\" | ( IFS=\"$ifs\" read x y; echo \"(\$x)(\$y)\" ) # expected \"$r\" got \"$g\"" ;;
+			esac
+			case $R in
+			'')	R=$g
+				;;
+			"$g")	;;
+			*)	case $ksh_arith in
+				1)	((ordered+=1)) ;;
+				*)	ordered=`expr $ordered + 1` ;;
+				esac
+				;;
+			esac
+			;;
+		esac
+	done
+}
+
+for str in 	\
+	'-'	\
+	'a'	\
+	'- -'	\
+	'- a'	\
+	'a -'	\
+	'a b'	\
+	'- - -'	\
+	'- - a'	\
+	'- a -'	\
+	'- a b'	\
+	'a - -'	\
+	'a - b'	\
+	'a b -'	\
+	'a b c'	\
+
+do
+	IFS=' '
+	set x $str
+
+	shift
+	case $# in
+	0)	continue ;;
+	esac
+
+	f1=$1
+	case $f1 in
+	'-')	f1='' ;;
+	esac
+
+	shift
+	case $# in
+	0)	for d0 in '' ' '
+		do
+			for d1 in '' ' ' ':' ' :' ': ' ' : '
+			do
+				case $f1$d1 in
+				'')	split "$d0$f1$d1" "[0]" "()()" ;;
+				' ')	;;
+				*)	split "$d0$f1$d1" "[1]($f1)" "($f1)()" ;;
+				esac
+			done
+		done
+		continue
+		;;
+	esac
+	f2=$1
+	case $f2 in
+	'-')	f2='' ;;
+	esac
+
+	shift
+	case $# in
+	0)	for d0 in '' ' '
+		do
+			for d1 in ' ' ':' ' :' ': ' ' : '
+			do
+				case ' ' in
+				$f1$d1|$d1$f2)	continue ;;
+				esac
+				for d2 in '' ' ' ':' ' :' ': ' ' : '
+				do
+					case $f2$d2 in
+					'')	split "$d0$f1$d1$f2$d2" "[1]($f1)" "($f1)()" ;;
+					' ')	;;
+					*)	split "$d0$f1$d1$f2$d2" "[2]($f1)($f2)" "($f1)($f2)" ;;
+					esac
+				done
+			done
+		done
+		continue
+		;;
+	esac
+	f3=$1
+	case $f3 in
+	'-')	f3='' ;;
+	esac
+
+	shift
+	case $# in
+	0)	for d0 in '' ' '
+		do
+			for d1 in ':' ' :' ': ' ' : '
+			do
+				case ' ' in
+				$f1$d1|$d1$f2)	continue ;;
+				esac
+				for d2 in ' ' ':' ' :' ': ' ' : '
+				do
+					case $f2$d2 in
+					' ')	continue ;;
+					esac
+					case ' ' in
+					$f2$d2|$d2$f3)	continue ;;
+					esac
+					for d3 in '' ' ' ':' ' :' ': ' ' : '
+					do
+						case $f3$d3 in
+						'')	split "$d0$f1$d1$f2$d2$f3$d3" "[2]($f1)($f2)" "($f1)($f2)" ;;
+						' ')	;;
+						*)	x=$f2$d2$f3$d3
+							x=${x# } #was x=${x#' '} hush needs fixing for this to work
+							x=${x% } #was x=${x%' '}
+							split "$d0$f1$d1$f2$d2$f3$d3" "[3]($f1)($f2)($f3)" "($f1)($x)"
+							;;
+						esac
+					done
+				done
+			done
+		done
+		continue
+		;;
+	esac
+done
+case $ksh_arith in
+1)	((tests=passed+failed)) ;;
+*)	tests=`expr $passed + $failed` ;;
+esac
+case $ordered in
+0)	ordered="" ;;
+*)	ordered=" ordered $ordered" ;;
+esac
+case $tests in
+$TESTS)	fatal="" ;;
+*)	fatal=" -- fundamental IFS error -- $TESTS tests expected"
+esac
+echo "# tests $tests passed $passed failed $failed$ordered$fatal"