From afa78451df1e9fb2810d4ae8cb697b1b2071ff9c Mon Sep 17 00:00:00 2001
From: A404M <ahmadmahmoudiprogrammer@gmail.com>
Date: Mon, 26 May 2025 01:24:56 +0330
Subject: add shift

---
 src/runner/runner.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 89 insertions(+), 1 deletion(-)

(limited to 'src/runner/runner.c')

diff --git a/src/runner/runner.c b/src/runner/runner.c
index 926380a..923f9af 100644
--- a/src/runner/runner.c
+++ b/src/runner/runner.c
@@ -1075,6 +1075,78 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope,
     return newAstTree(AST_TREE_TOKEN_RAW_VALUE, ret, copyAstTree(left->type),
                       NULL, NULL);
   }
+  case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT: {
+    AstTree *left = arguments[0];
+    AstTree *right = arguments[1];
+    AstTreeRawValue *ret = a404m_malloc(getSizeOfType(left->type));
+
+    switch (left->type->token) {
+    case AST_TREE_TOKEN_TYPE_I8:
+      *(i8 *)ret = *(i8 *)left->metadata << *(i8 *)right->metadata;
+      break;
+    case AST_TREE_TOKEN_TYPE_U8:
+      *(u8 *)ret = *(u8 *)left->metadata << *(u8 *)right->metadata;
+      break;
+    case AST_TREE_TOKEN_TYPE_I16:
+      *(i16 *)ret = *(i16 *)left->metadata << *(i16 *)right->metadata;
+      break;
+    case AST_TREE_TOKEN_TYPE_U16:
+      *(u16 *)ret = *(u16 *)left->metadata << *(u16 *)right->metadata;
+      break;
+    case AST_TREE_TOKEN_TYPE_I32:
+      *(i32 *)ret = *(i32 *)left->metadata << *(i32 *)right->metadata;
+      break;
+    case AST_TREE_TOKEN_TYPE_U32:
+      *(u32 *)ret = *(u32 *)left->metadata << *(u32 *)right->metadata;
+      break;
+    case AST_TREE_TOKEN_TYPE_I64:
+      *(i64 *)ret = *(i64 *)left->metadata << *(i64 *)right->metadata;
+      break;
+    case AST_TREE_TOKEN_TYPE_U64:
+      *(u64 *)ret = *(u64 *)left->metadata << *(u64 *)right->metadata;
+      break;
+    default:
+      UNREACHABLE;
+    }
+    return newAstTree(AST_TREE_TOKEN_RAW_VALUE, ret, copyAstTree(left->type),
+                      NULL, NULL);
+  }
+  case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT: {
+    AstTree *left = arguments[0];
+    AstTree *right = arguments[1];
+    AstTreeRawValue *ret = a404m_malloc(getSizeOfType(left->type));
+
+    switch (left->type->token) {
+    case AST_TREE_TOKEN_TYPE_I8:
+      *(i8 *)ret = *(i8 *)left->metadata >> *(i8 *)right->metadata;
+      break;
+    case AST_TREE_TOKEN_TYPE_U8:
+      *(u8 *)ret = *(u8 *)left->metadata >> *(u8 *)right->metadata;
+      break;
+    case AST_TREE_TOKEN_TYPE_I16:
+      *(i16 *)ret = *(i16 *)left->metadata >> *(i16 *)right->metadata;
+      break;
+    case AST_TREE_TOKEN_TYPE_U16:
+      *(u16 *)ret = *(u16 *)left->metadata >> *(u16 *)right->metadata;
+      break;
+    case AST_TREE_TOKEN_TYPE_I32:
+      *(i32 *)ret = *(i32 *)left->metadata >> *(i32 *)right->metadata;
+      break;
+    case AST_TREE_TOKEN_TYPE_U32:
+      *(u32 *)ret = *(u32 *)left->metadata >> *(u32 *)right->metadata;
+      break;
+    case AST_TREE_TOKEN_TYPE_I64:
+      *(i64 *)ret = *(i64 *)left->metadata >> *(i64 *)right->metadata;
+      break;
+    case AST_TREE_TOKEN_TYPE_U64:
+      *(u64 *)ret = *(u64 *)left->metadata >> *(u64 *)right->metadata;
+      break;
+    default:
+      UNREACHABLE;
+    }
+    return newAstTree(AST_TREE_TOKEN_RAW_VALUE, ret, copyAstTree(left->type),
+                      NULL, NULL);
+  }
   case AST_TREE_TOKEN_BUILTIN_PUTC: {
     putchar(*(u8 *)arguments[0]->metadata);
     return copyAstTree(&AST_TREE_VOID_VALUE);
@@ -1447,7 +1519,9 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
   case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR:
   case AST_TREE_TOKEN_OPERATOR_BITWISE_AND:
   case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR:
-  case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: {
+  case AST_TREE_TOKEN_OPERATOR_BITWISE_OR:
+  case AST_TREE_TOKEN_OPERATOR_SHIFT_LEFT:
+  case AST_TREE_TOKEN_OPERATOR_SHIFT_RIGHT: {
     AstTreeInfix *metadata = expr->metadata;
     AstTree *function =
         runExpression(metadata->function->value, scope, shouldRet, false,
@@ -1541,6 +1615,8 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
   case AST_TREE_TOKEN_BUILTIN_BITWISE_AND:
   case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR:
   case AST_TREE_TOKEN_BUILTIN_BITWISE_OR:
+  case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT:
+  case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT:
     return copyAstTree(expr);
   case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME: {
     AstTreeBool *metadata = a404m_malloc(sizeof(*metadata));
@@ -2030,6 +2106,8 @@ AstTree *toRawValue(AstTree *value) {
   case AST_TREE_TOKEN_BUILTIN_BITWISE_AND:
   case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR:
   case AST_TREE_TOKEN_BUILTIN_BITWISE_OR:
+  case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT:
+  case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT:
   case AST_TREE_TOKEN_KEYWORD_RETURN:
   case AST_TREE_TOKEN_KEYWORD_BREAK:
   case AST_TREE_TOKEN_KEYWORD_CONTINUE:
@@ -2068,6 +2146,8 @@ AstTree *toRawValue(AstTree *value) {
   case AST_TREE_TOKEN_OPERATOR_BITWISE_AND:
   case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR:
   case AST_TREE_TOKEN_OPERATOR_BITWISE_OR:
+  case AST_TREE_TOKEN_OPERATOR_SHIFT_LEFT:
+  case AST_TREE_TOKEN_OPERATOR_SHIFT_RIGHT:
   case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS:
   case AST_TREE_TOKEN_SCOPE:
   case AST_TREE_TOKEN_NONE:
@@ -2205,6 +2285,8 @@ AstTree *castTo(AstTree *tree, AstTree *to) {
   case AST_TREE_TOKEN_BUILTIN_BITWISE_AND:
   case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR:
   case AST_TREE_TOKEN_BUILTIN_BITWISE_OR:
+  case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT:
+  case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT:
   case AST_TREE_TOKEN_KEYWORD_RETURN:
   case AST_TREE_TOKEN_KEYWORD_BREAK:
   case AST_TREE_TOKEN_KEYWORD_CONTINUE:
@@ -2253,6 +2335,8 @@ AstTree *castTo(AstTree *tree, AstTree *to) {
   case AST_TREE_TOKEN_OPERATOR_BITWISE_AND:
   case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR:
   case AST_TREE_TOKEN_OPERATOR_BITWISE_OR:
+  case AST_TREE_TOKEN_OPERATOR_SHIFT_LEFT:
+  case AST_TREE_TOKEN_OPERATOR_SHIFT_RIGHT:
   case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS:
   case AST_TREE_TOKEN_SCOPE:
   case AST_TREE_TOKEN_NONE:
@@ -2331,6 +2415,8 @@ ffi_type *toFFIType(AstTree *type) {
   case AST_TREE_TOKEN_BUILTIN_BITWISE_AND:
   case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR:
   case AST_TREE_TOKEN_BUILTIN_BITWISE_OR:
+  case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT:
+  case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT:
   case AST_TREE_TOKEN_KEYWORD_RETURN:
   case AST_TREE_TOKEN_KEYWORD_BREAK:
   case AST_TREE_TOKEN_KEYWORD_CONTINUE:
@@ -2379,6 +2465,8 @@ ffi_type *toFFIType(AstTree *type) {
   case AST_TREE_TOKEN_OPERATOR_BITWISE_AND:
   case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR:
   case AST_TREE_TOKEN_OPERATOR_BITWISE_OR:
+  case AST_TREE_TOKEN_OPERATOR_SHIFT_LEFT:
+  case AST_TREE_TOKEN_OPERATOR_SHIFT_RIGHT:
   case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS:
   case AST_TREE_TOKEN_SCOPE:
   case AST_TREE_TOKEN_NONE:
-- 
cgit v1.2.3