From daa1487aefbb31359c532a19e01819f0d00f6716 Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Thu, 13 Jun 2013 22:20:17 +0000 Subject: [PATCH] Actually works now --- gmqcc.h | 1 + main.c | 7 +++++++ parser.c | 31 +++++++++++++++++++------------ 3 files changed, 27 insertions(+), 12 deletions(-) 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 enable a flag\n" " -fno- 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;