BSD 4_3 development
[unix-history] / usr / src / usr.bin / efl / free.c
CommitLineData
832026c6
C
1#include "defs"
2
3
4cleanst()
5{
6register ptr p, q;
7ptr pjunk;
8int i;
9register struct stentry *s;
10struct stentry **hp;
11
12TEST fprintf(diagfile, "\n");
13
14clcomm();
15
16for(hp = hashtab ; hp<hashend ; ++hp)
17 while( s = *hp )
18 {
19 if( q = s->varp )
20 {
21 if( q->blklevel > 0 )
22 {
23 TEST fprintf(diagfile, "remove %s from st\n", s->namep);
24 switch(q->tag)
25 {
26 case TNAME:
27 frvar(q);
28 break;
29
30 case TSTRUCT:
31 frtype(q);
32 break;
33
34 case TDEFINE:
35 frdef(q);
36 break;
37
38 case TLABEL:
39 cfree(q);
40 break;
41
42 default:
43 sprintf(msg, "cleanst: illegal entry tag %d, ptr %o, name %s.",
44 q->tag, q, s->namep);
45 fatal(msg);
46 }
47 }
48 else if( q->tag == TNAME )
49 {
50 q->vdcldone = 0;
51 q->vnamedone = 0;
52 q->vextbase = 0;
53 for(i = 0 ; i<NFTNTYPES ; ++i)
54 q->vbase[i] = 0;
55 }
56 }
57 if(s->blklevel > 0)
58 name(s->namep,-1);
59 else break;
60 }
61
62for(p = gonelist ; p ; p = p->nextp)
63 frvar(p->datap);
64frchain(&gonelist);
65
66if(hidlist) fatal("cleanst: hidlist not empty");
67for(p = hidlist ; p ; p = p->nextp)
68 frvar(p->datap);
69frchain(&hidlist);
70
71for(p = tempvarlist ; p ; p = p->nextp)
72 frvar(p->datap);
73frchain(&tempvarlist);
74
75for(p = temptypelist ; p ; p = p->nextp)
76 if(p->datap->blklevel > 0)
77 frtype(p->datap);
78frchain(&temptypelist);
79
80q = &arrays;
81for(p = arrays ; p ; p = q->nextp)
82 if(p->datap == 0)
83 {
84 q->nextp = p->nextp;
85 p->nextp = 0;
86 pjunk = p;
87 frchain(&pjunk);
88 }
89 else q = p;
90}
91
92
93
94frvar(p)
95register ptr p;
96{
97register ptr q, qn;
98
99if(p==0) return;
100
101switch(p->tag)
102 {
103 case TSTRUCT:
104 frtype(p);
105 return;
106
107 case TDEFINE:
108 frdef(p);
109 return;
110
111 case TNAME:
112 case TTEMP:
113 if(q = p->vdim)
114 for(q = q->datap ; q ; q = qn)
115 {
116 if(q->lowerb) frexpr(q->lowerb);
117 frexpr(q->upperb);
118 qn = q->nextp;
119 cfree(q);
120 }
121
122 if(p->vdim)
123 p->vdim->datap = 0;
124 if(p->vtype == TYCHAR)
125 frexpr(p->vtypep);
126 frexpblock(p);
127 return;
128
129 default:
130 badtag("frvar",p->tag);
131 }
132}
133
134
135frtype(p)
136register ptr p;
137{
138register ptr q;
139
140if(p==0 || p->tag!=TSTRUCT)
141 fatal("frtype: bad argument");
142for(q = p->strdesc ; q; q = q->nextp)
143 frvar(q->datap);
144frchain( &(p->strdesc) );
145cfree(p);
146}
147
148
149
150frdef(p)
151ptr p;
152{
153cfree(p->valp);
154cfree(p);
155}
156
157
158
159frexpr(p)
160register ptr p;
161{
162register ptr q;
163
164if(p == 0) return;
165
166switch(p->tag)
167 {
168 case TAROP:
169 case TRELOP:
170 case TLOGOP:
171 case TASGNOP:
172 case TREPOP:
173 case TCALL:
174 frexpr(p->rightp);
175
176
177 case TNOTOP:
178 case TNEGOP:
179 frexpr(p->leftp);
180 break;
181
182 case TCONST:
183 cfree(p->leftp);
184 if(p->vtype == TYCHAR)
185 frexpr(p->vtypep);
186 if(p->rightp)
187 cfree(p->rightp);
188 break;
189
190 case TLIST:
191 for(q = p->leftp ; q ; q = q->nextp)
192 frexpr(q->datap);
193 frchain( &(p->leftp) );
194 break;
195
196 case TTEMP:
197 case TNAME:
198 case TFTNBLOCK:
199 if(p->vsubs)
200 frexpr(p->vsubs);
201 if(p->voffset)
202 frexpr(p->voffset);
203
204 case TERROR:
205/*debug*/ case TIOSTAT:
206 break;
207
208 default:
209 badtag("frexpr", p->tag);
210 }
211frexpblock(p);
212}
213
214
215
216
217clcomm() /* clean up common lists */
218{
219ptr p, oldp, q;
220
221for(oldp = &commonlist ; p = oldp->nextp ; )
222 {
223 q = p->datap;
224
225 if(q->blklevel > 0)
226 {
227 frchain( &(q->comchain) );
228 cfree(q);
229 oldp->nextp = p->nextp;
230 cfree(p);
231 }
232 else oldp = p;
233 }
234}