/* An error logger based on the po_error function pointer. */
static void
-po_error_logger (const char *format, ...)
- __attribute__ ((__format__ (__printf__, 1, 2)));
+po_error_logger (void *data, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3)));
static void
-po_error_logger (const char *format, ...)
+po_error_logger (void *data, const char *format, ...)
{
va_list args;
char *error_message;
check_msgid_msgstr_format (mp->msgid, mp->msgid_plural,
mp->msgstr, mp->msgstr_len,
- mp->is_format, mp->range, NULL, po_error_logger);
+ mp->is_format, mp->range, NULL,
+ po_error_logger, NULL);
/* Restore error handler. */
po_error = orig_error;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
spec2->numbered[j].number, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
spec1->numbered[i].number, pretty_msgstr);
err = true;
break;
if (spec1->numbered[i].type != spec2->numbered[j].type)
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr,
spec2->numbered[j].number);
err = true;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
spec2->numbered[j].number, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
spec1->numbered[i].number, pretty_msgstr);
err = true;
break;
if (spec1->numbered[i].type != spec2->numbered[j].type)
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr,
spec2->numbered[j].number);
err = true;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
spec2->numbered[j].number, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
spec1->numbered[i].number, pretty_msgstr);
err = true;
break;
{
char buf[MAX_TYPE_DESCRIPTION_LEN];
get_type_description (buf, type_difference);
- error_logger (_("The format specification for argument %u in '%s' is applicable to the types %s, but the format specification for argument %u in '%s' is not."),
+ error_logger (error_logger_data,
+ _("The format specification for argument %u in '%s' is applicable to the types %s, but the format specification for argument %u in '%s' is not."),
spec1->numbered[i].number, pretty_msgid, buf,
spec2->numbered[j].number, pretty_msgstr);
}
if (presentation_difference != 0)
{
if (error_logger)
- error_logger (_("The format specification for argument %u in '%s' uses a different presentation than the format specification for argument %u in '%s'."),
+ error_logger (error_logger_data,
+ _("The format specification for argument %u in '%s' uses a different presentation than the format specification for argument %u in '%s'."),
spec2->numbered[j].number, pretty_msgstr,
spec1->numbered[i].number, pretty_msgid);
err = true;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
: spec1->unnumbered_arg_count < spec2->unnumbered_arg_count)
{
if (error_logger)
- error_logger (_("number of format specifications in '%s' and '%s' does not match"),
+ error_logger (error_logger_data,
+ _("number of format specifications in '%s' and '%s' does not match"),
pretty_msgid, pretty_msgstr);
err = true;
}
if (spec1->unnumbered[i].type != spec2->unnumbered[i].type)
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr, i + 1);
err = true;
}
/* C# format strings.
- Copyright (C) 2003-2004, 2006-2007, 2009, 2018-2019 Free Software Foundation, Inc.
+ Copyright (C) 2003-2023 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2003.
This program is free software: you can redistribute it and/or modify
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
: spec1->numbered_arg_count < spec2->numbered_arg_count)
{
if (error_logger)
- error_logger (_("number of format specifications in '%s' and '%s' does not match"),
+ error_logger (error_logger_data,
+ _("number of format specifications in '%s' and '%s' does not match"),
pretty_msgid, pretty_msgstr);
err = true;
}
/* Emacs Lisp format strings.
- Copyright (C) 2001-2004, 2006-2007, 2009, 2019-2020 Free Software Foundation, Inc.
+ Copyright (C) 2001-2023 Free Software Foundation, Inc.
Written by Bruno Haible <haible@clisp.cons.org>, 2002.
This program is free software: you can redistribute it and/or modify
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
spec2->numbered[j].number, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
spec1->numbered[i].number, pretty_msgstr);
err = true;
break;
if (spec1->numbered[i].type != spec2->numbered[j].type)
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr,
spec2->numbered[j].number);
err = true;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
spec2->numbered[j].number, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
spec1->numbered[i].number, pretty_msgstr);
err = true;
break;
if (spec1->numbered[i].type != spec2->numbered[j].type)
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr,
spec2->numbered[j].number);
err = true;
if (error_logger)
{
if (spec1->uses_err_no)
- error_logger (_("'%s' uses %%m but '%s' doesn't"),
+ error_logger (error_logger_data,
+ _("'%s' uses %%m but '%s' doesn't"),
pretty_msgid, pretty_msgstr);
else
- error_logger (_("'%s' does not use %%m but '%s' uses %%m"),
+ error_logger (error_logger_data,
+ _("'%s' does not use %%m but '%s' uses %%m"),
pretty_msgid, pretty_msgstr);
}
err = true;
/* GFC (GNU Fortran Compiler) internal format strings.
- Copyright (C) 2003-2009, 2019-2020, 2022 Free Software Foundation, Inc.
+ Copyright (C) 2003-2023 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2009.
This program is free software: you can redistribute it and/or modify
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
: spec1->unnumbered_arg_count < spec2->unnumbered_arg_count)
{
if (error_logger)
- error_logger (_("number of format specifications in '%s' and '%s' does not match"),
+ error_logger (error_logger_data,
+ _("number of format specifications in '%s' and '%s' does not match"),
pretty_msgid, pretty_msgstr);
err = true;
}
if (spec1->unnumbered[i].type != spec2->unnumbered[i].type)
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr, i + 1);
err = true;
}
if (error_logger)
{
if (spec1->uses_currentloc)
- error_logger (_("'%s' uses %%C but '%s' doesn't"),
+ error_logger (error_logger_data,
+ _("'%s' uses %%C but '%s' doesn't"),
pretty_msgid, pretty_msgstr);
else
- error_logger (_("'%s' does not use %%C but '%s' uses %%C"),
+ error_logger (error_logger_data,
+ _("'%s' does not use %%C but '%s' uses %%C"),
pretty_msgid, pretty_msgstr);
}
err = true;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
spec2->numbered[j].number, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
spec1->numbered[i].number, pretty_msgstr);
err = true;
break;
if (spec1->numbered[i].type != spec2->numbered[j].type)
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr,
spec2->numbered[j].number);
err = true;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument {%u}, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument {%u}, as in '%s', doesn't exist in '%s'"),
spec2->numbered[j].number, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument {%u} doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument {%u} doesn't exist in '%s'"),
spec1->numbered[i].number, pretty_msgstr);
err = true;
break;
if (spec1->numbered[i].type != spec2->numbered[j].type)
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument {%u} are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument {%u} are not the same"),
pretty_msgid, pretty_msgstr,
spec2->numbered[j].number);
err = true;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
spec2->numbered[j].number, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
spec1->numbered[i].number, pretty_msgstr);
err = true;
break;
|| spec2->numbered[i].type == FAT_ANY))))
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr,
spec2->numbered[j].number);
err = true;
/* KUIT (KDE User Interface Text) format strings.
- Copyright (C) 2015, 2018-2019 Free Software Foundation, Inc.
+ Copyright (C) 2015-2023 Free Software Foundation, Inc.
Written by Daiki Ueno <ueno@gnu.org>, 2015.
This program is free software: you can redistribute it and/or modify
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *msgid_spec = msgid_descr;
struct spec *msgstr_spec = msgstr_descr;
return formatstring_kde.check (msgid_spec->base, msgstr_spec->base, equality,
- error_logger,
+ error_logger, error_logger_data,
pretty_msgid, pretty_msgstr);
}
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
spec2->numbered[j].number, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
spec1->numbered[i].number, pretty_msgstr);
err = true;
break;
else if (missing)
{
if (error_logger)
- error_logger (_("a format specification for arguments %u and %u doesn't exist in '%s', only one argument may be ignored"),
+ error_logger (error_logger_data,
+ _("a format specification for arguments %u and %u doesn't exist in '%s', only one argument may be ignored"),
missing, spec1->numbered[i].number,
pretty_msgstr);
err = true;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
spec2->numbered[j].number, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
spec1->numbered[i].number, pretty_msgstr);
err = true;
break;
if (spec1->numbered[i].type != spec2->numbered[j].type)
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr,
spec2->numbered[j].number);
err = true;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (!equal_list (spec1->list, spec2->list))
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' are not equivalent"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' are not equivalent"),
pretty_msgid, pretty_msgstr);
err = true;
}
equal_list (intersection, spec2->list))))
{
if (error_logger)
- error_logger (_("format specifications in '%s' are not a subset of those in '%s'"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' are not a subset of those in '%s'"),
pretty_msgstr, pretty_msgid);
err = true;
}
/* Lua format strings.
- Copyright (C) 2012-2013, 2018-2020 Free Software Foundation, Inc.
+ Copyright (C) 2012-2023 Free Software Foundation, Inc.
Written by ĽubomÃr Remák <lubomirr@lubomirr.eu>, 2012.
This program is free software: you can redistribute it and/or modify
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (i >= n1)
{
if (error_logger)
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
i + 1, pretty_msgstr, pretty_msgid);
return true;
}
else if (i >= n2)
{
if (error_logger)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
i + 1, pretty_msgstr);
return true;
}
else if (spec1->format_args[i] != spec2->format_args[i])
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr, i + 1);
return true;
}
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
spec2->numbered[j].number, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
spec1->numbered[i].number, pretty_msgstr);
err = true;
break;
if (spec1->numbered[i].type != spec2->numbered[j].type)
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr,
spec2->numbered[j].number);
err = true;
/* Perl brace format strings.
- Copyright (C) 2004, 2006-2007, 2009, 2019-2020 Free Software Foundation, Inc.
+ Copyright (C) 2004-2023 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2003.
This program is free software: you can redistribute it and/or modify
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument '%s' doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument '%s' doesn't exist in '%s'"),
spec1->named[i].name, pretty_msgstr);
err = true;
break;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
spec2->numbered[j].number, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
spec1->numbered[i].number, pretty_msgstr);
err = true;
break;
if (spec1->numbered[i].type != spec2->numbered[j].type)
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr,
spec2->numbered[j].number);
err = true;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
spec2->numbered[j].number, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
spec1->numbered[i].number, pretty_msgstr);
err = true;
break;
if (spec1->numbered[i].type != spec2->numbered[j].type)
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr,
spec2->numbered[j].number);
err = true;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument '%s' doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument '%s' doesn't exist in '%s'"),
spec2->named[i].name, pretty_msgid);
err = true;
break;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument '%s' doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument '%s' doesn't exist in '%s'"),
spec1->named[i].name, pretty_msgstr);
err = true;
break;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (spec1->named_arg_count > 0 && spec2->unnamed_arg_count > 0)
{
if (error_logger)
- error_logger (_("format specifications in '%s' expect a mapping, those in '%s' expect a tuple"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' expect a mapping, those in '%s' expect a tuple"),
pretty_msgid, pretty_msgstr);
err = true;
}
else if (spec1->unnamed_arg_count > 0 && spec2->named_arg_count > 0)
{
if (error_logger)
- error_logger (_("format specifications in '%s' expect a tuple, those in '%s' expect a mapping"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' expect a tuple, those in '%s' expect a mapping"),
pretty_msgid, pretty_msgstr);
err = true;
}
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument '%s', as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument '%s', as in '%s', doesn't exist in '%s'"),
spec2->named[j].name, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument '%s' doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument '%s' doesn't exist in '%s'"),
spec1->named[i].name, pretty_msgstr);
err = true;
break;
|| spec2->named[j].type == FAT_ANY))))
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument '%s' are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument '%s' are not the same"),
pretty_msgid, pretty_msgstr,
spec2->named[j].name);
err = true;
if (spec1->unnamed_arg_count != spec2->unnamed_arg_count)
{
if (error_logger)
- error_logger (_("number of format specifications in '%s' and '%s' does not match"),
+ error_logger (error_logger_data,
+ _("number of format specifications in '%s' and '%s' does not match"),
pretty_msgid, pretty_msgstr);
err = true;
}
|| spec2->unnamed[i].type == FAT_ANY))))
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr, i + 1);
err = true;
}
/* Qt plural format strings.
- Copyright (C) 2003-2004, 2006-2007, 2009, 2019 Free Software Foundation, Inc.
+ Copyright (C) 2003-2023 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2009.
This program is free software: you can redistribute it and/or modify
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
|| (equality && spec1->directives > 0 && spec2->directives == 0))
{
if (error_logger)
- error_logger (_("number of format specifications in '%s' and '%s' does not match"),
+ error_logger (error_logger_data,
+ _("number of format specifications in '%s' and '%s' does not match"),
pretty_msgid, pretty_msgstr);
err = true;
}
/* Qt format strings.
- Copyright (C) 2003-2004, 2006-2007, 2009, 2019 Free Software Foundation, Inc.
+ Copyright (C) 2003-2023 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2003.
This program is free software: you can redistribute it and/or modify
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (spec1->simple && !spec2->simple)
{
if (error_logger)
- error_logger (_("'%s' is a simple format string, but '%s' is not: it contains an 'L' flag or a double-digit argument number"),
+ error_logger (error_logger_data,
+ _("'%s' is a simple format string, but '%s' is not: it contains an 'L' flag or a double-digit argument number"),
pretty_msgid, pretty_msgstr);
err = true;
}
if (error_logger)
{
if (arg_used1)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
i, pretty_msgstr);
else
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
i, pretty_msgstr, pretty_msgid);
}
err = true;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (spec1->named_arg_count > 0 && spec2->numbered_arg_count > 0)
{
if (error_logger)
- error_logger (_("format specifications in '%s' expect a hash table, those in '%s' expect individual arguments"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' expect a hash table, those in '%s' expect individual arguments"),
pretty_msgid, pretty_msgstr);
err = true;
}
else if (spec1->numbered_arg_count > 0 && spec2->named_arg_count > 0)
{
if (error_logger)
- error_logger (_("format specifications in '%s' expect individual arguments, those in '%s' expect a hash table"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' expect individual arguments, those in '%s' expect a hash table"),
pretty_msgid, pretty_msgstr);
err = true;
}
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument '%s', as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument '%s', as in '%s', doesn't exist in '%s'"),
spec2->named[j].name, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument '%s' doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument '%s' doesn't exist in '%s'"),
spec1->named[i].name, pretty_msgstr);
err = true;
break;
if (!(spec1->named[i].type == spec2->named[j].type))
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument '%s' are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument '%s' are not the same"),
pretty_msgid, pretty_msgstr,
spec2->named[j].name);
err = true;
if (spec1->numbered_arg_count != spec2->numbered_arg_count)
{
if (error_logger)
- error_logger (_("number of format specifications in '%s' and '%s' does not match"),
+ error_logger (error_logger_data,
+ _("number of format specifications in '%s' and '%s' does not match"),
pretty_msgid, pretty_msgstr);
err = true;
}
if (!(spec1->numbered[i].type == spec2->numbered[i].type))
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr, i + 1);
err = true;
}
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (!equal_list (spec1->list, spec2->list))
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' are not equivalent"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' are not equivalent"),
pretty_msgid, pretty_msgstr);
err = true;
}
equal_list (intersection, spec2->list))))
{
if (error_logger)
- error_logger (_("format specifications in '%s' are not a subset of those in '%s'"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' are not a subset of those in '%s'"),
pretty_msgstr, pretty_msgid);
err = true;
}
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument '%s', as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument '%s', as in '%s', doesn't exist in '%s'"),
spec2->named[j].name, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument '%s' doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument '%s' doesn't exist in '%s'"),
spec1->named[i].name, pretty_msgstr);
err = true;
break;
/* Smalltalk and YCP format strings.
- Copyright (C) 2001-2004, 2006-2007, 2009, 2019-2020 Free Software Foundation, Inc.
+ Copyright (C) 2001-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
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (error_logger)
{
if (arg_used1)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
i + 1, pretty_msgstr);
else
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
i + 1, pretty_msgstr, pretty_msgid);
}
err = true;
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
- formatstring_error_logger_t error_logger,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
const char *pretty_msgid, const char *pretty_msgstr)
{
struct spec *spec1 = (struct spec *) msgid_descr;
if (cmp > 0)
{
if (error_logger)
- error_logger (_("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u, as in '%s', doesn't exist in '%s'"),
spec2->numbered[j].number, pretty_msgstr,
pretty_msgid);
err = true;
if (equality)
{
if (error_logger)
- error_logger (_("a format specification for argument %u doesn't exist in '%s'"),
+ error_logger (error_logger_data,
+ _("a format specification for argument %u doesn't exist in '%s'"),
spec1->numbered[i].number, pretty_msgstr);
err = true;
break;
if (spec1->numbered[i].type != spec2->numbered[j].type)
{
if (error_logger)
- error_logger (_("format specifications in '%s' and '%s' for argument %u are not the same"),
+ error_logger (error_logger_data,
+ _("format specifications in '%s' and '%s' for argument %u are not the same"),
pretty_msgid, pretty_msgstr,
spec2->numbered[j].number);
err = true;
size_t i,
struct argument_range range,
const struct plural_distribution *distribution,
- formatstring_error_logger_t error_logger)
+ formatstring_error_logger_t error_logger, void *error_logger_data)
{
int seen_errors = 0;
if (parser->check (msgid_descr, msgstr_descr,
strict_checking,
- error_logger, pretty_msgid, pretty_msgstr))
+ error_logger, error_logger_data,
+ pretty_msgid, pretty_msgstr))
seen_errors++;
parser->free (msgstr_descr);
}
else
{
- error_logger (_("'%s' is not a valid %s format string, unlike '%s'. Reason: %s"),
+ error_logger (error_logger_data,
+ _("'%s' is not a valid %s format string, unlike '%s'. Reason: %s"),
pretty_msgstr, format_language_pretty[i],
pretty_msgid, invalid_reason);
seen_errors++;
const enum is_format is_format[NFORMATS],
struct argument_range range,
const struct plural_distribution *distribution,
- formatstring_error_logger_t error_logger)
+ formatstring_error_logger_t error_logger, void *error_logger_data)
{
int seen_errors = 0;
size_t i;
msgstr, msgstr_len, i,
range,
distribution,
- error_logger);
+ error_logger, error_logger_data);
return seen_errors;
}
fdi[(ptr) - format_start] |= (flag)/*;*/
/* This type of callback is responsible for showing an error. */
-typedef void (*formatstring_error_logger_t) (const char *format, ...)
+typedef void (*formatstring_error_logger_t) (void *data, const char *format, ...)
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
- __attribute__ ((__format__ (__printf__, 1, 2)))
+ __attribute__ ((__format__ (__printf__, 2, 3)))
#endif
;
msgstr_descr may omit some of the arguments of msgid_descr).
If not, signal an error using error_logger (only if error_logger != NULL)
and return true. Otherwise return false. */
- bool (*check) (void *msgid_descr, void *msgstr_descr, bool equality, formatstring_error_logger_t error_logger, const char *pretty_msgid, const char *pretty_msgstr);
+ bool (*check) (void *msgid_descr, void *msgstr_descr, bool equality,
+ formatstring_error_logger_t error_logger, void *error_logger_data,
+ const char *pretty_msgid, const char *pretty_msgstr);
};
/* Format string parsers, each defined in its own file. */
size_t i,
struct argument_range range,
const struct plural_distribution *distribution,
- formatstring_error_logger_t error_logger);
+ formatstring_error_logger_t error_logger, void *error_logger_data);
/* Check whether both formats strings contain compatible format
specifications.
const enum is_format is_format[NFORMATS],
struct argument_range range,
const struct plural_distribution *distribution,
- formatstring_error_logger_t error_logger);
+ formatstring_error_logger_t error_logger, void *error_logger_data);
#ifdef __cplusplus
/* Signal an error when checking format strings. */
-static const message_ty *curr_mp;
-static lex_pos_ty curr_msgid_pos;
+struct formatstring_error_logger_locals
+{
+ const message_ty *curr_mp;
+ lex_pos_ty curr_msgid_pos;
+};
static void
-formatstring_error_logger (const char *format, ...)
+formatstring_error_logger (void *data, const char *format, ...)
#if defined __GNUC__ && ((__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || __GNUC__ > 2)
- __attribute__ ((__format__ (__printf__, 1, 2)))
+ __attribute__ ((__format__ (__printf__, 2, 3)))
#endif
;
static void
-formatstring_error_logger (const char *format, ...)
+formatstring_error_logger (void *data, const char *format, ...)
{
+ struct formatstring_error_logger_locals *l =
+ (struct formatstring_error_logger_locals *) data;
va_list args;
char *msg;
error (EXIT_FAILURE, 0, _("memory exhausted"));
va_end (args);
po_xerror (PO_SEVERITY_ERROR,
- curr_mp, curr_msgid_pos.file_name, curr_msgid_pos.line_number,
+ l->curr_mp,
+ l->curr_msgid_pos.file_name, l->curr_msgid_pos.line_number,
(size_t)(-1), false, msg);
free (msg);
}
/* Test 3: Check whether both formats strings contain the same number
of format specifications. */
{
- curr_mp = mp;
- curr_msgid_pos = *msgid_pos;
+ struct formatstring_error_logger_locals locals;
+ locals.curr_mp = mp;
+ locals.curr_msgid_pos = *msgid_pos;
seen_errors +=
check_msgid_msgstr_format (msgid, msgid_plural, msgstr, msgstr_len,
is_format, mp->range, distribution,
- formatstring_error_logger);
+ formatstring_error_logger, &locals);
}
if (check_accelerators && msgid_plural == NULL)
/* A silent error logger. We are only interested in knowing whether errors
occurred at all. */
static void
-silent_error_logger (const char *format, ...)
- __attribute__ ((__format__ (__printf__, 1, 2)));
+silent_error_logger (void *data, const char *format, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3)));
static void
-silent_error_logger (const char *format, ...)
+silent_error_logger (void *data, const char *format, ...)
{
}
&& !possible_format_p (def->is_format[i])
&& check_msgid_msgstr_format_i (ref->msgid, ref->msgid_plural,
msgstr, msgstr_len, i, ref->range,
- distribution, silent_error_logger)
+ distribution,
+ silent_error_logger, NULL)
> 0)
result->is_fuzzy = true;
}