From 96c63e2fc4d70f20c8e2bac79e3547dfd6a5fcb8 Mon Sep 17 00:00:00 2001 From: c Date: Sat, 2 Mar 2024 11:00:37 -0500 Subject: Doer is. --- src/doer.c | 70 ++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 36 insertions(+), 34 deletions(-) (limited to 'src/doer.c') 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) { - -} - -- cgit v1.2.3