aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/rc/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/rc/tree.c')
-rw-r--r--src/cmd/rc/tree.c111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/cmd/rc/tree.c b/src/cmd/rc/tree.c
new file mode 100644
index 0000000..2c65041
--- /dev/null
+++ b/src/cmd/rc/tree.c
@@ -0,0 +1,111 @@
+#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->type == Tword && 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*
+hangchild2(Tree *node, Tree *c1, int i1, Tree *c2, int i2)
+{
+ node->child[i1] = c1;
+ node->child[i2] = c2;
+
+ return node;
+}
+
+Tree*
+hangchild3(Tree *node, Tree *c0, Tree *c1, Tree *c2)
+{
+ node->child[0] = c0;
+ node->child[1] = c1;
+ node->child[2] = c2;
+
+ return node;
+}
+
+Tree*
+hangepilog(Tree *cmd, Tree *epi)
+{
+ Tree *p;
+ if(!epi)
+ return cmd;
+ for(p = epi; p->child[1]; p = p->child[1])
+ ;
+
+ p->child[1] = cmd;
+ return epi;
+}
+
+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);
+}
+*/