diff --git a/tools/qfcc/include/rua-lang.h b/tools/qfcc/include/rua-lang.h index 3cf24ece8..3ec6ce03c 100644 --- a/tools/qfcc/include/rua-lang.h +++ b/tools/qfcc/include/rua-lang.h @@ -92,6 +92,7 @@ void rua_expand_on (void *scanner); void rua_expand_off (void *scanner); void rua_end_directive (void *scanner); void rua_start_if (bool expand, void *scanner); +void rua_start_else (bool expand, void *scanner); void rua_if (bool pass, void *scanner); void rua_else (bool pass, const char *tok, void *scanner); void rua_endif (void *scanner); diff --git a/tools/qfcc/source/pre-parse.y b/tools/qfcc/source/pre-parse.y index e19b478a2..8de32011f 100644 --- a/tools/qfcc/source/pre-parse.y +++ b/tools/qfcc/source/pre-parse.y @@ -213,13 +213,14 @@ directive extra_warn | ELSE { rua_else (true, "else", scanner); } extra_warn - | ELIF expand expr { rua_else (expr_long ($3), "elif", scanner); } + | ELIF { rua_start_else (true, scanner); } + expr { rua_else (expr_long ($3), "elif", scanner); } eod - | ELIFDEF ID - { rua_else (rua_defined ($2, scanner), "elifdef", scanner); } + | ELIFDEF { rua_start_else (false, scanner); } + ID { rua_else (rua_defined ($3, scanner), "elifdef", scanner); } extra_warn - | ELIFNDEF ID - { rua_else (!rua_defined ($2, scanner), "elifndef", scanner); } + | ELIFNDEF { rua_start_else (false, scanner); } + ID { rua_else (!rua_defined ($3, scanner), "elifndef", scanner); } extra_warn | ENDIF { rua_endif (scanner); } extra_warn diff --git a/tools/qfcc/source/qc-lex.l b/tools/qfcc/source/qc-lex.l index 76a2e89f1..cadc8e26c 100644 --- a/tools/qfcc/source/qc-lex.l +++ b/tools/qfcc/source/qc-lex.l @@ -1826,7 +1826,17 @@ rua_start_if (bool expand, void *scanner) cond.own_state = c.own_state & c.enabled; } DARRAY_APPEND (&extra->cond_stack, cond); - extra->expand = expand && !extra->suppressed; + extra->expand = expand; + + yy_pop_state (scanner); + yy_push_state (PREEXPR, scanner); +} + +void +rua_start_else (bool expand, void *scanner) +{ + auto extra = qc_yyget_extra (scanner); + extra->expand = expand; yy_pop_state (scanner); yy_push_state (PREEXPR, scanner);