From d1a19f0d477a6249d8af9322317b8434b86260ea Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Wed, 13 Oct 2021 08:27:37 -0700 Subject: fix(email): bytes error. updated vendoring --- sys/cmd/rc/tree.c | 214 +++++++++++++++++++++++++++--------------------------- 1 file changed, 108 insertions(+), 106 deletions(-) (limited to 'sys/cmd/rc/tree.c') 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); } -- cgit v1.2.1