OSDN Git Service

* target-def.h: Remove usage of OBJECT_FORMAT_ROSE.
[pf3gnuchains/gcc-fork.git] / gcc / cpperror.c
1 /* Default error handlers for CPP Library.
2    Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998, 1999, 2000,
3    2001, 2002  Free Software Foundation, Inc.
4    Written by Per Bothner, 1994.
5    Based on CCCP program by Paul Rubin, June 1986
6    Adapted to ANSI C, Richard Stallman, Jan 1987
7
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
11 later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
22  In other words, you are welcome to use, share and improve this program.
23  You are forbidden to forbid anyone else to use, share and improve
24  what you give them.   Help stamp out software-hoarding!  */
25
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tm.h"
30 #include "cpplib.h"
31 #include "cpphash.h"
32 #include "intl.h"
33
34 static void print_location (cpp_reader *, unsigned int, unsigned int);
35
36 /* Print the logical file location (LINE, COL) in preparation for a
37    diagnostic.  Outputs the #include chain if it has changed.  A line
38    of zero suppresses the include stack, and outputs the program name
39    instead.  */
40 static void
41 print_location (cpp_reader *pfile, unsigned int line, unsigned int col)
42 {
43   if (!pfile->buffer || line == 0)
44     fprintf (stderr, "%s: ", progname);
45   else
46     {
47       const struct line_map *map;
48
49       map = lookup_line (&pfile->line_maps, line);
50       print_containing_files (&pfile->line_maps, map);
51
52       line = SOURCE_LINE (map, line);
53       if (col == 0)
54         col = 1;
55
56       if (line == 0)
57         fprintf (stderr, "%s:", map->to_file);
58       else if (CPP_OPTION (pfile, show_column) == 0)
59         fprintf (stderr, "%s:%u:", map->to_file, line);
60       else
61         fprintf (stderr, "%s:%u:%u:", map->to_file, line, col);
62
63       fputc (' ', stderr);
64     }
65 }
66
67 /* Set up for a diagnostic: print the file and line, bump the error
68    counter, etc.  LINE is the logical line number; zero means to print
69    at the location of the previously lexed token, which tends to be
70    the correct place by default.  Returns 0 if the error has been
71    suppressed.  */
72 int
73 _cpp_begin_message (cpp_reader *pfile, int code, unsigned int line,
74                     unsigned int column)
75 {
76   int level = DL_EXTRACT (code);
77
78   switch (level)
79     {
80     case DL_WARNING:
81     case DL_PEDWARN:
82       if (CPP_IN_SYSTEM_HEADER (pfile)
83           && ! CPP_OPTION (pfile, warn_system_headers))
84         return 0;
85       /* Fall through.  */
86
87     case DL_WARNING_SYSHDR:
88       if (CPP_OPTION (pfile, warnings_are_errors)
89           || (level == DL_PEDWARN && CPP_OPTION (pfile, pedantic_errors)))
90         {
91           if (CPP_OPTION (pfile, inhibit_errors))
92             return 0;
93           level = DL_ERROR;
94           pfile->errors++;
95         }
96       else if (CPP_OPTION (pfile, inhibit_warnings))
97         return 0;
98       break;
99
100     case DL_ERROR:
101       if (CPP_OPTION (pfile, inhibit_errors))
102         return 0;
103       /* ICEs cannot be inhibited.  */
104     case DL_ICE:
105       pfile->errors++;
106       break;
107     }
108
109   print_location (pfile, line, column);
110   if (DL_WARNING_P (level))
111     fputs (_("warning: "), stderr);
112   else if (level == DL_ICE)
113     fputs (_("internal error: "), stderr);
114
115   return 1;
116 }
117
118 /* Don't remove the blank before do, as otherwise the exgettext
119    script will mistake this as a function definition */
120 #define v_message(msgid, ap) \
121  do { vfprintf (stderr, _(msgid), ap); putc ('\n', stderr); } while (0)
122
123 /* Exported interface.  */
124
125 /* Print an error at the location of the previously lexed token.  */
126 void
127 cpp_error (cpp_reader * pfile, int level, const char *msgid, ...)
128 {
129   unsigned int line, column;
130   va_list ap;
131   
132   va_start (ap, msgid);
133
134   if (pfile->buffer)
135     {
136       if (CPP_OPTION (pfile, traditional))
137         {
138           if (pfile->state.in_directive)
139             line = pfile->directive_line;
140           else
141             line = pfile->line;
142           column = 0;
143         }
144       else
145         {
146           line = pfile->cur_token[-1].line;
147           column = pfile->cur_token[-1].col;
148         }
149     }
150   else
151     line = column = 0;
152
153   if (_cpp_begin_message (pfile, level, line, column))
154     v_message (msgid, ap);
155
156   va_end (ap);
157 }
158
159 /* Print an error at a specific location.  */
160 void
161 cpp_error_with_line (cpp_reader *pfile, int level,
162                      unsigned int line, unsigned int column,
163                      const char *msgid, ...)
164 {
165   va_list ap;
166   
167   va_start (ap, msgid);
168
169   if (_cpp_begin_message (pfile, level, line, column))
170     v_message (msgid, ap);
171
172   va_end (ap);
173 }
174
175 void
176 cpp_errno (cpp_reader *pfile, int level, const char *msgid)
177 {
178   if (msgid[0] == '\0')
179     msgid = _("stdout");
180
181   cpp_error (pfile, level, "%s: %s", msgid, xstrerror (errno));
182 }