xref: /netbsd-src/external/gpl2/gettext/dist/gettext-tools/tests/format-c-2 (revision 946379e7b37692fc43f68eb0d1c10daa0a7f3b6c)
1*946379e7Schristos#! /bin/sh
2*946379e7Schristos
3*946379e7Schristos# Test checking of C format strings.
4*946379e7Schristos
5*946379e7Schristostmpfiles=""
6*946379e7Schristostrap 'rm -fr $tmpfiles' 1 2 3 15
7*946379e7Schristos
8*946379e7Schristostmpfiles="$tmpfiles f-c-2.data"
9*946379e7Schristoscat <<\EOF > f-c-2.data
10*946379e7Schristos# Valid: %% doesn't count
11*946379e7Schristosmsgid  "abc%%def"
12*946379e7Schristosmsgstr "xyz"
13*946379e7Schristos# Invalid: invalid msgstr
14*946379e7Schristosmsgid  "abc%%def"
15*946379e7Schristosmsgstr "xyz%"
16*946379e7Schristos# Valid: same arguments
17*946379e7Schristosmsgid  "abc%s%gdef"
18*946379e7Schristosmsgstr "xyz%s%g"
19*946379e7Schristos# Valid: same arguments, with different widths
20*946379e7Schristosmsgid  "abc%2sdef"
21*946379e7Schristosmsgstr "xyz%3s"
22*946379e7Schristos# Valid: same arguments but in numbered syntax
23*946379e7Schristosmsgid  "abc%s%gdef"
24*946379e7Schristosmsgstr "xyz%1$s%2$g"
25*946379e7Schristos# Valid: permutation
26*946379e7Schristosmsgid  "abc%s%g%cdef"
27*946379e7Schristosmsgstr "xyz%3$c%2$g%1$s"
28*946379e7Schristos# Invalid: too few arguments
29*946379e7Schristosmsgid  "abc%2$udef%1$s"
30*946379e7Schristosmsgstr "xyz%1$s"
31*946379e7Schristos# Invalid: too few arguments
32*946379e7Schristosmsgid  "abc%sdef%u"
33*946379e7Schristosmsgstr "xyz%s"
34*946379e7Schristos# Invalid: too many arguments
35*946379e7Schristosmsgid  "abc%udef"
36*946379e7Schristosmsgstr "xyz%uvw%c"
37*946379e7Schristos# Valid: same numbered arguments, with different widths
38*946379e7Schristosmsgid  "abc%2$5s%1$4s"
39*946379e7Schristosmsgstr "xyz%2$4s%1$5s"
40*946379e7Schristos# Invalid: missing argument
41*946379e7Schristosmsgid  "abc%2$sdef%1$u"
42*946379e7Schristosmsgstr "xyz%1$u"
43*946379e7Schristos# Invalid: missing argument
44*946379e7Schristosmsgid  "abc%1$sdef%2$u"
45*946379e7Schristosmsgstr "xyz%2$u"
46*946379e7Schristos# Invalid: added argument
47*946379e7Schristosmsgid  "abc%1$udef"
48*946379e7Schristosmsgstr "xyz%1$uvw%2$c"
49*946379e7Schristos# Valid: type compatibility
50*946379e7Schristosmsgid  "abc%i"
51*946379e7Schristosmsgstr "xyz%d"
52*946379e7Schristos# Valid: type compatibility
53*946379e7Schristosmsgid  "abc%o"
54*946379e7Schristosmsgstr "xyz%u"
55*946379e7Schristos# Valid: type compatibility
56*946379e7Schristosmsgid  "abc%u"
57*946379e7Schristosmsgstr "xyz%x"
58*946379e7Schristos# Valid: type compatibility
59*946379e7Schristosmsgid  "abc%u"
60*946379e7Schristosmsgstr "xyz%X"
61*946379e7Schristos# Valid: type compatibility
62*946379e7Schristosmsgid  "abc%e"
63*946379e7Schristosmsgstr "xyz%E"
64*946379e7Schristos# Valid: type compatibility
65*946379e7Schristosmsgid  "abc%e"
66*946379e7Schristosmsgstr "xyz%f"
67*946379e7Schristos# Valid: type compatibility
68*946379e7Schristosmsgid  "abc%e"
69*946379e7Schristosmsgstr "xyz%F"
70*946379e7Schristos# Valid: type compatibility
71*946379e7Schristosmsgid  "abc%e"
72*946379e7Schristosmsgstr "xyz%g"
73*946379e7Schristos# Valid: type compatibility
74*946379e7Schristosmsgid  "abc%e"
75*946379e7Schristosmsgstr "xyz%G"
76*946379e7Schristos# Valid: type compatibility
77*946379e7Schristosmsgid  "abc%e"
78*946379e7Schristosmsgstr "xyz%a"
79*946379e7Schristos# Valid: type compatibility
80*946379e7Schristosmsgid  "abc%e"
81*946379e7Schristosmsgstr "xyz%A"
82*946379e7Schristos# Invalid: type incompatibility
83*946379e7Schristosmsgid  "abc%c"
84*946379e7Schristosmsgstr "xyz%s"
85*946379e7Schristos# Invalid: type incompatibility
86*946379e7Schristosmsgid  "abc%c"
87*946379e7Schristosmsgstr "xyz%i"
88*946379e7Schristos# Invalid: type incompatibility
89*946379e7Schristosmsgid  "abc%c"
90*946379e7Schristosmsgstr "xyz%o"
91*946379e7Schristos# Invalid: type incompatibility
92*946379e7Schristosmsgid  "abc%c"
93*946379e7Schristosmsgstr "xyz%e"
94*946379e7Schristos# Invalid: type incompatibility
95*946379e7Schristosmsgid  "abc%c"
96*946379e7Schristosmsgstr "xyz%p"
97*946379e7Schristos# Invalid: type incompatibility
98*946379e7Schristosmsgid  "abc%c"
99*946379e7Schristosmsgstr "xyz%n"
100*946379e7Schristos# Invalid: type incompatibility
101*946379e7Schristosmsgid  "abc%s"
102*946379e7Schristosmsgstr "xyz%i"
103*946379e7Schristos# Invalid: type incompatibility
104*946379e7Schristosmsgid  "abc%s"
105*946379e7Schristosmsgstr "xyz%o"
106*946379e7Schristos# Invalid: type incompatibility
107*946379e7Schristosmsgid  "abc%s"
108*946379e7Schristosmsgstr "xyz%e"
109*946379e7Schristos# Invalid: type incompatibility
110*946379e7Schristosmsgid  "abc%s"
111*946379e7Schristosmsgstr "xyz%p"
112*946379e7Schristos# Invalid: type incompatibility
113*946379e7Schristosmsgid  "abc%s"
114*946379e7Schristosmsgstr "xyz%n"
115*946379e7Schristos# Invalid: type incompatibility
116*946379e7Schristosmsgid  "abc%i"
117*946379e7Schristosmsgstr "xyz%o"
118*946379e7Schristos# Invalid: type incompatibility
119*946379e7Schristosmsgid  "abc%i"
120*946379e7Schristosmsgstr "xyz%e"
121*946379e7Schristos# Invalid: type incompatibility
122*946379e7Schristosmsgid  "abc%i"
123*946379e7Schristosmsgstr "xyz%p"
124*946379e7Schristos# Invalid: type incompatibility
125*946379e7Schristosmsgid  "abc%i"
126*946379e7Schristosmsgstr "xyz%n"
127*946379e7Schristos# Invalid: type incompatibility
128*946379e7Schristosmsgid  "abc%u"
129*946379e7Schristosmsgstr "xyz%e"
130*946379e7Schristos# Invalid: type incompatibility
131*946379e7Schristosmsgid  "abc%u"
132*946379e7Schristosmsgstr "xyz%p"
133*946379e7Schristos# Invalid: type incompatibility
134*946379e7Schristosmsgid  "abc%u"
135*946379e7Schristosmsgstr "xyz%n"
136*946379e7Schristos# Invalid: type incompatibility
137*946379e7Schristosmsgid  "abc%e"
138*946379e7Schristosmsgstr "xyz%p"
139*946379e7Schristos# Invalid: type incompatibility
140*946379e7Schristosmsgid  "abc%e"
141*946379e7Schristosmsgstr "xyz%n"
142*946379e7Schristos# Invalid: type incompatibility
143*946379e7Schristosmsgid  "abc%p"
144*946379e7Schristosmsgstr "xyz%n"
145*946379e7Schristos# Invalid: type incompatibility due to size
146*946379e7Schristosmsgid  "abc%i"
147*946379e7Schristosmsgstr "xyz%hhi"
148*946379e7Schristos# Invalid: type incompatibility due to size
149*946379e7Schristosmsgid  "abc%i"
150*946379e7Schristosmsgstr "xyz%hi"
151*946379e7Schristos# Invalid: type incompatibility due to size
152*946379e7Schristosmsgid  "abc%i"
153*946379e7Schristosmsgstr "xyz%li"
154*946379e7Schristos# Invalid: type incompatibility due to size
155*946379e7Schristosmsgid  "abc%i"
156*946379e7Schristosmsgstr "xyz%lli"
157*946379e7Schristos# Invalid: type incompatibility due to size
158*946379e7Schristosmsgid  "abc%i"
159*946379e7Schristosmsgstr "xyz%Li"
160*946379e7Schristos# Invalid: type incompatibility due to size
161*946379e7Schristosmsgid  "abc%i"
162*946379e7Schristosmsgstr "xyz%qi"
163*946379e7Schristos# Invalid: type incompatibility due to size
164*946379e7Schristosmsgid  "abc%i"
165*946379e7Schristosmsgstr "xyz%ji"
166*946379e7Schristos# Invalid: type incompatibility due to size
167*946379e7Schristosmsgid  "abc%i"
168*946379e7Schristosmsgstr "xyz%zi"
169*946379e7Schristos# Invalid: type incompatibility due to size
170*946379e7Schristosmsgid  "abc%i"
171*946379e7Schristosmsgstr "xyz%ti"
172*946379e7Schristos# Invalid: type incompatibility due to size
173*946379e7Schristosmsgid  "abc%hhi"
174*946379e7Schristosmsgstr "xyz%hi"
175*946379e7Schristos# Invalid: type incompatibility due to size
176*946379e7Schristosmsgid  "abc%hhi"
177*946379e7Schristosmsgstr "xyz%li"
178*946379e7Schristos# Invalid: type incompatibility due to size
179*946379e7Schristosmsgid  "abc%hhi"
180*946379e7Schristosmsgstr "xyz%lli"
181*946379e7Schristos# Invalid: type incompatibility due to size
182*946379e7Schristosmsgid  "abc%hhi"
183*946379e7Schristosmsgstr "xyz%Li"
184*946379e7Schristos# Invalid: type incompatibility due to size
185*946379e7Schristosmsgid  "abc%hhi"
186*946379e7Schristosmsgstr "xyz%qi"
187*946379e7Schristos# Invalid: type incompatibility due to size
188*946379e7Schristosmsgid  "abc%hhi"
189*946379e7Schristosmsgstr "xyz%ji"
190*946379e7Schristos# Invalid: type incompatibility due to size
191*946379e7Schristosmsgid  "abc%hhi"
192*946379e7Schristosmsgstr "xyz%zi"
193*946379e7Schristos# Invalid: type incompatibility due to size
194*946379e7Schristosmsgid  "abc%hhi"
195*946379e7Schristosmsgstr "xyz%ti"
196*946379e7Schristos# Invalid: type incompatibility due to size
197*946379e7Schristosmsgid  "abc%hi"
198*946379e7Schristosmsgstr "xyz%li"
199*946379e7Schristos# Invalid: type incompatibility due to size
200*946379e7Schristosmsgid  "abc%hi"
201*946379e7Schristosmsgstr "xyz%lli"
202*946379e7Schristos# Invalid: type incompatibility due to size
203*946379e7Schristosmsgid  "abc%hi"
204*946379e7Schristosmsgstr "xyz%Li"
205*946379e7Schristos# Invalid: type incompatibility due to size
206*946379e7Schristosmsgid  "abc%hi"
207*946379e7Schristosmsgstr "xyz%qi"
208*946379e7Schristos# Invalid: type incompatibility due to size
209*946379e7Schristosmsgid  "abc%hi"
210*946379e7Schristosmsgstr "xyz%ji"
211*946379e7Schristos# Invalid: type incompatibility due to size
212*946379e7Schristosmsgid  "abc%hi"
213*946379e7Schristosmsgstr "xyz%zi"
214*946379e7Schristos# Invalid: type incompatibility due to size
215*946379e7Schristosmsgid  "abc%hi"
216*946379e7Schristosmsgstr "xyz%ti"
217*946379e7Schristos# Invalid: type incompatibility due to size
218*946379e7Schristosmsgid  "abc%li"
219*946379e7Schristosmsgstr "xyz%lli"
220*946379e7Schristos# Invalid: type incompatibility due to size
221*946379e7Schristosmsgid  "abc%li"
222*946379e7Schristosmsgstr "xyz%Li"
223*946379e7Schristos# Invalid: type incompatibility due to size
224*946379e7Schristosmsgid  "abc%li"
225*946379e7Schristosmsgstr "xyz%qi"
226*946379e7Schristos# Invalid: type incompatibility due to size
227*946379e7Schristosmsgid  "abc%li"
228*946379e7Schristosmsgstr "xyz%ji"
229*946379e7Schristos# Invalid: type incompatibility due to size
230*946379e7Schristosmsgid  "abc%li"
231*946379e7Schristosmsgstr "xyz%zi"
232*946379e7Schristos# Invalid: type incompatibility due to size
233*946379e7Schristosmsgid  "abc%li"
234*946379e7Schristosmsgstr "xyz%ti"
235*946379e7Schristos# Invalid: type incompatibility due to size
236*946379e7Schristosmsgid  "abc%lli"
237*946379e7Schristosmsgstr "xyz%ji"
238*946379e7Schristos# Invalid: type incompatibility due to size
239*946379e7Schristosmsgid  "abc%lli"
240*946379e7Schristosmsgstr "xyz%zi"
241*946379e7Schristos# Invalid: type incompatibility due to size
242*946379e7Schristosmsgid  "abc%lli"
243*946379e7Schristosmsgstr "xyz%ti"
244*946379e7Schristos# Invalid: type incompatibility due to size
245*946379e7Schristosmsgid  "abc%Li"
246*946379e7Schristosmsgstr "xyz%ji"
247*946379e7Schristos# Invalid: type incompatibility due to size
248*946379e7Schristosmsgid  "abc%Li"
249*946379e7Schristosmsgstr "xyz%zi"
250*946379e7Schristos# Invalid: type incompatibility due to size
251*946379e7Schristosmsgid  "abc%Li"
252*946379e7Schristosmsgstr "xyz%ti"
253*946379e7Schristos# Invalid: type incompatibility due to size
254*946379e7Schristosmsgid  "abc%qi"
255*946379e7Schristosmsgstr "xyz%ji"
256*946379e7Schristos# Invalid: type incompatibility due to size
257*946379e7Schristosmsgid  "abc%qi"
258*946379e7Schristosmsgstr "xyz%zi"
259*946379e7Schristos# Invalid: type incompatibility due to size
260*946379e7Schristosmsgid  "abc%qi"
261*946379e7Schristosmsgstr "xyz%ti"
262*946379e7Schristos# Invalid: type incompatibility due to size
263*946379e7Schristosmsgid  "abc%ji"
264*946379e7Schristosmsgstr "xyz%zi"
265*946379e7Schristos# Invalid: type incompatibility due to size
266*946379e7Schristosmsgid  "abc%ji"
267*946379e7Schristosmsgstr "xyz%ti"
268*946379e7Schristos# Invalid: type incompatibility due to size
269*946379e7Schristosmsgid  "abc%zi"
270*946379e7Schristosmsgstr "xyz%ti"
271*946379e7Schristos# Invalid: type incompatibility for width
272*946379e7Schristosmsgid  "abc%g%*g"
273*946379e7Schristosmsgstr "xyz%*g%g"
274*946379e7SchristosEOF
275*946379e7Schristos
276*946379e7Schristos: ${MSGFMT=msgfmt}
277*946379e7Schristosn=0
278*946379e7Schristoswhile read comment; do
279*946379e7Schristos  read msgid_line
280*946379e7Schristos  read msgstr_line
281*946379e7Schristos  n=`expr $n + 1`
282*946379e7Schristos  tmpfiles="$tmpfiles f-c-2-$n.po f-c-2-$n.mo"
283*946379e7Schristos  cat <<EOF > f-c-2-$n.po
284*946379e7Schristos#, c-format
285*946379e7Schristos${msgid_line}
286*946379e7Schristos${msgstr_line}
287*946379e7SchristosEOF
288*946379e7Schristos  fail=
289*946379e7Schristos  if echo "$comment" | grep 'Valid:' > /dev/null; then
290*946379e7Schristos    if ${MSGFMT} --check-format -o f-c-2-$n.mo f-c-2-$n.po; then
291*946379e7Schristos      :
292*946379e7Schristos    else
293*946379e7Schristos      fail=yes
294*946379e7Schristos    fi
295*946379e7Schristos  else
296*946379e7Schristos    ${MSGFMT} --check-format -o f-c-2-$n.mo f-c-2-$n.po 2> /dev/null
297*946379e7Schristos    if test $? = 1; then
298*946379e7Schristos      :
299*946379e7Schristos    else
300*946379e7Schristos      fail=yes
301*946379e7Schristos    fi
302*946379e7Schristos  fi
303*946379e7Schristos  if test -n "$fail"; then
304*946379e7Schristos    echo "Format string checking error:" 1>&2
305*946379e7Schristos    cat f-c-2-$n.po 1>&2
306*946379e7Schristos    exit 1
307*946379e7Schristos  fi
308*946379e7Schristos  rm -f f-c-2-$n.po f-c-2-$n.mo
309*946379e7Schristosdone < f-c-2.data
310*946379e7Schristos
311*946379e7Schristosrm -fr $tmpfiles
312*946379e7Schristos
313*946379e7Schristosexit 0
314