dollar_altvalue1 test partially fails: word splitting of unquoted ${var:+...}
is not correct
function                                             old     new   delta
encode_then_expand_vararg                              -     443    +443
expand_one_var                                      1599    1610     +11
parse_stream                                        2756    2753      -3
encode_string                                        250     242      -8
setup_heredoc                                        308     298     -10
expand_and_evaluate_arith                            106      96     -10
encode_then_expand_string                            142     126     -16
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/5 up/down: 454/-47)           Total: 407 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
		
	
		
			
				
	
	
		
			258 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			258 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
# 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#' '}
 | 
						|
							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"
 |