From: Bruno Haible Date: Thu, 30 Nov 2023 15:55:42 +0000 (+0100) Subject: xgettext: Vala: Don't flag printf arguments as c-format. X-Git-Tag: v0.23~285 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ef9a0aa385b1cd11c06575a3c5291330f99364d0;p=thirdparty%2Fgettext.git xgettext: Vala: Don't flag printf arguments as c-format. Reported by Anders Jonsson at . * gettext-tools/src/xgettext.c (xgettext_record_flag: Recognize also "undecided-...-format". * gettext-tools/src/x-vala.c (init_flag_table_vala): Flag the printf function as 'undecided-c-format', not 'c-format'. * gettext-tools/tests/xgettext-vala-5: Use vprintf instead of printf. * gettext-tools/tests/xgettext-vala-6: New file. * gettext-tools/tests/Makefile.am (TESTS): Add it. --- diff --git a/gettext-tools/src/x-vala.c b/gettext-tools/src/x-vala.c index cd55fca33..0b58d929a 100644 --- a/gettext-tools/src/x-vala.c +++ b/gettext-tools/src/x-vala.c @@ -145,7 +145,52 @@ init_flag_table_vala () xgettext_record_flag ("N_:1:pass-c-format!Vala"); xgettext_record_flag ("NC_:2:pass-c-format!Vala"); - xgettext_record_flag ("printf:1:c-format!Vala"); + /* In Vala, vprintf does not exist as a function, only as a method. + https://valadoc.org/?q=printf provides this list: + + Method Arguments + + Posix.FILE.printf (posix) (string format, ...) + Posix.printf (posix) (string format, ...) + Alsa.Output.printf (alsa) (string format, ...) + Dazzle.Path.printf (libdazzle-1.0) () + Dazzle.ShortcutChordTable.printf (libdazzle-1.0) () + string.printf (glib-2.0) (...) + GLib.FileStream.printf (glib-2.0) (string format, ...) + GLib.StringBuilder.printf (glib-2.0) (string format, ...) + GLib.Variant.Variant.printf (glib-2.0) (string format, ...) + FastCGI.FileStream.printf (fcgi) (string format, ...) + FastCGI.Stream.printf (fcgi) (string format, ...) + Purple.Stringref.printf (purple) (string format) + Gsl.Stream.printf (gsl) (string label, string file, int line, string reason) + Gsf.Output.printf (libgsf-1) (string format, ...) + GLib.OutputStream.printf (gio-2.0) (out size_t bytes_written, Cancellable? cancellable, string format, ...) + TokyoCabinet.XString.printf (tokyocabinet) (string format, ...) + ZLib.GZFileStream.printf (zlib) (string format, ...) + + Therefore, whenever the first argument is a string, it may be a format + string or a plain string. We don't know. Therefore we cannot enable + this flag. Recognition of format strings that occur as a first argument + therefore relies on the heuristics. */ + /* Override the effect of + xgettext_record_flag ("printf:1:c-format"); + in x-c.c. */ + xgettext_record_flag ("printf:1:undecided-c-format!Vala"); + + /* In Vala, vprintf does not exist as a function, only as a method. + https://valadoc.org/?q=vprintf provides this list: + + Method Arguments + string.vprintf (glib-2.0) (va_list args) + GLib.FileStream.vprintf (glib-2.0) (string format, va_list args) + GLib.StringBuilder.vprintf (glib-2.0) (string format, va_list args) + FastCGI.FileStream.vprintf (fcgi) (string format, va_list args) + FastCGI.Stream.vprintf (fcgi) (string format, va_list args) + Gsf.Output.vprintf (libgsf-1) (string format, va_list args) + GLib.OutputStream.vprintf (gio-2.0) (out size_t bytes_written, Cancellable? cancellable, string format, va_list args) + + Therefore, whenever the first argument is a string, it must be a format + string. */ xgettext_record_flag ("vprintf:1:c-format!Vala"); } diff --git a/gettext-tools/src/xgettext.c b/gettext-tools/src/xgettext.c index 2401b7f50..1a97bb438 100644 --- a/gettext-tools/src/xgettext.c +++ b/gettext-tools/src/xgettext.c @@ -1483,6 +1483,12 @@ xgettext_record_flag (const char *optionstring) n -= 11; value = impossible; } + else if (n >= 10 && memcmp (p, "undecided-", 10) == 0) + { + p += 10; + n -= 10; + value = undecided; + } else value = yes_according_to_context; diff --git a/gettext-tools/tests/Makefile.am b/gettext-tools/tests/Makefile.am index ed09f3524..e6e6b040d 100644 --- a/gettext-tools/tests/Makefile.am +++ b/gettext-tools/tests/Makefile.am @@ -165,7 +165,7 @@ TESTS = gettext-1 gettext-2 \ xgettext-tcl-stackovfl-1 xgettext-tcl-stackovfl-2 \ xgettext-tcl-stackovfl-3 xgettext-tcl-stackovfl-4 \ xgettext-vala-1 xgettext-vala-2 xgettext-vala-3 xgettext-vala-4 \ - xgettext-vala-5 \ + xgettext-vala-5 xgettext-vala-6 \ xgettext-vala-stackovfl-1 xgettext-vala-stackovfl-2 \ xgettext-ycp-1 xgettext-ycp-2 xgettext-ycp-3 xgettext-ycp-4 \ xgettext-ycp-stackovfl-1 xgettext-ycp-stackovfl-2 \ diff --git a/gettext-tools/tests/xgettext-vala-5 b/gettext-tools/tests/xgettext-vala-5 index 44d4be33e..d68239833 100755 --- a/gettext-tools/tests/xgettext-vala-5 +++ b/gettext-tools/tests/xgettext-vala-5 @@ -6,8 +6,8 @@ : ${XGETTEXT=xgettext} cat <<\EOF > xg-vala-5.vala -printf (_("blablaQ %d and %s"), a, b); -printf (_("blablaQ {0} and {1}"), a, b); +vprintf (_("blablaQ %d and %s"), args); +vprintf (_("blablaQ {0} and {1}"), args); EOF ${XGETTEXT} --omit-header --no-location -o xg-vala-5.tmp xg-vala-5.vala || Exit 1 diff --git a/gettext-tools/tests/xgettext-vala-6 b/gettext-tools/tests/xgettext-vala-6 new file mode 100755 index 000000000..afd78e9e4 --- /dev/null +++ b/gettext-tools/tests/xgettext-vala-6 @@ -0,0 +1,44 @@ +#! /bin/sh +. "${srcdir=.}/init.sh"; path_prepend_ . ../src + +# Test Vala support: printf and format strings. + +: ${XGETTEXT=xgettext} + +cat <<\EOF > xg-vala-6.vala +"%s".printf(_("Hello 1")); +_("Explanation: %s").printf(_("Hello 2")); +Posix.printf(_("Hello 3")); +Posix.printf(_("Hello 4 %s!"), _("Sir")); +EOF + +${XGETTEXT} --omit-header --no-location -o xg-vala-6.tmp xg-vala-6.vala || Exit 1 +func_filter_POT_Creation_Date xg-vala-6.tmp xg-vala-6.po + +cat <<\EOF > xg-vala-6.ok +msgid "Hello 1" +msgstr "" + +#, c-format +msgid "Explanation: %s" +msgstr "" + +msgid "Hello 2" +msgstr "" + +msgid "Hello 3" +msgstr "" + +#, c-format +msgid "Hello 4 %s!" +msgstr "" + +msgid "Sir" +msgstr "" +EOF + +: ${DIFF=diff} +${DIFF} xg-vala-6.ok xg-vala-6.po +result=$? + +exit $result