X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=diagnostic.c;h=7c0f8a1da7c77ca5777deaa25fe2995831d19c91;hb=373937ba4ad87e9fa55dbf89644182050ed1b75a;hp=33bf313ac1ce74a3254fed5f4cfac18e3dcf7d08;hpb=72a8112d5715bb10affebfe82e42fd65f6d3ee26;p=cparser diff --git a/diagnostic.c b/diagnostic.c index 33bf313..7c0f8a1 100644 --- a/diagnostic.c +++ b/diagnostic.c @@ -23,6 +23,7 @@ #include "diagnostic.h" #include "adt/error.h" #include "entity_t.h" +#include "separator_t.h" #include "symbol_t.h" #include "token_t.h" #include "ast.h" @@ -36,12 +37,12 @@ unsigned warning_count = 0; bool show_column = true; bool diagnostics_show_option = true; -static const source_position_t *curr_pos = NULL; +static const position_t *curr_pos = NULL; /** * prints an additional source position */ -static void print_source_position(FILE *out, const source_position_t *pos) +static void print_position(FILE *out, const position_t *pos) { fprintf(out, "at line %u", pos->lineno); if (show_column) @@ -177,12 +178,6 @@ done_flags:; break; } - case 't': { - const token_t *const token = va_arg(ap, const token_t*); - print_pp_token(stderr, token); - break; - } - case 'K': { const token_t* const token = va_arg(ap, const token_t*); print_token(stderr, token); @@ -191,18 +186,13 @@ done_flags:; case 'k': { if (extended) { - bool first = true; - va_list* toks = va_arg(ap, va_list*); - const char* const delimiter = va_arg(ap, const char*); + va_list* const toks = va_arg(ap, va_list*); + separator_t sep = { "", va_arg(ap, const char*) }; for (;;) { const token_kind_t tok = (token_kind_t)va_arg(*toks, int); if (tok == 0) break; - if (first) { - first = false; - } else { - fputs(delimiter, stderr); - } + fputs(sep_next(&sep), stderr); print_token_kind(stderr, tok); } } else { @@ -229,8 +219,8 @@ done_flags:; } case 'P': { - const source_position_t *pos = va_arg(ap, const source_position_t *); - print_source_position(stderr, pos); + const position_t *pos = va_arg(ap, const position_t *); + print_position(stderr, pos); break; } @@ -250,18 +240,24 @@ void diagnosticf(const char *const fmt, ...) va_end(ap); } -static void diagnosticposvf(source_position_t const *const pos, char const *const kind, char const *const fmt, va_list ap) +static void diagnosticposvf(position_t const *const pos, char const *const kind, char const *const fmt, va_list ap) { FILE *const out = stderr; - fprintf(out, "%s:%u:", pos->input_name, pos->lineno); - if (show_column) - fprintf(out, "%u:", (unsigned)pos->colno); - fprintf(out, " %s: ", kind); + if (pos) { + fprintf(out, "%s:", pos->input_name); + if (pos->lineno != 0) { + fprintf(out, "%u:", pos->lineno); + if (show_column) + fprintf(out, "%u:", (unsigned)pos->colno); + } + fputc(' ', out); + } + fprintf(out, "%s: ", kind); curr_pos = pos; diagnosticvf(fmt, ap); } -static void errorvf(const source_position_t *pos, +static void errorvf(const position_t *pos, const char *const fmt, va_list ap) { ++error_count; @@ -271,7 +267,7 @@ static void errorvf(const source_position_t *pos, exit(EXIT_FAILURE); } -void errorf(const source_position_t *pos, const char *const fmt, ...) +void errorf(const position_t *pos, const char *const fmt, ...) { va_list ap; va_start(ap, fmt); @@ -279,7 +275,7 @@ void errorf(const source_position_t *pos, const char *const fmt, ...) va_end(ap); } -void warningf(warning_t const warn, source_position_t const* pos, char const *const fmt, ...) +void warningf(warning_t const warn, position_t const* pos, char const *const fmt, ...) { va_list ap; va_start(ap, fmt); @@ -299,6 +295,8 @@ void warningf(warning_t const warn, source_position_t const* pos, char const *co diagnosticposvf(pos, kind, fmt, ap); if (diagnostics_show_option) fprintf(stderr, " [-W%s]\n", s->name); + else + fputc('\n', stderr); break; default: @@ -307,14 +305,14 @@ void warningf(warning_t const warn, source_position_t const* pos, char const *co va_end(ap); } -static void internal_errorvf(const source_position_t *pos, +static void internal_errorvf(const position_t *pos, const char *const fmt, va_list ap) { diagnosticposvf(pos, "internal error", fmt, ap); fputc('\n', stderr); } -void internal_errorf(const source_position_t *pos, const char *const fmt, ...) +void internal_errorf(const position_t *pos, const char *const fmt, ...) { va_list ap; va_start(ap, fmt);