1*38fd1498Szrj /* Default error handlers for CPP Library.
2*38fd1498Szrj Copyright (C) 1986-2018 Free Software Foundation, Inc.
3*38fd1498Szrj Written by Per Bothner, 1994.
4*38fd1498Szrj Based on CCCP program by Paul Rubin, June 1986
5*38fd1498Szrj Adapted to ANSI C, Richard Stallman, Jan 1987
6*38fd1498Szrj
7*38fd1498Szrj This program is free software; you can redistribute it and/or modify it
8*38fd1498Szrj under the terms of the GNU General Public License as published by the
9*38fd1498Szrj Free Software Foundation; either version 3, or (at your option) any
10*38fd1498Szrj later version.
11*38fd1498Szrj
12*38fd1498Szrj This program is distributed in the hope that it will be useful,
13*38fd1498Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of
14*38fd1498Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15*38fd1498Szrj GNU General Public License for more details.
16*38fd1498Szrj
17*38fd1498Szrj You should have received a copy of the GNU General Public License
18*38fd1498Szrj along with this program; see the file COPYING3. If not see
19*38fd1498Szrj <http://www.gnu.org/licenses/>.
20*38fd1498Szrj
21*38fd1498Szrj In other words, you are welcome to use, share and improve this program.
22*38fd1498Szrj You are forbidden to forbid anyone else to use, share and improve
23*38fd1498Szrj what you give them. Help stamp out software-hoarding! */
24*38fd1498Szrj
25*38fd1498Szrj #include "config.h"
26*38fd1498Szrj #include "system.h"
27*38fd1498Szrj #include "cpplib.h"
28*38fd1498Szrj #include "internal.h"
29*38fd1498Szrj
30*38fd1498Szrj /* Print a diagnostic at the given location. */
31*38fd1498Szrj
32*38fd1498Szrj ATTRIBUTE_FPTR_PRINTF(5,0)
33*38fd1498Szrj static bool
cpp_diagnostic_at(cpp_reader * pfile,int level,int reason,rich_location * richloc,const char * msgid,va_list * ap)34*38fd1498Szrj cpp_diagnostic_at (cpp_reader * pfile, int level, int reason,
35*38fd1498Szrj rich_location *richloc,
36*38fd1498Szrj const char *msgid, va_list *ap)
37*38fd1498Szrj {
38*38fd1498Szrj bool ret;
39*38fd1498Szrj
40*38fd1498Szrj if (!pfile->cb.error)
41*38fd1498Szrj abort ();
42*38fd1498Szrj ret = pfile->cb.error (pfile, level, reason, richloc, _(msgid), ap);
43*38fd1498Szrj
44*38fd1498Szrj return ret;
45*38fd1498Szrj }
46*38fd1498Szrj
47*38fd1498Szrj /* Print a diagnostic at the location of the previously lexed token. */
48*38fd1498Szrj
49*38fd1498Szrj ATTRIBUTE_FPTR_PRINTF(4,0)
50*38fd1498Szrj static bool
cpp_diagnostic(cpp_reader * pfile,int level,int reason,const char * msgid,va_list * ap)51*38fd1498Szrj cpp_diagnostic (cpp_reader * pfile, int level, int reason,
52*38fd1498Szrj const char *msgid, va_list *ap)
53*38fd1498Szrj {
54*38fd1498Szrj source_location src_loc;
55*38fd1498Szrj
56*38fd1498Szrj if (CPP_OPTION (pfile, traditional))
57*38fd1498Szrj {
58*38fd1498Szrj if (pfile->state.in_directive)
59*38fd1498Szrj src_loc = pfile->directive_line;
60*38fd1498Szrj else
61*38fd1498Szrj src_loc = pfile->line_table->highest_line;
62*38fd1498Szrj }
63*38fd1498Szrj /* We don't want to refer to a token before the beginning of the
64*38fd1498Szrj current run -- that is invalid. */
65*38fd1498Szrj else if (pfile->cur_token == pfile->cur_run->base)
66*38fd1498Szrj {
67*38fd1498Szrj src_loc = 0;
68*38fd1498Szrj }
69*38fd1498Szrj else
70*38fd1498Szrj {
71*38fd1498Szrj src_loc = pfile->cur_token[-1].src_loc;
72*38fd1498Szrj }
73*38fd1498Szrj rich_location richloc (pfile->line_table, src_loc);
74*38fd1498Szrj return cpp_diagnostic_at (pfile, level, reason, &richloc, msgid, ap);
75*38fd1498Szrj }
76*38fd1498Szrj
77*38fd1498Szrj /* Print a warning or error, depending on the value of LEVEL. */
78*38fd1498Szrj
79*38fd1498Szrj bool
cpp_error(cpp_reader * pfile,int level,const char * msgid,...)80*38fd1498Szrj cpp_error (cpp_reader * pfile, int level, const char *msgid, ...)
81*38fd1498Szrj {
82*38fd1498Szrj va_list ap;
83*38fd1498Szrj bool ret;
84*38fd1498Szrj
85*38fd1498Szrj va_start (ap, msgid);
86*38fd1498Szrj
87*38fd1498Szrj ret = cpp_diagnostic (pfile, level, CPP_W_NONE, msgid, &ap);
88*38fd1498Szrj
89*38fd1498Szrj va_end (ap);
90*38fd1498Szrj return ret;
91*38fd1498Szrj }
92*38fd1498Szrj
93*38fd1498Szrj /* Print a warning. The warning reason may be given in REASON. */
94*38fd1498Szrj
95*38fd1498Szrj bool
cpp_warning(cpp_reader * pfile,int reason,const char * msgid,...)96*38fd1498Szrj cpp_warning (cpp_reader * pfile, int reason, const char *msgid, ...)
97*38fd1498Szrj {
98*38fd1498Szrj va_list ap;
99*38fd1498Szrj bool ret;
100*38fd1498Szrj
101*38fd1498Szrj va_start (ap, msgid);
102*38fd1498Szrj
103*38fd1498Szrj ret = cpp_diagnostic (pfile, CPP_DL_WARNING, reason, msgid, &ap);
104*38fd1498Szrj
105*38fd1498Szrj va_end (ap);
106*38fd1498Szrj return ret;
107*38fd1498Szrj }
108*38fd1498Szrj
109*38fd1498Szrj /* Print a pedantic warning. The warning reason may be given in REASON. */
110*38fd1498Szrj
111*38fd1498Szrj bool
cpp_pedwarning(cpp_reader * pfile,int reason,const char * msgid,...)112*38fd1498Szrj cpp_pedwarning (cpp_reader * pfile, int reason, const char *msgid, ...)
113*38fd1498Szrj {
114*38fd1498Szrj va_list ap;
115*38fd1498Szrj bool ret;
116*38fd1498Szrj
117*38fd1498Szrj va_start (ap, msgid);
118*38fd1498Szrj
119*38fd1498Szrj ret = cpp_diagnostic (pfile, CPP_DL_PEDWARN, reason, msgid, &ap);
120*38fd1498Szrj
121*38fd1498Szrj va_end (ap);
122*38fd1498Szrj return ret;
123*38fd1498Szrj }
124*38fd1498Szrj
125*38fd1498Szrj /* Print a warning, including system headers. The warning reason may be
126*38fd1498Szrj given in REASON. */
127*38fd1498Szrj
128*38fd1498Szrj bool
cpp_warning_syshdr(cpp_reader * pfile,int reason,const char * msgid,...)129*38fd1498Szrj cpp_warning_syshdr (cpp_reader * pfile, int reason, const char *msgid, ...)
130*38fd1498Szrj {
131*38fd1498Szrj va_list ap;
132*38fd1498Szrj bool ret;
133*38fd1498Szrj
134*38fd1498Szrj va_start (ap, msgid);
135*38fd1498Szrj
136*38fd1498Szrj ret = cpp_diagnostic (pfile, CPP_DL_WARNING_SYSHDR, reason, msgid, &ap);
137*38fd1498Szrj
138*38fd1498Szrj va_end (ap);
139*38fd1498Szrj return ret;
140*38fd1498Szrj }
141*38fd1498Szrj
142*38fd1498Szrj /* Print a diagnostic at a specific location. */
143*38fd1498Szrj
144*38fd1498Szrj ATTRIBUTE_FPTR_PRINTF(6,0)
145*38fd1498Szrj static bool
cpp_diagnostic_with_line(cpp_reader * pfile,int level,int reason,source_location src_loc,unsigned int column,const char * msgid,va_list * ap)146*38fd1498Szrj cpp_diagnostic_with_line (cpp_reader * pfile, int level, int reason,
147*38fd1498Szrj source_location src_loc, unsigned int column,
148*38fd1498Szrj const char *msgid, va_list *ap)
149*38fd1498Szrj {
150*38fd1498Szrj bool ret;
151*38fd1498Szrj
152*38fd1498Szrj if (!pfile->cb.error)
153*38fd1498Szrj abort ();
154*38fd1498Szrj rich_location richloc (pfile->line_table, src_loc);
155*38fd1498Szrj if (column)
156*38fd1498Szrj richloc.override_column (column);
157*38fd1498Szrj ret = pfile->cb.error (pfile, level, reason, &richloc, _(msgid), ap);
158*38fd1498Szrj
159*38fd1498Szrj return ret;
160*38fd1498Szrj }
161*38fd1498Szrj
162*38fd1498Szrj /* Print a warning or error, depending on the value of LEVEL. */
163*38fd1498Szrj
164*38fd1498Szrj bool
cpp_error_with_line(cpp_reader * pfile,int level,source_location src_loc,unsigned int column,const char * msgid,...)165*38fd1498Szrj cpp_error_with_line (cpp_reader *pfile, int level,
166*38fd1498Szrj source_location src_loc, unsigned int column,
167*38fd1498Szrj const char *msgid, ...)
168*38fd1498Szrj {
169*38fd1498Szrj va_list ap;
170*38fd1498Szrj bool ret;
171*38fd1498Szrj
172*38fd1498Szrj va_start (ap, msgid);
173*38fd1498Szrj
174*38fd1498Szrj ret = cpp_diagnostic_with_line (pfile, level, CPP_W_NONE, src_loc,
175*38fd1498Szrj column, msgid, &ap);
176*38fd1498Szrj
177*38fd1498Szrj va_end (ap);
178*38fd1498Szrj return ret;
179*38fd1498Szrj }
180*38fd1498Szrj
181*38fd1498Szrj /* Print a warning. The warning reason may be given in REASON. */
182*38fd1498Szrj
183*38fd1498Szrj bool
cpp_warning_with_line(cpp_reader * pfile,int reason,source_location src_loc,unsigned int column,const char * msgid,...)184*38fd1498Szrj cpp_warning_with_line (cpp_reader *pfile, int reason,
185*38fd1498Szrj source_location src_loc, unsigned int column,
186*38fd1498Szrj const char *msgid, ...)
187*38fd1498Szrj {
188*38fd1498Szrj va_list ap;
189*38fd1498Szrj bool ret;
190*38fd1498Szrj
191*38fd1498Szrj va_start (ap, msgid);
192*38fd1498Szrj
193*38fd1498Szrj ret = cpp_diagnostic_with_line (pfile, CPP_DL_WARNING, reason, src_loc,
194*38fd1498Szrj column, msgid, &ap);
195*38fd1498Szrj
196*38fd1498Szrj va_end (ap);
197*38fd1498Szrj return ret;
198*38fd1498Szrj }
199*38fd1498Szrj
200*38fd1498Szrj /* Print a pedantic warning. The warning reason may be given in REASON. */
201*38fd1498Szrj
202*38fd1498Szrj bool
cpp_pedwarning_with_line(cpp_reader * pfile,int reason,source_location src_loc,unsigned int column,const char * msgid,...)203*38fd1498Szrj cpp_pedwarning_with_line (cpp_reader *pfile, int reason,
204*38fd1498Szrj source_location src_loc, unsigned int column,
205*38fd1498Szrj const char *msgid, ...)
206*38fd1498Szrj {
207*38fd1498Szrj va_list ap;
208*38fd1498Szrj bool ret;
209*38fd1498Szrj
210*38fd1498Szrj va_start (ap, msgid);
211*38fd1498Szrj
212*38fd1498Szrj ret = cpp_diagnostic_with_line (pfile, CPP_DL_PEDWARN, reason, src_loc,
213*38fd1498Szrj column, msgid, &ap);
214*38fd1498Szrj
215*38fd1498Szrj va_end (ap);
216*38fd1498Szrj return ret;
217*38fd1498Szrj }
218*38fd1498Szrj
219*38fd1498Szrj /* Print a warning, including system headers. The warning reason may be
220*38fd1498Szrj given in REASON. */
221*38fd1498Szrj
222*38fd1498Szrj bool
cpp_warning_with_line_syshdr(cpp_reader * pfile,int reason,source_location src_loc,unsigned int column,const char * msgid,...)223*38fd1498Szrj cpp_warning_with_line_syshdr (cpp_reader *pfile, int reason,
224*38fd1498Szrj source_location src_loc, unsigned int column,
225*38fd1498Szrj const char *msgid, ...)
226*38fd1498Szrj {
227*38fd1498Szrj va_list ap;
228*38fd1498Szrj bool ret;
229*38fd1498Szrj
230*38fd1498Szrj va_start (ap, msgid);
231*38fd1498Szrj
232*38fd1498Szrj ret = cpp_diagnostic_with_line (pfile, CPP_DL_WARNING_SYSHDR, reason, src_loc,
233*38fd1498Szrj column, msgid, &ap);
234*38fd1498Szrj
235*38fd1498Szrj va_end (ap);
236*38fd1498Szrj return ret;
237*38fd1498Szrj }
238*38fd1498Szrj
239*38fd1498Szrj /* As cpp_error, but use SRC_LOC as the location of the error, without
240*38fd1498Szrj a column override. */
241*38fd1498Szrj
242*38fd1498Szrj bool
cpp_error_at(cpp_reader * pfile,int level,source_location src_loc,const char * msgid,...)243*38fd1498Szrj cpp_error_at (cpp_reader * pfile, int level, source_location src_loc,
244*38fd1498Szrj const char *msgid, ...)
245*38fd1498Szrj {
246*38fd1498Szrj va_list ap;
247*38fd1498Szrj bool ret;
248*38fd1498Szrj
249*38fd1498Szrj va_start (ap, msgid);
250*38fd1498Szrj
251*38fd1498Szrj rich_location richloc (pfile->line_table, src_loc);
252*38fd1498Szrj ret = cpp_diagnostic_at (pfile, level, CPP_W_NONE, &richloc,
253*38fd1498Szrj msgid, &ap);
254*38fd1498Szrj
255*38fd1498Szrj va_end (ap);
256*38fd1498Szrj return ret;
257*38fd1498Szrj }
258*38fd1498Szrj
259*38fd1498Szrj /* As cpp_error, but use RICHLOC as the location of the error, without
260*38fd1498Szrj a column override. */
261*38fd1498Szrj
262*38fd1498Szrj bool
cpp_error_at(cpp_reader * pfile,int level,rich_location * richloc,const char * msgid,...)263*38fd1498Szrj cpp_error_at (cpp_reader * pfile, int level, rich_location *richloc,
264*38fd1498Szrj const char *msgid, ...)
265*38fd1498Szrj {
266*38fd1498Szrj va_list ap;
267*38fd1498Szrj bool ret;
268*38fd1498Szrj
269*38fd1498Szrj va_start (ap, msgid);
270*38fd1498Szrj
271*38fd1498Szrj ret = cpp_diagnostic_at (pfile, level, CPP_W_NONE, richloc,
272*38fd1498Szrj msgid, &ap);
273*38fd1498Szrj
274*38fd1498Szrj va_end (ap);
275*38fd1498Szrj return ret;
276*38fd1498Szrj }
277*38fd1498Szrj
278*38fd1498Szrj /* Print a warning or error, depending on the value of LEVEL. Include
279*38fd1498Szrj information from errno. */
280*38fd1498Szrj
281*38fd1498Szrj bool
cpp_errno(cpp_reader * pfile,int level,const char * msgid)282*38fd1498Szrj cpp_errno (cpp_reader *pfile, int level, const char *msgid)
283*38fd1498Szrj {
284*38fd1498Szrj return cpp_error (pfile, level, "%s: %s", _(msgid), xstrerror (errno));
285*38fd1498Szrj }
286*38fd1498Szrj
287*38fd1498Szrj /* Print a warning or error, depending on the value of LEVEL. Include
288*38fd1498Szrj information from errno. Unlike cpp_errno, the argument is a filename
289*38fd1498Szrj that is not localized, but "" is replaced with localized "stdout". */
290*38fd1498Szrj
291*38fd1498Szrj bool
cpp_errno_filename(cpp_reader * pfile,int level,const char * filename,source_location loc)292*38fd1498Szrj cpp_errno_filename (cpp_reader *pfile, int level, const char *filename,
293*38fd1498Szrj source_location loc)
294*38fd1498Szrj {
295*38fd1498Szrj if (filename[0] == '\0')
296*38fd1498Szrj filename = _("stdout");
297*38fd1498Szrj
298*38fd1498Szrj return cpp_error_at (pfile, level, loc, "%s: %s", filename,
299*38fd1498Szrj xstrerror (errno));
300*38fd1498Szrj }
301