#endif
-/* Current position within the PO file. */
-lex_pos_ty gram_pos;
-
-
/* Error handling during the parsing of a PO file.
- These functions can access gram_pos and ps->gram_pos_column. */
+ These functions can access ps->gram_pos and ps->gram_pos_column. */
/* VARARGS1 */
void
if (vasprintf (&buffer, fmt, ap) < 0)
error (EXIT_FAILURE, 0, _("memory exhausted"));
va_end (ap);
- po_xerror (PO_SEVERITY_ERROR, NULL, gram_pos.file_name, gram_pos.line_number,
+ po_xerror (PO_SEVERITY_ERROR, NULL,
+ ps->gram_pos.file_name, ps->gram_pos.line_number,
ps->gram_pos_column + 1, false, buffer);
free (buffer);
{
/* Ignore the logical_filename, because PO file entries already have
their file names attached. But use real_filename for error messages. */
- gram_pos.file_name = xstrdup (real_filename);
+ ps->gram_pos.file_name = xstrdup (real_filename);
mbfile_init (ps->mbf, fp);
- gram_pos.line_number = 1;
+ ps->gram_pos.line_number = 1;
ps->gram_pos_column = 0;
ps->signal_eilseq = true;
ps->po_lex_obsolete = false;
void
lex_end (struct po_parser_state *ps)
{
- gram_pos.file_name = NULL;
- gram_pos.line_number = 0;
+ ps->gram_pos.file_name = NULL;
+ ps->gram_pos.line_number = 0;
po_lex_charset_close (ps);
free (ps->buf);
}
po_xerror (PO_SEVERITY_FATAL_ERROR, NULL, NULL, 0, 0, false,
xasprintf ("%s: %s",
xasprintf (_("error while reading \"%s\""),
- gram_pos.file_name),
+ ps->gram_pos.file_name),
errno_description));
}
break;
if (mb_iseq (mbc, '\n'))
{
- gram_pos.line_number++;
+ ps->gram_pos.line_number++;
ps->gram_pos_column = 0;
break;
}
break;
}
- gram_pos.line_number++;
+ ps->gram_pos.line_number++;
ps->gram_pos_column = 0;
}
else
{
if (mb_iseq (mbc, '\n'))
/* Decrement the line number, but don't care about the column. */
- gram_pos.line_number--;
+ ps->gram_pos.line_number--;
else
/* Decrement the column number. Also works well enough for tabs. */
ps->gram_pos_column -= mb_width (ps, mbc);
if (!strcmp (s, "msgctxt"))
return PREV_MSGCTXT;
}
- po_gram_error_at_line (&gram_pos, _("keyword \"%s\" unknown"), s);
+ po_gram_error_at_line (&ps->gram_pos, _("keyword \"%s\" unknown"), s);
return NAME;
}
buf[bufpos] = '\0';
lval->string.string = buf;
- lval->string.pos = gram_pos;
+ lval->string.pos = ps->gram_pos;
lval->string.obsolete = ps->po_lex_obsolete;
ps->po_lex_obsolete = false;
ps->signal_eilseq = true;
}
if (mb_iseof (mbc))
{
- po_gram_error_at_line (&gram_pos,
+ po_gram_error_at_line (&ps->gram_pos,
_("end-of-file within string"));
break;
}
if (mb_iseq (mbc, '\n'))
{
- po_gram_error_at_line (&gram_pos,
+ po_gram_error_at_line (&ps->gram_pos,
_("end-of-line within string"));
break;
}
/* Strings cannot contain the msgctxt separator, because it cannot
be faithfully represented in the msgid of a .mo file. */
if (strchr (buf, MSGCTXT_SEPARATOR) != NULL)
- po_gram_error_at_line (&gram_pos,
+ po_gram_error_at_line (&ps->gram_pos,
_("context separator <EOT> within string"));
/* FIXME: Treatment of embedded \000 chars is incorrect. */
lval->string.string = xstrdup (buf);
- lval->string.pos = gram_pos;
+ lval->string.pos = ps->gram_pos;
lval->string.obsolete = ps->po_lex_obsolete;
return (ps->po_lex_previous ? PREV_STRING : STRING);
if (k == NAME)
{
lval->string.string = xstrdup (buf);
- lval->string.pos = gram_pos;
+ lval->string.pos = ps->gram_pos;
lval->string.obsolete = ps->po_lex_obsolete;
}
else
{
- lval->pos.pos = gram_pos;
+ lval->pos.pos = ps->gram_pos;
lval->pos.obsolete = ps->po_lex_obsolete;
}
return k;
buf[bufpos] = '\0';
lval->number.number = atol (buf);
- lval->number.pos = gram_pos;
+ lval->number.pos = ps->gram_pos;
lval->number.obsolete = ps->po_lex_obsolete;
return NUMBER;
case '[':
- lval->pos.pos = gram_pos;
+ lval->pos.pos = ps->gram_pos;
lval->pos.obsolete = ps->po_lex_obsolete;
return '[';
case ']':
- lval->pos.pos = gram_pos;
+ lval->pos.pos = ps->gram_pos;
lval->pos.obsolete = ps->po_lex_obsolete;
return ']';