From d47ceb27a49b1e3f314e249696ab94b69deb2991 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Thu, 18 Apr 2013 14:43:07 +0900 Subject: [PATCH] Make header checking more reliable --- gettext-tools/src/ChangeLog | 6 +++ gettext-tools/src/msgl-check.c | 88 ++++++++++++++-------------------- gettext-tools/tests/msgfmt-10 | 2 + gettext-tools/tests/msgfmt-15 | 4 ++ gettext-tools/tests/msgfmt-17 | 4 ++ 5 files changed, 51 insertions(+), 53 deletions(-) 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'; ) + { + if (strncmp (line, field, len) == 0 && line[len] == ':') + { + 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) + { + p += strlen (default_values[cnt]); + if (*p == '\0' || *p == '\n') + { + 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); + } + } + break; + } + line = strchrnul (line, '\n'); + if (*line == '\n') + line++; + } + if (*line == '\0') { char *msg = xasprintf (_("header field '%s' missing in header\n"), - required_fields[cnt]); + field); 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) - { - p += strlen (default_values[cnt]); - if (*p == '\0' || *p == '\n') - { - if (initial != -1) - { - po_xerror (severity, - mp, NULL, 0, 0, true, _("\ -some header fields still have the initial default value\n")); - initial = -1; - break; - } - else - initial = cnt; - } - } - } - } - - 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"