diff --git a/src/common.h b/src/common.h index b7403fa..c38b1c6 100644 --- a/src/common.h +++ b/src/common.h @@ -37,6 +37,8 @@ struct _C99 /* parsing */ Token * token; int in_switch; + unsigned int error_cnt; + unsigned int warning_cnt; }; diff --git a/src/parser.c b/src/parser.c index 3a221aa..ff2e744 100644 --- a/src/parser.c +++ b/src/parser.c @@ -115,8 +115,13 @@ static int _parse_check(C99 * c99, TokenCode code) int ret = 0; if(!_parse_is_code(c99, code)) + { ret = _parse_error(c99, "Expected \"%s\"", code_get_string(code)); + while(c99_scan(c99) == 0 + && c99->token != NULL + && !_parse_is_code(c99, code)); + } ret |= c99_scan(c99); return ret; } @@ -128,6 +133,7 @@ static int _parse_error(C99 * c99, char const * format, ...) Token * token = c99->token; va_list ap; + c99->error_cnt++; if(token == NULL) /* XXX not very elegant */ fputs(PACKAGE ": near end of file: error: ", stderr); else @@ -705,6 +711,7 @@ static int _parameter_declaration(C99 * c99) fprintf(stderr, "DEBUG: %s()\n", __func__); #endif ret = _declaration_specifiers(c99); + /* FIXME ambiguity between declarator and abstract declarator */ if(token_in_set(c99->token, c99set_abstract_declarator)) ret |= _abstract_declarator(c99); else if(token_in_set(c99->token, c99set_declarator)) @@ -1669,7 +1676,14 @@ int c99_parse(C99 * c99) if(c99->flags & C99PREFS_E) return _parse_E(c99); if((ret = _translation_unit(c99)) != 0) + { unlink(c99->outfile); + fprintf(stderr, "%s%s%s%u%s%u%s", PACKAGE ": ", + cpp_get_filename(c99->cpp), + ": Compilation failed with ", c99->error_cnt, + " error(s) and ", c99->warning_cnt, + " warning(s)\n"); + } return ret; } diff --git a/src/scanner.c b/src/scanner.c index 8fa6571..931091e 100644 --- a/src/scanner.c +++ b/src/scanner.c @@ -62,6 +62,7 @@ char const * code_get_string(TokenCode code) /* useful */ /* c99_scan */ static int _scan_skip_meta(C99 * c99); +static void _meta_error(C99 * c99, TokenCode code); int c99_scan(C99 * c99) { @@ -104,7 +105,7 @@ int c99_scan(C99 * c99) static int _scan_skip_meta(C99 * c99) { int ret; - int code; + TokenCode code; while((ret = cpp_scan(c99->cpp, &c99->token)) == 0) { @@ -115,13 +116,21 @@ static int _scan_skip_meta(C99 * c99) || code > C99_CODE_META_LAST)) break; if(code == C99_CODE_META_ERROR || code == C99_CODE_META_WARNING) - fprintf(stderr, "%s%s%s%u%s%s%s%s\n", PACKAGE ": ", - token_get_filename(c99->token), ":", - token_get_line(c99->token), ": ", - (code == C99_CODE_META_ERROR) - ? "error" : "warning", ": ", - token_get_string(c99->token)); + _meta_error(c99, code); token_delete(c99->token); } return ret; } + +static void _meta_error(C99 * c99, TokenCode code) +{ + if(code == C99_CODE_META_ERROR) + c99->error_cnt++; + else + c99->warning_cnt++; + fprintf(stderr, "%s%s%s%u%s%s%s%s\n", PACKAGE ": ", + token_get_filename(c99->token), ":", + token_get_line(c99->token), ": ", + (code == C99_CODE_META_ERROR) ? "error" : "warning", + ": ", token_get_string(c99->token)); +}