use global table for atomic type properties
[cparser] / main.c
diff --git a/main.c b/main.c
index 2794b90..65ec298 100644 (file)
--- 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);
        }
-       FILEf = 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;
@@ -646,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;
                }
        }
@@ -687,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);