format-lisp-1 revision 1.1.1.1 1 1.1 christos #! /bin/sh
2 1.1 christos
3 1.1 christos # Test recognition of Lisp format strings.
4 1.1 christos
5 1.1 christos tmpfiles=""
6 1.1 christos trap 'rm -fr $tmpfiles' 1 2 3 15
7 1.1 christos
8 1.1 christos tmpfiles="$tmpfiles f-l-1.data"
9 1.1 christos cat <<\EOF > f-l-1.data
10 1.1 christos # Valid: no argument, ( | . *)
11 1.1 christos "abc~~def"
12 1.1 christos # Valid: one argument, (* | . *)
13 1.1 christos "abc~Sdef"
14 1.1 christos # Valid: 11 arguments, (* * * * * * * * * * * | . *)
15 1.1 christos "abc~10@*~Sdef"
16 1.1 christos # Invalid: unterminated
17 1.1 christos "abc~~def~"
18 1.1 christos # Invalid: unterminated
19 1.1 christos "abc~~def~1"
20 1.1 christos # Invalid: unterminated
21 1.1 christos "abc~~def~:"
22 1.1 christos # Invalid: unterminated
23 1.1 christos "abc~~def~@"
24 1.1 christos # Valid: colon
25 1.1 christos "abc~:Sdef"
26 1.1 christos # Valid: atsign
27 1.1 christos "abc~@Sdef"
28 1.1 christos # Valid: colon and atsign
29 1.1 christos "abc~:@Sdef"
30 1.1 christos # Valid: atsign and colon
31 1.1 christos "abc~@:Sdef"
32 1.1 christos # Valid: params before atsign and colon
33 1.1 christos "abc~3,-4,,'*@:Sdef"
34 1.1 christos # Invalid: params after atsign and colon
35 1.1 christos "abc~@:3,-4Sdef"
36 1.1 christos # Invalid: params after atsign and colon
37 1.1 christos "abc~@:-4Sdef"
38 1.1 christos # Invalid: params after atsign and colon
39 1.1 christos "abc~@:,-4Sdef"
40 1.1 christos # Valid: V and # params, (i() * | . *)
41 1.1 christos "abc~#,vSdef"
42 1.1 christos # Invalid: wrong type params
43 1.1 christos "abc~,'*Sdef"
44 1.1 christos # Valid: FORMAT-ASCII, (i() i() i() c() * | . *)
45 1.1 christos "abc~v,v,v,vA"
46 1.1 christos # Invalid: too many params
47 1.1 christos "abc~v,v,v,v,5A"
48 1.1 christos # Valid: FORMAT-S-EXPRESSION, (i() i() i() c() * | . *)
49 1.1 christos "abc~v,v,v,vS"
50 1.1 christos # Invalid: too many params
51 1.1 christos "abc~v,v,v,v,5S"
52 1.1 christos # Valid: FORMAT-WRITE, (* | . *)
53 1.1 christos "abc~W"
54 1.1 christos # Invalid: too many params
55 1.1 christos "abc~3W"
56 1.1 christos # Valid: FORMAT-DECIMAL, (i() c() c() i() i | . *)
57 1.1 christos "abc~v,v,v,vD"
58 1.1 christos # Invalid: too many params
59 1.1 christos "abc~v,v,v,v,5D"
60 1.1 christos # Valid: FORMAT-BINARY, (i() c() c() i() i | . *)
61 1.1 christos "abc~v,v,v,vB"
62 1.1 christos # Invalid: too many params
63 1.1 christos "abc~v,v,v,v,5B"
64 1.1 christos # Valid: FORMAT-OCTAL, (i() c() c() i() i | . *)
65 1.1 christos "abc~v,v,v,vO"
66 1.1 christos # Invalid: too many params
67 1.1 christos "abc~v,v,v,v,5O"
68 1.1 christos # Valid: FORMAT-HEXADECIMAL, (i() c() c() i() i | . *)
69 1.1 christos "abc~v,v,v,vX"
70 1.1 christos # Invalid: too many params
71 1.1 christos "abc~v,v,v,v,5X"
72 1.1 christos # Valid: FORMAT-RADIX, (i() i() c() c() i() i | . *)
73 1.1 christos "abc~v,v,v,v,vR"
74 1.1 christos # Invalid: too many params
75 1.1 christos "abc~v,v,v,v,v,5R"
76 1.1 christos # Valid: FORMAT-PLURAL, (* | . *)
77 1.1 christos "abc~P"
78 1.1 christos # Valid: FORMAT-PLURAL, (i | . *)
79 1.1 christos "abc~R egg~:P"
80 1.1 christos # Invalid: too many params
81 1.1 christos "abc~2P"
82 1.1 christos # Valid: FORMAT-CHARACTER, (c | . *)
83 1.1 christos "abc~C"
84 1.1 christos # Invalid: too many params
85 1.1 christos "abc~4C"
86 1.1 christos # Valid: FORMAT-FIXED-FLOAT, (i() i() i() c() c() r | . *)
87 1.1 christos "abc~v,v,v,v,vF"
88 1.1 christos # Invalid: too many params
89 1.1 christos "abc~v,v,v,v,v,5F"
90 1.1 christos # Valid: FORMAT-EXPONENTIAL-FLOAT, (i() i() i() i() c() c() c() r | . *)
91 1.1 christos "abc~v,v,v,v,v,v,vE"
92 1.1 christos # Invalid: too many params
93 1.1 christos "abc~v,v,v,v,v,v,v,5E"
94 1.1 christos # Valid: FORMAT-GENERAL-FLOAT, (i() i() i() i() c() c() c() r | . *)
95 1.1 christos "abc~v,v,v,v,v,v,vG"
96 1.1 christos # Invalid: too many params
97 1.1 christos "abc~v,v,v,v,v,v,v,5G"
98 1.1 christos # Valid: FORMAT-DOLLARS-FLOAT, (i() i() i() c() r | . *)
99 1.1 christos "abc~v,v,v,v$"
100 1.1 christos # Invalid: too many params
101 1.1 christos "abc~v,v,v,v,5$"
102 1.1 christos # Valid: FORMAT-TERPRI, (i() | . *)
103 1.1 christos "abc~v%"
104 1.1 christos # Invalid: too many params
105 1.1 christos "abc~v,5%"
106 1.1 christos # Valid: FORMAT-FRESH-LINE, (i() | . *)
107 1.1 christos "abc~v&"
108 1.1 christos # Invalid: too many params
109 1.1 christos "abc~v,5&"
110 1.1 christos # Valid: FORMAT-PAGE, (i() | . *)
111 1.1 christos "abc~v|"
112 1.1 christos # Invalid: too many params
113 1.1 christos "abc~v,5|"
114 1.1 christos # Valid: FORMAT-TILDE, (i() | . *)
115 1.1 christos "abc~v~"
116 1.1 christos # Invalid: too many params
117 1.1 christos "abc~v,5~"
118 1.1 christos # Valid: underscore, ( | . *)
119 1.1 christos "abc~_"
120 1.1 christos # Invalid: too many params
121 1.1 christos "abc~5_"
122 1.1 christos # Valid: FORMAT-TABULATE, (i() i() | . *)
123 1.1 christos "abc~v,vT"
124 1.1 christos # Invalid: too many params
125 1.1 christos "abc~v,v,5T"
126 1.1 christos # Valid: FORMAT-GOTO absolute, (* r c | . *)
127 1.1 christos "abc~S~F~S~2@*~C"
128 1.1 christos # Invalid: type incompatibility
129 1.1 christos "abc~S~F~S~1@*~C"
130 1.1 christos # Valid: FORMAT-GOTO backward, (* c r | . *)
131 1.1 christos "abc~S~S~F~2:*~C"
132 1.1 christos # Invalid: type incompatibility
133 1.1 christos "abc~S~S~F~1:*~C"
134 1.1 christos # Invalid: too many params
135 1.1 christos "abc~v,4*"
136 1.1 christos # Valid: FORMAT-GOTO with large number
137 1.1 christos "abc~S~F~S~1000000@*~C"
138 1.1 christos # Valid: FORMAT-INDIRECTION, (~ ( | . *) | . *)
139 1.1 christos "abc~?"
140 1.1 christos # Valid: FORMAT-INDIRECTION, (~ | . *)
141 1.1 christos "abc~@?"
142 1.1 christos # Invalid: too many params
143 1.1 christos "abc~4?"
144 1.1 christos # Valid: FORMAT-CALL-USER-FUNCTION, (* | . *)
145 1.1 christos "abc~/FOOBAR/"
146 1.1 christos # Invalid: too many params
147 1.1 christos "abc~4/FOOBAR/"
148 1.1 christos # Invalid: unterminated
149 1.1 christos "abc~/FOOB"
150 1.1 christos # Invalid: nesting mismatch
151 1.1 christos "abc~(~/FOOB~)/"
152 1.1 christos # Valid: FORMAT-CASE-CONVERSION, (* | . *)
153 1.1 christos "abc~(~S~)"
154 1.1 christos # Invalid: too many params
155 1.1 christos "abc~4(~S~)"
156 1.1 christos # Invalid: too many params
157 1.1 christos "abc~(~S~4)"
158 1.1 christos # Invalid: unterminated
159 1.1 christos "abc~(~S"
160 1.1 christos # Invalid: separator
161 1.1 christos "abc~(~S~;~S~)"
162 1.1 christos # Valid: FORMAT-CONDITIONAL, (i() c | . *)
163 1.1 christos "abc~@[~D~]~C"
164 1.1 christos # Valid: FORMAT-CONDITIONAL, (i() | . *)
165 1.1 christos "abc~@[~D~D~]~C"
166 1.1 christos # Invalid: separator
167 1.1 christos "abc~@[~D~;~D~]~C"
168 1.1 christos # Valid: FORMAT-CONDITIONAL, (* i c | . *)
169 1.1 christos "abc~:[~X~;~D~]~C"
170 1.1 christos # Invalid: missing separator
171 1.1 christos "abc~:[~D~]~C"
172 1.1 christos # Invalid: too many separators
173 1.1 christos "abc~:[~X~;~D~;~E~]~C"
174 1.1 christos # Valid: FORMAT-CONDITIONAL, (* | . *)
175 1.1 christos "abc~[~D~;~X~]~C"
176 1.1 christos # Valid: FORMAT-CONDITIONAL, (* i c | . *)
177 1.1 christos "abc~[~D~;~X~:;~R~]~C"
178 1.1 christos # Invalid: default clause not last
179 1.1 christos "abc~[~D~;~X~:;~R~;~R~]~C"
180 1.1 christos # Invalid: too many params
181 1.1 christos "abc~4@[~D~]"
182 1.1 christos # Invalid: too many params
183 1.1 christos "abc~@[~D~4]"
184 1.1 christos # Invalid: too many params
185 1.1 christos "abc~4:[~D~;~X~]"
186 1.1 christos # Invalid: too many params
187 1.1 christos "abc~:[~D~4;~X~]"
188 1.1 christos # Invalid: too many params
189 1.1 christos "abc~:[~D~;~X~4]"
190 1.1 christos # Valid: FORMAT-CONDITIONAL, one param, without colon or atsign
191 1.1 christos "abc~4[~D~;~X~]"
192 1.1 christos # Invalid: too many params
193 1.1 christos "abc~4,4[~D~;~X~]"
194 1.1 christos # Invalid: too many params
195 1.1 christos "abc~[~D~4;~X~]"
196 1.1 christos # Invalid: too many params
197 1.1 christos "abc~[~D~;~X~4]"
198 1.1 christos # Valid: FORMAT-ITERATION, (( | . *) | . *)
199 1.1 christos "abc~{~~~}"
200 1.1 christos # Valid: FORMAT-ITERATION, (( | . ( | . *)) | . *)
201 1.1 christos "abc~:{~~~}"
202 1.1 christos # Valid: FORMAT-ITERATION, ( | . *)
203 1.1 christos "abc~@{~~~}"
204 1.1 christos # Valid: FORMAT-ITERATION, ( | . ( | . *))
205 1.1 christos "abc~:@{~~~}"
206 1.1 christos # Valid: FORMAT-ITERATION with indirection, (~ ( | . *) | . *)
207 1.1 christos "abc~{~}"
208 1.1 christos # Valid: FORMAT-ITERATION with indirection, (~ ( | . ( | . *)) | . *)
209 1.1 christos "abc~:{~}"
210 1.1 christos # Valid: FORMAT-ITERATION with indirection, (~ | . *)
211 1.1 christos "abc~@{~}"
212 1.1 christos # Valid: FORMAT-ITERATION with indirection, (~ | . ( | . *))
213 1.1 christos "abc~:@{~}"
214 1.1 christos # Valid: FORMAT-ITERATION with loop, (( | . i c) | . *)
215 1.1 christos "abc~{~D ~C~}"
216 1.1 christos # Valid: FORMAT-ITERATION with loop, (( | . (i c | . *)) | . *)
217 1.1 christos "abc~:{~D ~C~}"
218 1.1 christos # Valid: FORMAT-ITERATION with loop, ( | . i c)
219 1.1 christos "abc~@{~D ~C~}"
220 1.1 christos # Valid: FORMAT-ITERATION with loop, ( | . (i c | . *))
221 1.1 christos "abc~:@{~D ~C~}"
222 1.1 christos # Valid: FORMAT-ITERATION with variable-advance loop, (( | . *) | . *)
223 1.1 christos "abc~{~[~D~]~}"
224 1.1 christos # Valid: FORMAT-ITERATION with variable-advance loop, (( | . (* | . *)) | . *)
225 1.1 christos "abc~:{~[~D~]~}"
226 1.1 christos # Valid: FORMAT-ITERATION with variable-advance loop, ( | . *)
227 1.1 christos "abc~@{~[~D~]~}"
228 1.1 christos # Valid: FORMAT-ITERATION with variable-advance loop, ( | . (* | . *))
229 1.1 christos "abc~:@{~[~D~]~}"
230 1.1 christos # Invalid: separator
231 1.1 christos "abc~{~D~;~C~}"
232 1.1 christos # Valid: FORMAT-JUSTIFICATION, (i() i() i() c() i | . *)
233 1.1 christos "abc~v,v,v,v<~D~>"
234 1.1 christos # Invalid: too many params
235 1.1 christos "abc~v,v,v,v,4<~D~>"
236 1.1 christos # Valid: separators
237 1.1 christos "abc~<~D~;~X~;def~>"
238 1.1 christos # Invalid: wrongly nested
239 1.1 christos "abc~<~(~>~)"
240 1.1 christos # Invalid: wrongly nested
241 1.1 christos "abc~{~(~}~)"
242 1.1 christos # Invalid: wrongly nested
243 1.1 christos "abc~{~<~}~>"
244 1.1 christos # Valid: FORMAT-CALL, (f * | . *)
245 1.1 christos "abc~!"
246 1.1 christos # Valid: any number of arguments
247 1.1 christos "abc~v,v,v,v,v!"
248 1.1 christos # Invalid: type incompatibility between integer and list
249 1.1 christos "abc~D~:*~{~D~}"
250 1.1 christos # Invalid: type incompatibility between real and list
251 1.1 christos "abc~{~S~}~:*~F"
252 1.1 christos # Valid: list must be empty
253 1.1 christos "abc~{~C~}~:*~{~D~}"
254 1.1 christos EOF
255 1.1 christos
256 1.1 christos : ${XGETTEXT=xgettext}
257 1.1 christos n=0
258 1.1 christos while read comment; do
259 1.1 christos read string
260 1.1 christos n=`expr $n + 1`
261 1.1 christos tmpfiles="$tmpfiles f-l-1-$n.in f-l-1-$n.po"
262 1.1 christos cat <<EOF > f-l-1-$n.in
263 1.1 christos (gettext ${string})
264 1.1 christos EOF
265 1.1 christos ${XGETTEXT} -L Lisp -o f-l-1-$n.po f-l-1-$n.in || exit 1
266 1.1 christos test -f f-l-1-$n.po || exit 1
267 1.1 christos fail=
268 1.1 christos if echo "$comment" | grep 'Valid:' > /dev/null; then
269 1.1 christos if grep lisp-format f-l-1-$n.po > /dev/null; then
270 1.1 christos :
271 1.1 christos else
272 1.1 christos fail=yes
273 1.1 christos fi
274 1.1 christos else
275 1.1 christos if grep lisp-format f-l-1-$n.po > /dev/null; then
276 1.1 christos fail=yes
277 1.1 christos else
278 1.1 christos :
279 1.1 christos fi
280 1.1 christos fi
281 1.1 christos if test -n "$fail"; then
282 1.1 christos echo "Format string recognition error:" 1>&2
283 1.1 christos cat f-l-1-$n.in 1>&2
284 1.1 christos echo "Got:" 1>&2
285 1.1 christos cat f-l-1-$n.po 1>&2
286 1.1 christos exit 1
287 1.1 christos fi
288 1.1 christos rm -f f-l-1-$n.in f-l-1-$n.po
289 1.1 christos done < f-l-1.data
290 1.1 christos
291 1.1 christos rm -fr $tmpfiles
292 1.1 christos
293 1.1 christos exit 0
294