blob: 9bf76d8efb1b7956e88b9c9d9219aaf55ebaeaf4 [file] [log] [blame]
rscf08fded2003-11-23 18:04:08 +00001#include "rc.h"
2#include "exec.h"
3#include "io.h"
4#include "fns.h"
5tree *treenodes;
6/*
7 * create and clear a new tree node, and add it
8 * to the node list.
9 */
10tree *newtree(void){
11 tree *t=new(tree);
12 t->iskw=0;
13 t->str=0;
14 t->child[0]=t->child[1]=t->child[2]=0;
15 t->next=treenodes;
16 treenodes=t;
17 return t;
18}
19void freenodes(void){
20 tree *t, *u;
21 for(t=treenodes;t;t=u){
22 u=t->next;
23 if(t->str) efree(t->str);
24 efree((char *)t);
25 }
26 treenodes=0;
27}
28tree *tree1(int type, tree *c0)
29{
30 return tree3(type, c0, (tree *)0, (tree *)0);
31}
32tree *tree2(int type, tree *c0, tree *c1)
33{
34 return tree3(type, c0, c1, (tree *)0);
35}
36tree *tree3(int type, tree *c0, tree *c1, tree *c2)
37{
38 tree *t;
39 if(type==';'){
40 if(c0==0) return c1;
41 if(c1==0) return c0;
42 }
43 t=newtree();
44 t->type=type;
45 t->child[0]=c0;
46 t->child[1]=c1;
47 t->child[2]=c2;
48 return t;
49}
50tree *mung1(tree *t, tree *c0)
51{
52 t->child[0]=c0;
53 return t;
54}
55tree *mung2(tree *t, tree *c0, tree *c1)
56{
57 t->child[0]=c0;
58 t->child[1]=c1;
59 return t;
60}
61tree *mung3(tree *t, tree *c0, tree *c1, tree *c2)
62{
63 t->child[0]=c0;
64 t->child[1]=c1;
65 t->child[2]=c2;
66 return t;
67}
68tree *epimung(tree *comp, tree *epi)
69{
70 tree *p;
71 if(epi==0) return comp;
72 for(p=epi;p->child[1];p=p->child[1]);
73 p->child[1]=comp;
74 return epi;
75}
76/*
77 * Add a SIMPLE node at the root of t and percolate all the redirections
78 * up to the root.
79 */
80tree *simplemung(tree *t)
81{
82 tree *u;
83 struct io *s;
84 t=tree1(SIMPLE, t);
85 s=openstr();
86 pfmt(s, "%t", t);
87 t->str=strdup(s->strp);
88 closeio(s);
89 for(u=t->child[0];u->type==ARGLIST;u=u->child[0]){
90 if(u->child[1]->type==DUP
91 || u->child[1]->type==REDIR){
92 u->child[1]->child[1]=t;
93 t=u->child[1];
94 u->child[1]=0;
95 }
96 }
97 return t;
98}
99tree *token(char *str, int type)
100{
101 tree *t=newtree();
102 t->type=type;
103 t->str=strdup(str);
104 return t;
105}
106void freetree(tree *p)
107{
108 if(p==0) return;
109 freetree(p->child[0]);
110 freetree(p->child[1]);
111 freetree(p->child[2]);
112 if(p->str) efree(p->str);
113 efree((char *)p);
114}