Make the input encoding selectable via −finput‐charset=. Currently suported are...
[cparser] / main.c
diff --git a/main.c b/main.c
index 5c83317..e45a3de 100644 (file)
--- a/main.c
+++ b/main.c
@@ -72,8 +72,9 @@
 #include "driver/firm_opt.h"
 #include "driver/firm_cmdline.h"
 #include "adt/error.h"
-#include "write_fluffy.h"
-#include "write_caml.h"
+#include "wrappergen/write_fluffy.h"
+#include "wrappergen/write_caml.h"
+#include "wrappergen/write_jna.h"
 #include "revision.h"
 #include "warning.h"
 #include "mangle.h"
@@ -271,6 +272,7 @@ static void add_flag(struct obstack *obst, const char *format, ...)
                case '\r':
                case '\t':
                case '`':
+               case '|':
                        obstack_1grow(obst, '\\');
                        /* FALLTHROUGH */
                default:
@@ -300,8 +302,17 @@ static FILE *preprocess(const char *fname)
        add_flag(&cppflags_obst, "-U__SIZE_TYPE__");
        add_flag(&cppflags_obst, "-D__SIZE_TYPE__=%s", type_to_string(type_size_t));
 
-       /* hack... */
+       /* TODO hack... */
+       add_flag(&cppflags_obst, "-D__builtin_abort=abort");
+       add_flag(&cppflags_obst, "-D__builtin_abs=abs");
+       add_flag(&cppflags_obst, "-D__builtin_exit=exit");
+       add_flag(&cppflags_obst, "-D__builtin_malloc=malloc");
+       add_flag(&cppflags_obst, "-D__builtin_memcmp=memcmp");
        add_flag(&cppflags_obst, "-D__builtin_memcpy=memcpy");
+       add_flag(&cppflags_obst, "-D__builtin_memset=memset");
+       add_flag(&cppflags_obst, "-D__builtin_strlen=strlen");
+       add_flag(&cppflags_obst, "-D__builtin_strcmp=strcmp");
+       add_flag(&cppflags_obst, "-D__builtin_strcpy=strcpy");
 
        /* handle dependency generation */
        if (dep_target[0] != '\0') {
@@ -498,7 +509,8 @@ typedef enum compile_mode_t {
        LexTest,
        PrintAst,
        PrintFluffy,
-       PrintCaml
+       PrintCaml,
+       PrintJna
 } compile_mode_t;
 
 static void usage(const char *argv0)
@@ -507,18 +519,20 @@ static void usage(const char *argv0)
 }
 
 static void print_cparser_version(void) {
-       firm_version_t ver;
-       firm_get_version(&ver);
-
        printf("cparser (%s) using libFirm (%u.%u",
-               cparser_REVISION, ver.major, ver.minor);
-       if (ver.revision[0] != 0) {
+              cparser_REVISION, ir_get_version_major(),
+              ir_get_version_minor());
+
+       const char *revision = ir_get_version_revision();
+       if (revision[0] != 0) {
                putchar(' ');
-               fputs(ver.revision, stdout);
+               fputs(revision, stdout);
        }
-       if (ver.build[0] != 0) {
+
+       const char *build = ir_get_version_build();
+       if (build[0] != 0) {
                putchar(' ');
-               fputs(ver.build, stdout);
+               fputs(build, stdout);
        }
        puts(")\n");
 }
@@ -817,6 +831,9 @@ int main(int argc, char **argv)
                                    strstart(orig_opt, "align-jumps=") ||
                                    strstart(orig_opt, "align-functions=")) {
                                        fprintf(stderr, "ignoring gcc option '-f%s'\n", orig_opt);
+                               } else if (strstart(orig_opt, "input-charset=")) {
+                                       char const* const encoding = strchr(orig_opt, '=') + 1;
+                                       select_input_encoding(encoding);
                                } else if (streq(orig_opt, "verbose-asm")) {
                                        /* ignore: we always print verbose assembler */
                                } else {
@@ -1026,6 +1043,8 @@ int main(int argc, char **argv)
                                        mode = PrintFluffy;
                                } else if (streq(option, "print-caml")) {
                                        mode = PrintCaml;
+                               } else if (streq(option, "print-jna")) {
+                                       mode = PrintJna;
                                } else if (streq(option, "version")) {
                                        print_cparser_version();
                                        exit(EXIT_SUCCESS);
@@ -1145,6 +1164,7 @@ int main(int argc, char **argv)
                case PrintAst:
                case PrintFluffy:
                case PrintCaml:
+               case PrintJna:
                case LexTest:
                case PreprocessOnly:
                case ParseOnly:
@@ -1207,9 +1227,17 @@ int main(int argc, char **argv)
 
                FILE *preprocessed_in = NULL;
                switch (filetype) {
-                       case FILETYPE_C:         filetype = FILETYPE_PREPROCESSED_C;         goto preprocess;
-                       case FILETYPE_CXX:       filetype = FILETYPE_PREPROCESSED_CXX;       goto preprocess;
-                       case FILETYPE_ASSEMBLER: filetype = FILETYPE_PREPROCESSED_ASSEMBLER; goto preprocess;
+                       case FILETYPE_C:
+                               filetype = FILETYPE_PREPROCESSED_C;
+                               goto preprocess;
+                       case FILETYPE_CXX:
+                               filetype = FILETYPE_PREPROCESSED_CXX;
+                               goto preprocess;
+                       case FILETYPE_ASSEMBLER:
+                               filetype = FILETYPE_PREPROCESSED_ASSEMBLER;
+                               add_flag(&cppflags_obst, "-x");
+                               add_flag(&cppflags_obst, "assembler-with-cpp");
+                               goto preprocess;
 preprocess:
                                /* no support for input on FILE* yet */
                                if (in != NULL)
@@ -1220,6 +1248,10 @@ preprocess:
                                        copy_file(out, preprocessed_in);
                                        int result = pclose(preprocessed_in);
                                        fclose(out);
+                                       /* remove output file in case of error */
+                                       if (out != stdout && result != EXIT_SUCCESS) {
+                                               unlink(outname);
+                                       }
                                        return result;
                                }
 
@@ -1309,6 +1341,9 @@ do_parsing:
                        if (in == preprocessed_in) {
                                int pp_result = pclose(preprocessed_in);
                                if (pp_result != EXIT_SUCCESS) {
+                                       /* remove output file */
+                                       if (out != stdout)
+                                               unlink(outname);
                                        exit(EXIT_FAILURE);
                                }
                        }
@@ -1321,6 +1356,9 @@ do_parsing:
                        } else if (mode == PrintCaml) {
                                write_caml_decls(out, unit);
                                continue;
+                       } else if (mode == PrintJna) {
+                               write_jna_decls(out, unit);
+                               continue;
                        }
 
                        translation_unit_to_firm(unit);
@@ -1364,6 +1402,9 @@ do_parsing:
                        if (in == preprocessed_in) {
                                int pp_result = pclose(preprocessed_in);
                                if (pp_result != EXIT_SUCCESS) {
+                                       /* remove output in error case */
+                                       if (out != stdout)
+                                               unlink(outname);
                                        return pp_result;
                                }
                        }
@@ -1404,8 +1445,11 @@ do_parsing:
                file->type = filetype;
        }
 
-       if (result != EXIT_SUCCESS)
+       if (result != EXIT_SUCCESS) {
+               if (out != stdout)
+                       unlink(outname);
                return result;
+       }
 
        /* link program file */
        if (mode == CompileAssembleLink) {