X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=main.c;h=65ec2981f87a9ae4f1164afae843f5273ab8b23a;hb=7ea2ad59b0f4b39c3a18b680b13fb4011ba02a41;hp=84b2b5fa3ff949c92c28c4a521d46b052941faf6;hpb=fd16b92f058181088a385c3224c8814831c006d3;p=cparser diff --git a/main.c b/main.c index 84b2b5f..65ec298 100644 --- a/main.c +++ b/main.c @@ -105,7 +105,7 @@ bool strict_mode = false; /* to switch on printing of implicit casts */ extern bool print_implicit_casts; -/* to switch on printing of srenthesis to indicate operator precedence */ +/* to switch on printing of parenthesis to indicate operator precedence */ extern bool print_parenthesis; static int verbose; @@ -166,9 +166,9 @@ static void get_output_name(char *buf, size_t buflen, const char *inputname, memcpy(buf+last_dot, newext, extlen); } -static translation_unit_t *do_parsing(FILE *const in, const char *const input) +static translation_unit_t *do_parsing(FILE *const in, const char *const input_name) { - lexer_open_stream(in, input); + lexer_open_stream(in, input_name); translation_unit_t *unit = parse(); return unit; } @@ -184,7 +184,7 @@ static void lextest(FILE *in, const char *fname) } while(lexer_token.type != T_EOF); } -static FILE* preprocess(FILE* in, const char *fname) +static FILE *preprocess(FILE *in, const char *fname) { char buf[4096]; obstack_1grow(&cppflags_obst, '\0'); @@ -200,8 +200,8 @@ static FILE* preprocess(FILE* in, const char *fname) if(verbose) { puts(buf); } - FILE* f = popen(buf, "r"); - if (f == NULL) { + FILE *f = popen(buf, "r"); + if(f == NULL) { fprintf(stderr, "invoking preprocessor failed\n"); exit(1); } @@ -362,6 +362,7 @@ int main(int argc, char **argv) const char *dumpfunction = NULL; compile_mode_t mode = CompileAssembleLink; int opt_level = 1; + int result = EXIT_SUCCESS; obstack_init(&cppflags_obst); obstack_init(&ldflags_obst); @@ -415,7 +416,6 @@ int main(int argc, char **argv) /* fallthrough */ case 2: firm_option("inline"); - firm_option("no-strength-red"); firm_option("deconv"); firm_be_option("omitfp"); break; @@ -524,7 +524,16 @@ int main(int argc, char **argv) } else if(strcmp(option, "pedantic") == 0) { fprintf(stderr, "warning: ignoring gcc option '%s'\n", arg); } else if(strncmp(option, "std=", 4) == 0) { - fprintf(stderr, "warning: ignoring gcc option '%s'\n", arg); + if(strcmp(&option[4], "c99") == 0) { + c_mode = _C89|_C99; + } else if(strcmp(&option[4], "c89") == 0) { + c_mode = _C89; + } else if(strcmp(&option[4], "gnu99") == 0) { + c_mode = _C89|_C99|_GNUC; + } else if(strcmp(&option[4], "microsoft") == 0) { + c_mode = _C89|_C99|_MS; + } else + fprintf(stderr, "warning: ignoring gcc option '%s'\n", arg); } else if (option[0] == '-') { /* double dash option */ ++option; @@ -557,7 +566,8 @@ int main(int argc, char **argv) } else if(strcmp(option, "version") == 0) { firm_version_t ver; firm_get_version(&ver); - printf("cparser (%d.%d %s) using libFirm (%u.%u", 0, 1, cparser_REVISION, ver.major, ver.minor); + printf("cparser (%s) using libFirm (%u.%u", + cparser_REVISION, ver.major, ver.minor); if(ver.revision[0] != 0) { putchar(' '); fputs(ver.revision, stdout); @@ -645,7 +655,11 @@ int main(int argc, char **argv) outname = outnamebuf; break; case CompileAssembleLink: +#ifdef _WIN32 + outname = "a.exe"; +#else outname = "a.out"; +#endif break; } } @@ -686,29 +700,35 @@ int main(int argc, char **argv) FILE *preprocessed_in = preprocess(in, input); translation_unit_t *const unit = do_parsing(preprocessed_in, input); - int result = pclose(preprocessed_in); - if(result != 0) { - return result; + int res = pclose(preprocessed_in); + if(res != 0) { + return res; } - if(unit == NULL) { + + if(error_count > 0) { /* parsing failed because of errors */ fprintf(stderr, "%u error(s), %u warning(s)\n", error_count, warning_count); - return EXIT_FAILURE; - } - if (warning_count > 0) { + result = EXIT_FAILURE; + } else if(warning_count > 0) { fprintf(stderr, "%u warning(s)\n", warning_count); } if(mode == BenchmarkParser) { - return 0; + return result; } + /* prints the AST even if errors occurred */ if(mode == PrintAst) { type_set_output(out); ast_set_output(out); print_ast(unit); - return 0; + return result; } + + /* cannot handle other modes with errors */ + if(result != EXIT_SUCCESS) + return result; + if(mode == PrintFluffy) { type_set_output(out); ast_set_output(out);