}
po_lex_pass_obsolete_entries (true);
catalog_reader_parse ((abstract_catalog_reader_ty *) pop, fp, real_filename,
- filename, input_syntax);
+ filename, false, input_syntax);
catalog_reader_free ((abstract_catalog_reader_ty *) pop);
if (fp != stdin)
/* Charset handling while reading PO files.
- Copyright (C) 2001-2007, 2010, 2019-2021 Free Software Foundation, Inc.
+ Copyright (C) 2001-2007, 2010, 2019-2021, 2023 Free Software Foundation, Inc.
Written by Bruno Haible <haible@clisp.cons.org>, 2001.
This program is free software: you can redistribute it and/or modify
}
void
-po_lex_charset_set (const char *header_entry, const char *filename)
+po_lex_charset_set (const char *header_entry,
+ const char *filename, bool is_pot_role)
{
/* Verify the validity of CHARSET. It is necessary
1. for the correct treatment of multibyte characters containing
only ASCII msgids. */
size_t filenamelen = strlen (filename);
- if (!(filenamelen >= 4
- && memcmp (filename + filenamelen - 4, ".pot", 4) == 0
- && strcmp (charset, "CHARSET") == 0))
+ if (!(strcmp (charset, "CHARSET") == 0
+ && ((filenamelen >= 4
+ && memcmp (filename + filenamelen - 4, ".pot", 4) == 0)
+ || is_pot_role)))
{
char *warning_message =
xasprintf (_("\
/* Charset handling while reading PO files.
- Copyright (C) 2001-2003, 2006, 2021 Free Software Foundation, Inc.
+ Copyright (C) 2001-2003, 2006, 2021, 2023 Free Software Foundation, Inc.
Written by Bruno Haible <haible@clisp.cons.org>, 2001.
This program is free software: you can redistribute it and/or modify
/* Initialize the PO file's encoding. */
extern void po_lex_charset_init (void);
-/* Set the PO file's encoding from the header entry. */
+/* Set the PO file's encoding from the header entry.
+ If is_pot_role is true, "charset=CHARSET" is expected and does not deserve
+ a warning. */
extern void po_lex_charset_set (const char *header_entry,
- const char *filename);
+ const char *filename, bool is_pot_role);
/* Finish up with the PO file's encoding. */
extern void po_lex_charset_close (void);
/* GNU gettext - internationalization aids
- Copyright (C) 1995-1996, 1998, 2000-2001, 2003, 2005-2006, 2012-2013, 2016, 2020
- Free Software Foundation, Inc.
+ Copyright (C) 1995-1996, 1998, 2000-2001, 2003, 2005-2006, 2012-2013, 2016, 2020, 2023 Free Software Foundation, Inc.
This file was written by Peter Miller <pmiller@agso.gov.au>
{
/* Test for header entry. Ignore fuzziness of the header entry. */
if (msgctxt == NULL && msgid[0] == '\0' && !obsolete)
- po_lex_charset_set (msgstr, gram_pos.file_name);
+ po_lex_charset_set (msgstr, gram_pos.file_name, gram_pot_role);
po_callback_message (msgctxt,
msgid, msgid_pos, msgid_plural,
/* GNU gettext - internationalization aids
- Copyright (C) 1995-2009, 2011, 2019 Free Software Foundation, Inc.
+ Copyright (C) 1995-2009, 2011, 2019, 2023 Free Software Foundation, Inc.
This file was written by Peter Miller <millerp@canb.auug.org.au>.
Multibyte character handling by Bruno Haible <haible@clisp.cons.org>.
lex_pos_ty gram_pos;
int gram_pos_column;
+/* Whether the PO file is in the role of a POT file. */
+bool gram_pot_role;
+
/* Error handling during the parsing of a PO file.
These functions can access gram_pos and gram_pos_column. */
/* Prepare lexical analysis. */
void
-lex_start (FILE *fp, const char *real_filename, const char *logical_filename)
+lex_start (FILE *fp, const char *real_filename, const char *logical_filename,
+ bool is_pot_role)
{
/* Ignore the logical_filename, because PO file entries already have
their file names attached. But use real_filename for error messages. */
gram_pos.line_number = 1;
gram_pos_column = 0;
+ gram_pot_role = is_pot_role;
signal_eilseq = true;
po_lex_obsolete = false;
po_lex_previous = false;
gram_pos.file_name = NULL;
gram_pos.line_number = 0;
gram_pos_column = 0;
+ gram_pot_role = false;
signal_eilseq = false;
po_lex_obsolete = false;
po_lex_previous = false;
extern DLL_VARIABLE lex_pos_ty gram_pos;
extern DLL_VARIABLE int gram_pos_column;
+/* Whether the PO file is in the role of a POT file. */
+extern DLL_VARIABLE bool gram_pot_role;
+
/* Number of parse errors within a PO file that cause the program to
terminate. Cf. error_message_count, declared in <error.h>. */
extern DLL_VARIABLE unsigned int gram_max_allowed_errors;
/* Prepare lexical analysis. */
extern void lex_start (FILE *fp, const char *real_filename,
- const char *logical_filename);
+ const char *logical_filename, bool is_pot_role);
/* Terminate lexical analysis. */
extern void lex_end (void);
void
catalog_reader_parse (abstract_catalog_reader_ty *pop, FILE *fp,
const char *real_filename, const char *logical_filename,
+ bool is_pot_role,
catalog_input_format_ty input_syntax)
{
error_message_count = 0;
/* Parse the stream's content. */
parse_start (pop);
- input_syntax->parse (pop, fp, real_filename, logical_filename);
+ input_syntax->parse (pop, fp, real_filename, logical_filename, is_pot_role);
parse_end (pop);
if (error_message_count > 0)
/* Reading PO files, abstract class.
- Copyright (C) 1995-1996, 1998, 2000-2003, 2005-2006, 2008-2009, 2012,
- 2015 Free Software Foundation, Inc.
+ Copyright (C) 1995-1996, 1998, 2000-2003, 2005-2006, 2008-2009, 2012, 2015, 2023 Free Software Foundation, Inc.
This file was written by Peter Miller <millerp@canb.auug.org.au>
{
/* Parses the contents of FP, invoking the appropriate callbacks. */
void (*parse) (abstract_catalog_reader_ty *pop, FILE *fp,
- const char *real_filename, const char *logical_filename);
+ const char *real_filename, const char *logical_filename,
+ bool is_pot_role);
/* Whether the parse function always produces messages encoded in UTF-8
encoding. */
catalog_reader_parse (abstract_catalog_reader_ty *pop, FILE *fp,
const char *real_filename,
const char *logical_filename,
+ bool is_pot_role,
catalog_input_format_ty input_syntax);
/* Call the destructor and deallocate a abstract_catalog_reader_ty (or derived
pop->mdlp->encoding = po_charset_utf8;
po_lex_pass_obsolete_entries (true);
catalog_reader_parse ((abstract_catalog_reader_ty *) pop, fp, real_filename,
- logical_filename, input_syntax);
+ logical_filename, false, input_syntax);
mdlp = pop->mdlp;
catalog_reader_free ((abstract_catalog_reader_ty *) pop);
return mdlp;
/* Reading PO files.
- Copyright (C) 1995-1996, 1998, 2000-2006 Free Software Foundation, Inc.
+ Copyright (C) 1995-1996, 1998, 2000-2006, 2023 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
abstract_catalog_reader_class_ty methods. */
static void
po_parse (abstract_catalog_reader_ty *this, FILE *fp,
- const char *real_filename, const char *logical_filename)
+ const char *real_filename, const char *logical_filename,
+ bool is_pot_role)
{
- lex_start (fp, real_filename, logical_filename);
+ lex_start (fp, real_filename, logical_filename, is_pot_role);
po_gram_parse ();
lex_end ();
}
abstract_catalog_reader_class_ty methods. */
static void
properties_parse (abstract_catalog_reader_ty *this, FILE *file,
- const char *real_filename, const char *logical_filename)
+ const char *real_filename, const char *logical_filename,
+ bool is_pot_role)
{
/* Read the file into memory. */
contents = fread_file (file, 0, &contents_length);
abstract_catalog_reader_class_ty methods. */
static void
stringtable_parse (abstract_catalog_reader_ty *pop, FILE *file,
- const char *real_filename, const char *logical_filename)
+ const char *real_filename, const char *logical_filename,
+ bool is_pot_role)
{
fp = file;
real_file_name = real_filename;
pop->mdlp = NULL;
pop->mlp = mdlp->item[0]->messages;
catalog_reader_parse ((abstract_catalog_reader_ty *) pop, fp, real_filename,
- logical_filename, input_syntax);
+ logical_filename, true, input_syntax);
catalog_reader_free ((abstract_catalog_reader_ty *) pop);
if (header_charset != NULL)
abstract_catalog_reader_ty *pop;
pop = catalog_reader_alloc (&exclude_methods);
- catalog_reader_parse (pop, fp, real_filename, filename, &input_format_po);
+ catalog_reader_parse (pop, fp, real_filename, filename, true, &input_format_po);
catalog_reader_free (pop);
if (fp != stdin)