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