- add -f[no-]short-wchar
[cparser] / main.c
diff --git a/main.c b/main.c
index 99a2561..c643979 100644 (file)
--- a/main.c
+++ b/main.c
@@ -80,7 +80,7 @@
 #include "warning.h"
 
 #ifndef PREPROCESSOR
-#define PREPROCESSOR "cpp -std=c99 -U__WCHAR_TYPE__ -D__WCHAR_TYPE__=int -U__SIZE_TYPE__ -D__SIZE_TYPE__=__SIZE_TYPE__ -m32"
+#define PREPROCESSOR "cpp -std=c99 -U__WCHAR_TYPE__ -D__WCHAR_TYPE__=int -U__SIZE_TYPE__ -D__SIZE_TYPE__=__SIZE_TYPE__ -m32 -U__STRICT_ANSI__"
 #endif
 
 #ifndef LINKER
@@ -599,9 +599,10 @@ int main(int argc, char **argv)
                        } else if(strcmp(option, "M") == 0) {
                                mode = PreprocessOnly;
                                add_flag(&cppflags_obst, "-M");
-                       } else if(strcmp(option, "MMD") == 0
-                                       || strcmp(option, "MD") == 0
-                                       || strcmp(option, "MM") == 0) {
+                       } else if (strcmp(option, "MMD") == 0 ||
+                                  strcmp(option, "MD")  == 0 ||
+                                  strcmp(option, "MM")  == 0 ||
+                                  strcmp(option, "MP")  == 0) {
                                add_flag(&cppflags_obst, "-%s", option);
                        } else if(strcmp(option, "MT") == 0
                                        || strcmp(option, "MQ") == 0
@@ -612,27 +613,38 @@ int main(int argc, char **argv)
                                add_flag(&cppflags_obst, "%s", opt);
                        } else if(strcmp(option, "pipe") == 0) {
                                /* here for gcc compatibility */
-                       } else if(option[0] == 'f') {
+                       } else if (option[0] == 'f') {
+                               bool truth_value = true;
                                const char *opt;
                                GET_ARG_AFTER(opt, "-f");
+                               if (opt[0] == 'n' && opt[1] == 'o' && opt[2] == '-') {
+                                       truth_value = false;
+                                       opt += 3;
+                               }
 
-                               if(strcmp(opt, "syntax-only") == 0) {
+                               if (strcmp(opt, "dollars-in-identifiers") == 0) {
+                                       allow_dollar_in_symbol = truth_value;
+                               } else if (strcmp(opt, "short-wchar") == 0) {
+                                       opt_short_wchar_t = truth_value;
+                               } else if (strcmp(opt, "syntax-only") == 0) {
                                        mode = ParseOnly;
                                } else if(strcmp(opt, "omit-frame-pointer") == 0) {
-                                       set_be_option("omitfp");
-                               } else if(strcmp(opt, "no-omit-frame-pointer") == 0) {
-                                       set_be_option("omitfp=no");
+                                       set_be_option(truth_value ? "omitfp" : "omitfp=no");
                                } else if(strcmp(opt, "strength-reduce") == 0) {
                                        firm_option("strength-red");
-                               } else if(strcmp(opt, "fast-math") == 0
+                               } else if (strcmp(opt, "fast-math") == 0
+                                               || strcmp(opt, "jump-tables") == 0
                                                || strcmp(opt, "unroll-loops") == 0
                                                || strcmp(opt, "expensive-optimizations") == 0
                                                || strcmp(opt, "no-common") == 0
+                                               || strcmp(opt, "PIC") == 0
                                                || strncmp(opt, "align-loops=", sizeof("align-loops=")-1) == 0
                                                || strncmp(opt, "align-jumps=", sizeof("align-jumps=")-1) == 0
                                                || strncmp(opt, "align-functions=", sizeof("align-functions=")-1) == 0) {
-                                       fprintf(stderr, "ignoring gcc option '-f %s'\n", opt);
+                                                       fprintf(stderr, "ignoring gcc option '-f %s'\n", truth_value ? opt : opt - 3);
                                } else {
+                                       if (! truth_value)
+                                               opt -= 3;
                                        int res = firm_option(opt);
                                        if (res == 0) {
                                                fprintf(stderr, "error: unknown Firm option '-f %s'\n",
@@ -643,7 +655,7 @@ int main(int argc, char **argv)
                                                help_displayed = true;
                                        }
                                }
-                       } else if(option[0] == 'b') {
+                       } else if (option[0] == 'b') {
                                const char *opt;
                                GET_ARG_AFTER(opt, "-b");
                                int res = firm_be_option(opt);
@@ -657,8 +669,8 @@ int main(int argc, char **argv)
                                        if (strncmp(opt, "isa=", 4) == 0)
                                                strncpy(cpu_arch, opt, sizeof(cpu_arch));
                                }
-                       } else if(option[0] == 'W') {
-                               if(strncmp(option + 1, "l,", 2) == 0)   // a gcc-style linker option
+                       } else if (option[0] == 'W') {
+                               if (strncmp(option + 1, "l,", 2) == 0)  // a gcc-style linker option
                                {
                                        const char *opt;
                                        GET_ARG_AFTER(opt, "-Wl,");
@@ -671,7 +683,7 @@ int main(int argc, char **argv)
                                char arch_opt[64];
 
                                GET_ARG_AFTER(opt, "-m");
-                               if(strncmp(opt, "arch=", 5) == 0) {
+                               if (strncmp(opt, "arch=", 5) == 0) {
                                        GET_ARG_AFTER(opt, "-march=");
                                        snprintf(arch_opt, sizeof(arch_opt), "%s-arch=%s", cpu_arch, opt);
                                        int res = firm_be_option(arch_opt);
@@ -738,7 +750,8 @@ int main(int argc, char **argv)
                        } else if(strcmp(option, "pg") == 0) {
                                set_be_option("gprof");
                                add_flag(&ldflags_obst, "-pg");
-                       } else if(strcmp(option, "pedantic") == 0) {
+                       } else if(strcmp(option, "pedantic") == 0
+                                       || strcmp(option, "ansi") == 0) {
                                fprintf(stderr, "warning: ignoring gcc option '%s'\n", arg);
                        } else if(strcmp(option, "shared") == 0) {
                                add_flag(&ldflags_obst, "-shared");
@@ -813,7 +826,7 @@ int main(int argc, char **argv)
                        if (type == FILETYPE_AUTODETECT) {
                                size_t      len      = strlen(arg);
                                if (len < 2 && arg[0] == '-') {
-                                       /* - implicitely means C source file */
+                                       /* - implicitly means C source file */
                                        type     = FILETYPE_C;
                                        filename = NULL;
                                } else if (len > 2 && arg[len-2] == '.') {
@@ -992,7 +1005,7 @@ int main(int argc, char **argv)
                        if (in == preprocessed_in) {
                                int pp_result = pclose(preprocessed_in);
                                if (pp_result != EXIT_SUCCESS) {
-                                       return pp_result;
+                                       exit(EXIT_FAILURE);
                                }
                        }