/* 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;
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;
}
} 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');
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);
}
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);
/* fallthrough */
case 2:
firm_option("inline");
- firm_option("no-strength-red");
firm_option("deconv");
firm_be_option("omitfp");
break;
} 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;
} 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);
outname = outnamebuf;
break;
case CompileAssembleLink:
+#ifdef _WIN32
+ outname = "a.exe";
+#else
outname = "a.out";
+#endif
break;
}
}
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);