summaryrefslogtreecommitdiff
path: root/src/runner
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-10 00:17:29 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-10 00:17:29 +0330
commit302cc65d3e59937742c18475d63e22c482176fa7 (patch)
tree69fdaf179bc71eb39643ca3b709f18bd57866df7 /src/runner
parent07cca00060de91569074f61172c9406f01eaefe7 (diff)
add - * / %
Diffstat (limited to 'src/runner')
-rw-r--r--src/runner/runner.c48
1 files changed, 41 insertions, 7 deletions
diff --git a/src/runner/runner.c b/src/runner/runner.c
index 2378387..9c3e7e2 100644
--- a/src/runner/runner.c
+++ b/src/runner/runner.c
@@ -41,8 +41,8 @@ void runnerVariableSetValue(RunnerVariablePages *pages,
}
for (size_t i = 0; i < pages->size; ++i) {
RunnerVariables *variables = pages->data[i];
- for (size_t i = 0; i < variables->size; ++i) {
- RunnerVariable *var = variables->data[i];
+ for (size_t j = 0; j < variables->size; ++j) {
+ RunnerVariable *var = variables->data[j];
if (var->variable == variable) {
if (var->value != NULL) {
astTreeDelete(var->value);
@@ -63,8 +63,8 @@ AstTree *runnerVariableGetValue(RunnerVariablePages *pages,
}
for (size_t i = 0; i < pages->size; ++i) {
RunnerVariables *variables = pages->data[i];
- for (size_t i = 0; i < variables->size; ++i) {
- RunnerVariable *var = variables->data[i];
+ for (size_t j = 0; j < variables->size; ++j) {
+ RunnerVariable *var = variables->data[j];
if (var->variable == variable) {
if (var->value != NULL) {
return var->value;
@@ -205,6 +205,10 @@ AstTree *runAstTreeFunction(AstTree *tree, AstTree **arguments,
}
continue;
case AST_TREE_TOKEN_OPERATOR_SUM:
+ case AST_TREE_TOKEN_OPERATOR_SUB:
+ case AST_TREE_TOKEN_OPERATOR_MULTIPLY:
+ case AST_TREE_TOKEN_OPERATOR_DIVIDE:
+ case AST_TREE_TOKEN_OPERATOR_MODULO:
case AST_TREE_TOKEN_FUNCTION:
case AST_TREE_TOKEN_TYPE_TYPE:
case AST_TREE_TOKEN_TYPE_FUNCTION:
@@ -249,7 +253,11 @@ AstTree *calcAstTreeValue(AstTree *tree, RunnerVariablePages *pages) {
UNREACHABLE;
}
}
- case AST_TREE_TOKEN_OPERATOR_SUM: {
+ case AST_TREE_TOKEN_OPERATOR_SUM:
+ case AST_TREE_TOKEN_OPERATOR_SUB:
+ case AST_TREE_TOKEN_OPERATOR_MULTIPLY:
+ case AST_TREE_TOKEN_OPERATOR_DIVIDE:
+ case AST_TREE_TOKEN_OPERATOR_MODULO: {
AstTreeInfix *metadata = tree->metadata;
AstTree *left = calcAstTreeValue(&metadata->left, pages);
AstTree *right = calcAstTreeValue(&metadata->right, pages);
@@ -257,8 +265,30 @@ AstTree *calcAstTreeValue(AstTree *tree, RunnerVariablePages *pages) {
if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) {
if (left->token == AST_TREE_TOKEN_VALUE_U64 &&
right->token == AST_TREE_TOKEN_VALUE_U64) {
- left->metadata =
- (void *)((AstTreeU64)left->metadata + (AstTreeU64)right->metadata);
+ switch (tree->token) {
+ case AST_TREE_TOKEN_OPERATOR_SUM:
+ left->metadata = (void *)((AstTreeU64)left->metadata +
+ (AstTreeU64)right->metadata);
+ break;
+ case AST_TREE_TOKEN_OPERATOR_SUB:
+ left->metadata = (void *)((AstTreeU64)left->metadata -
+ (AstTreeU64)right->metadata);
+ break;
+ case AST_TREE_TOKEN_OPERATOR_MULTIPLY:
+ left->metadata = (void *)((AstTreeU64)left->metadata *
+ (AstTreeU64)right->metadata);
+ break;
+ case AST_TREE_TOKEN_OPERATOR_DIVIDE:
+ left->metadata = (void *)((AstTreeU64)left->metadata /
+ (AstTreeU64)right->metadata);
+ break;
+ case AST_TREE_TOKEN_OPERATOR_MODULO:
+ left->metadata = (void *)((AstTreeU64)left->metadata %
+ (AstTreeU64)right->metadata);
+ break;
+ default:
+ UNREACHABLE;
+ }
astTreeDelete(right);
return left;
} else {
@@ -301,6 +331,10 @@ AstTree *deepCopyAstTree(AstTree *tree) {
case AST_TREE_TOKEN_VARIABLE_DEFINE:
case AST_TREE_TOKEN_OPERATOR_ASSIGN:
case AST_TREE_TOKEN_OPERATOR_SUM:
+ case AST_TREE_TOKEN_OPERATOR_SUB:
+ case AST_TREE_TOKEN_OPERATOR_MULTIPLY:
+ case AST_TREE_TOKEN_OPERATOR_DIVIDE:
+ case AST_TREE_TOKEN_OPERATOR_MODULO:
case AST_TREE_TOKEN_NONE:
}
UNREACHABLE;