Implemented __VA_COUNT__

This commit is contained in:
Dale Weiler 2013-02-08 12:30:17 +00:00
parent 945aba6e10
commit a568d43487
2 changed files with 14 additions and 2 deletions

15
ftepp.c
View file

@ -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, &params[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:

View file

@ -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,