]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - ftepp.c
Unary NOT in #if
[xonotic/gmqcc.git] / ftepp.c
diff --git a/ftepp.c b/ftepp.c
index 51a83a15563908adfee19fb31a63c5a04ae38c32..a240643046e0827c2a42a1b98820cae6e7730ce8 100644 (file)
--- a/ftepp.c
+++ b/ftepp.c
@@ -198,16 +198,23 @@ static bool ftepp_define(ftepp_t *ftepp)
 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;
@@ -215,7 +222,6 @@ static bool ftepp_if_expr(ftepp_t *ftepp, bool *out)
                     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;
@@ -280,10 +286,14 @@ static bool ftepp_if_expr(ftepp_t *ftepp, bool *out)
             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;
@@ -317,8 +327,6 @@ static bool ftepp_if(ftepp_t *ftepp, ppcondition *cond)
 {
     bool result = false;
 
-    ftepp->lex->flags.noops = false;
-
     memset(cond, 0, sizeof(*cond));
     (void)ftepp_next(ftepp);
 
@@ -331,7 +339,6 @@ static bool ftepp_if(ftepp_t *ftepp, ppcondition *cond)
 
     if (!ftepp_if_expr(ftepp, &result))
         return false;
-    ftepp->lex->flags.noops = true;
 
     cond->on = result;
     return true;
@@ -507,6 +514,7 @@ static bool ftepp_preprocess(ftepp_t *ftepp)
     bool newline = true;
 
     ftepp->lex->flags.preprocessing = true;
+    ftepp->lex->flags.noops = true;
 
     ftepp_next(ftepp);
     do