1 | # Usage: $SHELL ifs.sh
|
---|
2 | #
|
---|
3 | # This script generates 6856 tests for the set(1) and read(1)
|
---|
4 | # builtins w.r.t. IFS whitespace and non-whitespace characters.
|
---|
5 | # Each failed test produces one line on the standard output that
|
---|
6 | # contains the test along with the expected and actual results.
|
---|
7 | # The last output line contains the test result counts. ordered>0
|
---|
8 | # are the number of tests where IFS=": " produced different results
|
---|
9 | # than IFS=" :". If a test fails the same way for IFS=": " and
|
---|
10 | # IFS=" :" then the second output line is suppressed.
|
---|
11 |
|
---|
12 | TESTS=6856
|
---|
13 |
|
---|
14 | ksh_read=0
|
---|
15 | echo 1 | read ksh_read
|
---|
16 | ksh_arith=0
|
---|
17 | eval '((ksh_arith+=1))' 2>/dev/null
|
---|
18 |
|
---|
19 | failed=0
|
---|
20 | ordered=0
|
---|
21 | passed=0
|
---|
22 |
|
---|
23 | split()
|
---|
24 | {
|
---|
25 | i=$1 s=$2 r=$3 S='' R=''
|
---|
26 | for ifs in ': ' ' :'
|
---|
27 | do IFS=$ifs
|
---|
28 | set x $i
|
---|
29 | shift
|
---|
30 | IFS=' '
|
---|
31 | g="[$#]"
|
---|
32 | while :
|
---|
33 | do case $# in
|
---|
34 | 0) break ;;
|
---|
35 | esac
|
---|
36 | g="$g($1)"
|
---|
37 | shift
|
---|
38 | done
|
---|
39 | case $g in
|
---|
40 | "$s") case $ksh_arith in
|
---|
41 | 1) ((passed+=1)) ;;
|
---|
42 | *) passed=`expr $passed + 1` ;;
|
---|
43 | esac
|
---|
44 | case $S in
|
---|
45 | '') S=$g
|
---|
46 | ;;
|
---|
47 | "$g") ;;
|
---|
48 | *) case $ksh_arith in
|
---|
49 | 1) ((ordered+=1)) ;;
|
---|
50 | *) ordered=`expr $ordered + 1` ;;
|
---|
51 | esac
|
---|
52 | ;;
|
---|
53 | esac
|
---|
54 | ;;
|
---|
55 | "$S") case $ksh_arith in
|
---|
56 | 1) ((failed+=1)) ;;
|
---|
57 | *) failed=`expr $failed + 1` ;;
|
---|
58 | esac
|
---|
59 | ;;
|
---|
60 | *) case $ksh_arith in
|
---|
61 | 1) ((failed+=1)) ;;
|
---|
62 | *) failed=`expr $failed + 1` ;;
|
---|
63 | esac
|
---|
64 | case $s in
|
---|
65 | "$S") ;;
|
---|
66 | ?0*) echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#]\" # expected \"$s\" got \"$g\"" ;;
|
---|
67 | ?1*) echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)\" # expected \"$s\" got \"$g\"" ;;
|
---|
68 | ?2*) echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)(\$2)\" # expected \"$s\" got \"$g\"" ;;
|
---|
69 | ?3*) echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)(\$2)(\$3)\" # expected \"$s\" got \"$g\"" ;;
|
---|
70 | *) echo TEST ERROR i="'$i'" s="'$s'" ;;
|
---|
71 | esac
|
---|
72 | case $S in
|
---|
73 | '') S=$g
|
---|
74 | ;;
|
---|
75 | "$g") ;;
|
---|
76 | *) case $ksh_arith in
|
---|
77 | 1) ((ordered+=1)) ;;
|
---|
78 | *) ordered=`expr $ordered + 1` ;;
|
---|
79 | esac
|
---|
80 | ;;
|
---|
81 | esac
|
---|
82 | esac
|
---|
83 | case $ksh_read in
|
---|
84 | 1) echo "$i" | IFS=$ifs read x y; g="($x)($y)" ;;
|
---|
85 | *) g=`export ifs; echo "$i" | ( IFS=$ifs; read x y; echo "($x)($y)" )` ;;
|
---|
86 | esac
|
---|
87 | case $g in
|
---|
88 | "$r") case $ksh_arith in
|
---|
89 | 1) ((passed+=1)) ;;
|
---|
90 | *) passed=`expr $passed + 1` ;;
|
---|
91 | esac
|
---|
92 | case $R in
|
---|
93 | '') R=$g
|
---|
94 | ;;
|
---|
95 | "$g") ;;
|
---|
96 | *) case $ksh_arith in
|
---|
97 | 1) ((ordered+=1)) ;;
|
---|
98 | *) ordered=`expr $ordered + 1` ;;
|
---|
99 | esac
|
---|
100 | ;;
|
---|
101 | esac
|
---|
102 | ;;
|
---|
103 | "$R") case $ksh_arith in
|
---|
104 | 1) ((failed+=1)) ;;
|
---|
105 | *) failed=`expr $failed + 1` ;;
|
---|
106 | esac
|
---|
107 | ;;
|
---|
108 | *) case $ksh_arith in
|
---|
109 | 1) ((failed+=1)) ;;
|
---|
110 | *) failed=`expr $failed + 1` ;;
|
---|
111 | esac
|
---|
112 | case $r in
|
---|
113 | "$R") ;;
|
---|
114 | *) echo "echo \"$i\" | ( IFS=\"$ifs\" read x y; echo \"(\$x)(\$y)\" ) # expected \"$r\" got \"$g\"" ;;
|
---|
115 | esac
|
---|
116 | case $R in
|
---|
117 | '') R=$g
|
---|
118 | ;;
|
---|
119 | "$g") ;;
|
---|
120 | *) case $ksh_arith in
|
---|
121 | 1) ((ordered+=1)) ;;
|
---|
122 | *) ordered=`expr $ordered + 1` ;;
|
---|
123 | esac
|
---|
124 | ;;
|
---|
125 | esac
|
---|
126 | ;;
|
---|
127 | esac
|
---|
128 | done
|
---|
129 | }
|
---|
130 |
|
---|
131 | for str in \
|
---|
132 | '-' \
|
---|
133 | 'a' \
|
---|
134 | '- -' \
|
---|
135 | '- a' \
|
---|
136 | 'a -' \
|
---|
137 | 'a b' \
|
---|
138 | '- - -' \
|
---|
139 | '- - a' \
|
---|
140 | '- a -' \
|
---|
141 | '- a b' \
|
---|
142 | 'a - -' \
|
---|
143 | 'a - b' \
|
---|
144 | 'a b -' \
|
---|
145 | 'a b c' \
|
---|
146 |
|
---|
147 | do
|
---|
148 | IFS=' '
|
---|
149 | set x $str
|
---|
150 |
|
---|
151 | shift
|
---|
152 | case $# in
|
---|
153 | 0) continue ;;
|
---|
154 | esac
|
---|
155 |
|
---|
156 | f1=$1
|
---|
157 | case $f1 in
|
---|
158 | '-') f1='' ;;
|
---|
159 | esac
|
---|
160 |
|
---|
161 | shift
|
---|
162 | case $# in
|
---|
163 | 0) for d0 in '' ' '
|
---|
164 | do
|
---|
165 | for d1 in '' ' ' ':' ' :' ': ' ' : '
|
---|
166 | do
|
---|
167 | case $f1$d1 in
|
---|
168 | '') split "$d0$f1$d1" "[0]" "()()" ;;
|
---|
169 | ' ') ;;
|
---|
170 | *) split "$d0$f1$d1" "[1]($f1)" "($f1)()" ;;
|
---|
171 | esac
|
---|
172 | done
|
---|
173 | done
|
---|
174 | continue
|
---|
175 | ;;
|
---|
176 | esac
|
---|
177 | f2=$1
|
---|
178 | case $f2 in
|
---|
179 | '-') f2='' ;;
|
---|
180 | esac
|
---|
181 |
|
---|
182 | shift
|
---|
183 | case $# in
|
---|
184 | 0) for d0 in '' ' '
|
---|
185 | do
|
---|
186 | for d1 in ' ' ':' ' :' ': ' ' : '
|
---|
187 | do
|
---|
188 | case ' ' in
|
---|
189 | $f1$d1|$d1$f2) continue ;;
|
---|
190 | esac
|
---|
191 | for d2 in '' ' ' ':' ' :' ': ' ' : '
|
---|
192 | do
|
---|
193 | case $f2$d2 in
|
---|
194 | '') split "$d0$f1$d1$f2$d2" "[1]($f1)" "($f1)()" ;;
|
---|
195 | ' ') ;;
|
---|
196 | *) split "$d0$f1$d1$f2$d2" "[2]($f1)($f2)" "($f1)($f2)" ;;
|
---|
197 | esac
|
---|
198 | done
|
---|
199 | done
|
---|
200 | done
|
---|
201 | continue
|
---|
202 | ;;
|
---|
203 | esac
|
---|
204 | f3=$1
|
---|
205 | case $f3 in
|
---|
206 | '-') f3='' ;;
|
---|
207 | esac
|
---|
208 |
|
---|
209 | shift
|
---|
210 | case $# in
|
---|
211 | 0) for d0 in '' ' '
|
---|
212 | do
|
---|
213 | for d1 in ':' ' :' ': ' ' : '
|
---|
214 | do
|
---|
215 | case ' ' in
|
---|
216 | $f1$d1|$d1$f2) continue ;;
|
---|
217 | esac
|
---|
218 | for d2 in ' ' ':' ' :' ': ' ' : '
|
---|
219 | do
|
---|
220 | case $f2$d2 in
|
---|
221 | ' ') continue ;;
|
---|
222 | esac
|
---|
223 | case ' ' in
|
---|
224 | $f2$d2|$d2$f3) continue ;;
|
---|
225 | esac
|
---|
226 | for d3 in '' ' ' ':' ' :' ': ' ' : '
|
---|
227 | do
|
---|
228 | case $f3$d3 in
|
---|
229 | '') split "$d0$f1$d1$f2$d2$f3$d3" "[2]($f1)($f2)" "($f1)($f2)" ;;
|
---|
230 | ' ') ;;
|
---|
231 | *) x=$f2$d2$f3$d3
|
---|
232 | x=${x#' '}
|
---|
233 | x=${x%' '}
|
---|
234 | split "$d0$f1$d1$f2$d2$f3$d3" "[3]($f1)($f2)($f3)" "($f1)($x)"
|
---|
235 | ;;
|
---|
236 | esac
|
---|
237 | done
|
---|
238 | done
|
---|
239 | done
|
---|
240 | done
|
---|
241 | continue
|
---|
242 | ;;
|
---|
243 | esac
|
---|
244 | done
|
---|
245 | case $ksh_arith in
|
---|
246 | 1) ((tests=passed+failed)) ;;
|
---|
247 | *) tests=`expr $passed + $failed` ;;
|
---|
248 | esac
|
---|
249 | case $ordered in
|
---|
250 | 0) ordered="" ;;
|
---|
251 | *) ordered=" ordered $ordered" ;;
|
---|
252 | esac
|
---|
253 | case $tests in
|
---|
254 | $TESTS) fatal="" ;;
|
---|
255 | *) fatal=" -- fundamental IFS error -- $TESTS tests expected"
|
---|
256 | esac
|
---|
257 | echo "# tests $tests passed $passed failed $failed$ordered$fatal"
|
---|