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