]>
Commit | Line | Data |
---|---|---|
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 "cpplib.h" | |
29 | #include "cpphash.h" | |
30 | #include "intl.h" | |
31 | ||
32 | static void print_location (cpp_reader *, fileline, unsigned int); | |
33 | ||
34 | /* Print the logical file location (LINE, COL) in preparation for a | |
35 | diagnostic. Outputs the #include chain if it has changed. A line | |
36 | of zero suppresses the include stack, and outputs the program name | |
37 | instead. */ | |
38 | static void | |
39 | print_location (cpp_reader *pfile, fileline line, unsigned int col) | |
40 | { | |
41 | if (!pfile->buffer || line == 0) | |
42 | fprintf (stderr, "%s: ", progname); | |
43 | else | |
44 | { | |
45 | const struct line_map *map; | |
46 | unsigned int lin; | |
47 | ||
48 | map = linemap_lookup (&pfile->line_maps, line); | |
49 | linemap_print_containing_files (&pfile->line_maps, map); | |
50 | ||
51 | lin = SOURCE_LINE (map, line); | |
52 | if (col == 0) | |
53 | col = 1; | |
54 | ||
55 | if (lin == 0) | |
56 | fprintf (stderr, "%s:", map->to_file); | |
57 | else if (CPP_OPTION (pfile, show_column) == 0) | |
58 | fprintf (stderr, "%s:%u:", map->to_file, lin); | |
59 | else | |
60 | fprintf (stderr, "%s:%u:%u:", map->to_file, lin, col); | |
61 | ||
62 | fputc (' ', stderr); | |
63 | } | |
64 | } | |
65 | ||
66 | /* Set up for a diagnostic: print the file and line, bump the error | |
67 | counter, etc. LINE is the logical line number; zero means to print | |
68 | at the location of the previously lexed token, which tends to be | |
69 | the correct place by default. Returns 0 if the error has been | |
70 | suppressed. */ | |
71 | int | |
72 | _cpp_begin_message (cpp_reader *pfile, int code, fileline line, | |
73 | unsigned int column) | |
74 | { | |
75 | int level = DL_EXTRACT (code); | |
76 | ||
77 | switch (level) | |
78 | { | |
79 | case DL_WARNING: | |
80 | case DL_PEDWARN: | |
81 | if (CPP_IN_SYSTEM_HEADER (pfile) | |
82 | && ! CPP_OPTION (pfile, warn_system_headers)) | |
83 | return 0; | |
84 | /* Fall through. */ | |
85 | ||
86 | case DL_WARNING_SYSHDR: | |
87 | if (CPP_OPTION (pfile, warnings_are_errors) | |
88 | || (level == DL_PEDWARN && CPP_OPTION (pfile, pedantic_errors))) | |
89 | { | |
90 | if (CPP_OPTION (pfile, inhibit_errors)) | |
91 | return 0; | |
92 | level = DL_ERROR; | |
93 | pfile->errors++; | |
94 | } | |
95 | else if (CPP_OPTION (pfile, inhibit_warnings)) | |
96 | return 0; | |
97 | break; | |
98 | ||
99 | case DL_ERROR: | |
100 | if (CPP_OPTION (pfile, inhibit_errors)) | |
101 | return 0; | |
102 | /* ICEs cannot be inhibited. */ | |
103 | case DL_ICE: | |
104 | pfile->errors++; | |
105 | break; | |
106 | } | |
107 | ||
108 | print_location (pfile, line, column); | |
109 | if (DL_WARNING_P (level)) | |
110 | fputs (_("warning: "), stderr); | |
111 | else if (level == DL_ICE) | |
112 | fputs (_("internal error: "), stderr); | |
113 | ||
114 | return 1; | |
115 | } | |
116 | ||
117 | /* Don't remove the blank before do, as otherwise the exgettext | |
118 | script will mistake this as a function definition */ | |
119 | #define v_message(msgid, ap) \ | |
120 | do { vfprintf (stderr, _(msgid), ap); putc ('\n', stderr); } while (0) | |
121 | ||
122 | /* Exported interface. */ | |
123 | ||
124 | /* Print an error at the location of the previously lexed token. */ | |
125 | void | |
126 | cpp_error (cpp_reader * pfile, int level, const char *msgid, ...) | |
127 | { | |
128 | fileline line; | |
129 | unsigned int 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 | fileline 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 | } |