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