Reporting the error count after compilation

This commit is contained in:
Pierre Pronchery 2008-03-13 19:27:03 +00:00
parent 6ba294f137
commit 03f1e24d2b
3 changed files with 32 additions and 7 deletions

View File

@ -37,6 +37,8 @@ struct _C99
/* parsing */
Token * token;
int in_switch;
unsigned int error_cnt;
unsigned int warning_cnt;
};

View File

@ -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;
}

View File

@ -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));
}