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 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;
18 f08fdedc 2003-11-23 devnull }
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);
25 f08fdedc 2003-11-23 devnull }
26 f08fdedc 2003-11-23 devnull treenodes=0;
27 f08fdedc 2003-11-23 devnull }
28 f08fdedc 2003-11-23 devnull tree *tree1(int type, tree *c0)
29 f08fdedc 2003-11-23 devnull {
30 f08fdedc 2003-11-23 devnull return tree3(type, c0, (tree *)0, (tree *)0);
31 f08fdedc 2003-11-23 devnull }
32 f08fdedc 2003-11-23 devnull tree *tree2(int type, tree *c0, tree *c1)
33 f08fdedc 2003-11-23 devnull {
34 f08fdedc 2003-11-23 devnull return tree3(type, c0, c1, (tree *)0);
35 f08fdedc 2003-11-23 devnull }
36 f08fdedc 2003-11-23 devnull tree *tree3(int type, tree *c0, tree *c1, tree *c2)
37 f08fdedc 2003-11-23 devnull {
38 f08fdedc 2003-11-23 devnull tree *t;
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;
42 f08fdedc 2003-11-23 devnull }
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;
49 f08fdedc 2003-11-23 devnull }
50 f08fdedc 2003-11-23 devnull tree *mung1(tree *t, tree *c0)
51 f08fdedc 2003-11-23 devnull {
52 f08fdedc 2003-11-23 devnull t->child[0]=c0;
53 f08fdedc 2003-11-23 devnull return t;
54 f08fdedc 2003-11-23 devnull }
55 f08fdedc 2003-11-23 devnull tree *mung2(tree *t, tree *c0, tree *c1)
56 f08fdedc 2003-11-23 devnull {
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;
60 f08fdedc 2003-11-23 devnull }
61 f08fdedc 2003-11-23 devnull tree *mung3(tree *t, tree *c0, tree *c1, tree *c2)
62 f08fdedc 2003-11-23 devnull {
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;
67 f08fdedc 2003-11-23 devnull }
68 f08fdedc 2003-11-23 devnull tree *epimung(tree *comp, tree *epi)
69 f08fdedc 2003-11-23 devnull {
70 f08fdedc 2003-11-23 devnull tree *p;
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;
75 f08fdedc 2003-11-23 devnull }
76 f08fdedc 2003-11-23 devnull /*
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.
79 f08fdedc 2003-11-23 devnull */
80 f08fdedc 2003-11-23 devnull tree *simplemung(tree *t)
81 f08fdedc 2003-11-23 devnull {
82 f08fdedc 2003-11-23 devnull tree *u;
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;
95 f08fdedc 2003-11-23 devnull }
96 f08fdedc 2003-11-23 devnull }
97 f08fdedc 2003-11-23 devnull return t;
98 f08fdedc 2003-11-23 devnull }
99 f08fdedc 2003-11-23 devnull tree *token(char *str, int type)
100 f08fdedc 2003-11-23 devnull {
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;
105 f08fdedc 2003-11-23 devnull }
106 f08fdedc 2003-11-23 devnull void freetree(tree *p)
107 f08fdedc 2003-11-23 devnull {
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);
114 f08fdedc 2003-11-23 devnull }