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