X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=diagnostic.c;h=782c65728d3df862f20dd442dcbafe2d94171330;hb=f56ee1a34627fb21c5909086f3597c76ce9583be;hp=ad81055eaf0d71879fc1ccab76a2618b099c4226;hpb=6d7d61de445629e1590d3a2ba2990ef7a651368a;p=cparser diff --git a/diagnostic.c b/diagnostic.c index ad81055..782c657 100644 --- a/diagnostic.c +++ b/diagnostic.c @@ -34,6 +34,7 @@ unsigned diagnostic_count = 0; unsigned error_count = 0; /** Number of occurred warnings. */ unsigned warning_count = 0; +bool show_column = true; static const source_position_t *curr_pos = NULL; @@ -42,7 +43,9 @@ static const source_position_t *curr_pos = NULL; */ static void print_source_position(FILE *out, const source_position_t *pos) { - fprintf(out, "at line %u", pos->linenr); + fprintf(out, "at line %u", pos->lineno); + if (show_column) + fprintf(out, ":%u", pos->colno); if (curr_pos == NULL || curr_pos->input_name != pos->input_name) fprintf(out, " of \"%s\"", pos->input_name); } @@ -67,12 +70,6 @@ static void diagnosticvf(const char *const fmt, va_list ap) fputc(*f, stderr); break; - case 'C': { - const wint_t val = va_arg(ap, wint_t); - fprintf(stderr, "%lc", val); - break; - } - case 'c': { const unsigned char val = (unsigned char) va_arg(ap, int); fputc(val, stderr); @@ -91,6 +88,14 @@ static void diagnosticvf(const char *const fmt, va_list ap) break; } + case 'S': { + const string_t *str = va_arg(ap, const string_t*); + for (size_t i = 0; i < str->size; ++i) { + fputc(str->begin[i], stderr); + } + break; + } + case 'u': { const unsigned int val = va_arg(ap, unsigned int); fprintf(stderr, "%u", val); @@ -114,7 +119,7 @@ static void diagnosticvf(const char *const fmt, va_list ap) case 'Q': { const unsigned qualifiers = va_arg(ap, unsigned); - print_type_qualifiers(qualifiers); + print_type_qualifiers(qualifiers, QUAL_SEP_NONE); break; } @@ -188,15 +193,23 @@ void diagnosticf(const char *const fmt, ...) va_end(ap); } -static void errorvf(const source_position_t *pos, - const char *const fmt, va_list ap) +static void diagnosticposvf(source_position_t const *const pos, char const *const kind, char const *const fmt, va_list ap) { - fprintf(stderr, "%s:%u: error: ", pos->input_name, pos->linenr); - ++error_count; + FILE *const out = stderr; + fprintf(out, "%s:%u:", pos->input_name, pos->lineno); + if (show_column) + fprintf(out, "%u:", pos->colno); + fprintf(out, " %s: ", kind); curr_pos = pos; diagnosticvf(fmt, ap); - fputc('\n', stderr); + fputc('\n', out); +} +static void errorvf(const source_position_t *pos, + const char *const fmt, va_list ap) +{ + ++error_count; + diagnosticposvf(pos, "error", fmt, ap); if (warning.fatal_errors) exit(EXIT_FAILURE); } @@ -213,11 +226,8 @@ void errorf(const source_position_t *pos, const char *const fmt, ...) static void warningvf(const source_position_t *pos, const char *const fmt, va_list ap) { - fprintf(stderr, "%s:%u: warning: ", pos->input_name, pos->linenr); ++warning_count; - curr_pos = pos; - diagnosticvf(fmt, ap); - fputc('\n', stderr); + diagnosticposvf(pos, "warning", fmt, ap); } void warningf(const source_position_t *pos, const char *const fmt, ...) @@ -236,10 +246,7 @@ void warningf(const source_position_t *pos, const char *const fmt, ...) static void internal_errorvf(const source_position_t *pos, const char *const fmt, va_list ap) { - fprintf(stderr, "%s:%u: internal error: ", pos->input_name, pos->linenr); - curr_pos = pos; - diagnosticvf(fmt, ap); - fputc('\n', stderr); + diagnosticposvf(pos, "internal error", fmt, ap); } void internal_errorf(const source_position_t *pos, const char *const fmt, ...)