From: Dale Weiler Date: Fri, 8 Feb 2013 12:30:17 +0000 (+0000) Subject: Implemented __VA_COUNT__ X-Git-Tag: before-library~128 X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=commitdiff_plain;h=a568d434878e753126b357031d31899e4a583465 Implemented __VA_COUNT__ --- diff --git a/ftepp.c b/ftepp.c index 4734639..a0f1105 100644 --- a/ftepp.c +++ b/ftepp.c @@ -451,8 +451,12 @@ static bool ftepp_define_body(ftepp_t *ftepp, ppmacro *macro) ftepp->token = old; } } - else - { + else if (macro->variadic && !strcmp(ftepp_tokval(ftepp), "__VA_COUNT__")) { + ftepp->token = TOKEN_VA_COUNT; + ptok = pptoken_make(ftepp); + vec_push(macro->output, ptok); + ftepp_next(ftepp); + } else { ptok = pptoken_make(ftepp); vec_push(macro->output, ptok); ftepp_next(ftepp); @@ -681,6 +685,7 @@ static void ftepp_param_out(ftepp_t *ftepp, macroparam *param) static bool ftepp_preprocess(ftepp_t *ftepp); static bool ftepp_macro_expand(ftepp_t *ftepp, ppmacro *macro, macroparam *params, bool resetline) { + char *buffer = NULL; char *old_string = ftepp->output_string; char *inner_string; lex_file *old_lexer = ftepp->lex; @@ -736,6 +741,12 @@ static bool ftepp_macro_expand(ftepp_t *ftepp, ppmacro *macro, macroparam *param ftepp_param_out(ftepp, ¶ms[out->constval.i + vararg_start]); break; + case TOKEN_VA_COUNT: + util_asprintf(&buffer, "%d", varargs); + ftepp_out(ftepp, buffer, false); + mem_d(buffer); + break; + case TOKEN_IDENT: case TOKEN_TYPENAME: case TOKEN_KEYWORD: diff --git a/lexer.h b/lexer.h index 15730ee..9724a7b 100644 --- a/lexer.h +++ b/lexer.h @@ -76,6 +76,7 @@ enum { TOKEN_VA_ARGS, /* for the ftepp only */ TOKEN_VA_ARGS_ARRAY, /* for the ftepp only */ + TOKEN_VA_COUNT, /* to get the count of vaargs */ TOKEN_STRINGCONST, /* not the typename but an actual "string" */ TOKEN_CHARCONST,