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 <[email protected]> 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 <[email protected]>\n" "Language-Team: test <[email protected]>\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 <[email protected]>\n" "Language-Team: test <[email protected]>\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 <[email protected]>\n" "Language-Team: test <[email protected]>\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 <[email protected]>\n" "Language-Team: test <[email protected]>\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 <[email protected]>\n" "Language-Team: test <[email protected]>\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 <[email protected]>\n" "Language-Team: test <[email protected]>\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 <[email protected]>\n" "Language-Team: test <[email protected]>\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 <[email protected]>\n" "Language-Team: test <[email protected]>\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 <[email protected]>\n" "Language-Team: test <[email protected]>\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
