diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /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-x | sys/src/cmd/rc/tree.c | 148 |
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); +} |