6 #include "diagnostic.h"
11 //#define ABORT_ON_ERROR
17 static void diagnosticvf(const char *const fmt, va_list ap)
19 for (const char* f = fmt; *f != '\0'; ++f) {
23 bool extended = false;
35 const wint_t val = va_arg(ap, wint_t);
41 const unsigned char val = va_arg(ap, int);
47 const int val = va_arg(ap, int);
48 fprintf(stderr, "%d", val);
53 const char* const str = va_arg(ap, const char*);
59 const expression_t* const expr = va_arg(ap, const expression_t*);
60 print_expression(expr);
65 const unsigned qualifiers = va_arg(ap, unsigned);
66 print_type_qualifiers(qualifiers);
71 const type_t* const type = va_arg(ap, const type_t*);
72 const symbol_t* sym = NULL;
74 sym = va_arg(ap, const symbol_t*);
76 print_type_ext(type, sym, NULL);
81 const token_t* const token = va_arg(ap, const token_t*);
82 print_token(stderr, token);
89 va_list* toks = va_arg(ap, va_list*);
90 const char* const delimiter = va_arg(ap, const char*);
92 const token_type_t tok = va_arg(*toks, token_type_t);
98 fputs(delimiter, stderr);
100 print_token_type(stderr, tok);
103 const token_type_t token = va_arg(ap, token_type_t);
104 print_token_type(stderr, token);
110 panic("unknown format specifier");
118 void diagnosticf(const char *const fmt, ...)
122 diagnosticvf(fmt, ap);
126 void errorf(const source_position_t pos, const char *const fmt, ...)
129 fprintf(stderr, "%s:%u: error: ", pos.input_name, pos.linenr);
132 diagnosticvf(fmt, ap);
136 #ifdef ABORT_ON_ERROR
141 void warningf(const source_position_t pos, const char *const fmt, ...)
143 fprintf(stderr, "%s:%u: warning: ", pos.input_name, pos.linenr);
146 diagnosticvf(fmt, ap);