Added remaining int operators
authorLukas Krickl <lukas@krickl.dev>
Sun, 10 Dec 2023 08:03:58 +0000 (09:03 +0100)
committerLukas Krickl <lukas@krickl.dev>
Sun, 10 Dec 2023 08:03:58 +0000 (09:03 +0100)
include/ulas.h
src/main.c
src/ulas.c

index 575d284fc7b93f3ffb4a70aa327b51e7ed0dbd4c..e6b2b67cea83d4ec21a25599f500d8a46fd1e3cd 100644 (file)
@@ -129,7 +129,9 @@ enum ulas_type {
   ULAS_EQ,
   ULAS_NEQ,
   ULAS_GTEQ,
-  ULAS_LTEQ
+  ULAS_LTEQ,
+  ULAS_RSHIFT,
+  ULAS_LSHIFT,
 };
 
 // data type value
index e7484df48014c8ef48452a90573432037fe474db..2bd14d13afb21571acca7e8c91c677d46db731bf 100644 (file)
@@ -19,7 +19,7 @@
 
 #define ULAS_INCPATHSMAX 256
 
-const char *incpaths[ULAS_INCPATHSMAX];
+char *incpaths[ULAS_INCPATHSMAX];
 long incpathslen = 0;
 
 void ulas_help(void) {
index 3989b5a89c4d71c6ef2d3d5829df9eccbf6dfd2a..5ee5030d13a84f6ecd9d366dbb946662a1417bd5 100644 (file)
@@ -526,12 +526,17 @@ struct ulas_tok ulas_totok(char *buf, unsigned long n, int *rc) {
       if (*buf == '=') {
         tok.type = ULAS_LTEQ;
         buf++;
+      } else if (*buf == '<') {
+        tok.type = ULAS_LSHIFT;
       }
       break;
     case '>':
       if (*buf == '=') {
         tok.type = ULAS_GTEQ;
         buf++;
+      } else if (*buf == '>') {
+        tok.type = ULAS_RSHIFT;
+        buf++;
       }
       break;
     default:
@@ -1527,6 +1532,16 @@ int ulas_intexpreval(int i, int *rc) {
         return 0;
       }
       return left % right;
+    case ULAS_RSHIFT:
+      return left >> right;
+    case ULAS_LSHIFT:
+      return left << right;
+    case '|':
+      return left | right;
+    case '&':
+      return left & right;
+    case '^':
+      return left ^ right;
     default:
       ULASPANIC("Unhandeled binary operator\n");
       break;
@@ -1544,6 +1559,8 @@ int ulas_intexpreval(int i, int *rc) {
       return !right;
     case '-':
       return -right;
+    case '~':
+      return ~right;
     default:
       ULASPANIC("Unhandeled unary operation\n");
       break;