]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
xgettext: Vala: Don't flag printf arguments as c-format.
authorBruno Haible <bruno@clisp.org>
Thu, 30 Nov 2023 15:55:42 +0000 (16:55 +0100)
committerBruno Haible <bruno@clisp.org>
Thu, 30 Nov 2023 16:15:49 +0000 (17:15 +0100)
Reported by Anders Jonsson <anders.jonsson@norsjovallen.se>
at <https://savannah.gnu.org/bugs/?64921>.

* 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.

gettext-tools/src/x-vala.c
gettext-tools/src/xgettext.c
gettext-tools/tests/Makefile.am
gettext-tools/tests/xgettext-vala-5
gettext-tools/tests/xgettext-vala-6 [new file with mode: 0755]

index cd55fca3310eaa760db4034aaebad93004577830..0b58d929abafeb11c5e81314c9ed632c0df4c11a 100644 (file)
@@ -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");
 }
 
index 2401b7f503c0838b53a2ee48f8d6446b05e927c9..1a97bb43839f8ef8a4dfd65d48581f3345a1ee76 100644 (file)
@@ -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;
 
index ed09f3524b4dc5c8a53ee0dab7674ed8b0bae743..e6e6b040d3168c2e0a94ffc544262bd9bf2bb12d 100644 (file)
@@ -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 \
index 44d4be33ef2aacf61664928fb97ead90cfd42ab8..d68239833c5af0db71fd81277b99b3ed461c2874 100755 (executable)
@@ -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 (executable)
index 0000000..afd78e9
--- /dev/null
@@ -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
+"<b>%s</b>".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