2 * This file is part of cparser.
3 * Copyright (C) 2007-2008 Matthias Braun <matze@braunis.de>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23 #include "diagnostic.h"
24 #include "adt/error.h"
31 /** Number of occurred diagnostics. */
32 unsigned diagnostic_count = 0;
33 /** Number of occurred errors. */
34 unsigned error_count = 0;
35 /** Number of occurred warnings. */
36 unsigned warning_count = 0;
38 static const source_position_t *curr_pos = NULL;
41 * prints an additional source position
43 static void print_source_position(FILE *out, const source_position_t *pos) {
44 fprintf(out, "at line %u", pos->linenr);
45 if (curr_pos == NULL || curr_pos->input_name != pos->input_name)
46 fprintf(out, " of \"%s\"", pos->input_name);
50 * Issue a diagnostic message.
52 static void diagnosticvf(const char *const fmt, va_list ap)
54 for (const char* f = fmt; *f != '\0'; ++f) {
58 bool extended = false;
70 const wint_t val = va_arg(ap, wint_t);
71 fprintf(stderr, "%lc", val);
76 const unsigned char val = (unsigned char) va_arg(ap, int);
82 const int val = va_arg(ap, int);
83 fprintf(stderr, "%d", val);
88 const char* const str = va_arg(ap, const char*);
94 const unsigned int val = va_arg(ap, unsigned int);
95 fprintf(stderr, "%u", val);
100 const symbol_t *const symbol = va_arg(ap, const symbol_t*);
102 fputs("(null)", stderr);
104 fputs(symbol->string, stderr);
109 const expression_t* const expr = va_arg(ap, const expression_t*);
110 print_expression(expr);
115 const unsigned qualifiers = va_arg(ap, unsigned);
116 print_type_qualifiers(qualifiers);
121 const type_t* const type = va_arg(ap, const type_t*);
122 const symbol_t* sym = NULL;
124 sym = va_arg(ap, const symbol_t*);
126 print_type_ext(type, sym, NULL);
131 const token_t *const token = va_arg(ap, const token_t*);
132 print_pp_token(stderr, token);
137 const token_t* const token = va_arg(ap, const token_t*);
138 print_token(stderr, token);
145 va_list* toks = va_arg(ap, va_list*);
146 const char* const delimiter = va_arg(ap, const char*);
148 const token_type_t tok = va_arg(*toks, token_type_t);
154 fputs(delimiter, stderr);
156 print_token_type(stderr, tok);
159 const token_type_t token = va_arg(ap, token_type_t);
160 print_token_type(stderr, token);
166 const source_position_t *pos = va_arg(ap, const source_position_t *);
167 print_source_position(stderr, pos);
172 panic("unknown format specifier");
180 void diagnosticf(const char *const fmt, ...)
186 diagnosticvf(fmt, ap);
190 static void errorvf(const source_position_t *pos,
191 const char *const fmt, va_list ap)
193 fprintf(stderr, "%s:%u: error: ", pos->input_name, pos->linenr);
196 diagnosticvf(fmt, ap);
199 if (warning.fatal_errors)
203 void errorf(const source_position_t *pos, const char *const fmt, ...)
208 errorvf(pos, fmt, ap);
212 static void warningvf(const source_position_t *pos,
213 const char *const fmt, va_list ap)
215 fprintf(stderr, "%s:%u: warning: ", pos->input_name, pos->linenr);
218 diagnosticvf(fmt, ap);
222 void warningf(const source_position_t *pos, const char *const fmt, ...)
227 if (warning.s_are_errors) {
228 errorvf(pos, fmt, ap);
230 warningvf(pos, fmt, ap);
235 static void internal_errorvf(const source_position_t *pos,
236 const char *const fmt, va_list ap)
238 fprintf(stderr, "%s:%u: internal error: ", pos->input_name, pos->linenr);
240 diagnosticvf(fmt, ap);
244 void internal_errorf(const source_position_t *pos, const char *const fmt, ...)
249 internal_errorvf(pos, fmt, ap);