--- /dev/null
+#! /bin/sh
+
+# Test recognition of Boost format strings.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles f-bo-1.data"
+cat <<\EOF > f-bo-1.data
+# Valid: no argument
+"abc%%"
+# Valid: one character argument
+"abc%c"
+# Valid: one character argument
+"abc%|c|"
+# Valid: one string argument
+"abc%s"
+# Valid: one string argument
+"abc%|s|"
+# Valid: one integer argument
+"abc%i"
+# Valid: one integer argument
+"abc%|i|"
+# Valid: one integer argument
+"abc%d"
+# Valid: one integer argument
+"abc%|d|"
+# Valid: one integer argument
+"abc%o"
+# Valid: one integer argument
+"abc%|o|"
+# Valid: one integer argument
+"abc%u"
+# Valid: one integer argument
+"abc%|u|"
+# Valid: one integer argument
+"abc%x"
+# Valid: one integer argument
+"abc%|x|"
+# Valid: one integer argument
+"abc%X"
+# Valid: one integer argument
+"abc%|X|"
+# Valid: one floating-point argument
+"abc%e"
+# Valid: one floating-point argument
+"abc%|e|"
+# Valid: one floating-point argument
+"abc%E"
+# Valid: one floating-point argument
+"abc%|E|"
+# Valid: one floating-point argument
+"abc%f"
+# Valid: one floating-point argument
+"abc%|f|"
+# Valid: one floating-point argument
+"abc%g"
+# Valid: one floating-point argument
+"abc%|g|"
+# Valid: one floating-point argument
+"abc%G"
+# Valid: one floating-point argument
+"abc%|G|"
+# Valid: one pointer argument
+"abc%p"
+# Valid: one pointer argument
+"abc%|p|"
+# Valid: no argument
+"abc%n"
+# Valid: no argument
+"abc%|n|"
+# Valid: one argument with flags
+"abc%0#g"
+# Valid: one argument with flags
+"abc%|0#g|"
+# Valid: one argument with width
+"abc%2g"
+# Valid: one argument with width
+"abc%|2g|"
+# Valid: one argument with width
+"abc%*g"
+# Valid: one argument with width
+"abc%|*g|"
+# Valid: one argument with precision
+"abc%.4g"
+# Valid: one argument with precision
+"abc%|.4g|"
+# Valid: one argument with precision
+"abc%.*g"
+# Valid: one argument with precision
+"abc%|.*g|"
+# Valid: one argument with width and precision
+"abc%14.4g"
+# Valid: one argument with width and precision
+"abc%|14.4g|"
+# Valid: one argument with width and precision
+"abc%14.*g"
+# Valid: one argument with width and precision
+"abc%|14.*g|"
+# Valid: one argument with width and precision
+"abc%*.4g"
+# Valid: one argument with width and precision
+"abc%|*.4g|"
+# Valid: one argument with width and precision
+"abc%*.*g"
+# Valid: one argument with width and precision
+"abc%|*.*g|"
+# Valid: one argument with size specifier
+"abc%hhi"
+# Valid: one argument with size specifier
+"abc%|hhi|"
+# Valid: one argument with size specifier
+"abc%hi"
+# Valid: one argument with size specifier
+"abc%|hi|"
+# Valid: one argument with size specifier
+"abc%li"
+# Valid: one argument with size specifier
+"abc%|li|"
+# Valid: one argument with size specifier
+"abc%lli"
+# Valid: one argument with size specifier
+"abc%|lli|"
+# Valid: one argument with size specifier
+"abc%Lg"
+# Valid: one argument with size specifier
+"abc%|Lg|"
+# Invalid: unknown size specifier
+"abc%qi"
+# Invalid: unknown size specifier
+"abc%|qi|"
+# Invalid: unknown size specifier
+"abc%ji"
+# Invalid: unknown size specifier
+"abc%|ji|"
+# Invalid: unknown size specifier
+"abc%zi"
+# Invalid: unknown size specifier
+"abc%|zi|"
+# Invalid: unterminated
+"abc%"
+# Invalid: unterminated
+"abc%|"
+# Invalid: unterminated
+"abc%|d"
+# Invalid: unknown format specifier
+"abc%a"
+# Invalid: unknown format specifier
+"abc%|a|"
+# Invalid: unknown format specifier
+"abc%A"
+# Invalid: unknown format specifier
+"abc%|A|"
+# Invalid: unknown format specifier
+"abc%F"
+# Invalid: unknown format specifier
+"abc%|F|"
+# Invalid: unknown format specifier
+"abc%y"
+# Invalid: unknown format specifier
+"abc%|y|"
+# Invalid: flags after width
+"abc%*0g"
+# Invalid: flags after width
+"abc%|*0g|"
+# Invalid: twice precision
+"abc%.4.2g"
+# Invalid: twice precision
+"abc%|.4.2g|"
+# Valid: three arguments
+"abc%d%u%u"
+# Valid: three arguments, mixed syntax
+"abc%|d|%u%u"
+# Valid: three arguments, mixed syntax
+"abc%d%u%|u|"
+# Valid: a numbered argument
+"abc%1$d"
+# Valid: a numbered argument
+"abc%|1$d|"
+# Valid: a numbered argument
+"abc%1%"
+# Invalid: zero
+"abc%0$d"
+# Invalid: zero
+"abc%|0$d|"
+# Invalid: zero
+"abc%0%def"
+# Valid: two-digit numbered arguments
+"abc%11$def%10$dgh%9$dij%8$dkl%7$dmn%6$dop%5$dqr%4$dst%3$duv%2$dwx%1$dyz"
+# Valid: two-digit numbered arguments
+"abc%|11$d|ef%|10$d|gh%|9$d|ij%|8$d|kl%|7$d|mn%|6$d|op%|5$d|qr%|4$d|st%|3$d|uv%|2$d|wx%|1$d|yz"
+# Invalid: unterminated number
+"abc%1"
+# Valid: omitted directive number
+"abc%|1|"
+# Invalid: flags before number
+"abc%+1$d"
+# Invalid: flags before number
+"abc%|+1$d|"
+# Valid: three arguments, two with same number
+"abc%1$4x,%2$c,%1$u"
+# Valid: three arguments, two with same number
+"abc%|1$4x|,%|2$c|,%|1$u|"
+# Invalid: argument with conflicting types
+"abc%1$4x,%2$c,%1$p"
+# Invalid: argument with conflicting types
+"abc%|1$4x|,%|2$c|,%|1$p|"
+# Valid: no conflict
+"abc%1$4x,%2$c,%1$s"
+# Valid: no conflict
+"abc%|1$4x|,%|2$c|,%|1$s|"
+# Valid: no conflict
+"abc%1$4x,%2$c,%1$u"
+# Valid: no conflict
+"abc%|1$4x|,%|2$c|,%|1$u|"
+# Invalid: mixing of numbered and unnumbered arguments
+"abc%d%2$x"
+# Invalid: mixing of numbered and unnumbered arguments
+"abc%|d|%|2$x|"
+# Invalid: mixing of numbered and unnumbered arguments
+"abc%|d|%2%"
+# Valid: numbered argument with constant precision
+"abc%1$.9x"
+# Valid: numbered argument with constant precision
+"abc%|1$.9x|"
+# Invalid: mixing of numbered and unnumbered arguments
+"abc%1$.*x"
+# Invalid: mixing of numbered and unnumbered arguments
+"abc%|1$.*x|"
+# Valid: missing non-final argument
+"abc%2$x%3$s"
+# Valid: missing non-final argument
+"abc%|2$x|%|3$s|"
+# Valid: missing non-final argument
+"abc%2%%3%"
+# Valid: permutation
+"abc%2$ddef%1$d"
+# Valid: permutation
+"abc%|2$d|def%|1$d|"
+# Valid: multiple uses of same argument
+"abc%2$xdef%1$pghi%2$x"
+# Valid: multiple uses of same argument
+"abc%|2$x|def%|1$p|ghi|%2$x|"
+# Valid: one argument with width
+"abc%2$#*1$g"
+# Valid: one argument with width
+"abc%|2$#*1$g|"
+# Valid: one argument with width and precision
+"abc%3$*2$.*1$g"
+# Valid: one argument with width and precision
+"abc%|3$*2$.*1$g|"
+# Invalid: zero
+"abc%2$*0$.*1$g"
+# Invalid: zero
+"abc%|2$*0$.*1$g|"
+# Valid: tab
+"abc%t"
+# Valid: tab
+"abc%9t"
+# Valid: tab
+"abc%|9t|"
+# Invalid: unterminated directive
+"abc%T"
+# Valid: tab
+"abc%T "
+# Valid: tab
+"abc%99T "
+# Invalid: unterminated directive
+"abc%|99T "
+# Invalid: unterminated directive
+"abc%|99T|"
+# Valid: tab
+"abc%|99T |"
+# Valid: tab
+"abc%|99T||"
+EOF
+
+: ${XGETTEXT=xgettext}
+n=0
+while read comment; do
+ read string
+ n=`expr $n + 1`
+ tmpfiles="$tmpfiles f-bo-1-$n.in f-bo-1-$n.po"
+ cat <<EOF > f-bo-1-$n.in
+gettext(${string});
+EOF
+ ${XGETTEXT} -L C++ --boost -o f-bo-1-$n.po f-bo-1-$n.in || exit 1
+ test -f f-bo-1-$n.po || exit 1
+ fail=
+ if echo "$comment" | grep 'Valid:' > /dev/null; then
+ if grep boost-format f-bo-1-$n.po > /dev/null; then
+ :
+ else
+ fail=yes
+ fi
+ else
+ if grep boost-format f-bo-1-$n.po > /dev/null; then
+ fail=yes
+ else
+ :
+ fi
+ fi
+ if test -n "$fail"; then
+ echo "Format string recognition error:" 1>&2
+ cat f-bo-1-$n.in 1>&2
+ echo "Got:" 1>&2
+ cat f-bo-1-$n.po 1>&2
+ exit 1
+ fi
+ rm -f f-bo-1-$n.in f-bo-1-$n.po
+done < f-bo-1.data
+
+rm -fr $tmpfiles
+
+exit 0
--- /dev/null
+#! /bin/sh
+
+# Test checking of Boost format strings.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles f-bo-2.data"
+cat <<\EOF > f-bo-2.data
+# Valid: %% doesn't count
+msgid "abc%%def"
+msgstr "xyz"
+# Invalid: invalid msgstr
+msgid "abc%%def"
+msgstr "xyz%"
+# Valid: same arguments
+msgid "abc%s%gdef"
+msgstr "xyz%s%g"
+# Valid: same arguments, despite different syntax
+msgid "abc%s%gdef"
+msgstr "xyz%|s|%|g|"
+# Valid: same arguments, with different widths
+msgid "abc%2sdef"
+msgstr "xyz%3s"
+# Valid: same arguments but in numbered syntax
+msgid "abc%s%gdef"
+msgstr "xyz%1$s%2$g"
+# Valid: same arguments but in numbered syntax
+msgid "abc%s%gdef"
+msgstr "xyz%1%%2$g"
+# Valid: permutation
+msgid "abc%s%g%cdef"
+msgstr "xyz%3$c%2$g%1$s"
+# Invalid: too few arguments
+msgid "abc%2$udef%1$s"
+msgstr "xyz%1$s"
+# Invalid: too few arguments
+msgid "abc%sdef%u"
+msgstr "xyz%s"
+# Invalid: too many arguments
+msgid "abc%udef"
+msgstr "xyz%uvw%c"
+# Valid: same numbered arguments, with different widths
+msgid "abc%2$5s%1$4s"
+msgstr "xyz%2$4s%1$5s"
+# Invalid: missing argument
+msgid "abc%2$sdef%1$u"
+msgstr "xyz%1$u"
+# Invalid: missing argument
+msgid "abc%1$sdef%2$u"
+msgstr "xyz%2$u"
+# Invalid: added argument
+msgid "abc%1$udef"
+msgstr "xyz%1$uvw%2$c"
+# Valid: type compatibility
+msgid "abc%i"
+msgstr "xyz%d"
+# Valid: type compatibility
+msgid "abc%i"
+msgstr "xyz%o"
+# Valid: type compatibility
+msgid "abc%i"
+msgstr "xyz%u"
+# Valid: type compatibility
+msgid "abc%i"
+msgstr "xyz%x"
+# Valid: type compatibility
+msgid "abc%i"
+msgstr "xyz%X"
+# Valid: type compatibility
+msgid "abc%e"
+msgstr "xyz%E"
+# Valid: type compatibility
+msgid "abc%e"
+msgstr "xyz%f"
+# Valid: type compatibility
+msgid "abc%e"
+msgstr "xyz%g"
+# Valid: type compatibility
+msgid "abc%e"
+msgstr "xyz%G"
+# Invalid: type incompatibility
+msgid "abc%c"
+msgstr "xyz%s"
+# Invalid: type incompatibility
+msgid "abc%c"
+msgstr "xyz%i"
+# Invalid: type incompatibility
+msgid "abc%c"
+msgstr "xyz%e"
+# Invalid: type incompatibility
+msgid "abc%c"
+msgstr "xyz%p"
+# Invalid: different argument count
+msgid "abc%c"
+msgstr "xyz%n"
+# Invalid: type incompatibility
+msgid "abc%s"
+msgstr "xyz%i"
+# Invalid: type incompatibility
+msgid "abc%s"
+msgstr "xyz%e"
+# Invalid: type incompatibility
+msgid "abc%s"
+msgstr "xyz%p"
+# Invalid: different argument count
+msgid "abc%s"
+msgstr "xyz%n"
+# Invalid: type incompatibility
+msgid "abc%i"
+msgstr "xyz%e"
+# Invalid: type incompatibility
+msgid "abc%i"
+msgstr "xyz%p"
+# Invalid: different argument count
+msgid "abc%i"
+msgstr "xyz%n"
+# Invalid: type incompatibility
+msgid "abc%e"
+msgstr "xyz%p"
+# Invalid: different argument count
+msgid "abc%e"
+msgstr "xyz%n"
+# Invalid: different argument count
+msgid "abc%p"
+msgstr "xyz%n"
+# Valid: size is ignored
+msgid "abc%i"
+msgstr "xyz%hhi"
+# Valid: size is ignored
+msgid "abc%i"
+msgstr "xyz%hi"
+# Valid: size is ignored
+msgid "abc%i"
+msgstr "xyz%li"
+# Valid: size is ignored
+msgid "abc%i"
+msgstr "xyz%lli"
+# Valid: size is ignored
+msgid "abc%i"
+msgstr "xyz%Li"
+# Valid: size is ignored
+msgid "abc%hhi"
+msgstr "xyz%hi"
+# Valid: size is ignored
+msgid "abc%hhi"
+msgstr "xyz%li"
+# Valid: size is ignored
+msgid "abc%hhi"
+msgstr "xyz%lli"
+# Valid: size is ignored
+msgid "abc%hhi"
+msgstr "xyz%Li"
+# Valid: size is ignored
+msgid "abc%hi"
+msgstr "xyz%li"
+# Valid: size is ignored
+msgid "abc%hi"
+msgstr "xyz%lli"
+# Valid: size is ignored
+msgid "abc%hi"
+msgstr "xyz%Li"
+# Valid: size is ignored
+msgid "abc%li"
+msgstr "xyz%lli"
+# Valid: size is ignored
+msgid "abc%li"
+msgstr "xyz%Li"
+# Invalid: type incompatibility for width
+msgid "abc%g%*g"
+msgstr "xyz%*g%g"
+EOF
+
+: ${MSGFMT=msgfmt}
+n=0
+while read comment; do
+ read msgid_line
+ read msgstr_line
+ n=`expr $n + 1`
+ tmpfiles="$tmpfiles f-bo-2-$n.po f-bo-2-$n.mo"
+ cat <<EOF > f-bo-2-$n.po
+#, boost-format
+${msgid_line}
+${msgstr_line}
+EOF
+ fail=
+ if echo "$comment" | grep 'Valid:' > /dev/null; then
+ if ${MSGFMT} --check-format -o f-bo-2-$n.mo f-bo-2-$n.po; then
+ :
+ else
+ fail=yes
+ fi
+ else
+ ${MSGFMT} --check-format -o f-bo-2-$n.mo f-bo-2-$n.po 2> /dev/null
+ if test $? = 1; then
+ :
+ else
+ fail=yes
+ fi
+ fi
+ if test -n "$fail"; then
+ echo "Format string checking error:" 1>&2
+ cat f-bo-2-$n.po 1>&2
+ exit 1
+ fi
+ rm -f f-bo-2-$n.po f-bo-2-$n.mo
+done < f-bo-2.data
+
+rm -fr $tmpfiles
+
+exit 0