]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
Make header checking more reliable
authorDaiki Ueno <ueno@gnu.org>
Thu, 18 Apr 2013 05:43:07 +0000 (14:43 +0900)
committerDaiki Ueno <ueno@gnu.org>
Mon, 22 Apr 2013 06:50:12 +0000 (15:50 +0900)
gettext-tools/src/ChangeLog
gettext-tools/src/msgl-check.c
gettext-tools/tests/msgfmt-10
gettext-tools/tests/msgfmt-15
gettext-tools/tests/msgfmt-17

index 9493a5ed76212ab86ae4748b8aa825703540316a..ff1a392bbfea0bf96f15e9b2935c695e054ec124 100644 (file)
@@ -1,3 +1,9 @@
+2013-04-22  Daiki Ueno  <ueno@gnu.org>
+
+       Make msgfmt --check-header more reliable.
+       * msgl-check.c (check_header_entry): Don't use c_strstr to parse
+       message header.
+
 2013-04-22  Daiki Ueno  <ueno@gnu.org>
 
        Support CR/LF line terminators in Python sources even on Unix.
index 3aa526db79ab68d1cb7d5abb167282ff3b843348..cc73e9abc6aac74df3f57a6bcfb445a18b66e805 100644 (file)
@@ -770,72 +770,54 @@ check_header_entry (const message_ty *mp, const char *msgstr_string)
   };
   const size_t nfields = SIZEOF (required_fields);
   const size_t nrequiredfields = nfields - 1;
-  int initial = -1;
   int cnt;
 
   for (cnt = 0; cnt < nfields; ++cnt)
     {
       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, _("\
-some header fields still have the initial default value\n"));
-                      initial = -1;
-                      break;
+                     char *msg =
+                       xasprintf (_("header field '%s' still has the initial default value\n"),
+                                  field);
+                     po_xerror (severity, mp, NULL, 0, 0, true, msg);
+                     free (msg);
                     }
-                  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);
         }
-    }
-
-  if (initial != -1)
-    {
-      int severity =
-        (initial < nrequiredfields ? PO_SEVERITY_ERROR : PO_SEVERITY_WARNING);
-      char *msg =
-        xasprintf (_("header field '%s' still has the initial default value\n"),
-                   required_fields[initial]);
-      po_xerror (severity, mp, NULL, 0, 0, true, msg);
-      free (msg);
     }
 }
 
index b719a38ddda6c3033c3a5c16943beb5b74df2841..00229588cec5589dec84b5ab16de457e676544d9 100755 (executable)
@@ -17,6 +17,7 @@ msgstr ""
 "PO-Revision-Date: 2001-04-05 19:47+0200\n"
 "Last-Translator: ABC DEF <abc@gnu.uucp>\n"
 "Language-Team: test <test@li.org>\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
index bafd49758018d8da08a02403dc6843bfb33e696d..b2712c61f2ef8c5163cf554045f780abf597a169 100755 (executable)
@@ -24,6 +24,7 @@ msgstr ""
 "PO-Revision-Date: 2001-04-05 19:47+0200\n"
 "Last-Translator: ABC DEF <abc@gnu.uucp>\n"
 "Language-Team: test <test@li.org>\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 <abc@gnu.uucp>\n"
 "Language-Team: test <test@li.org>\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 <abc@gnu.uucp>\n"
 "Language-Team: test <test@li.org>\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 <abc@gnu.uucp>\n"
 "Language-Team: test <test@li.org>\n"
+"Language: test\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
index 6f742533d6217edcd58a3f3c95efaf7358a0683e..5ff20b58751b8634ea248a27fb4fc5e62f27a99e 100755 (executable)
@@ -23,6 +23,7 @@ msgstr ""
 "PO-Revision-Date: 2001-04-05 19:47+0200\n"
 "Last-Translator: ABC DEF <abc@gnu.uucp>\n"
 "Language-Team: test <test@li.org>\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 <abc@gnu.uucp>\n"
 "Language-Team: test <test@li.org>\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 <abc@gnu.uucp>\n"
 "Language-Team: test <test@li.org>\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 <abc@gnu.uucp>\n"
 "Language-Team: test <test@li.org>\n"
+"Language: test\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"