diff options
author | thing1 <thing1@seacrossedlovers.xyz> | 2024-07-01 11:36:45 +0100 |
---|---|---|
committer | thing1 <thing1@seacrossedlovers.xyz> | 2024-07-01 11:36:45 +0100 |
commit | d933ce70bd2c497e4af26483abafebfce436986e (patch) | |
tree | b15f4f2c297734108ff0717334b912b87a0f995b /comp/lucas-standen-NEA/code/execution/builtin.c | |
parent | 42047fea26b14edc67b394db18ce7edb0c6399f8 (diff) |
updated work
Diffstat (limited to 'comp/lucas-standen-NEA/code/execution/builtin.c')
-rw-r--r-- | comp/lucas-standen-NEA/code/execution/builtin.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/comp/lucas-standen-NEA/code/execution/builtin.c b/comp/lucas-standen-NEA/code/execution/builtin.c new file mode 100644 index 0000000..df3ca03 --- /dev/null +++ b/comp/lucas-standen-NEA/code/execution/builtin.c @@ -0,0 +1,45 @@ +#include <stdlib.h> +#include <stdio.h> +#include "../global/types.h" +#include "../global/util.h" + +#define MAXARGS 8 + +void *doCall(ast_node *node){ + builtInFuncs id = node->func->builtInFunc; + for (int i = 0; i < MAXARGS; i++){ + if (node->args[i] != NULL){ + node->literalArgs[i] = doCall(node->args[i]); + } + } + + char *str = CheckedMalloc(20); + switch (id){ + case ADD: + snprintf(str, 20, "%d", atoi(node->literalArgs[0]) + atoi(node->literalArgs[1])); + return str; + break; + case SUB: + snprintf(str, 20, "%d", atoi(node->literalArgs[0]) - atoi(node->literalArgs[1])); + return str; + break; + case DIV: + snprintf(str, 20, "%d", atoi(node->literalArgs[0]) / atoi(node->literalArgs[1])); + return str; + break; + case MUL: + snprintf(str, 20, "%d", atoi(node->literalArgs[0]) * atoi(node->literalArgs[1])); + return str; + break; + + case WRITE: + fputs(node->literalArgs[0], stdout); + break; + + case EXIT: + int returnValue = atoi(node->literalArgs[0]); + CheckedFreeALL(); + exit(returnValue); + break; + } +} |