From: Dale Weiler Date: Sun, 27 Jan 2013 21:31:18 +0000 (+0000) Subject: Handle all possible subscript errors X-Git-Tag: before-library~202 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=7ea1033a43e78de662feaa41fd71d791a5749936;p=xonotic%2Fgmqcc.git Handle all possible subscript errors --- diff --git a/ftepp.c b/ftepp.c index 0fb7681..9be8c54 100644 --- a/ftepp.c +++ b/ftepp.c @@ -411,36 +411,38 @@ static bool ftepp_define_body(ftepp_t *ftepp, ppmacro *macro) bool subscript = false; size_t index = 0; if (macro->variadic && !strcmp(ftepp_tokval(ftepp), "__VA_ARGS__")) { - /* remember the token */ - if (ftepp_next(ftepp) == '#') { - subscript = true; - } + subscript = !!(ftepp_next(ftepp) == '#'); if (subscript && ftepp_next(ftepp) != '#') { ftepp_error(ftepp, "expected `##` in __VA_ARGS__ for subscripting"); return false; - } else if (subscript && ftepp_next(ftepp) == '[') { - if (ftepp_next(ftepp) != TOKEN_INTCONST) { - ftepp_error(ftepp, "expected index for __VA_ARGS__ subscript"); - return false; - } + } else if (subscript) { + if (ftepp_next(ftepp) == '[') { + if (ftepp_next(ftepp) != TOKEN_INTCONST) { + ftepp_error(ftepp, "expected index for __VA_ARGS__ subscript"); + return false; + } - index = atoi(ftepp_tokval(ftepp)); + index = atoi(ftepp_tokval(ftepp)); - if (ftepp_next(ftepp) != ']') { - ftepp_error(ftepp, "expected `]` in __VA_ARGS__ subscript"); + if (ftepp_next(ftepp) != ']') { + ftepp_error(ftepp, "expected `]` in __VA_ARGS__ subscript"); + return false; + } + + /* + * mark it as an array to be handled later as such and not + * as traditional __VA_ARGS__ + */ + ftepp->token = TOKEN_VA_ARGS_ARRAY; + ptok = pptoken_make(ftepp); + ptok->constval.i = index; + vec_push(macro->output, ptok); + ftepp_next(ftepp); + } else { + ftepp_error(ftepp, "expected `[` for subscripting of __VA_ARGS__"); return false; } - - /* - * mark it as an array to be handled later as such and not - * as traditional __VA_ARGS__ - */ - ftepp->token = TOKEN_VA_ARGS_ARRAY; - ptok = pptoken_make(ftepp); - ptok->constval.i = index; - vec_push(macro->output, ptok); - ftepp_next(ftepp); } else { int old = ftepp->token; ftepp->token = TOKEN_VA_ARGS;