]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - main.c
Handling output file, writing output file
[xonotic/gmqcc.git] / main.c
diff --git a/main.c b/main.c
index 00f84110e07e6bbe53d27e53d6bb4e4630f5bef6..54c64b639ca4ae0103ad60ce52e2cd01f5122d1b 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,6 +1,6 @@
 /*
- * Copyright (C) 2012 
- *     Dale Weiler
+ * Copyright (C) 2012
+ *     Dale Weiler
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy of
  * this software and associated documentation files (the "Software"), to deal in
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#      include <stdlib.h>
-       #include <string.h>
-#              include <limits.h>
-  #      include       "gmqcc.h"
+#include "gmqcc.h"
 
+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) {
-       argc--;
-       argv++;
-       
-       const char *ifile = argv[0];
-       
-       FILE *fp = fopen(ifile, "r");
-       if  (!fp) {
-               fclose(fp);
-               return error(ERROR_COMPILER, "Source file: %s not found\n", ifile);
-       } else {
-               struct lex_file *lex = lex_open(fp);
-               if (!lex) {
-                       fclose(fp);
-                       return 0;
-               }
-               parse_tree(lex);
-               lex_close (lex);
-       }
-       
-       code_write();
-       return 0;
+    const char *argarg;
+    char opt;
+
+    util_debug("COM", "starting ...\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");
+
+    util_meminfo();
+    return 0;
 }