]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
Handling output file, writing output file
authorWolfgang Bumiller <wolfgang.linux@bumiller.com>
Fri, 27 Jul 2012 16:22:39 +0000 (18:22 +0200)
committerWolfgang Bumiller <wolfgang.linux@bumiller.com>
Fri, 27 Jul 2012 16:22:39 +0000 (18:22 +0200)
main.c
parser.c

diff --git a/main.c b/main.c
index 195574ea1538c737b65aeb0f7bb4207a5d3066c8..54c64b639ca4ae0103ad60ce52e2cd01f5122d1b 100644 (file)
--- a/main.c
+++ b/main.c
  */
 #include "gmqcc.h"
 
-bool parser_compile(const char *filename);
+static const char *output = "progs.dat";
+static const char *input  = NULL;
+
+#define OptReq(opt, body)                                         \
+    case opt:                                                     \
+        if (argv[0][2]) argarg = argv[0]+2;                       \
+        else {                                                    \
+            if (argc < 2) {                                       \
+                printf("option -%c requires an argument\n", opt); \
+                exit(1);                                          \
+            }                                                     \
+            argarg = argv[1];                                     \
+            --argc;                                               \
+            ++argv;                                               \
+        }                                                         \
+        do { body } while (0);                                    \
+        break;
+
+#define LongReq(opt, body)                                   \
+    if (!strcmp(argv[0], opt)) {                             \
+        if (argc < 2) {                                      \
+            printf("option " opt " requires an argument\n"); \
+            exit(1);                                         \
+        }                                                    \
+        argarg = argv[1];                                    \
+        --argc;                                              \
+        ++argv;                                              \
+        do { body } while (0);                               \
+        break;                                               \
+    } else if (!strncmp(argv[0], opt "=", sizeof(opt "=")))  \
+    {                                                        \
+        argarg = argv[0] + sizeof(opt "=");                  \
+        do { body } while (0);                               \
+        break;                                               \
+    }
+
+bool parser_compile(const char *filename, const char *datfile);
 int main(int argc, char **argv) {
+    const char *argarg;
+    char opt;
+
     util_debug("COM", "starting ...\n");
 
-    if (argc == 2) {
-        if (!parser_compile(argv[1])) {
-            printf("There were compile errors\n");
+    --argc;
+    ++argv;
+    while (argc > 0) {
+        if (argv[0][0] == '-') {
+            opt = argv[0][1];
+            switch (opt)
+            {
+                OptReq('o', output = argarg; );
+                case '-':
+                    LongReq("--output", output = argarg; );
+                default:
+                    printf("Unrecognized option: %s\n", argv[0]);
+                    break;
+            }
         }
+        else
+        {
+            if (input) {
+                printf("Onlyh 1 input file allowed\n");
+                exit(1);
+            }
+            input = argv[0];
+        }
+        --argc;
+        ++argv;
+    }
+
+    if (!input) {
+        printf("must specify an input file\n");
+    }
+
+    if (!parser_compile(input, output)) {
+        printf("There were compile errors\n");
     }
 
     util_debug("COM", "cleaning ...\n");
index 942fd9c55da4ac1c0a0d60689518bf050c93b097..d7c5b8d30402ebf6d59dd98117b44f65d91b5d42 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -1056,7 +1056,7 @@ static bool parser_do(parser_t *parser)
     return true;
 }
 
-bool parser_compile(const char *filename)
+bool parser_compile(const char *filename, const char *datfile)
 {
     size_t i;
     parser_t *parser;
@@ -1135,6 +1135,11 @@ bool parser_compile(const char *filename)
 
     ir_builder_dump(ir, printf);
 
+    if (!ir_builder_generate(ir, datfile))
+        printf("*** failed to generate output file\n");
+
+    ir_builder_delete(ir);
+
 cleanup:
     for (i = 0; i < parser->globals_count; ++i) {
         ast_value_delete(parser->globals[i]);