aboutsummaryrefslogtreecommitdiff
path: root/src/doer.c
diff options
context:
space:
mode:
authorc2024-03-02 11:00:37 -0500
committerc2024-03-02 11:00:37 -0500
commit96c63e2fc4d70f20c8e2bac79e3547dfd6a5fcb8 (patch)
tree4b00617617355193486ff506cb2c012e8b33cbfa /src/doer.c
parente29c41a84b299c95a49dfa429f4161eb71cf6837 (diff)
Doer is.
Diffstat (limited to 'src/doer.c')
-rw-r--r--src/doer.c70
1 files changed, 36 insertions, 34 deletions
diff --git a/src/doer.c b/src/doer.c
index 21a1045..f446011 100644
--- a/src/doer.c
+++ b/src/doer.c
@@ -1,5 +1,6 @@
#include "include/doer.h"
-
+#include "include/tree.h"
+#include "include/util.h"
/* Creates a new doer from a tree. */
doer_t* doer_init(tree_t* tree) {
@@ -20,47 +21,48 @@ void doer_destroy(doer_t* doer) {
free(doer);
}
-
-void doer_do_blin_print(char* s) {
-
+void doer_do_blin_print(doer_t* doer) {
+ printf(
+ "%s",
+ doer->tree->data.call.arg->data.carg.val->data.lstr.val
+ );
}
-void doer_do_block(tree_t* tree) {
- tree->data.block.val
+void doer_do_blin_printl(doer_t* doer) {
+ printf(
+ "%s\n",
+ doer->tree->data.call.arg->data.carg.val->data.lstr.val
+ );
}
-void doer_do_expr(tree_t* tree) {
- /* For now, assume the only expression that exists is a call to print(). */
-
+void doer_do_block(doer_t* doer) {
+ if (!doer->tree) return;
+ tree_t* tree_root = doer->tree;
+ doer->tree = doer->tree->data.block.val;
+ doer_do_expr(doer);
+ doer->tree = tree_root->data.block.nxt;
+ doer_do_block(doer);
}
-void doer_do_lint(tree_t* tree) {
-
-}
-
-void doer_do_lstr(tree_t* tree) {
-
-}
-
-void doer_do_tag(tree_t* tree) {
-
-}
-
-void doer_do_darg(tree_t* tree) {
-
+void doer_do_expr(doer_t* doer) {
+ switch (doer->tree->type) {
+ case TREE_TYPE_CALL:
+ /* Assume only call is `print` for now. */
+ doer_do_call(doer);
+ break;
+ default:
+ LOG_WARF("unknown tree type: %d", doer->tree->type);
+ }
}
-void doer_do_carg(tree_t* tree) {
-
+void doer_do_call(doer_t* doer) {
+ /* Search through built-in functions first. */
+ for (int i = 0; i < sizeof(blinfs) / sizeof(blinf_t); i++) {
+ if (!strcmp(blinfs[i].name, doer->tree->data.call.target)) {
+ (blinfs[i].fp)(doer);
+ break;
+ }
+ }
}
-
-void doer_do_def(tree_t* tree) {
-
-}
-
-void doer_do_call(tree_t* tree) {
-
-}
-