From 36367beb40b69d66ba866be31878097eed70b6be Mon Sep 17 00:00:00 2001
From: A404M <ahmadmahmoudiprogrammer@gmail.com>
Date: Sun, 23 Feb 2025 22:36:54 +0330
Subject: add more support for types

---
 src/main.c          |  2 +-
 src/runner/runner.c | 25 +++++++++++++++++++++++++
 src/utils/string.c  |  8 ++++----
 3 files changed, 30 insertions(+), 5 deletions(-)

(limited to 'src')

diff --git a/src/main.c b/src/main.c
index 71f6384..3513ff3 100644
--- a/src/main.c
+++ b/src/main.c
@@ -61,7 +61,7 @@ int main(int argc, char *argv[]) {
     return 1;
   }
 
-  const int ret = run(argv[1], true);
+  const int ret = run(argv[1], false);
   fileDelete();
   return ret;
 }
diff --git a/src/runner/runner.c b/src/runner/runner.c
index 5362729..cb2dc8f 100644
--- a/src/runner/runner.c
+++ b/src/runner/runner.c
@@ -364,6 +364,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) {
       doLeftOperationFloat(operand, +, AstTreeFloat, f16);
     } else {
       printError(expr->str_begin, expr->str_end, "Not supported");
+      UNREACHABLE;
     }
     return operand;
   }
@@ -395,6 +396,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) {
       doLeftOperationFloat(operand, -, AstTreeFloat, f16);
     } else {
       printError(expr->str_begin, expr->str_end, "Not supported");
+      UNREACHABLE;
     }
     return operand;
   }
@@ -440,6 +442,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) {
       doOperationFloat(left, right, +, AstTreeFloat, f16);
     } else {
       printError(expr->str_begin, expr->str_end, "Not supported");
+      UNREACHABLE;
     }
     astTreeDelete(right);
     return left;
@@ -486,6 +489,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) {
       doOperationFloat(left, right, -, AstTreeFloat, f16);
     } else {
       printError(expr->str_begin, expr->str_end, "Not supported");
+      UNREACHABLE;
     }
     astTreeDelete(right);
     return left;
@@ -532,6 +536,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) {
       doOperationFloat(left, right, *, AstTreeFloat, f16);
     } else {
       printError(expr->str_begin, expr->str_end, "Not supported");
+      UNREACHABLE;
     }
     astTreeDelete(right);
     return left;
@@ -578,6 +583,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) {
       doOperationFloat(left, right, /, AstTreeFloat, f16);
     } else {
       printError(expr->str_begin, expr->str_end, "Not supported");
+      UNREACHABLE;
     }
     astTreeDelete(right);
     return left;
@@ -612,6 +618,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) {
       doOperation(left, right, %, AstTreeInt, i8);
     } else {
       printError(expr->str_begin, expr->str_end, "Not supported");
+      UNREACHABLE;
     }
     astTreeDelete(right);
     return left;
@@ -656,8 +663,15 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) {
     } else if (left->type == &AST_TREE_F16_TYPE &&
                right->type == &AST_TREE_F16_TYPE) {
       doOperationFloat(left, right, ==, AstTreeFloat, f16);
+    } else if (left->type == &AST_TREE_TYPE_TYPE) {
+      bool res = typeIsEqual(left, right);
+      astTreeDelete(left);
+      left = newAstTree(AST_TREE_TOKEN_VALUE_BOOL, (void *)(AstTreeBool)res,
+                        &AST_TREE_BOOL_TYPE, NULL, NULL);
+      left->token = AST_TREE_TOKEN_VALUE_BOOL;
     } else {
       printError(expr->str_begin, expr->str_end, "Not supported");
+      UNREACHABLE;
     }
     astTreeDelete(right);
     return left;
@@ -702,8 +716,15 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) {
     } else if (left->type == &AST_TREE_F16_TYPE &&
                right->type == &AST_TREE_F16_TYPE) {
       doOperationFloat(left, right, !=, AstTreeFloat, f16);
+    } else if (left->type == &AST_TREE_TYPE_TYPE) {
+      bool res = !typeIsEqual(left, right);
+      astTreeDelete(left);
+      left = newAstTree(AST_TREE_TOKEN_VALUE_BOOL, (void *)(AstTreeBool)res,
+                        &AST_TREE_BOOL_TYPE, NULL, NULL);
+      left->token = AST_TREE_TOKEN_VALUE_BOOL;
     } else {
       printError(expr->str_begin, expr->str_end, "Not supported");
+      UNREACHABLE;
     }
     astTreeDelete(right);
     return left;
@@ -750,6 +771,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) {
       doOperationFloat(left, right, >, AstTreeFloat, f16);
     } else {
       printError(expr->str_begin, expr->str_end, "Not supported");
+      UNREACHABLE;
     }
     astTreeDelete(right);
     return left;
@@ -796,6 +818,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) {
       doOperationFloat(left, right, <, AstTreeFloat, f16);
     } else {
       printError(expr->str_begin, expr->str_end, "Not supported");
+      UNREACHABLE;
     }
     astTreeDelete(right);
     return left;
@@ -842,6 +865,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) {
       doOperationFloat(left, right, >=, AstTreeFloat, f16);
     } else {
       printError(expr->str_begin, expr->str_end, "Not supported");
+      UNREACHABLE;
     }
     astTreeDelete(right);
     return left;
@@ -888,6 +912,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) {
       doOperationFloat(left, right, <=, AstTreeFloat, f16);
     } else {
       printError(expr->str_begin, expr->str_end, "Not supported");
+      UNREACHABLE;
     }
     astTreeDelete(right);
     return left;
diff --git a/src/utils/string.c b/src/utils/string.c
index 17e27cd..16e9f9b 100644
--- a/src/utils/string.c
+++ b/src/utils/string.c
@@ -47,12 +47,12 @@ f128 numberToFloat(char *str_begin, char *str_end, bool *success) {
       c = *str_begin++;
     }
     if (c >= '0' && c <= '9') {
-      if (!isPastPoint) {
-        left *= 10;
-        left += c - '0';
-      } else {
+      if (isPastPoint) {
         right += c - '0';
         right /= 10;
+      } else {
+        left *= 10;
+        left += c - '0';
       }
     } else if (c == '.' && !isPastPoint) {
       isPastPoint = true;
-- 
cgit v1.2.3