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