1#! /bin/sh
2
3# Test checking of Lisp format strings.
4
5tmpfiles=""
6trap 'rm -fr $tmpfiles' 1 2 3 15
7
8tmpfiles="$tmpfiles f-sc-2.data"
9cat <<\EOF > f-sc-2.data
10# Valid: ~~ doesn't count
11msgid  "abc~~def"
12msgstr "xyz"
13# Invalid: invalid msgstr
14msgid  "abc~~def"
15msgstr "xyz~"
16# Valid: ~! doesn't count
17msgid  "abc~!def"
18msgstr "xyz"
19# Valid: ~Q doesn't count
20msgid  "abc~Qdef"
21msgstr "xyz"
22# Valid: same argument
23msgid  "abc~Ddef"
24msgstr "xyz~D"
25# Valid: same arguments
26msgid  "abc~1000000@*~Ddef"
27msgstr "~1000000@*xyz~D"
28# Valid: permutation
29msgid  "abc~D~C~Fdef"
30msgstr "xyz~2@*~F~2:*~C~2:*~D"
31# Invalid: too few arguments
32msgid  "abc~1@*~Sdef~0@*~S"
33msgstr "xyz~S"
34# Invalid: too many arguments
35msgid  "abc~Ddef"
36msgstr "xyz~Duvw~C"
37# Invalid: missing non-final argument
38msgid  "abc~1@*~Sdef~0@*~F"
39msgstr "xyz~1@*~S"
40# Invalid: added non-final argument
41msgid  "abc~1@*~Ddef"
42msgstr "xyz~F~D"
43# Valid: formatting variations
44msgid  "abc~Sdef"
45msgstr "xyz~:S"
46# Valid: formatting variations
47msgid  "abc~4Sdef"
48msgstr "xyz~7S"
49# Valid: type compatibility
50msgid  "abc~Sdef"
51msgstr "xyz~Y"
52# Valid: type compatibility
53msgid  "abc~Ddef"
54msgstr "xyz~B"
55# Valid: type compatibility
56msgid  "abc~Ddef"
57msgstr "xyz~O"
58# Valid: type compatibility
59msgid  "abc~Ddef"
60msgstr "xyz~X"
61# Valid: type compatibility
62msgid  "abc~Ddef"
63msgstr "xyz~R"
64# Valid: optional plural
65msgid  "~D egg~:P"
66msgstr "~D Eier"
67# Valid: type compatibility
68msgid  "abc~Fdef"
69msgstr "xyz~E"
70# Valid: type compatibility
71msgid  "abc~Fdef"
72msgstr "xyz~G"
73# Valid: type compatibility
74msgid  "abc~Fdef"
75msgstr "xyz~$"
76# Invalid: type incompatibility
77msgid  "abc~Fdef"
78msgstr "xyz~D"
79# Invalid: type incompatibility
80msgid  "abc~Ddef"
81msgstr "xyz~C"
82# Invalid: type incompatibility
83msgid  "abc~Fdef"
84msgstr "xyz~C"
85# Invalid: type incompatibility
86msgid  "abc~Sdef"
87msgstr "xyz~D"
88# Invalid: type incompatibility
89msgid  "abc~Sdef"
90msgstr "xyz~F"
91# Invalid: type incompatibility
92msgid  "abc~Sdef"
93msgstr "xyz~C"
94# Invalid: type incompatibility
95msgid  "abc~Fdef"
96msgstr "xyz~I"
97# Invalid: type incompatibility
98msgid  "abc~Ddef"
99msgstr "xyz~I"
100# Invalid: type incompatibility
101msgid  "abc~Sdef"
102msgstr "xyz~I"
103# Invalid: type incompatibility
104msgid  "abc~Cdef"
105msgstr "xyz~I"
106# Valid: extra formatting
107msgid  "abc~Ddef~S"
108msgstr "xyz~D~_d~/ef~%~S"
109# Valid: extra force-output
110msgid  "abc~Ddef~S"
111msgstr "xyz~Ddef~S~!"
112# Valid: FORMAT-GOTO doesn't consume an argument by itself
113msgid  "abc~5@*~Ddef~C"
114msgstr "xyz~6@*~C~2@*uvw~5@*~R"
115# Valid: ~? and ~K are equivalent
116msgid  "abc~?"
117msgstr "xyz~K"
118# Invalid: @ matters
119msgid  "abc~?"
120msgstr "xyz~@?"
121# Valid: case conversion is optional
122msgid  "abc~(~S~)"
123msgstr "xyz~S"
124# Valid: case conversion is optional
125msgid  "abc~(~D~^ ~D~)"
126msgstr "xyz~D~^ ~D"
127# Invalid: ~^ matters
128msgid  "abc~(~D~^ ~D~)"
129msgstr "xyz~(~D ~D~)"
130# Valid: case conversion is optional, and it doesn't catch ~^
131msgid  "abc~(~D~^ ~D~)def~C"
132msgstr "xyz~D~^ ~Duvw~C"
133# Valid: synonymous conditionals
134msgid  "abc~@[~D~]def~C"
135msgstr "xyz~:[~;~:*~D~]~C"
136# Valid: synonymous conditionals
137msgid  "abc~Ddef"
138msgstr "abc~[null~;eins~:;~:*~D~]def"
139# Valid: conditionals are optional and don't catch ~^
140msgid  "abc~:[~;~]~^~D~C"
141msgstr "xyz~:[uvw~^~R~;~:*~S~^~D~]~C"
142# Invalid: ~:[ requires an argument, ~1@* doesn't
143msgid  "abc~1@*~^~D~C"
144msgstr "xyz~:[uvw~^~R~;~:*~S~^~D~]~C"
145# Invalid: ~{~} is special
146msgid  "abc~{ ~}"
147msgstr "xyz~{~}"
148# Invalid: @ matters
149msgid  "abc~{~S~}"
150msgstr "xyz~@{~S~}"
151# Invalid: @ matters
152msgid  "abc~:{~S~}"
153msgstr "xyz~@:{~S~}"
154# Invalid: : matters
155msgid  "abc~{~S~}"
156msgstr "xyz~:{~S~}"
157# Invalid: : matters
158msgid  "abc~@{~S~}"
159msgstr "xyz~@:{~S~}"
160# Invalid: @: matters
161msgid  "abc~{~S~}"
162msgstr "xyz~@:{~S~}"
163# Valid: permutation inside iteration
164msgid  "abc~{~D ~C~}"
165msgstr "xyz~{~1@*~C~2:*~D~1*~}"
166# Invalid: permutation inside iteration, but wrong position at iteration end
167msgid  "abc~{~D ~C~}"
168msgstr "xyz~{~1@*~C~2:*~D~}"
169# Invalid: ~^ inside iteration matters
170msgid  "abc~{~D ~^~C~}"
171msgstr "xyz~{~D ~C~}"
172# Invalid: ~^ inside iteration depends on position
173msgid  "abc~{~D ~^~C~}"
174msgstr "xyz~{~1@*~C~^~2:*~D~1*~}"
175# Invalid: ~^ inside iteration depends on position
176msgid  "abc~{~D ~^~C~}"
177msgstr "xyz~{~1@*~C~2:*~^~D~1*~}"
178# Invalid: ~^ inside iteration depends on position
179msgid  "abc~{~D ~^~C~}"
180msgstr "xyz~{~1@*~C~2:*~D~^~1*~}"
181# Invalid: ~^ inside iteration depends on position
182msgid  "abc~{~D ~^~C~}"
183msgstr "xyz~{~1@*~C~2:*~D~1*~^~}"
184EOF
185
186: ${MSGFMT=msgfmt}
187n=0
188while read comment; do
189  read msgid_line
190  read msgstr_line
191  n=`expr $n + 1`
192  tmpfiles="$tmpfiles f-sc-2-$n.po f-sc-2-$n.mo"
193  cat <<EOF > f-sc-2-$n.po
194#, scheme-format
195${msgid_line}
196${msgstr_line}
197EOF
198  fail=
199  if echo "$comment" | grep 'Valid:' > /dev/null; then
200    if ${MSGFMT} --check-format -o f-sc-2-$n.mo f-sc-2-$n.po; then
201      :
202    else
203      fail=yes
204    fi
205  else
206    ${MSGFMT} --check-format -o f-sc-2-$n.mo f-sc-2-$n.po 2> /dev/null
207    if test $? = 1; then
208      :
209    else
210      fail=yes
211    fi
212  fi
213  if test -n "$fail"; then
214    echo "Format string checking error:" 1>&2
215    cat f-sc-2-$n.po 1>&2
216    exit 1
217  fi
218  rm -f f-sc-2-$n.po f-sc-2-$n.mo
219done < f-sc-2.data
220
221rm -fr $tmpfiles
222
223exit 0
224