[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [bug-gettext] [PATCH] Make header checking more reliable.,
Daiki Ueno <=