1*946379e7Schristos#! /bin/sh 2*946379e7Schristos 3*946379e7Schristos# Test recognition of C format strings. 4*946379e7Schristos 5*946379e7Schristostmpfiles="" 6*946379e7Schristostrap 'rm -fr $tmpfiles' 1 2 3 15 7*946379e7Schristos 8*946379e7Schristostmpfiles="$tmpfiles f-c-1.data" 9*946379e7Schristoscat <<\EOF > f-c-1.data 10*946379e7Schristos# Valid: no argument 11*946379e7Schristos"abc%%" 12*946379e7Schristos# Valid: one character argument 13*946379e7Schristos"abc%c" 14*946379e7Schristos# Valid: one string argument 15*946379e7Schristos"abc%s" 16*946379e7Schristos# Valid: one integer argument 17*946379e7Schristos"abc%i" 18*946379e7Schristos# Valid: one integer argument 19*946379e7Schristos"abc%d" 20*946379e7Schristos# Valid: one integer argument 21*946379e7Schristos"abc%o" 22*946379e7Schristos# Valid: one integer argument 23*946379e7Schristos"abc%u" 24*946379e7Schristos# Valid: one integer argument 25*946379e7Schristos"abc%x" 26*946379e7Schristos# Valid: one integer argument 27*946379e7Schristos"abc%X" 28*946379e7Schristos# Valid: one floating-point argument 29*946379e7Schristos"abc%e" 30*946379e7Schristos# Valid: one floating-point argument 31*946379e7Schristos"abc%E" 32*946379e7Schristos# Valid: one floating-point argument 33*946379e7Schristos"abc%f" 34*946379e7Schristos# Valid: one floating-point argument 35*946379e7Schristos"abc%F" 36*946379e7Schristos# Valid: one floating-point argument 37*946379e7Schristos"abc%g" 38*946379e7Schristos# Valid: one floating-point argument 39*946379e7Schristos"abc%G" 40*946379e7Schristos# Valid: one floating-point argument 41*946379e7Schristos"abc%a" 42*946379e7Schristos# Valid: one floating-point argument 43*946379e7Schristos"abc%A" 44*946379e7Schristos# Valid: one pointer argument 45*946379e7Schristos"abc%p" 46*946379e7Schristos# Valid: one argument with flags 47*946379e7Schristos"abc%0#g" 48*946379e7Schristos# Valid: one argument with width 49*946379e7Schristos"abc%2g" 50*946379e7Schristos# Valid: one argument with width 51*946379e7Schristos"abc%*g" 52*946379e7Schristos# Valid: one argument with precision 53*946379e7Schristos"abc%.4g" 54*946379e7Schristos# Valid: one argument with precision 55*946379e7Schristos"abc%.*g" 56*946379e7Schristos# Valid: one argument with width and precision 57*946379e7Schristos"abc%14.4g" 58*946379e7Schristos# Valid: one argument with width and precision 59*946379e7Schristos"abc%14.*g" 60*946379e7Schristos# Valid: one argument with width and precision 61*946379e7Schristos"abc%*.4g" 62*946379e7Schristos# Valid: one argument with width and precision 63*946379e7Schristos"abc%*.*g" 64*946379e7Schristos# Valid: one argument with size specifier 65*946379e7Schristos"abc%hhi" 66*946379e7Schristos# Valid: one argument with size specifier 67*946379e7Schristos"abc%hi" 68*946379e7Schristos# Valid: one argument with size specifier 69*946379e7Schristos"abc%li" 70*946379e7Schristos# Valid: one argument with size specifier 71*946379e7Schristos"abc%lli" 72*946379e7Schristos# Valid: one argument with size specifier 73*946379e7Schristos"abc%Lg" 74*946379e7Schristos# Valid: one argument with size specifier 75*946379e7Schristos"abc%qi" 76*946379e7Schristos# Valid: one argument with size specifier 77*946379e7Schristos"abc%ji" 78*946379e7Schristos# Valid: one argument with size specifier 79*946379e7Schristos"abc%zi" 80*946379e7Schristos# Valid: one argument with size specifier 81*946379e7Schristos"abc%ti" 82*946379e7Schristos# Invalid: unterminated 83*946379e7Schristos"abc%" 84*946379e7Schristos# Invalid: unknown format specifier 85*946379e7Schristos"abc%y" 86*946379e7Schristos# Invalid: flags after width 87*946379e7Schristos"abc%*0g" 88*946379e7Schristos# Invalid: twice precision 89*946379e7Schristos"abc%.4.2g" 90*946379e7Schristos# Valid: three arguments 91*946379e7Schristos"abc%d%u%u" 92*946379e7Schristos# Valid: a numbered argument 93*946379e7Schristos"abc%1$d" 94*946379e7Schristos# Invalid: zero 95*946379e7Schristos"abc%0$d" 96*946379e7Schristos# Valid: two-digit numbered arguments 97*946379e7Schristos"abc%11$def%10$dgh%9$dij%8$dkl%7$dmn%6$dop%5$dqr%4$dst%3$duv%2$dwx%1$dyz" 98*946379e7Schristos# Invalid: unterminated number 99*946379e7Schristos"abc%1" 100*946379e7Schristos# Invalid: flags before number 101*946379e7Schristos"abc%+1$d" 102*946379e7Schristos# Valid: three arguments, two with same number 103*946379e7Schristos"abc%1$4x,%2$c,%1$u" 104*946379e7Schristos# Invalid: argument with conflicting types 105*946379e7Schristos"abc%1$4x,%2$c,%1$s" 106*946379e7Schristos# Valid: no conflict 107*946379e7Schristos"abc%1$4x,%2$c,%1$u" 108*946379e7Schristos# Invalid: mixing of numbered and unnumbered arguments 109*946379e7Schristos"abc%d%2$x" 110*946379e7Schristos# Valid: numbered argument with constant precision 111*946379e7Schristos"abc%1$.9x" 112*946379e7Schristos# Invalid: mixing of numbered and unnumbered arguments 113*946379e7Schristos"abc%1$.*x" 114*946379e7Schristos# Invalid: missing non-final argument 115*946379e7Schristos"abc%2$x%3$s" 116*946379e7Schristos# Valid: permutation 117*946379e7Schristos"abc%2$ddef%1$d" 118*946379e7Schristos# Valid: multiple uses of same argument 119*946379e7Schristos"abc%2$xdef%1$pghi%2$x" 120*946379e7Schristos# Valid: one argument with width 121*946379e7Schristos"abc%2$#*1$g" 122*946379e7Schristos# Valid: one argument with width and precision 123*946379e7Schristos"abc%3$*2$.*1$g" 124*946379e7Schristos# Invalid: zero 125*946379e7Schristos"abc%2$*0$.*1$g" 126*946379e7SchristosEOF 127*946379e7Schristos 128*946379e7Schristos: ${XGETTEXT=xgettext} 129*946379e7Schristosn=0 130*946379e7Schristoswhile read comment; do 131*946379e7Schristos read string 132*946379e7Schristos n=`expr $n + 1` 133*946379e7Schristos tmpfiles="$tmpfiles f-c-1-$n.in f-c-1-$n.po" 134*946379e7Schristos cat <<EOF > f-c-1-$n.in 135*946379e7Schristosgettext(${string}); 136*946379e7SchristosEOF 137*946379e7Schristos ${XGETTEXT} -L C -o f-c-1-$n.po f-c-1-$n.in || exit 1 138*946379e7Schristos test -f f-c-1-$n.po || exit 1 139*946379e7Schristos fail= 140*946379e7Schristos if echo "$comment" | grep 'Valid:' > /dev/null; then 141*946379e7Schristos if grep c-format f-c-1-$n.po > /dev/null; then 142*946379e7Schristos : 143*946379e7Schristos else 144*946379e7Schristos fail=yes 145*946379e7Schristos fi 146*946379e7Schristos else 147*946379e7Schristos if grep c-format f-c-1-$n.po > /dev/null; then 148*946379e7Schristos fail=yes 149*946379e7Schristos else 150*946379e7Schristos : 151*946379e7Schristos fi 152*946379e7Schristos fi 153*946379e7Schristos if test -n "$fail"; then 154*946379e7Schristos echo "Format string recognition error:" 1>&2 155*946379e7Schristos cat f-c-1-$n.in 1>&2 156*946379e7Schristos echo "Got:" 1>&2 157*946379e7Schristos cat f-c-1-$n.po 1>&2 158*946379e7Schristos exit 1 159*946379e7Schristos fi 160*946379e7Schristos rm -f f-c-1-$n.in f-c-1-$n.po 161*946379e7Schristosdone < f-c-1.data 162*946379e7Schristos 163*946379e7Schristosrm -fr $tmpfiles 164*946379e7Schristos 165*946379e7Schristosexit 0 166