aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/rc/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cmd/rc/tree.c')
-rw-r--r--sys/cmd/rc/tree.c214
1 files changed, 108 insertions, 106 deletions
diff --git a/sys/cmd/rc/tree.c b/sys/cmd/rc/tree.c
index 14049e5..897597e 100644
--- a/sys/cmd/rc/tree.c
+++ b/sys/cmd/rc/tree.c
@@ -1,144 +1,146 @@
#include "rc.h"
-
-// -----------------------------------------------------------------------
-// globals
-
-static Tree *nodes;
-
-// -----------------------------------------------------------------------
-// exported funcs
-
-Tree*
+#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;
-
- alloc(t);
- t->str = nil;
- t->child[0] = t->child[1] = t->child[2] = nil;
- t->redir.fd[0] = t->redir.fd[1] = t->redir.type = 0;
-
- t->link = nodes, nodes = t;
- return t;
+ 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
-freetree(Tree *t)
+freenodes(void)
{
- if (!t)
- return;
-
- freetree(t->child[0]);
- freetree(t->child[1]);
- freetree(t->child[2]);
-
- if (t->str)
- efree(t->str);
- efree(t);
+ tree *t, *u;
+ for(t = treenodes;t;t = u){
+ u = t->next;
+ if(t->str)
+ efree(t->str);
+ efree((char *)t);
+ }
+ treenodes = 0;
}
-void
-freenodes(void)
+tree*
+tree1(int type, tree *c0)
{
- Tree *t, *u;
-
- for (t = nodes;t;t = u) {
- u = t->link;
- if (t->str)
- efree(t->str);
- efree(t);
- }
- nodes = nil;
+ return tree3(type, c0, (tree *)0, (tree *)0);
}
-/* tree creation */
-Tree*
-tree3(int type, Tree *c0, Tree *c1, Tree *c2)
+tree*
+tree2(int type, tree *c0, tree *c1)
{
- Tree *t;
-
- t = newtree();
- t->type = type;
- t->child[0] = c0;
- t->child[1] = c1;
- t->child[2] = c2;
-
- return t;
+ return tree3(type, c0, c1, (tree *)0);
}
-Tree*
-tree2(int type, Tree *c0, Tree *c1)
+tree*
+tree3(int type, tree *c0, tree *c1, tree *c2)
{
- return tree3(type, c0, c1, nil);
+ 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*
-tree1(int type, Tree *c0)
+tree*
+mung1(tree *t, tree *c0)
{
- return tree3(type, c0, nil, nil);
+ t->child[0] = c0;
+ return t;
}
-/* tree hang */
-Tree*
-hang1(Tree *p, Tree *c0)
+tree*
+mung2(tree *t, tree *c0, tree *c1)
{
- p->child[0] = c0;
- return p;
+ t->child[0] = c0;
+ t->child[1] = c1;
+ return t;
}
-Tree*
-hang2(Tree *p, Tree *c0, Tree *c1)
+tree*
+mung3(tree *t, tree *c0, tree *c1, tree *c2)
{
- p->child[0] = c0;
- p->child[1] = c1;
- return p;
+ t->child[0] = c0;
+ t->child[1] = c1;
+ t->child[2] = c2;
+ return t;
}
-Tree*
-hang3(Tree *p, Tree *c0, Tree *c1, Tree *c2)
+tree*
+epimung(tree *comp, tree *epi)
{
- p->child[0] = c0;
- p->child[1] = c1;
- p->child[2] = c2;
- return p;
+ 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.
+ */
-/* hangs the cmd underneath the epilogue */
-Tree*
-epihang(Tree *c, Tree *epi)
+tree*
+simplemung(tree *t)
{
- Tree *p;
- if(!epi)
- return c;
- for(p=epi;p->child[1];p = p->child[1])
- ;
- p->child[1] = c;
- return epi;
+ tree *u;
+ struct io *s;
+ t = tree1(SIMPLE, t);
+ s = openstr();
+ pfmt(s, "%t", t);
+ t->str = strdup(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;
}
-/* hangs tree t from a new simple node. percolates redirections to root */
-Tree*
-simplehang(Tree *t)
+tree*
+token(char *str, int type)
{
- Tree *u;
- t = tree1(Tsimple, t);
- for(u = t->child[0];u->type==Targs;u=u->child[0]) {
- if (u->child[1]->type==Tdup
- || u->child[1]->type==Tredir){
- u->child[1]->child[1] = t;
- t = u->child[1];
- u->child[1] = nil;
- }
- }
- return t;
+ tree *t = newtree();
+ t->type = type;
+ t->str = strdup(str);
+ return t;
}
-Tree*
-wordnode(char *w)
+void
+freetree(tree *p)
{
- Tree *t = newtree();
- t->type = Tword;
- t->str = strdup(w);
-
- return t;
+ 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);
}