Index: ChangeLog from Akim Demaille * 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. Index: src/complain.c =================================================================== RCS file: /cvsroot/bison/bison/src/complain.c,v retrieving revision 1.23 diff -u -r1.23 complain.c --- src/complain.c 9 Dec 2005 23:51:25 -0000 1.23 +++ src/complain.c 10 Jul 2006 19:32:05 -0000 @@ -1,6 +1,7 @@ /* 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 under the terms of the GNU General Public License as published by the @@ -32,13 +33,48 @@ name of the executing program. */ 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; + +/** 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. | `--------------------------------*/ @@ -46,35 +82,16 @@ void warn_at (location loc, const char *message, ...) { - va_list args; - - 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); + ERROR_MESSAGE (&loc, _("warning"), message); } void warn (const char *message, ...) { - va_list args; - - fprintf (stderr, "%s: %s", current_file ? current_file : program_name, _("warning: ")); + ERROR_MESSAGE (NULL, _("warning"), message); +} - 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. | `-----------------------------------------------------------*/ @@ -82,34 +99,18 @@ void complain_at (location loc, const char *message, ...) { - va_list args; - - location_print (stderr, loc); - fputs (": ", stderr); - - va_start (args, message); - vfprintf (stderr, message, args); - va_end (args); - + ERROR_MESSAGE (&loc, NULL, message); complaint_issued = true; - putc ('\n', stderr); } void complain (const char *message, ...) { - va_list args; - - fprintf (stderr, "%s: ", current_file ? current_file : program_name); - - va_start (args, message); - vfprintf (stderr, message, args); - va_end (args); - + ERROR_MESSAGE (NULL, NULL, message); complaint_issued = true; - putc ('\n', stderr); } - + + /*-------------------------------------------------. | A severe error has occurred, we cannot proceed. | `-------------------------------------------------*/ @@ -117,31 +118,13 @@ void fatal_at (location loc, const char *message, ...) { - va_list args; - - location_print (stderr, loc); - fputs (": ", stderr); - fputs (_("fatal error: "), stderr); - - va_start (args, message); - vfprintf (stderr, message, args); - va_end (args); - putc ('\n', stderr); + ERROR_MESSAGE (&loc, _("fatal error"), message); exit (EXIT_FAILURE); } void fatal (const char *message, ...) { - va_list args; - - 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); + ERROR_MESSAGE (NULL, _("fatal error"), message); exit (EXIT_FAILURE); } Index: src/complain.h =================================================================== RCS file: /cvsroot/bison/bison/src/complain.h,v retrieving revision 1.16 diff -u -r1.16 complain.h --- src/complain.h 14 May 2005 06:49:47 -0000 1.16 +++ src/complain.h 10 Jul 2006 19:32:05 -0000 @@ -1,5 +1,5 @@ /* 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 under the terms of the GNU General Public License as published by the @@ -25,7 +25,7 @@ extern "C" { # endif -/* Informative messages, but we proceed. */ +/** Informative messages, but we proceed. */ void warn (char const *format, ...) __attribute__ ((__format__ (__printf__, 1, 2))); @@ -33,7 +33,7 @@ void warn_at (location loc, char const *format, ...) __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, ...) __attribute__ ((__format__ (__printf__, 1, 2))); @@ -41,7 +41,7 @@ void complain_at (location loc, char const *format, ...) __attribute__ ((__format__ (__printf__, 2, 3))); -/* Something bad happened, and let's die now. */ +/** A fatal error, causing immediate exit. */ void fatal (char const *format, ...) __attribute__ ((__noreturn__, __format__ (__printf__, 1, 2))); @@ -49,10 +49,7 @@ void fatal_at (location loc, char const *format, ...) __attribute__ ((__noreturn__, __format__ (__printf__, 2, 3))); -/* This variable is set each time `warn' is called. */ -extern bool warning_issued; - -/* This variable is set each time `complain' is called. */ +/** Whether an error was reported. */ extern bool complaint_issued; # ifdef __cplusplus