1 #! /bin/sh 2 3 # Test recognition of Lisp format strings. 4 5 tmpfiles="" 6 trap 'rm -fr $tmpfiles' 1 2 3 15 7 8 tmpfiles="$tmpfiles f-l-1.data" 9 cat <<\EOF > f-l-1.data 10 # Valid: no argument, ( | . *) 11 "abc~~def" 12 # Valid: one argument, (* | . *) 13 "abc~Sdef" 14 # Valid: 11 arguments, (* * * * * * * * * * * | . *) 15 "abc~10@*~Sdef" 16 # Invalid: unterminated 17 "abc~~def~" 18 # Invalid: unterminated 19 "abc~~def~1" 20 # Invalid: unterminated 21 "abc~~def~:" 22 # Invalid: unterminated 23 "abc~~def~@" 24 # Valid: colon 25 "abc~:Sdef" 26 # Valid: atsign 27 "abc~@Sdef" 28 # Valid: colon and atsign 29 "abc~:@Sdef" 30 # Valid: atsign and colon 31 "abc~@:Sdef" 32 # Valid: params before atsign and colon 33 "abc~3,-4,,'*@:Sdef" 34 # Invalid: params after atsign and colon 35 "abc~@:3,-4Sdef" 36 # Invalid: params after atsign and colon 37 "abc~@:-4Sdef" 38 # Invalid: params after atsign and colon 39 "abc~@:,-4Sdef" 40 # Valid: V and # params, (i() * | . *) 41 "abc~#,vSdef" 42 # Invalid: wrong type params 43 "abc~,'*Sdef" 44 # Valid: FORMAT-ASCII, (i() i() i() c() * | . *) 45 "abc~v,v,v,vA" 46 # Invalid: too many params 47 "abc~v,v,v,v,5A" 48 # Valid: FORMAT-S-EXPRESSION, (i() i() i() c() * | . *) 49 "abc~v,v,v,vS" 50 # Invalid: too many params 51 "abc~v,v,v,v,5S" 52 # Valid: FORMAT-WRITE, (* | . *) 53 "abc~W" 54 # Invalid: too many params 55 "abc~3W" 56 # Valid: FORMAT-DECIMAL, (i() c() c() i() i | . *) 57 "abc~v,v,v,vD" 58 # Invalid: too many params 59 "abc~v,v,v,v,5D" 60 # Valid: FORMAT-BINARY, (i() c() c() i() i | . *) 61 "abc~v,v,v,vB" 62 # Invalid: too many params 63 "abc~v,v,v,v,5B" 64 # Valid: FORMAT-OCTAL, (i() c() c() i() i | . *) 65 "abc~v,v,v,vO" 66 # Invalid: too many params 67 "abc~v,v,v,v,5O" 68 # Valid: FORMAT-HEXADECIMAL, (i() c() c() i() i | . *) 69 "abc~v,v,v,vX" 70 # Invalid: too many params 71 "abc~v,v,v,v,5X" 72 # Valid: FORMAT-RADIX, (i() i() c() c() i() i | . *) 73 "abc~v,v,v,v,vR" 74 # Invalid: too many params 75 "abc~v,v,v,v,v,5R" 76 # Valid: FORMAT-PLURAL, (* | . *) 77 "abc~P" 78 # Valid: FORMAT-PLURAL, (i | . *) 79 "abc~R egg~:P" 80 # Invalid: too many params 81 "abc~2P" 82 # Valid: FORMAT-CHARACTER, (c | . *) 83 "abc~C" 84 # Invalid: too many params 85 "abc~4C" 86 # Valid: FORMAT-FIXED-FLOAT, (i() i() i() c() c() r | . *) 87 "abc~v,v,v,v,vF" 88 # Invalid: too many params 89 "abc~v,v,v,v,v,5F" 90 # Valid: FORMAT-EXPONENTIAL-FLOAT, (i() i() i() i() c() c() c() r | . *) 91 "abc~v,v,v,v,v,v,vE" 92 # Invalid: too many params 93 "abc~v,v,v,v,v,v,v,5E" 94 # Valid: FORMAT-GENERAL-FLOAT, (i() i() i() i() c() c() c() r | . *) 95 "abc~v,v,v,v,v,v,vG" 96 # Invalid: too many params 97 "abc~v,v,v,v,v,v,v,5G" 98 # Valid: FORMAT-DOLLARS-FLOAT, (i() i() i() c() r | . *) 99 "abc~v,v,v,v$" 100 # Invalid: too many params 101 "abc~v,v,v,v,5$" 102 # Valid: FORMAT-TERPRI, (i() | . *) 103 "abc~v%" 104 # Invalid: too many params 105 "abc~v,5%" 106 # Valid: FORMAT-FRESH-LINE, (i() | . *) 107 "abc~v&" 108 # Invalid: too many params 109 "abc~v,5&" 110 # Valid: FORMAT-PAGE, (i() | . *) 111 "abc~v|" 112 # Invalid: too many params 113 "abc~v,5|" 114 # Valid: FORMAT-TILDE, (i() | . *) 115 "abc~v~" 116 # Invalid: too many params 117 "abc~v,5~" 118 # Valid: underscore, ( | . *) 119 "abc~_" 120 # Invalid: too many params 121 "abc~5_" 122 # Valid: FORMAT-TABULATE, (i() i() | . *) 123 "abc~v,vT" 124 # Invalid: too many params 125 "abc~v,v,5T" 126 # Valid: FORMAT-GOTO absolute, (* r c | . *) 127 "abc~S~F~S~2@*~C" 128 # Invalid: type incompatibility 129 "abc~S~F~S~1@*~C" 130 # Valid: FORMAT-GOTO backward, (* c r | . *) 131 "abc~S~S~F~2:*~C" 132 # Invalid: type incompatibility 133 "abc~S~S~F~1:*~C" 134 # Invalid: too many params 135 "abc~v,4*" 136 # Valid: FORMAT-GOTO with large number 137 "abc~S~F~S~1000000@*~C" 138 # Valid: FORMAT-INDIRECTION, (~ ( | . *) | . *) 139 "abc~?" 140 # Valid: FORMAT-INDIRECTION, (~ | . *) 141 "abc~@?" 142 # Invalid: too many params 143 "abc~4?" 144 # Valid: FORMAT-CALL-USER-FUNCTION, (* | . *) 145 "abc~/FOOBAR/" 146 # Invalid: too many params 147 "abc~4/FOOBAR/" 148 # Invalid: unterminated 149 "abc~/FOOB" 150 # Invalid: nesting mismatch 151 "abc~(~/FOOB~)/" 152 # Valid: FORMAT-CASE-CONVERSION, (* | . *) 153 "abc~(~S~)" 154 # Invalid: too many params 155 "abc~4(~S~)" 156 # Invalid: too many params 157 "abc~(~S~4)" 158 # Invalid: unterminated 159 "abc~(~S" 160 # Invalid: separator 161 "abc~(~S~;~S~)" 162 # Valid: FORMAT-CONDITIONAL, (i() c | . *) 163 "abc~@[~D~]~C" 164 # Valid: FORMAT-CONDITIONAL, (i() | . *) 165 "abc~@[~D~D~]~C" 166 # Invalid: separator 167 "abc~@[~D~;~D~]~C" 168 # Valid: FORMAT-CONDITIONAL, (* i c | . *) 169 "abc~:[~X~;~D~]~C" 170 # Invalid: missing separator 171 "abc~:[~D~]~C" 172 # Invalid: too many separators 173 "abc~:[~X~;~D~;~E~]~C" 174 # Valid: FORMAT-CONDITIONAL, (* | . *) 175 "abc~[~D~;~X~]~C" 176 # Valid: FORMAT-CONDITIONAL, (* i c | . *) 177 "abc~[~D~;~X~:;~R~]~C" 178 # Invalid: default clause not last 179 "abc~[~D~;~X~:;~R~;~R~]~C" 180 # Invalid: too many params 181 "abc~4@[~D~]" 182 # Invalid: too many params 183 "abc~@[~D~4]" 184 # Invalid: too many params 185 "abc~4:[~D~;~X~]" 186 # Invalid: too many params 187 "abc~:[~D~4;~X~]" 188 # Invalid: too many params 189 "abc~:[~D~;~X~4]" 190 # Valid: FORMAT-CONDITIONAL, one param, without colon or atsign 191 "abc~4[~D~;~X~]" 192 # Invalid: too many params 193 "abc~4,4[~D~;~X~]" 194 # Invalid: too many params 195 "abc~[~D~4;~X~]" 196 # Invalid: too many params 197 "abc~[~D~;~X~4]" 198 # Valid: FORMAT-ITERATION, (( | . *) | . *) 199 "abc~{~~~}" 200 # Valid: FORMAT-ITERATION, (( | . ( | . *)) | . *) 201 "abc~:{~~~}" 202 # Valid: FORMAT-ITERATION, ( | . *) 203 "abc~@{~~~}" 204 # Valid: FORMAT-ITERATION, ( | . ( | . *)) 205 "abc~:@{~~~}" 206 # Valid: FORMAT-ITERATION with indirection, (~ ( | . *) | . *) 207 "abc~{~}" 208 # Valid: FORMAT-ITERATION with indirection, (~ ( | . ( | . *)) | . *) 209 "abc~:{~}" 210 # Valid: FORMAT-ITERATION with indirection, (~ | . *) 211 "abc~@{~}" 212 # Valid: FORMAT-ITERATION with indirection, (~ | . ( | . *)) 213 "abc~:@{~}" 214 # Valid: FORMAT-ITERATION with loop, (( | . i c) | . *) 215 "abc~{~D ~C~}" 216 # Valid: FORMAT-ITERATION with loop, (( | . (i c | . *)) | . *) 217 "abc~:{~D ~C~}" 218 # Valid: FORMAT-ITERATION with loop, ( | . i c) 219 "abc~@{~D ~C~}" 220 # Valid: FORMAT-ITERATION with loop, ( | . (i c | . *)) 221 "abc~:@{~D ~C~}" 222 # Valid: FORMAT-ITERATION with variable-advance loop, (( | . *) | . *) 223 "abc~{~[~D~]~}" 224 # Valid: FORMAT-ITERATION with variable-advance loop, (( | . (* | . *)) | . *) 225 "abc~:{~[~D~]~}" 226 # Valid: FORMAT-ITERATION with variable-advance loop, ( | . *) 227 "abc~@{~[~D~]~}" 228 # Valid: FORMAT-ITERATION with variable-advance loop, ( | . (* | . *)) 229 "abc~:@{~[~D~]~}" 230 # Invalid: separator 231 "abc~{~D~;~C~}" 232 # Valid: FORMAT-JUSTIFICATION, (i() i() i() c() i | . *) 233 "abc~v,v,v,v<~D~>" 234 # Invalid: too many params 235 "abc~v,v,v,v,4<~D~>" 236 # Valid: separators 237 "abc~<~D~;~X~;def~>" 238 # Invalid: wrongly nested 239 "abc~<~(~>~)" 240 # Invalid: wrongly nested 241 "abc~{~(~}~)" 242 # Invalid: wrongly nested 243 "abc~{~<~}~>" 244 # Valid: FORMAT-CALL, (f * | . *) 245 "abc~!" 246 # Valid: any number of arguments 247 "abc~v,v,v,v,v!" 248 # Invalid: type incompatibility between integer and list 249 "abc~D~:*~{~D~}" 250 # Invalid: type incompatibility between real and list 251 "abc~{~S~}~:*~F" 252 # Valid: list must be empty 253 "abc~{~C~}~:*~{~D~}" 254 EOF 255 256 : ${XGETTEXT=xgettext} 257 n=0 258 while read comment; do 259 read string 260 n=`expr $n + 1` 261 tmpfiles="$tmpfiles f-l-1-$n.in f-l-1-$n.po" 262 cat <<EOF > f-l-1-$n.in 263 (gettext ${string}) 264 EOF 265 ${XGETTEXT} -L Lisp -o f-l-1-$n.po f-l-1-$n.in || exit 1 266 test -f f-l-1-$n.po || exit 1 267 fail= 268 if echo "$comment" | grep 'Valid:' > /dev/null; then 269 if grep lisp-format f-l-1-$n.po > /dev/null; then 270 : 271 else 272 fail=yes 273 fi 274 else 275 if grep lisp-format f-l-1-$n.po > /dev/null; then 276 fail=yes 277 else 278 : 279 fi 280 fi 281 if test -n "$fail"; then 282 echo "Format string recognition error:" 1>&2 283 cat f-l-1-$n.in 1>&2 284 echo "Got:" 1>&2 285 cat f-l-1-$n.po 1>&2 286 exit 1 287 fi 288 rm -f f-l-1-$n.in f-l-1-$n.po 289 done < f-l-1.data 290 291 rm -fr $tmpfiles 292 293 exit 0 294