bug-gettext
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bug-gettext] [PATCH] Make header checking more reliable.


From: Daiki Ueno
Subject: [bug-gettext] [PATCH] Make header checking more reliable.
Date: Thu, 18 Apr 2013 14:43:07 +0900
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux)

See <https://savannah.gnu.org/bugs/?31181>.

Currently, msgfmt --check-header simply scans the message header with
c_strstr.  This causes false positive warnings.

For example,

  Language-Team: Foo Language Team <address@hidden>

results in:

  warning: header field `Language' should start at beginning of line

because "Language" appears in a field value.  Also, if "Language-Team"
field is present and "Language" isn't, msgfmt does not report any
warning.

This patch tries to check the header more strictly.

---
 gettext-tools/src/msgl-check.c | 74 ++++++++++++++++++++----------------------
 gettext-tools/tests/msgfmt-10  |  2 ++
 gettext-tools/tests/msgfmt-15  |  4 +++
 gettext-tools/tests/msgfmt-17  |  4 +++
 4 files changed, 46 insertions(+), 38 deletions(-)

diff --git a/gettext-tools/src/msgl-check.c b/gettext-tools/src/msgl-check.c
index 3aa526d..915b81e 100644
--- a/gettext-tools/src/msgl-check.c
+++ b/gettext-tools/src/msgl-check.c
@@ -777,53 +777,51 @@ check_header_entry (const message_ty *mp, const char 
*msgstr_string)
     {
       int severity =
         (cnt < nrequiredfields ? PO_SEVERITY_ERROR : PO_SEVERITY_WARNING);
-      const char *endp = c_strstr (msgstr_string, required_fields[cnt]);
+      const char *field = required_fields[cnt];
+      size_t len = strlen (field);
+      const char *line;
 
-      if (endp == NULL)
+      for (line = msgstr_string; *line != '\0'; )
         {
-          char *msg =
-            xasprintf (_("header field '%s' missing in header\n"),
-                       required_fields[cnt]);
-          po_xerror (severity, mp, NULL, 0, 0, true, msg);
-          free (msg);
-        }
-      else if (endp != msgstr_string && endp[-1] != '\n')
-        {
-          char *msg =
-            xasprintf (_("\
-header field '%s' should start at beginning of line\n"),
-                       required_fields[cnt]);
-          po_xerror (severity, mp, NULL, 0, 0, true, msg);
-          free (msg);
-        }
-      else
-        {
-          const char *p = endp + strlen (required_fields[cnt]);
-          /* Test whether the field's value, starting at p, is the default
-             value.  */
-          if (*p == ':')
-            p++;
-          if (*p == ' ')
-            p++;
-          if (default_values[cnt] != NULL
-              && strncmp (p, default_values[cnt],
-                          strlen (default_values[cnt])) == 0)
+          if (strncmp (line, field, len) == 0 && line[len] == ':')
             {
-              p += strlen (default_values[cnt]);
-              if (*p == '\0' || *p == '\n')
+              const char *p = line + len + 1;
+
+              /* Test whether the field's value, starting at p, is the default
+                 value.  */
+              if (*p == ' ')
+                p++;
+              if (default_values[cnt] != NULL
+                  && strncmp (p, default_values[cnt],
+                              strlen (default_values[cnt])) == 0)
                 {
-                  if (initial != -1)
+                  p += strlen (default_values[cnt]);
+                  if (*p == '\0' || *p == '\n')
                     {
-                      po_xerror (severity,
-                                 mp, NULL, 0, 0, true, _("\
+                      if (initial != -1)
+                        {
+                          po_xerror (severity,
+                                     mp, NULL, 0, 0, true, _("\
 some header fields still have the initial default value\n"));
-                      initial = -1;
-                      break;
+                          return;
+                        }
+                      else
+                        initial = cnt;
                     }
-                  else
-                    initial = cnt;
                 }
+              break;
             }
+          line = strchrnul (line, '\n');
+          if (*line == '\n')
+            line++;
+        }
+      if (*line == '\0')
+        {
+          char *msg =
+            xasprintf (_("header field '%s' missing in header\n"),
+                       field);
+          po_xerror (severity, mp, NULL, 0, 0, true, msg);
+          free (msg);
         }
     }
 
diff --git a/gettext-tools/tests/msgfmt-10 b/gettext-tools/tests/msgfmt-10
index b719a38..0022958 100755
--- a/gettext-tools/tests/msgfmt-10
+++ b/gettext-tools/tests/msgfmt-10
@@ -17,6 +17,7 @@ msgstr ""
 "PO-Revision-Date: 2001-04-05 19:47+0200\n"
 "Last-Translator: ABC DEF <address@hidden>\n"
 "Language-Team: test <address@hidden>\n"
+"Language: test\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=ISO-8859-9\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -74,6 +75,7 @@ ${MSGFMT} --check -o /dev/null mf-test10.po2 \
 
 tmpfiles="$tmpfiles mf-test10.ok"
 cat << EOF > mf-test10.ok
+mf-test10.po2:6: warning: header field 'Language' missing in header
 mf-test10.po2:20: number of format specifications in 'msgid_plural' and 
'msgstr[1]' does not match
 msgfmt: found 1 fatal error
 EOF
diff --git a/gettext-tools/tests/msgfmt-15 b/gettext-tools/tests/msgfmt-15
index bafd497..b2712c6 100755
--- a/gettext-tools/tests/msgfmt-15
+++ b/gettext-tools/tests/msgfmt-15
@@ -24,6 +24,7 @@ msgstr ""
 "PO-Revision-Date: 2001-04-05 19:47+0200\n"
 "Last-Translator: ABC DEF <address@hidden>\n"
 "Language-Team: test <address@hidden>\n"
+"Language: test\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -54,6 +55,7 @@ msgstr ""
 "PO-Revision-Date: 2001-04-05 19:47+0200\n"
 "Last-Translator: ABC DEF <address@hidden>\n"
 "Language-Team: test <address@hidden>\n"
+"Language: test\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -84,6 +86,7 @@ msgstr ""
 "PO-Revision-Date: 2001-04-05 19:47+0200\n"
 "Last-Translator: ABC DEF <address@hidden>\n"
 "Language-Team: test <address@hidden>\n"
+"Language: test\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -114,6 +117,7 @@ msgstr ""
 "PO-Revision-Date: 2001-04-05 19:47+0200\n"
 "Last-Translator: ABC DEF <address@hidden>\n"
 "Language-Team: test <address@hidden>\n"
+"Language: test\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
diff --git a/gettext-tools/tests/msgfmt-17 b/gettext-tools/tests/msgfmt-17
index 6f74253..5ff20b5 100755
--- a/gettext-tools/tests/msgfmt-17
+++ b/gettext-tools/tests/msgfmt-17
@@ -23,6 +23,7 @@ msgstr ""
 "PO-Revision-Date: 2001-04-05 19:47+0200\n"
 "Last-Translator: ABC DEF <address@hidden>\n"
 "Language-Team: test <address@hidden>\n"
+"Language: test\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -53,6 +54,7 @@ msgstr ""
 "PO-Revision-Date: 2001-04-05 19:47+0200\n"
 "Last-Translator: ABC DEF <address@hidden>\n"
 "Language-Team: test <address@hidden>\n"
+"Language: test\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -83,6 +85,7 @@ msgstr ""
 "PO-Revision-Date: 2001-04-05 19:47+0200\n"
 "Last-Translator: ABC DEF <address@hidden>\n"
 "Language-Team: test <address@hidden>\n"
+"Language: test\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -113,6 +116,7 @@ msgstr ""
 "PO-Revision-Date: 2001-04-05 19:47+0200\n"
 "Last-Translator: ABC DEF <address@hidden>\n"
 "Language-Team: test <address@hidden>\n"
+"Language: test\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-- 
1.8.1.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]