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