aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/builtins.c47
-rw-r--r--src/builtins.h6
-rw-r--r--src/parser.c29
3 files changed, 54 insertions, 28 deletions
diff --git a/src/builtins.c b/src/builtins.c
new file mode 100644
index 0000000..591caeb
--- /dev/null
+++ b/src/builtins.c
@@ -0,0 +1,47 @@
+#include "builtins.h"
+#include "ast.h"
+#include "utils.h"
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
+
+
+#define MAX_BUILTINS_COUNT 128
+static Node *all_builtins[MAX_BUILTINS_COUNT];
+static i64 builtins_count = 0;
+
+static void push_builtin(Node *node)
+{
+ assert(builtins_count < MAX_BUILTINS_COUNT);
+ all_builtins[builtins_count++] = node;
+}
+
+void initialize_builtins()
+{
+ Node *node;
+ // FIXME: The `TYPE_ANY` is a hack
+ node = Node_new(AST_BUILTIN);
+ node->func.name = "print";
+ node->func.return_type = type_new(TYPE_INT);
+ node->func.num_args = 1;
+ node->func.args = (Variable *)calloc(sizeof(Variable), 1);
+ node->func.args[0] = (Variable){"val", type_new(TYPE_ANY), 0};
+ push_builtin(node);
+
+ node = Node_new(AST_BUILTIN);
+ node->func.name = "putc";
+ node->func.return_type = type_new(TYPE_INT);
+ node->func.num_args = 1;
+ node->func.args = (Variable *)calloc(sizeof(Variable), 2);
+ node->func.args[0] = (Variable){"arg", type_new(TYPE_INT), 0};
+ push_builtin(node);
+}
+
+Node *find_builtin_function(Token *token)
+{
+ for (i64 i = 0; i < builtins_count; i++) {
+ if (strcmp(all_builtins[i]->func.name, token->value.as_string) == 0)
+ return all_builtins[i];
+ }
+ return NULL;
+} \ No newline at end of file
diff --git a/src/builtins.h b/src/builtins.h
new file mode 100644
index 0000000..38c1cb4
--- /dev/null
+++ b/src/builtins.h
@@ -0,0 +1,6 @@
+#pragma once
+
+#include "ast.h"
+
+void initialize_builtins();
+Node *find_builtin_function(Token *token); \ No newline at end of file
diff --git a/src/parser.c b/src/parser.c
index 13878d1..f412c79 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -1,5 +1,6 @@
#include "parser.h"
#include "utils.h"
+#include "builtins.h"
#include <stdlib.h>
#include <string.h>
#include <assert.h>
@@ -69,34 +70,6 @@ void dump_block_stack()
}
}
-Node *builtin_print;
-Node *builtin_putc;
-
-void initialize_builtins()
-{
- // FIXME: The `TYPE_ANY` is a hack
- builtin_print = Node_new(AST_BUILTIN);
- builtin_print->func.name = "print";
- builtin_print->func.return_type = type_new(TYPE_INT);
- builtin_print->func.num_args = 1;
- builtin_print->func.args = (Variable *)calloc(sizeof(Variable), 1);
- builtin_print->func.args[0] = (Variable){"val", type_new(TYPE_ANY), 0};
-
- builtin_putc = Node_new(AST_BUILTIN);
- builtin_putc->func.name = "putc";
- builtin_putc->func.return_type = type_new(TYPE_INT);
- builtin_putc->func.num_args = 1;
- builtin_putc->func.args = (Variable *)calloc(sizeof(Variable), 2);
- builtin_putc->func.args[0] = (Variable){"arg", type_new(TYPE_ANY), 0};
-}
-
-Node *find_builtin_function(Token *token)
-{
- if (strcmp(token->value.as_string, "putc") == 0) { return builtin_putc; }
- if (strcmp(token->value.as_string, "print") == 0) { return builtin_print; }
- return NULL;
-}
-
Variable *find_local_variable(Token *token)
{
if (current_function == NULL)