Make header checking more reliable

This commit is contained in:
Daiki Ueno 2013-04-18 14:43:07 +09:00
parent ea9a855bf0
commit d47ceb27a4
5 changed files with 51 additions and 53 deletions

View 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.

View 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'; )
{
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);
}
}

View File

@ -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

View File

@ -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"

View File

@ -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"