summaryrefslogtreecommitdiff
path: root/sys/src/cmd/rc/tree.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/rc/tree.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/rc/tree.c')
-rwxr-xr-xsys/src/cmd/rc/tree.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/sys/src/cmd/rc/tree.c b/sys/src/cmd/rc/tree.c
new file mode 100755
index 000000000..a2cd1af69
--- /dev/null
+++ b/sys/src/cmd/rc/tree.c
@@ -0,0 +1,148 @@
+#include "rc.h"
+#include "exec.h"
+#include "io.h"
+#include "fns.h"
+tree *treenodes;
+/*
+ * create and clear a new tree node, and add it
+ * to the node list.
+ */
+
+tree*
+newtree(void)
+{
+ tree *t = new(tree);
+ t->iskw = 0;
+ t->str = 0;
+ t->child[0] = t->child[1] = t->child[2] = 0;
+ t->next = treenodes;
+ treenodes = t;
+ return t;
+}
+
+void
+freenodes(void)
+{
+ tree *t, *u;
+ for(t = treenodes;t;t = u){
+ u = t->next;
+ if(t->str)
+ efree(t->str);
+ efree((char *)t);
+ }
+ treenodes = 0;
+}
+
+tree*
+tree1(int type, tree *c0)
+{
+ return tree3(type, c0, (tree *)0, (tree *)0);
+}
+
+tree*
+tree2(int type, tree *c0, tree *c1)
+{
+ return tree3(type, c0, c1, (tree *)0);
+}
+
+tree*
+tree3(int type, tree *c0, tree *c1, tree *c2)
+{
+ tree *t;
+ if(type==';'){
+ if(c0==0)
+ return c1;
+ if(c1==0)
+ return c0;
+ }
+ t = newtree();
+ t->type = type;
+ t->child[0] = c0;
+ t->child[1] = c1;
+ t->child[2] = c2;
+ return t;
+}
+
+tree*
+mung1(tree *t, tree *c0)
+{
+ t->child[0] = c0;
+ return t;
+}
+
+tree*
+mung2(tree *t, tree *c0, tree *c1)
+{
+ t->child[0] = c0;
+ t->child[1] = c1;
+ return t;
+}
+
+tree*
+mung3(tree *t, tree *c0, tree *c1, tree *c2)
+{
+ t->child[0] = c0;
+ t->child[1] = c1;
+ t->child[2] = c2;
+ return t;
+}
+
+tree*
+epimung(tree *comp, tree *epi)
+{
+ tree *p;
+ if(epi==0)
+ return comp;
+ for(p = epi;p->child[1];p = p->child[1]);
+ p->child[1] = comp;
+ return epi;
+}
+/*
+ * Add a SIMPLE node at the root of t and percolate all the redirections
+ * up to the root.
+ */
+
+tree*
+simplemung(tree *t)
+{
+ tree *u;
+ struct io *s;
+
+ t = tree1(SIMPLE, t);
+ s = openstr();
+ pfmt(s, "%t", t);
+ t->str = strdup((char *)s->strp);
+ closeio(s);
+ for(u = t->child[0];u->type==ARGLIST;u = u->child[0]){
+ if(u->child[1]->type==DUP
+ || u->child[1]->type==REDIR){
+ u->child[1]->child[1] = t;
+ t = u->child[1];
+ u->child[1] = 0;
+ }
+ }
+ return t;
+}
+
+tree*
+token(char *str, int type)
+{
+ tree *t = newtree();
+
+ t->type = type;
+ t->str = strdup(str);
+ return t;
+}
+
+void
+freetree(tree *p)
+{
+ if(p==0)
+ return;
+ freetree(p->child[0]);
+ freetree(p->child[1]);
+ freetree(p->child[2]);
+ if(p->str)
+ efree(p->str);
+ efree((char *)p);
+}