aboutsummaryrefslogtreecommitdiff
path: root/src/doer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/doer.c')
-rw-r--r--src/doer.c53
1 files changed, 50 insertions, 3 deletions
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++) {