warnings: factoring: complaints

* src/complain.c (error_message): Accept warning categories (an integer) as
argument.
Location is a 'const location *' instead of 'location *'.
(ERROR_MESSAGE): Delete it.
* src/complain.c, src/complain.h (complains): New function.
(complain, complain_at, complain_at_indent): Generic functions for
complaints. Call 'complains'.
(warn_at, warn_at_indent, warn, yacc_at, midrule_value_at)
(fatal_at, fatal): Delete them. Adjust dependencies.
* src/complain.h (enum warnings): New fields 'complaint' and 'fatal'.
* bootstrap.conf (XGETTEXT_OPTIONS): Adjust.
This commit is contained in:
Victor Santet
2012-06-28 16:44:21 +02:00
committed by Akim Demaille
parent d0f11c1b62
commit 6fb8b25619
17 changed files with 310 additions and 364 deletions

View File

@@ -29,7 +29,7 @@
#include "files.h"
#include "getargs.h"
int warnings_flag = Wconflicts_sr | Wconflicts_rr | Wother;
warnings warnings_flag = Wconflicts_sr | Wconflicts_rr | Wother;
bool complaint_issued;
static unsigned *indent_ptr = 0;
@@ -40,6 +40,7 @@ static unsigned *indent_ptr = 0;
*
* \param loc the location, defaulting to the current file,
* or the program name.
* \param flags the category for this message.
* \param prefix put before the message (e.g., "warning").
* \param message the error message, a printf format string. Iff it
* ends with ": ", then no trailing newline is printed,
@@ -49,10 +50,10 @@ static unsigned *indent_ptr = 0;
*/
static
void
error_message (location *loc,
const char *prefix,
error_message (const location *loc, warnings flags, const char *prefix,
const char *message, va_list args)
{
(void) flags;
unsigned pos = 0;
if (loc)
@@ -84,15 +85,73 @@ error_message (location *loc,
}
}
/** Wrap error_message() with varargs handling. */
#define ERROR_MESSAGE(Loc, Prefix, Message) \
{ \
va_list args; \
va_start (args, Message); \
error_message (Loc, Prefix, Message, args); \
va_end (args); \
/** Raise a complaint. That can be a fatal error, a complaint or just a
warning. */
static inline void
complains (const location *loc, warnings flags, const char *message,
va_list args)
{
if (flags & complaint)
{
error_message (loc, complaint, NULL, message, args);
complaint_issued = true;
}
else if (flags & fatal)
{
error_message (loc, fatal, _("fatal error"), message, args);
exit (EXIT_FAILURE);
}
else if (flags & Wyacc)
{
if (yacc_flag)
{
error_message (loc, flags, NULL, message, args);
complaint_issued = true;
}
else if (warnings_flag & Wyacc)
{
set_warning_issued ();
error_message (loc, flags, _("warning"), message, args);
}
}
else
{
if (! (warnings_flag & flags))
return;
set_warning_issued ();
error_message (loc, flags, _("warning"), message, args);
}
}
void
complain (warnings flags, const char *message, ...)
{
va_list args;
va_start (args, message);
complains (NULL, flags, message, args);
va_end (args);
}
void
complain_at (location loc, warnings flags, const char *message, ...)
{
va_list args;
va_start (args, message);
complains (&loc, flags, message, args);
va_end (args);
}
void complain_at_indent (location loc, warnings flags, unsigned *indent,
const char *message, ...)
{
indent_ptr = indent;
va_list args;
va_start (args, message);
complains (&loc, flags, message, args);
va_end (args);
}
/*--------------------------------.
| Report a warning, and proceed. |
@@ -109,108 +168,3 @@ set_warning_issued (void)
}
warning_issued = true;
}
void
warn_at (location loc, const char *message, ...)
{
if (!(warnings_flag & Wother))
return;
set_warning_issued ();
ERROR_MESSAGE (&loc, _("warning"), message);
}
void
warn_at_indent (location loc, unsigned *indent,
const char *message, ...)
{
if (!(warnings_flag & Wother))
return;
set_warning_issued ();
indent_ptr = indent;
ERROR_MESSAGE (&loc, _("warning"), message);
}
void
warn (const char *message, ...)
{
if (!(warnings_flag & Wother))
return;
set_warning_issued ();
ERROR_MESSAGE (NULL, _("warning"), message);
}
/*-----------------------------------------------------------.
| An error has occurred, but we can proceed, and die later. |
`-----------------------------------------------------------*/
void
complain_at (location loc, const char *message, ...)
{
ERROR_MESSAGE (&loc, NULL, message);
complaint_issued = true;
}
void
complain_at_indent (location loc, unsigned *indent,
const char *message, ...)
{
indent_ptr = indent;
ERROR_MESSAGE (&loc, NULL, message);
complaint_issued = true;
}
void
complain (const char *message, ...)
{
ERROR_MESSAGE (NULL, NULL, message);
complaint_issued = true;
}
/*--------------------------------------------------------------.
| An incompatibility with POSIX Yacc: mapped either to warn* or |
| complain* depending on yacc_flag. |
`--------------------------------------------------------------*/
void
yacc_at (location loc, const char *message, ...)
{
if (yacc_flag)
{
ERROR_MESSAGE (&loc, NULL, message);
complaint_issued = true;
}
else if (warnings_flag & Wyacc)
{
set_warning_issued ();
ERROR_MESSAGE (&loc, _("warning"), message);
}
}
void
midrule_value_at (location loc, const char *message, ...)
{
if (!(warnings_flag & Wmidrule_values))
return;
set_warning_issued ();
ERROR_MESSAGE (&loc, _("warning"), message);
}
/*-------------------------------------------------.
| A severe error has occurred, we cannot proceed. |
`-------------------------------------------------*/
void
fatal_at (location loc, const char *message, ...)
{
ERROR_MESSAGE (&loc, _("fatal error"), message);
exit (EXIT_FAILURE);
}
void
fatal (const char *message, ...)
{
ERROR_MESSAGE (NULL, _("fatal error"), message);
exit (EXIT_FAILURE);
}