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