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