1*946379e7Schristos#! /bin/sh 2*946379e7Schristos 3*946379e7Schristos# Test checking of Perl format strings. 4*946379e7Schristos 5*946379e7Schristostmpfiles="" 6*946379e7Schristostrap 'rm -fr $tmpfiles' 1 2 3 15 7*946379e7Schristos 8*946379e7Schristostmpfiles="$tmpfiles f-pl-2.data" 9*946379e7Schristoscat <<\EOF > f-pl-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%b" 54*946379e7Schristosmsgstr "xyz%o" 55*946379e7Schristos# Valid: type compatibility 56*946379e7Schristosmsgid "abc%o" 57*946379e7Schristosmsgstr "xyz%u" 58*946379e7Schristos# Valid: type compatibility 59*946379e7Schristosmsgid "abc%u" 60*946379e7Schristosmsgstr "xyz%x" 61*946379e7Schristos# Valid: type compatibility 62*946379e7Schristosmsgid "abc%u" 63*946379e7Schristosmsgstr "xyz%X" 64*946379e7Schristos# Valid: type and size compatibility 65*946379e7Schristosmsgid "abc%x" 66*946379e7Schristosmsgstr "xyz%X" 67*946379e7Schristos# Valid: type compatibility 68*946379e7Schristosmsgid "abc%e" 69*946379e7Schristosmsgstr "xyz%E" 70*946379e7Schristos# Valid: type compatibility 71*946379e7Schristosmsgid "abc%e" 72*946379e7Schristosmsgstr "xyz%f" 73*946379e7Schristos# Valid: type compatibility 74*946379e7Schristosmsgid "abc%e" 75*946379e7Schristosmsgstr "xyz%F" 76*946379e7Schristos# Valid: type compatibility 77*946379e7Schristosmsgid "abc%e" 78*946379e7Schristosmsgstr "xyz%g" 79*946379e7Schristos# Valid: type compatibility 80*946379e7Schristosmsgid "abc%e" 81*946379e7Schristosmsgstr "xyz%G" 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%_" 88*946379e7Schristos# Invalid: type incompatibility 89*946379e7Schristosmsgid "abc%c" 90*946379e7Schristosmsgstr "xyz%i" 91*946379e7Schristos# Invalid: type incompatibility 92*946379e7Schristosmsgid "abc%c" 93*946379e7Schristosmsgstr "xyz%u" 94*946379e7Schristos# Invalid: type incompatibility 95*946379e7Schristosmsgid "abc%c" 96*946379e7Schristosmsgstr "xyz%e" 97*946379e7Schristos# Invalid: type incompatibility 98*946379e7Schristosmsgid "abc%c" 99*946379e7Schristosmsgstr "xyz%p" 100*946379e7Schristos# Invalid: type incompatibility 101*946379e7Schristosmsgid "abc%c" 102*946379e7Schristosmsgstr "xyz%n" 103*946379e7Schristos# Invalid: type incompatibility 104*946379e7Schristosmsgid "abc%s" 105*946379e7Schristosmsgstr "xyz%_" 106*946379e7Schristos# Invalid: type incompatibility 107*946379e7Schristosmsgid "abc%s" 108*946379e7Schristosmsgstr "xyz%i" 109*946379e7Schristos# Invalid: type incompatibility 110*946379e7Schristosmsgid "abc%s" 111*946379e7Schristosmsgstr "xyz%u" 112*946379e7Schristos# Invalid: type incompatibility 113*946379e7Schristosmsgid "abc%s" 114*946379e7Schristosmsgstr "xyz%e" 115*946379e7Schristos# Invalid: type incompatibility 116*946379e7Schristosmsgid "abc%s" 117*946379e7Schristosmsgstr "xyz%p" 118*946379e7Schristos# Invalid: type incompatibility 119*946379e7Schristosmsgid "abc%s" 120*946379e7Schristosmsgstr "xyz%n" 121*946379e7Schristos# Invalid: type incompatibility 122*946379e7Schristosmsgid "abc%_" 123*946379e7Schristosmsgstr "xyz%i" 124*946379e7Schristos# Invalid: type incompatibility 125*946379e7Schristosmsgid "abc%_" 126*946379e7Schristosmsgstr "xyz%u" 127*946379e7Schristos# Invalid: type incompatibility 128*946379e7Schristosmsgid "abc%_" 129*946379e7Schristosmsgstr "xyz%e" 130*946379e7Schristos# Invalid: type incompatibility 131*946379e7Schristosmsgid "abc%_" 132*946379e7Schristosmsgstr "xyz%p" 133*946379e7Schristos# Invalid: type incompatibility 134*946379e7Schristosmsgid "abc%_" 135*946379e7Schristosmsgstr "xyz%n" 136*946379e7Schristos# Invalid: type incompatibility 137*946379e7Schristosmsgid "abc%i" 138*946379e7Schristosmsgstr "xyz%u" 139*946379e7Schristos# Invalid: type incompatibility 140*946379e7Schristosmsgid "abc%i" 141*946379e7Schristosmsgstr "xyz%e" 142*946379e7Schristos# Invalid: type incompatibility 143*946379e7Schristosmsgid "abc%i" 144*946379e7Schristosmsgstr "xyz%p" 145*946379e7Schristos# Invalid: type incompatibility 146*946379e7Schristosmsgid "abc%i" 147*946379e7Schristosmsgstr "xyz%n" 148*946379e7Schristos# Invalid: type incompatibility 149*946379e7Schristosmsgid "abc%u" 150*946379e7Schristosmsgstr "xyz%e" 151*946379e7Schristos# Invalid: type incompatibility 152*946379e7Schristosmsgid "abc%u" 153*946379e7Schristosmsgstr "xyz%p" 154*946379e7Schristos# Invalid: type incompatibility 155*946379e7Schristosmsgid "abc%u" 156*946379e7Schristosmsgstr "xyz%n" 157*946379e7Schristos# Invalid: type incompatibility 158*946379e7Schristosmsgid "abc%e" 159*946379e7Schristosmsgstr "xyz%p" 160*946379e7Schristos# Invalid: type incompatibility 161*946379e7Schristosmsgid "abc%e" 162*946379e7Schristosmsgstr "xyz%n" 163*946379e7Schristos# Invalid: type incompatibility 164*946379e7Schristosmsgid "abc%p" 165*946379e7Schristosmsgstr "xyz%n" 166*946379e7Schristos# Invalid: size incompatibility 167*946379e7Schristosmsgid "abc%hd" 168*946379e7Schristosmsgstr "xyz%d" 169*946379e7Schristos# Invalid: size incompatibility 170*946379e7Schristosmsgid "abc%hd" 171*946379e7Schristosmsgstr "xyz%ld" 172*946379e7Schristos# Invalid: size incompatibility 173*946379e7Schristosmsgid "abc%hd" 174*946379e7Schristosmsgstr "xyz%Vd" 175*946379e7Schristos# Invalid: size incompatibility 176*946379e7Schristosmsgid "abc%hd" 177*946379e7Schristosmsgstr "xyz%qd" 178*946379e7Schristos# Invalid: size incompatibility 179*946379e7Schristosmsgid "abc%d" 180*946379e7Schristosmsgstr "xyz%ld" 181*946379e7Schristos# Invalid: size incompatibility 182*946379e7Schristosmsgid "abc%d" 183*946379e7Schristosmsgstr "xyz%Vd" 184*946379e7Schristos# Invalid: size incompatibility 185*946379e7Schristosmsgid "abc%d" 186*946379e7Schristosmsgstr "xyz%qd" 187*946379e7Schristos# Invalid: size incompatibility 188*946379e7Schristosmsgid "abc%ld" 189*946379e7Schristosmsgstr "xyz%Vd" 190*946379e7Schristos# Invalid: size incompatibility 191*946379e7Schristosmsgid "abc%ld" 192*946379e7Schristosmsgstr "xyz%qd" 193*946379e7Schristos# Invalid: size incompatibility 194*946379e7Schristosmsgid "abc%Vd" 195*946379e7Schristosmsgstr "xyz%qd" 196*946379e7Schristos# Invalid: size incompatibility 197*946379e7Schristosmsgid "abc%d" 198*946379e7Schristosmsgstr "xyz%D" 199*946379e7Schristos# Invalid: size incompatibility 200*946379e7Schristosmsgid "abc%u" 201*946379e7Schristosmsgstr "xyz%U" 202*946379e7Schristos# Invalid: size incompatibility 203*946379e7Schristosmsgid "abc%o" 204*946379e7Schristosmsgstr "xyz%O" 205*946379e7Schristos# Invalid: type incompatibility for width 206*946379e7Schristosmsgid "abc%g%*g" 207*946379e7Schristosmsgstr "xyz%*g%g" 208*946379e7SchristosEOF 209*946379e7Schristos 210*946379e7Schristos: ${MSGFMT=msgfmt} 211*946379e7Schristosn=0 212*946379e7Schristoswhile read comment; do 213*946379e7Schristos read msgid_line 214*946379e7Schristos read msgstr_line 215*946379e7Schristos n=`expr $n + 1` 216*946379e7Schristos tmpfiles="$tmpfiles f-pl-2-$n.po f-pl-2-$n.mo" 217*946379e7Schristos cat <<EOF > f-pl-2-$n.po 218*946379e7Schristos#, perl-format 219*946379e7Schristos${msgid_line} 220*946379e7Schristos${msgstr_line} 221*946379e7SchristosEOF 222*946379e7Schristos fail= 223*946379e7Schristos if echo "$comment" | grep 'Valid:' > /dev/null; then 224*946379e7Schristos if ${MSGFMT} --check-format -o f-pl-2-$n.mo f-pl-2-$n.po; then 225*946379e7Schristos : 226*946379e7Schristos else 227*946379e7Schristos fail=yes 228*946379e7Schristos fi 229*946379e7Schristos else 230*946379e7Schristos ${MSGFMT} --check-format -o f-pl-2-$n.mo f-pl-2-$n.po 2> /dev/null 231*946379e7Schristos if test $? = 1; then 232*946379e7Schristos : 233*946379e7Schristos else 234*946379e7Schristos fail=yes 235*946379e7Schristos fi 236*946379e7Schristos fi 237*946379e7Schristos if test -n "$fail"; then 238*946379e7Schristos echo "Format string checking error:" 1>&2 239*946379e7Schristos cat f-pl-2-$n.po 1>&2 240*946379e7Schristos exit 1 241*946379e7Schristos fi 242*946379e7Schristos rm -f f-pl-2-$n.po f-pl-2-$n.mo 243*946379e7Schristosdone < f-pl-2.data 244*946379e7Schristos 245*946379e7Schristosrm -fr $tmpfiles 246*946379e7Schristos 247*946379e7Schristosexit 0 248