Blame


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