* src/complain.c (error_message, ERROR_MESSAGE): New.

To factor...
(fatal_at, fatal, warn_at, warn, complain_at, complain): these.
* src/complain.h, src/complain.c (warning_issued): Remove, unused.
This commit is contained in:
Akim Demaille
2006-07-10 19:36:31 +00:00
parent b321737f20
commit 23eb2a692f
3 changed files with 63 additions and 76 deletions

View File

@@ -1,3 +1,10 @@
2006-07-10 Akim Demaille <akim@lrde.epita.fr>
* src/complain.c (error_message, ERROR_MESSAGE): New.
To factor...
(fatal_at, fatal, warn_at, warn, complain_at, complain): these.
* src/complain.h, src/complain.c (warning_issued): Remove, unused.
2006-07-09 Paul Eggert <eggert@cs.ucla.edu> 2006-07-09 Paul Eggert <eggert@cs.ucla.edu>
* NEWS: Instead of %union, you can define and use your own union type * NEWS: Instead of %union, you can define and use your own union type

View File

@@ -1,6 +1,7 @@
/* Declaration for error-reporting function for Bison. /* Declaration for error-reporting function for Bison.
Copyright (C) 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc. Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006
Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it 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 the under the terms of the GNU General Public License as published by the
@@ -32,13 +33,48 @@
name of the executing program. */ name of the executing program. */
extern char *program_name; extern char *program_name;
/* This variable is set each time `warn' is called. */
bool warning_issued;
/* This variable is set each time `complain' is called. */
bool complaint_issued; bool complaint_issued;
/** Report an error message.
*
* \param loc the location, defaulting to the current file,
* or the program name.
* \param prefix put before the message (e.g., "warning").
* \param message the error message, a printf format string.
* \param args the arguments of the format string.
*/
static
void
error_message (location *loc,
const char *prefix,
const char *message, va_list args)
{
if (loc)
location_print (stderr, *loc);
else
fputs (current_file ? current_file : program_name, stderr);
fputs (": ", stderr);
if (prefix)
fprintf (stderr, "%s: ", prefix);
vfprintf (stderr, message, args);
va_end (args);
putc ('\n', stderr);
fflush (stderr);
}
/** 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); \
}
/*--------------------------------. /*--------------------------------.
| Report a warning, and proceed. | | Report a warning, and proceed. |
`--------------------------------*/ `--------------------------------*/
@@ -46,35 +82,16 @@ bool complaint_issued;
void void
warn_at (location loc, const char *message, ...) warn_at (location loc, const char *message, ...)
{ {
va_list args; ERROR_MESSAGE (&loc, _("warning"), message);
location_print (stderr, loc);
fputs (": ", stderr);
fputs (_("warning: "), stderr);
va_start (args, message);
vfprintf (stderr, message, args);
va_end (args);
warning_issued = true;
putc ('\n', stderr);
} }
void void
warn (const char *message, ...) warn (const char *message, ...)
{ {
va_list args; ERROR_MESSAGE (NULL, _("warning"), message);
fprintf (stderr, "%s: %s", current_file ? current_file : program_name, _("warning: "));
va_start (args, message);
vfprintf (stderr, message, args);
va_end (args);
warning_issued = true;
putc ('\n', stderr);
} }
/*-----------------------------------------------------------. /*-----------------------------------------------------------.
| An error has occurred, but we can proceed, and die later. | | An error has occurred, but we can proceed, and die later. |
`-----------------------------------------------------------*/ `-----------------------------------------------------------*/
@@ -82,34 +99,18 @@ warn (const char *message, ...)
void void
complain_at (location loc, const char *message, ...) complain_at (location loc, const char *message, ...)
{ {
va_list args; ERROR_MESSAGE (&loc, NULL, message);
location_print (stderr, loc);
fputs (": ", stderr);
va_start (args, message);
vfprintf (stderr, message, args);
va_end (args);
complaint_issued = true; complaint_issued = true;
putc ('\n', stderr);
} }
void void
complain (const char *message, ...) complain (const char *message, ...)
{ {
va_list args; ERROR_MESSAGE (NULL, NULL, message);
fprintf (stderr, "%s: ", current_file ? current_file : program_name);
va_start (args, message);
vfprintf (stderr, message, args);
va_end (args);
complaint_issued = true; complaint_issued = true;
putc ('\n', stderr);
} }
/*-------------------------------------------------. /*-------------------------------------------------.
| A severe error has occurred, we cannot proceed. | | A severe error has occurred, we cannot proceed. |
`-------------------------------------------------*/ `-------------------------------------------------*/
@@ -117,31 +118,13 @@ complain (const char *message, ...)
void void
fatal_at (location loc, const char *message, ...) fatal_at (location loc, const char *message, ...)
{ {
va_list args; ERROR_MESSAGE (&loc, _("fatal error"), message);
location_print (stderr, loc);
fputs (": ", stderr);
fputs (_("fatal error: "), stderr);
va_start (args, message);
vfprintf (stderr, message, args);
va_end (args);
putc ('\n', stderr);
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
} }
void void
fatal (const char *message, ...) fatal (const char *message, ...)
{ {
va_list args; ERROR_MESSAGE (NULL, _("fatal error"), message);
fprintf (stderr, "%s: ", current_file ? current_file : program_name);
fputs (_("fatal error: "), stderr);
va_start (args, message);
vfprintf (stderr, message, args);
va_end (args);
putc ('\n', stderr);
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
} }

View File

@@ -1,5 +1,5 @@
/* Declaration for error-reporting function for Bison. /* Declaration for error-reporting function for Bison.
Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. Copyright (C) 2000, 2001, 2002, 2006 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it 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 the under the terms of the GNU General Public License as published by the
@@ -25,7 +25,7 @@
extern "C" { extern "C" {
# endif # endif
/* Informative messages, but we proceed. */ /** Informative messages, but we proceed. */
void warn (char const *format, ...) void warn (char const *format, ...)
__attribute__ ((__format__ (__printf__, 1, 2))); __attribute__ ((__format__ (__printf__, 1, 2)));
@@ -33,7 +33,7 @@ void warn (char const *format, ...)
void warn_at (location loc, char const *format, ...) void warn_at (location loc, char const *format, ...)
__attribute__ ((__format__ (__printf__, 2, 3))); __attribute__ ((__format__ (__printf__, 2, 3)));
/* Something bad happened, but let's continue and die later. */ /** An error, but we continue and die later. */
void complain (char const *format, ...) void complain (char const *format, ...)
__attribute__ ((__format__ (__printf__, 1, 2))); __attribute__ ((__format__ (__printf__, 1, 2)));
@@ -41,7 +41,7 @@ void complain (char const *format, ...)
void complain_at (location loc, char const *format, ...) void complain_at (location loc, char const *format, ...)
__attribute__ ((__format__ (__printf__, 2, 3))); __attribute__ ((__format__ (__printf__, 2, 3)));
/* Something bad happened, and let's die now. */ /** A fatal error, causing immediate exit. */
void fatal (char const *format, ...) void fatal (char const *format, ...)
__attribute__ ((__noreturn__, __format__ (__printf__, 1, 2))); __attribute__ ((__noreturn__, __format__ (__printf__, 1, 2)));
@@ -49,10 +49,7 @@ void fatal (char const *format, ...)
void fatal_at (location loc, char const *format, ...) void fatal_at (location loc, char const *format, ...)
__attribute__ ((__noreturn__, __format__ (__printf__, 2, 3))); __attribute__ ((__noreturn__, __format__ (__printf__, 2, 3)));
/* This variable is set each time `warn' is called. */ /** Whether an error was reported. */
extern bool warning_issued;
/* This variable is set each time `complain' is called. */
extern bool complaint_issued; extern bool complaint_issued;
# ifdef __cplusplus # ifdef __cplusplus