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