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 } 115