From: Dale Weiler <killfieldengine@gmail.com>
Date: Thu, 13 Jun 2013 22:20:17 +0000 (+0000)
Subject: Actually works now
X-Git-Tag: v0.3.0~140
X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=daa1487aefbb31359c532a19e01819f0d00f6716;p=xonotic%2Fgmqcc.git

Actually works now
---

diff --git a/gmqcc.h b/gmqcc.h
index d6055db..dc69104 100644
--- a/gmqcc.h
+++ b/gmqcc.h
@@ -1129,6 +1129,7 @@ typedef enum {
     COMPILER_QCC,     /* circa  QuakeC */
     COMPILER_FTEQCC,  /* fteqcc QuakeC */
     COMPILER_QCCX,    /* qccx   QuakeC */
+    COMPILER_HCODE,   /* hcode  QuakeC */
     COMPILER_GMQCC    /* this   QuakeC */
 } opts_std_t;
 
diff --git a/main.c b/main.c
index 37638e9..ce3025a 100644
--- a/main.c
+++ b/main.c
@@ -74,6 +74,7 @@ static int usage(void) {
     con_out("  -std=standard          select one of the following standards\n"
             "       -std=qcc          original QuakeC\n"
             "       -std=fteqcc       fteqcc QuakeC\n"
+            "       -std=hcode        hexgen2 QuakeC\n"
             "       -std=gmqcc        this compiler (default)\n");
     con_out("  -f<flag>               enable a flag\n"
             "  -fno-<flag>            disable a flag\n"
@@ -204,6 +205,12 @@ static bool options_parse(int argc, char **argv) {
                     opts_set(opts.flags, ADJUST_VECTOR_FIELDS,  false);
                     OPTS_OPTION_U32(OPTION_STANDARD) = COMPILER_QCCX;
 
+                } else if (!strcmp(argarg, "hcode")) {
+
+                    opts_set(opts.flags, ADJUST_VECTOR_FIELDS,  false);
+                    opts_set(opts.flags, ASSIGN_FUNCTION_TYPES, true);
+
+                    OPTS_OPTION_U32(OPTION_STANDARD) = COMPILER_HCODE;
                 } else {
                     con_out("Unknown standard: %s\n", argarg);
                     return false;
diff --git a/parser.c b/parser.c
index 5b4ed65..06aca6b 100644
--- a/parser.c
+++ b/parser.c
@@ -5770,22 +5770,29 @@ skipvar:
             }
         }
 
-        if (parser->tok != '{' || var->expression.vtype != TYPE_FUNCTION) {
-            if (parser->tok != '=') {
-                parseerror(parser, "missing semicolon or initializer, got: `%s`", parser_tokval(parser));
-                break;
-            }
+        if ((OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_HCODE)
+                ? parser->tok != ':'
+                : true
+        ){
+            if (parser->tok != '{' || var->expression.vtype != TYPE_FUNCTION) {
+                if (parser->tok != '=') {
+                    parseerror(parser, "missing semicolon or initializer, got: `%s`", parser_tokval(parser));
+                    break;
+                }
 
-            if (!parser_next(parser)) {
-                parseerror(parser, "error parsing initializer");
-                break;
+                if (!parser_next(parser)) {
+                    parseerror(parser, "error parsing initializer");
+                    break;
+                }
+            }
+            else if (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_QCC) {
+                parseerror(parser, "expected '=' before function body in this standard");
             }
-        }
-        else if (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_QCC) {
-            parseerror(parser, "expected '=' before function body in this standard");
         }
 
-        if (parser->tok == '#') {
+        if (parser->tok == '#' ||
+            (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_HCODE && parser->tok == ':'))
+        {
             ast_function *func   = NULL;
             ast_value    *number = NULL;
             float         fractional;