static bool ftepp_if_expr(ftepp_t *ftepp, bool *out)
{
ppmacro *macro;
+ bool wasnot = false;
if (!ftepp_skipspace(ftepp))
return false;
+ while (ftepp->token == '!') {
+ wasnot = true;
+ ftepp_next(ftepp);
+ if (!ftepp_skipspace(ftepp))
+ return false;
+ }
+
switch (ftepp->token) {
case TOKEN_IDENT:
case TOKEN_TYPENAME:
case TOKEN_KEYWORD:
if (!strcmp(ftepp_tokval(ftepp), "defined")) {
- ftepp->lex->flags.noops = true;
ftepp_next(ftepp);
if (!ftepp_skipspace(ftepp))
return false;
ftepp_error(ftepp, "`defined` keyword in #if requires a macro name in parenthesis");
return false;
}
- ftepp->lex->flags.noops = false;
ftepp_next(ftepp);
if (!ftepp_skipspace(ftepp))
return false;
ftepp_error(ftepp, "junk in #if");
return false;
}
+ if (wasnot)
+ *out = !*out;
+ ftepp->lex->flags.noops = false;
ftepp_next(ftepp);
if (!ftepp_skipspace(ftepp))
return false;
+ ftepp->lex->flags.noops = true;
if (ftepp->token == ')')
return true;
{
bool result = false;
- ftepp->lex->flags.noops = false;
-
memset(cond, 0, sizeof(*cond));
(void)ftepp_next(ftepp);
if (!ftepp_if_expr(ftepp, &result))
return false;
- ftepp->lex->flags.noops = true;
cond->on = result;
return true;
bool newline = true;
ftepp->lex->flags.preprocessing = true;
+ ftepp->lex->flags.noops = true;
ftepp_next(ftepp);
do