From 5ca3fed36ae5a0186e20e967858632f8a5b29d4d Mon Sep 17 00:00:00 2001
From: "Wolfgang (Blub) Bumiller" <blub@speed.at>
Date: Mon, 13 Aug 2012 15:33:32 +0200
Subject: [PATCH] Even more operators

---
 parser.c | 33 ++++++++++++++++++++++++++++++---
 1 file changed, 30 insertions(+), 3 deletions(-)

diff --git a/parser.c b/parser.c
index 46c7ff4..0025f65 100644
--- a/parser.c
+++ b/parser.c
@@ -502,6 +502,9 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
             }
             out = (ast_expression*)ast_binary_new(ctx, INSTR_DIV_F, exprs[0], exprs[1]);
             break;
+        case opid1('%'):
+            parseerror(parser, "qc does not have a modulo operator");
+            return false;
         case opid1('|'):
         case opid1('&'):
             if (NotSameType(TYPE_FLOAT)) {
@@ -514,6 +517,31 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
                                                   (op->id == opid1('|') ? INSTR_BITOR : INSTR_BITAND),
                                                   exprs[0], exprs[1]);
             break;
+        case opid1('^'):
+            parseerror(parser, "TODO: bitxor");
+            return false;
+
+        case opid2('<','<'):
+        case opid2('>','>'):
+            parseerror(parser, "TODO: shifts");
+            return false;
+
+        case opid2('|','|'):
+            generated_op += 1; /* INSTR_OR */
+        case opid2('&','&'):
+            generated_op += INSTR_AND;
+            if (NotSameType(TYPE_FLOAT)) {
+                parseerror(parser, "type error: cannot apply logical operation on types %s and %s",
+                           type_name[exprs[0]->expression.vtype],
+                           type_name[exprs[1]->expression.vtype]);
+                parseerror(parser, "TODO: logical ops for arbitrary types using INSTR_NOT");
+                parseerror(parser, "TODO: optional early out");
+                return false;
+            }
+            if (opts_standard == COMPILER_GMQCC)
+                printf("TODO: early out logic\n");
+            out = (ast_expression*)ast_binary_new(ctx, generated_op, exprs[0], exprs[1]);
+            break;
 
         case opid1('>'):
             generated_op += 1; /* INSTR_GT */
@@ -538,7 +566,7 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
                            type_name[exprs[1]->expression.vtype]);
                 return false;
             }
-            out = (ast_expression*)ast_binary_new(ctx, type_ne_op[exprs[0]->expression.vtype], exprs[0], exprs[1]);
+            out = (ast_expression*)ast_binary_new(ctx, type_ne_instr[exprs[0]->expression.vtype], exprs[0], exprs[1]);
             break;
         case opid2('=', '='):
             if (exprs[0]->expression.vtype != exprs[1]->expression.vtype) {
@@ -547,10 +575,9 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
                            type_name[exprs[1]->expression.vtype]);
                 return false;
             }
-            out = (ast_expression*)ast_binary_new(ctx, type_eq_op[exprs[0]->expression.vtype], exprs[0], exprs[1]);
+            out = (ast_expression*)ast_binary_new(ctx, type_eq_instr[exprs[0]->expression.vtype], exprs[0], exprs[1]);
             break;
 
-
         case opid1('='):
             if (ast_istype(exprs[0], ast_entfield))
                 assignop = type_storep_instr[exprs[0]->expression.vtype];
-- 
2.39.5