summaryrefslogtreecommitdiff
path: root/comp/lucas-standen-NEA/code/execution/builtin.c
diff options
context:
space:
mode:
authorthing1 <thing1@seacrossedlovers.xyz>2024-07-01 11:36:45 +0100
committerthing1 <thing1@seacrossedlovers.xyz>2024-07-01 11:36:45 +0100
commitd933ce70bd2c497e4af26483abafebfce436986e (patch)
treeb15f4f2c297734108ff0717334b912b87a0f995b /comp/lucas-standen-NEA/code/execution/builtin.c
parent42047fea26b14edc67b394db18ce7edb0c6399f8 (diff)
updated work
Diffstat (limited to 'comp/lucas-standen-NEA/code/execution/builtin.c')
-rw-r--r--comp/lucas-standen-NEA/code/execution/builtin.c45
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;
+ }
+}