aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/rc/tree.c
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2021-10-15 16:18:02 -0700
committerNicholas Noll <nbnoll@eml.cc>2021-10-15 16:18:02 -0700
commitbf03074e346b004659196b6c17eee04dbffd3ac2 (patch)
tree7200db30f1ef7e3661091552932eb304bd4ce9c6 /sys/cmd/rc/tree.c
parent566d54fe549286895fdef8aa9f385686405dd290 (diff)
feat(rc): working prototype of input->compile->print loop
Diffstat (limited to 'sys/cmd/rc/tree.c')
-rw-r--r--sys/cmd/rc/tree.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/sys/cmd/rc/tree.c b/sys/cmd/rc/tree.c
new file mode 100644
index 0000000..0e2146f
--- /dev/null
+++ b/sys/cmd/rc/tree.c
@@ -0,0 +1,79 @@
+#include "rc.h"
+#include "parse.h"
+
+static Tree *nodes;
+
+Tree*
+maketree(void)
+{
+ Tree *node = emalloc(sizeof(*node));
+
+ node->link = nodes;
+ nodes = node;
+ return node;
+}
+
+void
+freeparsetree(void)
+{
+ Tree *t, *nt;
+ for(t = nodes; t; t = nt) {
+ nt = t->link;
+ if(t->str)
+ efree(t->str);
+ efree(t);
+ }
+ nodes = nil;
+}
+
+Tree*
+maketree1(int type, Tree *c0)
+{
+ return maketree2(type, c0, nil);
+}
+
+Tree*
+maketree2(int type, Tree *c0, Tree *c1)
+{
+ return maketree3(type, c0, c1, nil);
+}
+
+Tree*
+maketree3(int type, Tree *c0, Tree *c1, Tree *c2)
+{
+ Tree *node = maketree();
+
+ node->type = type;
+ node->child[0] = c0;
+ node->child[1] = c1;
+ node->child[2] = c2;
+
+ return node;
+}
+
+Tree*
+hangchild1(Tree *node, Tree *c, int i)
+{
+ node->child[i] = c;
+
+ return node;
+}
+
+Tree*
+token(int type, char *s)
+{
+ Tree *node = maketree();
+
+ node->type = type;
+ node->str = strdup(s);
+
+ return node;
+}
+
+/*
+Tree*
+basic(Tree *node)
+{
+ return maketree1(Tbasic, node);
+}
+*/