|
|
1.1 ! root 1: #include "rc.h" ! 2: #include "exec.h" ! 3: #include "io.h" ! 4: #include "fns.h" ! 5: tree *treenodes; ! 6: /* ! 7: * create and clear a new tree node, and add it ! 8: * to the node list. ! 9: */ ! 10: tree *newtree(void){ ! 11: tree *t=new(tree); ! 12: t->iskw=0; ! 13: t->str=0; ! 14: t->child[0]=t->child[1]=t->child[2]=0; ! 15: t->next=treenodes; ! 16: treenodes=t; ! 17: return t; ! 18: } ! 19: void freenodes(void){ ! 20: tree *t, *u; ! 21: for(t=treenodes;t;t=u){ ! 22: u=t->next; ! 23: if(t->str) efree(t->str); ! 24: efree((char *)t); ! 25: } ! 26: treenodes=0; ! 27: } ! 28: tree *tree1(int type, tree *c0) ! 29: { ! 30: return tree3(type, c0, (tree *)0, (tree *)0); ! 31: } ! 32: tree *tree2(int type, tree *c0, tree *c1) ! 33: { ! 34: return tree3(type, c0, c1, (tree *)0); ! 35: } ! 36: tree *tree3(int type, tree *c0, tree *c1, tree *c2) ! 37: { ! 38: tree *t; ! 39: if(type==';'){ ! 40: if(c0==0) return c1; ! 41: if(c1==0) return c0; ! 42: } ! 43: t=newtree(); ! 44: t->type=type; ! 45: t->child[0]=c0; ! 46: t->child[1]=c1; ! 47: t->child[2]=c2; ! 48: return t; ! 49: } ! 50: tree *mung1(tree *t, tree *c0) ! 51: { ! 52: t->child[0]=c0; ! 53: return t; ! 54: } ! 55: tree *mung2(tree *t, tree *c0, tree *c1) ! 56: { ! 57: t->child[0]=c0; ! 58: t->child[1]=c1; ! 59: return t; ! 60: } ! 61: tree *mung3(tree *t, tree *c0, tree *c1, tree *c2) ! 62: { ! 63: t->child[0]=c0; ! 64: t->child[1]=c1; ! 65: t->child[2]=c2; ! 66: return t; ! 67: } ! 68: tree *epimung(tree *comp, tree *epi) ! 69: { ! 70: tree *p; ! 71: if(epi==0) return comp; ! 72: for(p=epi;p->child[1];p=p->child[1]); ! 73: p->child[1]=comp; ! 74: return epi; ! 75: } ! 76: /* ! 77: * Add a SIMPLE node at the root of t and percolate all the redirections ! 78: * up to the root. ! 79: */ ! 80: tree *simplemung(tree *t) ! 81: { ! 82: tree *u; ! 83: struct io *s; ! 84: t=tree1(SIMPLE, t); ! 85: s=openstr(); ! 86: pfmt(s, "%t", t); ! 87: t->str=strdup(s->strp); ! 88: closeio(s); ! 89: for(u=t->child[0];u->type==ARGLIST;u=u->child[0]){ ! 90: if(u->child[1]->type==DUP ! 91: || u->child[1]->type==REDIR){ ! 92: u->child[1]->child[1]=t; ! 93: t=u->child[1]; ! 94: u->child[1]=0; ! 95: } ! 96: } ! 97: return t; ! 98: } ! 99: tree *token(char *str, int type) ! 100: { ! 101: tree *t=newtree(); ! 102: t->type=type; ! 103: t->str=strdup(str); ! 104: return t; ! 105: } ! 106: void freetree(tree *p) ! 107: { ! 108: if(p==0) return; ! 109: freetree(p->child[0]); ! 110: freetree(p->child[1]); ! 111: freetree(p->child[2]); ! 112: if(p->str) efree(p->str); ! 113: efree((char *)p); ! 114: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.