From: Daiki Ueno Date: Thu, 18 Apr 2013 05:43:07 +0000 (+0900) Subject: Make header checking more reliable X-Git-Tag: v0.18.3~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d47ceb27a49b1e3f314e249696ab94b69deb2991;p=thirdparty%2Fgettext.git Make header checking more reliable --- diff --git a/gettext-tools/src/ChangeLog b/gettext-tools/src/ChangeLog index 9493a5ed7..ff1a392bb 100644 --- a/gettext-tools/src/ChangeLog +++ b/gettext-tools/src/ChangeLog @@ -1,3 +1,9 @@ +2013-04-22 Daiki Ueno + + 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 Support CR/LF line terminators in Python sources even on Unix. diff --git a/gettext-tools/src/msgl-check.c b/gettext-tools/src/msgl-check.c index 3aa526db7..cc73e9abc 100644 --- a/gettext-tools/src/msgl-check.c +++ b/gettext-tools/src/msgl-check.c @@ -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); } } diff --git a/gettext-tools/tests/msgfmt-10 b/gettext-tools/tests/msgfmt-10 index b719a38dd..00229588c 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 \n" "Language-Team: test \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 bafd49758..b2712c61f 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 \n" "Language-Team: test \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 \n" "Language-Team: test \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 \n" "Language-Team: test \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 \n" "Language-Team: test \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 6f742533d..5ff20b587 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 \n" "Language-Team: test \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 \n" "Language-Team: test \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 \n" "Language-Team: test \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 \n" "Language-Team: test \n" +"Language: test\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n"