]> git.rm.cloudns.org Git - xonotic/gmqcc.git/commitdiff
unary NOT operator for float and vector
authorWolfgang (Blub) Bumiller <blub@speed.at>
Thu, 16 Aug 2012 14:21:19 +0000 (16:21 +0200)
committerWolfgang (Blub) Bumiller <blub@speed.at>
Thu, 16 Aug 2012 14:21:19 +0000 (16:21 +0200)
parser.c

index 62953ce46a49d56f7b7db0fece227bf3dd09cf47..121b39fc7faaa13ed656ea68badd329646647b52 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -549,6 +549,28 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
             }
             break;
 
+        case opid2('!','P'):
+            switch (exprs[0]->expression.vtype) {
+                case TYPE_FLOAT:
+                    if (CanConstFold1(exprs[0]))
+                        out = (ast_expression*)parser_const_float(parser, !ConstF(0));
+                    else
+                        out = (ast_expression*)ast_unary_new(ctx, INSTR_NOT_F, exprs[0]);
+                    break;
+                case TYPE_VECTOR:
+                    if (CanConstFold1(exprs[0]))
+                        out = (ast_expression*)parser_const_float(parser,
+                            (!ConstV(0).x && !ConstV(0).y && !ConstV(0).z));
+                    else
+                        out = (ast_expression*)ast_unary_new(ctx, INSTR_NOT_V, exprs[0]);
+                    break;
+                default:
+                parseerror(parser, "invalid types used in expression: cannot logically negate type %s",
+                           type_name[exprs[0]->expression.vtype]);
+                return false;
+            }
+            break;
+
         case opid1('+'):
             if (exprs[0]->expression.vtype != exprs[1]->expression.vtype ||
                 (exprs[0]->expression.vtype != TYPE_VECTOR && exprs[0]->expression.vtype != TYPE_FLOAT) )