From: Wolfgang (Blub) Bumiller Date: Fri, 16 Nov 2012 19:38:44 +0000 (+0100) Subject: Parsing basic macro body, no special tokens yet X-Git-Tag: 0.1.9~404^2~45 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=c48b9dbf61d9afbc480a2fb487d8181cb077792e;p=xonotic%2Fgmqcc.git Parsing basic macro body, no special tokens yet --- diff --git a/ftepp.c b/ftepp.c index 50461e6..15702b0 100644 --- a/ftepp.c +++ b/ftepp.c @@ -91,7 +91,10 @@ pptoken *pptoken_make(ftepp_t *ftepp) { pptoken *token = (pptoken*)mem_a(sizeof(pptoken)); token->token = ftepp->token; - token->value = util_strdup(ftepp_tokval(ftepp)); + if (token->token == TOKEN_WHITE) + token->value = util_strdup(" "); + else + token->value = util_strdup(ftepp_tokval(ftepp)); memcpy(&token->constval, &ftepp->lex->tok.constval, sizeof(token->constval)); return token; } @@ -204,6 +207,24 @@ static bool ftepp_define_params(ftepp_t *ftepp, ppmacro *macro) return true; } +static bool ftepp_define_body(ftepp_t *ftepp, ppmacro *macro) +{ + pptoken *ptok; + while (ftepp->token != TOKEN_EOL && ftepp->token < TOKEN_EOF) { + ptok = pptoken_make(ftepp); + vec_push(macro->output, ptok); + + ftepp_next(ftepp); + if (!ftepp_skipspace(ftepp)) + return false; + } + if (ftepp->token != TOKEN_EOL) { + ftepp_error(ftepp, "unexpected junk after macro or unexpected end of file"); + return false; + } + return true; +} + static bool ftepp_define(ftepp_t *ftepp) { ppmacro *macro; @@ -233,10 +254,9 @@ static bool ftepp_define(ftepp_t *ftepp) if (!ftepp_skipspace(ftepp)) return false; - if (ftepp->token != TOKEN_EOL) { - ftepp_error(ftepp, "stray tokens after macro"); + if (!ftepp_define_body(ftepp, macro)) return false; - } + vec_push(ftepp->macros, macro); return true; }