1 f08fdedc 2003-11-23 devnull #include "rc.h"
2 f08fdedc 2003-11-23 devnull #include "exec.h"
3 f08fdedc 2003-11-23 devnull #include "io.h"
4 f08fdedc 2003-11-23 devnull #include "fns.h"
5 f08fdedc 2003-11-23 devnull tree *treenodes;
7 f08fdedc 2003-11-23 devnull * create and clear a new tree node, and add it
8 f08fdedc 2003-11-23 devnull * to the node list.
10 f08fdedc 2003-11-23 devnull tree *newtree(void){
11 f08fdedc 2003-11-23 devnull tree *t=new(tree);
12 f08fdedc 2003-11-23 devnull t->iskw=0;
13 f08fdedc 2003-11-23 devnull t->str=0;
14 f08fdedc 2003-11-23 devnull t->child[0]=t->child[1]=t->child[2]=0;
15 f08fdedc 2003-11-23 devnull t->next=treenodes;
16 f08fdedc 2003-11-23 devnull treenodes=t;
17 f08fdedc 2003-11-23 devnull return t;
19 f08fdedc 2003-11-23 devnull void freenodes(void){
20 f08fdedc 2003-11-23 devnull tree *t, *u;
21 f08fdedc 2003-11-23 devnull for(t=treenodes;t;t=u){
22 f08fdedc 2003-11-23 devnull u=t->next;
23 f08fdedc 2003-11-23 devnull if(t->str) efree(t->str);
24 f08fdedc 2003-11-23 devnull efree((char *)t);
26 f08fdedc 2003-11-23 devnull treenodes=0;
28 f08fdedc 2003-11-23 devnull tree *tree1(int type, tree *c0)
30 f08fdedc 2003-11-23 devnull return tree3(type, c0, (tree *)0, (tree *)0);
32 f08fdedc 2003-11-23 devnull tree *tree2(int type, tree *c0, tree *c1)
34 f08fdedc 2003-11-23 devnull return tree3(type, c0, c1, (tree *)0);
36 f08fdedc 2003-11-23 devnull tree *tree3(int type, tree *c0, tree *c1, tree *c2)
39 f08fdedc 2003-11-23 devnull if(type==';'){
40 f08fdedc 2003-11-23 devnull if(c0==0) return c1;
41 f08fdedc 2003-11-23 devnull if(c1==0) return c0;
43 f08fdedc 2003-11-23 devnull t=newtree();
44 f08fdedc 2003-11-23 devnull t->type=type;
45 f08fdedc 2003-11-23 devnull t->child[0]=c0;
46 f08fdedc 2003-11-23 devnull t->child[1]=c1;
47 f08fdedc 2003-11-23 devnull t->child[2]=c2;
48 f08fdedc 2003-11-23 devnull return t;
50 f08fdedc 2003-11-23 devnull tree *mung1(tree *t, tree *c0)
52 f08fdedc 2003-11-23 devnull t->child[0]=c0;
53 f08fdedc 2003-11-23 devnull return t;
55 f08fdedc 2003-11-23 devnull tree *mung2(tree *t, tree *c0, tree *c1)
57 f08fdedc 2003-11-23 devnull t->child[0]=c0;
58 f08fdedc 2003-11-23 devnull t->child[1]=c1;
59 f08fdedc 2003-11-23 devnull return t;
61 f08fdedc 2003-11-23 devnull tree *mung3(tree *t, tree *c0, tree *c1, tree *c2)
63 f08fdedc 2003-11-23 devnull t->child[0]=c0;
64 f08fdedc 2003-11-23 devnull t->child[1]=c1;
65 f08fdedc 2003-11-23 devnull t->child[2]=c2;
66 f08fdedc 2003-11-23 devnull return t;
68 f08fdedc 2003-11-23 devnull tree *epimung(tree *comp, tree *epi)
71 f08fdedc 2003-11-23 devnull if(epi==0) return comp;
72 f08fdedc 2003-11-23 devnull for(p=epi;p->child[1];p=p->child[1]);
73 f08fdedc 2003-11-23 devnull p->child[1]=comp;
74 f08fdedc 2003-11-23 devnull return epi;
77 f08fdedc 2003-11-23 devnull * Add a SIMPLE node at the root of t and percolate all the redirections
78 f08fdedc 2003-11-23 devnull * up to the root.
80 f08fdedc 2003-11-23 devnull tree *simplemung(tree *t)
83 f08fdedc 2003-11-23 devnull struct io *s;
84 f08fdedc 2003-11-23 devnull t=tree1(SIMPLE, t);
85 f08fdedc 2003-11-23 devnull s=openstr();
86 f08fdedc 2003-11-23 devnull pfmt(s, "%t", t);
87 f08fdedc 2003-11-23 devnull t->str=strdup(s->strp);
88 f08fdedc 2003-11-23 devnull closeio(s);
89 f08fdedc 2003-11-23 devnull for(u=t->child[0];u->type==ARGLIST;u=u->child[0]){
90 f08fdedc 2003-11-23 devnull if(u->child[1]->type==DUP
91 f08fdedc 2003-11-23 devnull || u->child[1]->type==REDIR){
92 f08fdedc 2003-11-23 devnull u->child[1]->child[1]=t;
93 f08fdedc 2003-11-23 devnull t=u->child[1];
94 f08fdedc 2003-11-23 devnull u->child[1]=0;
97 f08fdedc 2003-11-23 devnull return t;
99 f08fdedc 2003-11-23 devnull tree *token(char *str, int type)
101 f08fdedc 2003-11-23 devnull tree *t=newtree();
102 f08fdedc 2003-11-23 devnull t->type=type;
103 f08fdedc 2003-11-23 devnull t->str=strdup(str);
104 f08fdedc 2003-11-23 devnull return t;
106 f08fdedc 2003-11-23 devnull void freetree(tree *p)
108 f08fdedc 2003-11-23 devnull if(p==0) return;
109 f08fdedc 2003-11-23 devnull freetree(p->child[0]);
110 f08fdedc 2003-11-23 devnull freetree(p->child[1]);
111 f08fdedc 2003-11-23 devnull freetree(p->child[2]);
112 f08fdedc 2003-11-23 devnull if(p->str) efree(p->str);
113 f08fdedc 2003-11-23 devnull efree((char *)p);