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