From 9a7e88e33213135da7c8fa3607ca455d997f4a39 Mon Sep 17 00:00:00 2001 From: c Date: Mon, 4 Mar 2024 13:11:29 -0500 Subject: One can now load simple variables into memory. --- src/doer.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) (limited to 'src/doer.c') diff --git a/src/doer.c b/src/doer.c index f446011..11aaeac 100644 --- a/src/doer.c +++ b/src/doer.c @@ -1,6 +1,28 @@ #include "include/doer.h" #include "include/tree.h" -#include "include/util.h" +#include "include/util.h" + +target_t* target_init(char* name, tree_t* tree) { + target_t* target = emalloc(sizeof(target_t)); + target->name = name; + target->tree = tree; + target->nxt = NULL; + return target; +} + +void target_destroy(target_t* target) { + if (target) { + target_destroy(target->nxt); + free(target->name); + free(target); + } +} + +void target_print(target_t* target) { + if (!target) return; + LOG_DBGF("target: %s; points to tree: %p", target->name, target->tree); + target_print(target->nxt); +} /* Creates a new doer from a tree. */ doer_t* doer_init(tree_t* tree) { @@ -9,6 +31,8 @@ doer_t* doer_init(tree_t* tree) { doer = emalloc(sizeof(doer_t)); doer->tree = tree; + doer->targets = NULL; + doer->ltarget = doer->targets; return doer; } @@ -21,20 +45,27 @@ void doer_destroy(doer_t* doer) { free(doer); } -void doer_do_blin_print(doer_t* doer) { +void doer_add_target(doer_t* doer, target_t* target) { + // First target being added. + if (!doer->targets) doer->targets = doer->ltarget = target; + else doer->ltarget->nxt = target; +} + +void blin_print(doer_t* doer) { printf( "%s", doer->tree->data.call.arg->data.carg.val->data.lstr.val ); } -void doer_do_blin_printl(doer_t* doer) { +void blin_printl(doer_t* doer) { printf( "%s\n", doer->tree->data.call.arg->data.carg.val->data.lstr.val ); } + void doer_do_block(doer_t* doer) { if (!doer->tree) return; @@ -52,11 +83,27 @@ void doer_do_expr(doer_t* doer) { /* Assume only call is `print` for now. */ doer_do_call(doer); break; + case TREE_TYPE_DEF: + doer_do_def(doer); + break; default: LOG_WARF("unknown tree type: %d", doer->tree->type); } } +void doer_do_def(doer_t* doer) { + target_t* target = target_init( + doer->tree-> // HACK: Grab the 2nd tag's value (w/o checking if + // it's actually thereā€¦). + data.def.tag-> + data.tag.nxt-> + data.tag.val, + doer->tree + ); + + doer_add_target(doer, target); +} + void doer_do_call(doer_t* doer) { /* Search through built-in functions first. */ for (int i = 0; i < sizeof(blinfs) / sizeof(blinf_t); i++) { -- cgit v1.2.3