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
11 tree*
newtree(void)12 newtree(void)
13 {
14 tree *t = new(tree);
15 t->iskw = 0;
16 t->str = 0;
17 t->child[0] = t->child[1] = t->child[2] = 0;
18 t->next = treenodes;
19 treenodes = t;
20 return t;
21 }
22
23 void
freenodes(void)24 freenodes(void)
25 {
26 tree *t, *u;
27 for(t = treenodes;t;t = u){
28 u = t->next;
29 if(t->str)
30 efree(t->str);
31 efree((char *)t);
32 }
33 treenodes = 0;
34 }
35
36 tree*
tree1(int type,tree * c0)37 tree1(int type, tree *c0)
38 {
39 return tree3(type, c0, (tree *)0, (tree *)0);
40 }
41
42 tree*
tree2(int type,tree * c0,tree * c1)43 tree2(int type, tree *c0, tree *c1)
44 {
45 return tree3(type, c0, c1, (tree *)0);
46 }
47
48 tree*
tree3(int type,tree * c0,tree * c1,tree * c2)49 tree3(int type, tree *c0, tree *c1, tree *c2)
50 {
51 tree *t;
52 if(type==';'){
53 if(c0==0)
54 return c1;
55 if(c1==0)
56 return c0;
57 }
58 t = newtree();
59 t->type = type;
60 t->child[0] = c0;
61 t->child[1] = c1;
62 t->child[2] = c2;
63 return t;
64 }
65
66 tree*
mung1(tree * t,tree * c0)67 mung1(tree *t, tree *c0)
68 {
69 t->child[0] = c0;
70 return t;
71 }
72
73 tree*
mung2(tree * t,tree * c0,tree * c1)74 mung2(tree *t, tree *c0, tree *c1)
75 {
76 t->child[0] = c0;
77 t->child[1] = c1;
78 return t;
79 }
80
81 tree*
mung3(tree * t,tree * c0,tree * c1,tree * c2)82 mung3(tree *t, tree *c0, tree *c1, tree *c2)
83 {
84 t->child[0] = c0;
85 t->child[1] = c1;
86 t->child[2] = c2;
87 return t;
88 }
89
90 tree*
epimung(tree * comp,tree * epi)91 epimung(tree *comp, tree *epi)
92 {
93 tree *p;
94 if(epi==0)
95 return comp;
96 for(p = epi;p->child[1];p = p->child[1]);
97 p->child[1] = comp;
98 return epi;
99 }
100 /*
101 * Add a SIMPLE node at the root of t and percolate all the redirections
102 * up to the root.
103 */
104
105 tree*
simplemung(tree * t)106 simplemung(tree *t)
107 {
108 tree *u;
109 struct io *s;
110 t = tree1(SIMPLE, t);
111 s = openstr();
112 pfmt(s, "%t", t);
113 t->str = strdup(s->strp);
114 closeio(s);
115 for(u = t->child[0];u->type==ARGLIST;u = u->child[0]){
116 if(u->child[1]->type==DUP
117 || u->child[1]->type==REDIR){
118 u->child[1]->child[1] = t;
119 t = u->child[1];
120 u->child[1] = 0;
121 }
122 }
123 return t;
124 }
125
126 tree*
token(char * str,int type)127 token(char *str, int type)
128 {
129 tree *t = newtree();
130 t->type = type;
131 t->str = strdup(str);
132 return t;
133 }
134
135 void
freetree(tree * p)136 freetree(tree *p)
137 {
138 if(p==0)
139 return;
140 freetree(p->child[0]);
141 freetree(p->child[1]);
142 freetree(p->child[2]);
143 if(p->str)
144 efree(p->str);
145 efree((char *)p);
146 }
147