]>
git.saurik.com Git - bison.git/blob - src/complain.c
fadef5a18aaa9f52df3eef857f04243e2ffdab49
   1 /* Declaration for error-reporting function for Bison. 
   3    Copyright (C) 2000-2002, 2004-2006, 2009-2012 Free Software 
   6    This program is free software: you can redistribute it and/or modify 
   7    it under the terms of the GNU General Public License as published by 
   8    the Free Software Foundation, either version 3 of the License, or 
   9    (at your option) any later version. 
  11    This program is distributed in the hope that it will be useful, 
  12    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  14    GNU General Public License for more details. 
  16    You should have received a copy of the GNU General Public License 
  17    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ 
  19 /* Based on error.c and error.h, 
  20    written by David MacKenzie <djm@gnu.ai.mit.edu>.  */ 
  32 int warnings_flag 
= Wconflicts_sr 
| Wconflicts_rr 
| Wother
; 
  34 bool complaint_issued
; 
  35 static unsigned *indent_ptr 
= 0; 
  39 /** Report an error message. 
  41  * \param loc     the location, defaulting to the current file, 
  42  *                or the program name. 
  43  * \param prefix  put before the message (e.g., "warning"). 
  44  * \param message the error message, a printf format string.  Iff it 
  45  *                ends with ": ", then no trailing newline is printed, 
  46  *                and the caller should print the remaining 
  47  *                newline-terminated message to stderr. 
  48  * \param args    the arguments of the format string. 
  52 error_message (location 
*loc
, 
  54                const char *message
, va_list args
) 
  59     pos 
+= location_print (stderr
, *loc
); 
  61     pos 
+= fprintf(stderr
, "%s", current_file 
? current_file 
: program_name
); 
  62   pos 
+= fprintf(stderr
, ": "); 
  68       else if (*indent_ptr 
> pos
) 
  69         fprintf (stderr
, "%*s", *indent_ptr 
- pos
, ""); 
  74     fprintf (stderr
, "%s: ", prefix
); 
  76   vfprintf (stderr
, message
, args
); 
  78     size_t l 
= strlen (message
); 
  79     if (l 
< 2 || message
[l
-2] != ':' || message
[l
-1] != ' ') 
  87 /** Wrap error_message() with varargs handling. */ 
  88 #define ERROR_MESSAGE(Loc, Prefix, Message)     \ 
  91   va_start (args, Message);                     \ 
  92   error_message (Loc, Prefix, Message, args);   \ 
  97 /*--------------------------------. 
  98 | Report a warning, and proceed.  | 
  99 `--------------------------------*/ 
 102 set_warning_issued (void) 
 104   static bool warning_issued 
= false; 
 105   if (!warning_issued 
&& (warnings_flag 
& Werror
)) 
 107       fprintf (stderr
, "%s: warnings being treated as errors\n", program_name
); 
 108       complaint_issued 
= true; 
 110   warning_issued 
= true; 
 114 warn_at (location loc
, const char *message
, ...) 
 116   if (!(warnings_flag 
& Wother
)) 
 118   set_warning_issued (); 
 119   ERROR_MESSAGE (&loc
, _("warning"), message
); 
 123 warn_at_indent (location loc
, unsigned *indent
, 
 124                 const char *message
, ...) 
 126   if (!(warnings_flag 
& Wother
)) 
 128   set_warning_issued (); 
 130   ERROR_MESSAGE (&loc
, _("warning"), message
); 
 134 warn (const char *message
, ...) 
 136   if (!(warnings_flag 
& Wother
)) 
 138   set_warning_issued (); 
 139   ERROR_MESSAGE (NULL
, _("warning"), message
); 
 143 /*-----------------------------------------------------------. 
 144 | An error has occurred, but we can proceed, and die later.  | 
 145 `-----------------------------------------------------------*/ 
 148 complain_at (location loc
, const char *message
, ...) 
 150   ERROR_MESSAGE (&loc
, NULL
, message
); 
 151   complaint_issued 
= true; 
 155 complain_at_indent (location loc
, unsigned *indent
, 
 156                     const char *message
, ...) 
 159   ERROR_MESSAGE (&loc
, NULL
, message
); 
 160   complaint_issued 
= true; 
 164 complain (const char *message
, ...) 
 166   ERROR_MESSAGE (NULL
, NULL
, message
); 
 167   complaint_issued 
= true; 
 171 /*--------------------------------------------------------------. 
 172 | An incompatibility with POSIX Yacc: mapped either to warn* or | 
 173 | complain* depending on yacc_flag.                             | 
 174 `--------------------------------------------------------------*/ 
 177 yacc_at (location loc
, const char *message
, ...) 
 181       ERROR_MESSAGE (&loc
, NULL
, message
); 
 182       complaint_issued 
= true; 
 184   else if (warnings_flag 
& Wyacc
) 
 186       set_warning_issued (); 
 187       ERROR_MESSAGE (&loc
, _("warning"), message
); 
 192 midrule_value_at (location loc
, const char *message
, ...) 
 194   if (!(warnings_flag 
& Wmidrule_values
)) 
 196   set_warning_issued (); 
 197   ERROR_MESSAGE (&loc
, _("warning"), message
); 
 200 /*-------------------------------------------------. 
 201 | A severe error has occurred, we cannot proceed.  | 
 202 `-------------------------------------------------*/ 
 205 fatal_at (location loc
, const char *message
, ...) 
 207   ERROR_MESSAGE (&loc
, _("fatal error"), message
); 
 212 fatal (const char *message
, ...) 
 214   ERROR_MESSAGE (NULL
, _("fatal error"), message
);