2 . "${srcdir=.}/init.sh"; path_prepend_ . ../src
4 # Test checking of Lisp format strings.
6 cat <<\EOF > f-sc-2.data
7 # Valid: ~~ doesn't count
10 # Invalid: invalid msgstr
13 # Valid: ~! doesn't count
16 # Valid: ~Q doesn't count
19 # Valid: same argument
22 # Valid: same arguments
23 msgid "abc~1000000@*~Ddef"
24 msgstr "~1000000@*xyz~D"
27 msgstr "xyz~2@*~F~2:*~C~2:*~D"
28 # Invalid: too few arguments
29 msgid "abc~1@*~Sdef~0@*~S"
31 # Invalid: too many arguments
34 # Invalid: missing non-final argument
35 msgid "abc~1@*~Sdef~0@*~F"
37 # Invalid: added non-final argument
40 # Valid: formatting variations
43 # Valid: formatting variations
46 # Valid: type compatibility
49 # Valid: type compatibility
52 # Valid: type compatibility
55 # Valid: type compatibility
58 # Valid: type compatibility
61 # Valid: optional plural
64 # Valid: type compatibility
67 # Valid: type compatibility
70 # Valid: type compatibility
73 # Invalid: type incompatibility
76 # Invalid: type incompatibility
79 # Invalid: type incompatibility
82 # Invalid: type incompatibility
85 # Invalid: type incompatibility
88 # Invalid: type incompatibility
91 # Invalid: type incompatibility
94 # Invalid: type incompatibility
97 # Invalid: type incompatibility
100 # Invalid: type incompatibility
103 # Valid: extra formatting
105 msgstr "xyz~D~_d~/ef~%~S"
106 # Valid: extra force-output
108 msgstr "xyz~Ddef~S~!"
109 # Valid: FORMAT-GOTO doesn't consume an argument by itself
110 msgid "abc~5@*~Ddef~C"
111 msgstr "xyz~6@*~C~2@*uvw~5@*~R"
112 # Valid: ~? and ~K are equivalent
118 # Valid: case conversion is optional
121 # Valid: case conversion is optional
122 msgid "abc~(~D~^ ~D~)"
124 # Invalid: ~^ matters
125 msgid "abc~(~D~^ ~D~)"
126 msgstr "xyz~(~D ~D~)"
127 # Valid: case conversion is optional, and it doesn't catch ~^
128 msgid "abc~(~D~^ ~D~)def~C"
129 msgstr "xyz~D~^ ~Duvw~C"
130 # Valid: synonymous conditionals
131 msgid "abc~@[~D~]def~C"
132 msgstr "xyz~:[~;~:*~D~]~C"
133 # Valid: synonymous conditionals
135 msgstr "abc~[null~;eins~:;~:*~D~]def"
136 # Valid: conditionals are optional and don't catch ~^
137 msgid "abc~:[~;~]~^~D~C"
138 msgstr "xyz~:[uvw~^~R~;~:*~S~^~D~]~C"
139 # Invalid: ~:[ requires an argument, ~1@* doesn't
140 msgid "abc~1@*~^~D~C"
141 msgstr "xyz~:[uvw~^~R~;~:*~S~^~D~]~C"
142 # Invalid: ~{~} is special
157 # Invalid: @: matters
160 # Valid: permutation inside iteration
162 msgstr "xyz~{~1@*~C~2:*~D~1*~}"
163 # Invalid: permutation inside iteration, but wrong position at iteration end
165 msgstr "xyz~{~1@*~C~2:*~D~}"
166 # Invalid: ~^ inside iteration matters
167 msgid "abc~{~D ~^~C~}"
168 msgstr "xyz~{~D ~C~}"
169 # Invalid: ~^ inside iteration depends on position
170 msgid "abc~{~D ~^~C~}"
171 msgstr "xyz~{~1@*~C~^~2:*~D~1*~}"
172 # Invalid: ~^ inside iteration depends on position
173 msgid "abc~{~D ~^~C~}"
174 msgstr "xyz~{~1@*~C~2:*~^~D~1*~}"
175 # Invalid: ~^ inside iteration depends on position
176 msgid "abc~{~D ~^~C~}"
177 msgstr "xyz~{~1@*~C~2:*~D~^~1*~}"
178 # Invalid: ~^ inside iteration depends on position
179 msgid "abc~{~D ~^~C~}"
180 msgstr "xyz~{~1@*~C~2:*~D~1*~^~}"
181 # Invalid: type compatibility with non-strict checking
183 msgid_plural "abc~{~c~c~}"
184 msgstr[0] "xyz~{~c~d~}"
185 msgstr[1] "xyz~{~c~d~}"
190 while read comment; do
194 if echo "$msgstr_line" | grep '^msgid_plural' > /dev/null; then
195 msgid_plural_line="$msgstr_line"
200 if test -z "$msgid_plural_line"; then
201 cat <<EOF > f-sc-2-$n.po
207 cat <<EOF > f-l-2-$n.po
216 if echo "$comment" | grep 'Valid:' > /dev/null; then
217 if ${MSGFMT} --check-format -o f-sc-2-$n.mo f-sc-2-$n.po; then
223 ${MSGFMT} --check-format -o f-sc-2-$n.mo f-sc-2-$n.po 2> /dev/null
230 if test -n "$fail"; then
231 echo "Format string checking error:" 1>&2
232 cat f-sc-2-$n.po 1>&2
235 rm -f f-sc-2-$n.po f-sc-2-$n.mo