X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=ftepp.c;h=d867d7917c6cb4194f6eeb8f817c1112a0d37253;hb=199ed6c31ff84e564ed665da5e12cbd99fcf4126;hp=436b05beab8ff4c351565881e441b6a1990a9e31;hpb=a2f63aae33190a6764cbb82b4c8a447a1bcc410e;p=xonotic%2Fgmqcc.git diff --git a/ftepp.c b/ftepp.c index 436b05b..d867d79 100644 --- a/ftepp.c +++ b/ftepp.c @@ -70,11 +70,6 @@ typedef struct { char *includename; } ftepp_t; -typedef struct { - const char *name; - char *(*func)(lex_file *); -} predef_t; - /* * Implement the predef subsystem now. We can do this safely with the * help of lexer contexts. @@ -168,7 +163,7 @@ char *ftepp_predef_randomlast(lex_file *context) { return value; } -static const predef_t ftepp_predefs[] = { +const ftepp_predef_t ftepp_predefs[FTEPP_PREDEF_COUNT] = { { "__LINE__", &ftepp_predef_line }, { "__FILE__", &ftepp_predef_file }, { "__COUNTER__", &ftepp_predef_counter }, @@ -827,6 +822,7 @@ static bool ftepp_if_value(ftepp_t *ftepp, bool *out, double *value_out) { ppmacro *macro; bool wasnot = false; + bool wasneg = false; if (!ftepp_skipspace(ftepp)) return false; @@ -838,6 +834,14 @@ static bool ftepp_if_value(ftepp_t *ftepp, bool *out, double *value_out) return false; } + if (ftepp->token == TOKEN_OPERATOR && !strcmp(ftepp_tokval(ftepp), "-")) + { + wasneg = true; + ftepp_next(ftepp); + if (!ftepp_skipspace(ftepp)) + return false; + } + switch (ftepp->token) { case TOKEN_IDENT: case TOKEN_TYPENAME: @@ -894,6 +898,7 @@ static bool ftepp_if_value(ftepp_t *ftepp, bool *out, double *value_out) } break; case TOKEN_STRINGCONST: + *value_out = 0; *out = false; break; case TOKEN_INTCONST: @@ -917,8 +922,12 @@ static bool ftepp_if_value(ftepp_t *ftepp, bool *out, double *value_out) default: ftepp_error(ftepp, "junk in #if: `%s` ...", ftepp_tokval(ftepp)); + if (opts.debug) + ftepp_error(ftepp, "internal: token %i\n", ftepp->token); return false; } + if (wasneg) + *value_out = -*value_out; if (wasnot) { *out = !*out; *value_out = (*out ? 1 : 0); @@ -1643,6 +1652,10 @@ bool ftepp_init() ftepp_add_define(NULL, "__STD_GMQCC__"); sprintf(major, "\"%d\"", GMQCC_VERSION_MAJOR); sprintf(minor, "\"%d\"", GMQCC_VERSION_MINOR); + } else if (opts.standard == COMPILER_QCCX) { + ftepp_add_define(NULL, "__STD_QCCX__"); + sprintf(major, "\"%d\"", GMQCC_VERSION_MAJOR); + sprintf(minor, "\"%d\"", GMQCC_VERSION_MINOR); } else if (opts.standard == COMPILER_QCC) { ftepp_add_define(NULL, "__STD_QCC__"); /* 1.0 */