Blame


1 98cd2746 2004-04-19 devnull #include <u.h>
2 98cd2746 2004-04-19 devnull #include <libc.h>
3 98cd2746 2004-04-19 devnull #include <bio.h>
4 98cd2746 2004-04-19 devnull #include <mach.h>
5 98cd2746 2004-04-19 devnull #include <ctype.h>
6 98cd2746 2004-04-19 devnull #include "dat.h"
7 98cd2746 2004-04-19 devnull
8 98cd2746 2004-04-19 devnull char *prefix = "";
9 98cd2746 2004-04-19 devnull
10 98cd2746 2004-04-19 devnull static TypeList *thash[1021];
11 98cd2746 2004-04-19 devnull static TypeList *namehash[1021];
12 98cd2746 2004-04-19 devnull static TypeList *alltypes;
13 98cd2746 2004-04-19 devnull
14 98cd2746 2004-04-19 devnull static uint
15 98cd2746 2004-04-19 devnull hash(uint num, uint num1)
16 98cd2746 2004-04-19 devnull {
17 98cd2746 2004-04-19 devnull return (num*1009 + num1*1013) % nelem(thash);
18 98cd2746 2004-04-19 devnull }
19 98cd2746 2004-04-19 devnull
20 98cd2746 2004-04-19 devnull static uint
21 98cd2746 2004-04-19 devnull shash(char *s)
22 98cd2746 2004-04-19 devnull {
23 98cd2746 2004-04-19 devnull uint h;
24 98cd2746 2004-04-19 devnull
25 98cd2746 2004-04-19 devnull h = 0;
26 98cd2746 2004-04-19 devnull for(; *s; s++)
27 98cd2746 2004-04-19 devnull h = 37*h + *s;
28 98cd2746 2004-04-19 devnull return h%nelem(namehash);
29 98cd2746 2004-04-19 devnull }
30 98cd2746 2004-04-19 devnull
31 98cd2746 2004-04-19 devnull void
32 98cd2746 2004-04-19 devnull addnamehash(Type *t)
33 98cd2746 2004-04-19 devnull {
34 98cd2746 2004-04-19 devnull uint h;
35 98cd2746 2004-04-19 devnull
36 98cd2746 2004-04-19 devnull if(t->name){
37 98cd2746 2004-04-19 devnull h = shash(t->name);
38 98cd2746 2004-04-19 devnull namehash[h] = mktl(t, namehash[h]);
39 98cd2746 2004-04-19 devnull }
40 98cd2746 2004-04-19 devnull }
41 98cd2746 2004-04-19 devnull
42 98cd2746 2004-04-19 devnull static void
43 98cd2746 2004-04-19 devnull addhash(Type *t)
44 98cd2746 2004-04-19 devnull {
45 98cd2746 2004-04-19 devnull uint h;
46 98cd2746 2004-04-19 devnull
47 98cd2746 2004-04-19 devnull if(t->n1 || t->n2){
48 98cd2746 2004-04-19 devnull h = hash(t->n1, t->n2);
49 98cd2746 2004-04-19 devnull thash[h] = mktl(t, thash[h]);
50 98cd2746 2004-04-19 devnull }
51 98cd2746 2004-04-19 devnull if(t->name)
52 98cd2746 2004-04-19 devnull addnamehash(t);
53 98cd2746 2004-04-19 devnull }
54 98cd2746 2004-04-19 devnull
55 98cd2746 2004-04-19 devnull Type*
56 98cd2746 2004-04-19 devnull typebysue(char sue, char *name)
57 98cd2746 2004-04-19 devnull {
58 98cd2746 2004-04-19 devnull Type *t;
59 98cd2746 2004-04-19 devnull TypeList *tl;
60 98cd2746 2004-04-19 devnull
61 98cd2746 2004-04-19 devnull for(tl=namehash[shash(name)]; tl; tl=tl->tl){
62 98cd2746 2004-04-19 devnull t = tl->hd;
63 98cd2746 2004-04-19 devnull if(t->sue==sue && t->suename && strcmp(name, t->suename)==0)
64 98cd2746 2004-04-19 devnull return t;
65 98cd2746 2004-04-19 devnull }
66 98cd2746 2004-04-19 devnull t = newtype();
67 98cd2746 2004-04-19 devnull if(sue=='e')
68 98cd2746 2004-04-19 devnull t->ty = Enum;
69 98cd2746 2004-04-19 devnull else
70 98cd2746 2004-04-19 devnull t->ty = Aggr;
71 98cd2746 2004-04-19 devnull if(sue=='u')
72 98cd2746 2004-04-19 devnull t->isunion = 1;
73 98cd2746 2004-04-19 devnull t->sue = sue;
74 98cd2746 2004-04-19 devnull t->suename = name;
75 98cd2746 2004-04-19 devnull addnamehash(t);
76 98cd2746 2004-04-19 devnull return t;
77 98cd2746 2004-04-19 devnull }
78 98cd2746 2004-04-19 devnull
79 98cd2746 2004-04-19 devnull Type*
80 98cd2746 2004-04-19 devnull typebynum(uint n1, uint n2)
81 98cd2746 2004-04-19 devnull {
82 98cd2746 2004-04-19 devnull Type *t;
83 98cd2746 2004-04-19 devnull TypeList *tl;
84 98cd2746 2004-04-19 devnull
85 98cd2746 2004-04-19 devnull if(n1 || n2){
86 98cd2746 2004-04-19 devnull for(tl=thash[hash(n1, n2)]; tl; tl=tl->tl){
87 98cd2746 2004-04-19 devnull t = tl->hd;
88 98cd2746 2004-04-19 devnull if(t->n1==n1 && t->n2==n2)
89 98cd2746 2004-04-19 devnull return t;
90 98cd2746 2004-04-19 devnull }
91 98cd2746 2004-04-19 devnull }
92 98cd2746 2004-04-19 devnull
93 98cd2746 2004-04-19 devnull t = newtype();
94 98cd2746 2004-04-19 devnull t->n1 = n1;
95 98cd2746 2004-04-19 devnull t->n2 = n2;
96 98cd2746 2004-04-19 devnull addhash(t);
97 98cd2746 2004-04-19 devnull return t;
98 98cd2746 2004-04-19 devnull }
99 98cd2746 2004-04-19 devnull
100 98cd2746 2004-04-19 devnull Type*
101 98cd2746 2004-04-19 devnull newtype(void)
102 98cd2746 2004-04-19 devnull {
103 98cd2746 2004-04-19 devnull Type *t;
104 98cd2746 2004-04-19 devnull static int gen;
105 98cd2746 2004-04-19 devnull
106 98cd2746 2004-04-19 devnull t = emalloc(sizeof *t);
107 98cd2746 2004-04-19 devnull t->gen = ++gen;
108 98cd2746 2004-04-19 devnull alltypes = mktl(t, alltypes);
109 98cd2746 2004-04-19 devnull return t;
110 98cd2746 2004-04-19 devnull }
111 98cd2746 2004-04-19 devnull
112 98cd2746 2004-04-19 devnull struct {
113 98cd2746 2004-04-19 devnull char *old;
114 98cd2746 2004-04-19 devnull char *new;
115 98cd2746 2004-04-19 devnull } fixes[] = { /* Font Tab 4 */
116 98cd2746 2004-04-19 devnull "append", "$append",
117 98cd2746 2004-04-19 devnull "builtin", "$builtin",
118 98cd2746 2004-04-19 devnull "complex", "$complex",
119 98cd2746 2004-04-19 devnull "delete", "$delete",
120 98cd2746 2004-04-19 devnull "do", "$do",
121 98cd2746 2004-04-19 devnull "else", "$else",
122 98cd2746 2004-04-19 devnull "eval", "$eval",
123 98cd2746 2004-04-19 devnull "fmt", "$fmt",
124 98cd2746 2004-04-19 devnull "fn", "$fn",
125 98cd2746 2004-04-19 devnull "head", "$head",
126 98cd2746 2004-04-19 devnull "if", "$if",
127 98cd2746 2004-04-19 devnull "local", "$local",
128 98cd2746 2004-04-19 devnull "loop", "$loop",
129 98cd2746 2004-04-19 devnull "ret", "$ret",
130 98cd2746 2004-04-19 devnull "tail", "$tail",
131 98cd2746 2004-04-19 devnull "then", "$then",
132 98cd2746 2004-04-19 devnull "whatis", "$whatis",
133 98cd2746 2004-04-19 devnull "while", "$while",
134 98cd2746 2004-04-19 devnull };
135 98cd2746 2004-04-19 devnull
136 98cd2746 2004-04-19 devnull char*
137 98cd2746 2004-04-19 devnull fixname(char *name)
138 98cd2746 2004-04-19 devnull {
139 98cd2746 2004-04-19 devnull int i;
140 98cd2746 2004-04-19 devnull
141 98cd2746 2004-04-19 devnull if(name == nil)
142 98cd2746 2004-04-19 devnull return nil;
143 98cd2746 2004-04-19 devnull for(i=0; i<nelem(fixes); i++)
144 98cd2746 2004-04-19 devnull if(name[0]==fixes[i].old[0] && strcmp(name, fixes[i].old)==0)
145 98cd2746 2004-04-19 devnull return fixes[i].new;
146 98cd2746 2004-04-19 devnull return name;
147 98cd2746 2004-04-19 devnull }
148 98cd2746 2004-04-19 devnull
149 98cd2746 2004-04-19 devnull void
150 98cd2746 2004-04-19 devnull denumber(void)
151 98cd2746 2004-04-19 devnull {
152 98cd2746 2004-04-19 devnull memset(thash, 0, sizeof thash);
153 98cd2746 2004-04-19 devnull memset(namehash, 0, sizeof namehash);
154 98cd2746 2004-04-19 devnull }
155 98cd2746 2004-04-19 devnull
156 98cd2746 2004-04-19 devnull void
157 98cd2746 2004-04-19 devnull renumber(TypeList *tl, uint n1)
158 98cd2746 2004-04-19 devnull {
159 98cd2746 2004-04-19 devnull Type *t;
160 98cd2746 2004-04-19 devnull
161 98cd2746 2004-04-19 devnull for(; tl; tl=tl->tl){
162 98cd2746 2004-04-19 devnull t = tl->hd;
163 98cd2746 2004-04-19 devnull t->n1 = n1;
164 98cd2746 2004-04-19 devnull addhash(t);
165 98cd2746 2004-04-19 devnull }
166 98cd2746 2004-04-19 devnull }
167 98cd2746 2004-04-19 devnull
168 733e9d39 2004-04-21 devnull Type*
169 98cd2746 2004-04-19 devnull defer(Type *t)
170 98cd2746 2004-04-19 devnull {
171 98cd2746 2004-04-19 devnull Type *u, *oldt;
172 98cd2746 2004-04-19 devnull int n;
173 98cd2746 2004-04-19 devnull
174 98cd2746 2004-04-19 devnull u = t;
175 98cd2746 2004-04-19 devnull n = 0;
176 98cd2746 2004-04-19 devnull oldt = t;
177 98cd2746 2004-04-19 devnull while(t && (t->ty == Defer || t->ty == Typedef)){
178 98cd2746 2004-04-19 devnull if(n++%2)
179 98cd2746 2004-04-19 devnull u = u->sub;
180 98cd2746 2004-04-19 devnull t = t->sub;
181 98cd2746 2004-04-19 devnull if(t == u) /* cycle */
182 98cd2746 2004-04-19 devnull goto cycle;
183 98cd2746 2004-04-19 devnull }
184 98cd2746 2004-04-19 devnull return t;
185 98cd2746 2004-04-19 devnull
186 98cd2746 2004-04-19 devnull cycle:
187 98cd2746 2004-04-19 devnull fprint(2, "cycle\n");
188 98cd2746 2004-04-19 devnull t = oldt;
189 98cd2746 2004-04-19 devnull n = 0;
190 98cd2746 2004-04-19 devnull while(t && (t->ty==Defer || t->ty==Typedef)){
191 98cd2746 2004-04-19 devnull fprint(2, "t %p/%d %s\n", t, t->ty, t->name);
192 98cd2746 2004-04-19 devnull if(t == u && n++ == 2)
193 98cd2746 2004-04-19 devnull break;
194 98cd2746 2004-04-19 devnull t = t->sub;
195 98cd2746 2004-04-19 devnull }
196 98cd2746 2004-04-19 devnull return u;
197 98cd2746 2004-04-19 devnull }
198 98cd2746 2004-04-19 devnull
199 98cd2746 2004-04-19 devnull static void
200 98cd2746 2004-04-19 devnull dotypedef(Type *t)
201 98cd2746 2004-04-19 devnull {
202 98cd2746 2004-04-19 devnull if(t->ty != Typedef && t->ty != Defer)
203 98cd2746 2004-04-19 devnull return;
204 98cd2746 2004-04-19 devnull
205 98cd2746 2004-04-19 devnull if(t->didtypedef)
206 98cd2746 2004-04-19 devnull return;
207 98cd2746 2004-04-19 devnull
208 98cd2746 2004-04-19 devnull t->didtypedef = 1;
209 98cd2746 2004-04-19 devnull if(t->sub == nil)
210 98cd2746 2004-04-19 devnull return;
211 98cd2746 2004-04-19 devnull
212 98cd2746 2004-04-19 devnull /* push names downward to remove anonymity */
213 98cd2746 2004-04-19 devnull if(t->name && t->sub->name == nil)
214 98cd2746 2004-04-19 devnull t->sub->name = t->name;
215 98cd2746 2004-04-19 devnull
216 98cd2746 2004-04-19 devnull dotypedef(t->sub);
217 98cd2746 2004-04-19 devnull }
218 98cd2746 2004-04-19 devnull
219 98cd2746 2004-04-19 devnull static int
220 98cd2746 2004-04-19 devnull countbytes(uvlong x)
221 98cd2746 2004-04-19 devnull {
222 98cd2746 2004-04-19 devnull int n;
223 98cd2746 2004-04-19 devnull
224 98cd2746 2004-04-19 devnull for(n=0; x; n++)
225 98cd2746 2004-04-19 devnull x>>=8;
226 98cd2746 2004-04-19 devnull return n;
227 98cd2746 2004-04-19 devnull }
228 98cd2746 2004-04-19 devnull
229 98cd2746 2004-04-19 devnull static void
230 98cd2746 2004-04-19 devnull dorange(Type *t)
231 98cd2746 2004-04-19 devnull {
232 98cd2746 2004-04-19 devnull Type *tt;
233 98cd2746 2004-04-19 devnull
234 98cd2746 2004-04-19 devnull if(t->ty != Range)
235 98cd2746 2004-04-19 devnull return;
236 98cd2746 2004-04-19 devnull if(t->didrange)
237 98cd2746 2004-04-19 devnull return;
238 98cd2746 2004-04-19 devnull t->didrange = 1;
239 98cd2746 2004-04-19 devnull tt = defer(t->sub);
240 98cd2746 2004-04-19 devnull if(tt == nil)
241 98cd2746 2004-04-19 devnull return;
242 98cd2746 2004-04-19 devnull dorange(tt);
243 98cd2746 2004-04-19 devnull if(t != tt && tt->ty != Base)
244 98cd2746 2004-04-19 devnull return;
245 98cd2746 2004-04-19 devnull t->ty = Base;
246 98cd2746 2004-04-19 devnull t->xsizeof = tt->xsizeof;
247 98cd2746 2004-04-19 devnull if(t->lo == 0)
248 98cd2746 2004-04-19 devnull t->printfmt = 'x';
249 98cd2746 2004-04-19 devnull else
250 98cd2746 2004-04-19 devnull t->printfmt = 'd';
251 98cd2746 2004-04-19 devnull if(t->xsizeof == 0)
252 98cd2746 2004-04-19 devnull t->xsizeof = countbytes(t->hi);
253 98cd2746 2004-04-19 devnull }
254 98cd2746 2004-04-19 devnull
255 98cd2746 2004-04-19 devnull
256 98cd2746 2004-04-19 devnull char*
257 98cd2746 2004-04-19 devnull nameof(Type *t, int doanon)
258 98cd2746 2004-04-19 devnull {
259 98cd2746 2004-04-19 devnull static char buf[1024];
260 98cd2746 2004-04-19 devnull char *p;
261 98cd2746 2004-04-19 devnull
262 98cd2746 2004-04-19 devnull if(t->name)
263 98cd2746 2004-04-19 devnull strcpy(buf, fixname(t->name));
264 98cd2746 2004-04-19 devnull else if(t->suename)
265 98cd2746 2004-04-19 devnull snprint(buf, sizeof buf, "%s_%s", t->isunion ? "union" : "struct", t->suename);
266 98cd2746 2004-04-19 devnull else if(doanon)
267 98cd2746 2004-04-19 devnull snprint(buf, sizeof buf, "%s_%lud_", prefix, t->gen);
268 98cd2746 2004-04-19 devnull else
269 98cd2746 2004-04-19 devnull return "";
270 98cd2746 2004-04-19 devnull for(p=buf; *p; p++)
271 98cd2746 2004-04-19 devnull if(isspace(*p))
272 98cd2746 2004-04-19 devnull *p = '_';
273 98cd2746 2004-04-19 devnull return buf;
274 98cd2746 2004-04-19 devnull }
275 98cd2746 2004-04-19 devnull
276 98cd2746 2004-04-19 devnull static char
277 98cd2746 2004-04-19 devnull basecharof(Type *t) //XXX
278 98cd2746 2004-04-19 devnull {
279 98cd2746 2004-04-19 devnull switch(t->xsizeof){
280 98cd2746 2004-04-19 devnull default:
281 98cd2746 2004-04-19 devnull return 'X';
282 98cd2746 2004-04-19 devnull case 1:
283 98cd2746 2004-04-19 devnull return 'b';
284 98cd2746 2004-04-19 devnull case 2:
285 98cd2746 2004-04-19 devnull if(t->printfmt=='d')
286 98cd2746 2004-04-19 devnull return 'd';
287 98cd2746 2004-04-19 devnull else
288 98cd2746 2004-04-19 devnull return 'x';
289 98cd2746 2004-04-19 devnull case 4:
290 98cd2746 2004-04-19 devnull if(t->printfmt=='d')
291 98cd2746 2004-04-19 devnull return 'D';
292 98cd2746 2004-04-19 devnull else if(t->printfmt=='f')
293 98cd2746 2004-04-19 devnull return 'f';
294 98cd2746 2004-04-19 devnull else
295 98cd2746 2004-04-19 devnull return 'X';
296 98cd2746 2004-04-19 devnull case 8:
297 98cd2746 2004-04-19 devnull if(t->printfmt=='d')
298 98cd2746 2004-04-19 devnull return 'V';
299 98cd2746 2004-04-19 devnull else if(t->printfmt=='f')
300 98cd2746 2004-04-19 devnull return 'F';
301 98cd2746 2004-04-19 devnull else
302 98cd2746 2004-04-19 devnull return 'Y';
303 98cd2746 2004-04-19 devnull }
304 98cd2746 2004-04-19 devnull }
305 98cd2746 2004-04-19 devnull
306 98cd2746 2004-04-19 devnull static int
307 98cd2746 2004-04-19 devnull nilstrcmp(char *a, char *b)
308 98cd2746 2004-04-19 devnull {
309 98cd2746 2004-04-19 devnull if(a == b)
310 98cd2746 2004-04-19 devnull return 0;
311 98cd2746 2004-04-19 devnull if(a == nil)
312 98cd2746 2004-04-19 devnull return -1;
313 98cd2746 2004-04-19 devnull if(b == nil)
314 98cd2746 2004-04-19 devnull return 1;
315 98cd2746 2004-04-19 devnull return strcmp(a, b);
316 98cd2746 2004-04-19 devnull }
317 98cd2746 2004-04-19 devnull
318 98cd2746 2004-04-19 devnull static int
319 98cd2746 2004-04-19 devnull typecmp(Type *t, Type *u)
320 98cd2746 2004-04-19 devnull {
321 98cd2746 2004-04-19 devnull int i;
322 98cd2746 2004-04-19 devnull
323 98cd2746 2004-04-19 devnull if(t == u)
324 98cd2746 2004-04-19 devnull return 0;
325 98cd2746 2004-04-19 devnull if(t == nil)
326 98cd2746 2004-04-19 devnull return -1;
327 98cd2746 2004-04-19 devnull if(u == nil)
328 98cd2746 2004-04-19 devnull return 1;
329 98cd2746 2004-04-19 devnull
330 98cd2746 2004-04-19 devnull if(t->ty < u->ty)
331 98cd2746 2004-04-19 devnull return -1;
332 98cd2746 2004-04-19 devnull if(t->ty > u->ty)
333 98cd2746 2004-04-19 devnull return 1;
334 98cd2746 2004-04-19 devnull
335 98cd2746 2004-04-19 devnull if(t->isunion != u->isunion)
336 98cd2746 2004-04-19 devnull return t->isunion - u->isunion;
337 98cd2746 2004-04-19 devnull
338 98cd2746 2004-04-19 devnull i = nilstrcmp(t->name, u->name);
339 98cd2746 2004-04-19 devnull if(i)
340 98cd2746 2004-04-19 devnull return i;
341 98cd2746 2004-04-19 devnull
342 98cd2746 2004-04-19 devnull i = nilstrcmp(t->suename, u->suename);
343 98cd2746 2004-04-19 devnull if(i)
344 98cd2746 2004-04-19 devnull return i;
345 98cd2746 2004-04-19 devnull
346 98cd2746 2004-04-19 devnull if(t->name || t->suename)
347 98cd2746 2004-04-19 devnull return 0;
348 98cd2746 2004-04-19 devnull
349 98cd2746 2004-04-19 devnull if(t->ty==Enum){
350 98cd2746 2004-04-19 devnull if(t->n < u->n)
351 98cd2746 2004-04-19 devnull return -1;
352 98cd2746 2004-04-19 devnull if(t->n > u->n)
353 98cd2746 2004-04-19 devnull return 1;
354 98cd2746 2004-04-19 devnull if(t->n == 0)
355 98cd2746 2004-04-19 devnull return 0;
356 98cd2746 2004-04-19 devnull i = strcmp(t->tname[0], u->tname[0]);
357 98cd2746 2004-04-19 devnull return i;
358 98cd2746 2004-04-19 devnull }
359 98cd2746 2004-04-19 devnull if(t < u)
360 98cd2746 2004-04-19 devnull return -1;
361 98cd2746 2004-04-19 devnull if(t > u)
362 98cd2746 2004-04-19 devnull return 1;
363 98cd2746 2004-04-19 devnull return 0;
364 98cd2746 2004-04-19 devnull }
365 98cd2746 2004-04-19 devnull
366 98cd2746 2004-04-19 devnull static int
367 98cd2746 2004-04-19 devnull qtypecmp(const void *va, const void *vb)
368 98cd2746 2004-04-19 devnull {
369 98cd2746 2004-04-19 devnull Type *t, *u;
370 98cd2746 2004-04-19 devnull
371 98cd2746 2004-04-19 devnull t = *(Type**)va;
372 98cd2746 2004-04-19 devnull u = *(Type**)vb;
373 98cd2746 2004-04-19 devnull return typecmp(t, u);
374 98cd2746 2004-04-19 devnull }
375 98cd2746 2004-04-19 devnull
376 98cd2746 2004-04-19 devnull void
377 98cd2746 2004-04-19 devnull printtype(Biobuf *b, Type *t)
378 98cd2746 2004-04-19 devnull {
379 98cd2746 2004-04-19 devnull char *name;
380 98cd2746 2004-04-19 devnull int j, nprint;
381 98cd2746 2004-04-19 devnull Type *tt, *ttt;
382 98cd2746 2004-04-19 devnull
383 98cd2746 2004-04-19 devnull if(t->printed)
384 98cd2746 2004-04-19 devnull return;
385 98cd2746 2004-04-19 devnull t->printed = 1;
386 98cd2746 2004-04-19 devnull switch(t->ty){
387 98cd2746 2004-04-19 devnull case Aggr:
388 98cd2746 2004-04-19 devnull name = nameof(t, 1);
389 98cd2746 2004-04-19 devnull Bprint(b, "sizeof%s = %lud;\n", name, t->xsizeof);
390 98cd2746 2004-04-19 devnull Bprint(b, "aggr %s {\n", name);
391 98cd2746 2004-04-19 devnull nprint = 0;
392 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++){
393 98cd2746 2004-04-19 devnull tt = defer(t->t[j]);
394 98cd2746 2004-04-19 devnull if(tt && tt->equiv)
395 98cd2746 2004-04-19 devnull tt = tt->equiv;
396 98cd2746 2004-04-19 devnull if(tt == nil){
397 98cd2746 2004-04-19 devnull Bprint(b, "// oops: nil type\n");
398 98cd2746 2004-04-19 devnull continue;
399 98cd2746 2004-04-19 devnull }
400 98cd2746 2004-04-19 devnull switch(tt->ty){
401 98cd2746 2004-04-19 devnull default:
402 98cd2746 2004-04-19 devnull Bprint(b, "// oops: unknown type %d for %p/%s (%d,%d; %c,%s; %p)\n",
403 98cd2746 2004-04-19 devnull tt->ty, tt, fixname(t->tname[j]),
404 98cd2746 2004-04-19 devnull tt->n1, tt->n2, tt->sue ? tt->sue : '.', tt->suename, tt->sub);
405 98cd2746 2004-04-19 devnull Bprint(b, "// t->t[j] = %p\n", ttt=t->t[j]);
406 98cd2746 2004-04-19 devnull while(ttt){
407 98cd2746 2004-04-19 devnull Bprint(b, "// %s %d (%d,%d) sub %p\n", ttt->name, ttt->ty, ttt->n1, ttt->n2, ttt->sub);
408 98cd2746 2004-04-19 devnull ttt=ttt->sub;
409 98cd2746 2004-04-19 devnull }
410 98cd2746 2004-04-19 devnull case Base:
411 98cd2746 2004-04-19 devnull case Pointer:
412 98cd2746 2004-04-19 devnull case Enum:
413 98cd2746 2004-04-19 devnull case Array:
414 98cd2746 2004-04-19 devnull case Function:
415 98cd2746 2004-04-19 devnull nprint++;
416 98cd2746 2004-04-19 devnull Bprint(b, "\t'%c' %lud %s;\n", basecharof(tt), t->val[j], fixname(t->tname[j]));
417 98cd2746 2004-04-19 devnull break;
418 98cd2746 2004-04-19 devnull case Aggr:
419 98cd2746 2004-04-19 devnull nprint++;
420 98cd2746 2004-04-19 devnull Bprint(b, "\t%s %lud %s;\n", nameof(tt, 1), t->val[j], fixname(t->tname[j]));
421 98cd2746 2004-04-19 devnull break;
422 98cd2746 2004-04-19 devnull }
423 98cd2746 2004-04-19 devnull }
424 98cd2746 2004-04-19 devnull if(nprint == 0)
425 98cd2746 2004-04-19 devnull Bprint(b, "\t'X' 0 __dummy;\n");
426 98cd2746 2004-04-19 devnull Bprint(b, "};\n\n");
427 98cd2746 2004-04-19 devnull
428 98cd2746 2004-04-19 devnull name = nameof(t, 1); /* might have smashed it */
429 98cd2746 2004-04-19 devnull Bprint(b, "defn %s(addr) { indent_%s(addr, \"\"); }\n", name, name);
430 98cd2746 2004-04-19 devnull Bprint(b, "defn\nindent_%s(addr, indent) {\n", name);
431 98cd2746 2004-04-19 devnull Bprint(b, "\tcomplex %s addr;\n", name);
432 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++){
433 98cd2746 2004-04-19 devnull name = fixname(t->tname[j]);
434 98cd2746 2004-04-19 devnull tt = defer(t->t[j]);
435 98cd2746 2004-04-19 devnull if(tt == nil){
436 98cd2746 2004-04-19 devnull Bprint(b, "// oops nil %s\n", name);
437 98cd2746 2004-04-19 devnull continue;
438 98cd2746 2004-04-19 devnull }
439 98cd2746 2004-04-19 devnull switch(tt->ty){
440 98cd2746 2004-04-19 devnull case Base:
441 98cd2746 2004-04-19 devnull base:
442 98cd2746 2004-04-19 devnull Bprint(b, "\tprint(indent, \"%s\t\", addr.%s, \"\\n\");\n",
443 98cd2746 2004-04-19 devnull name, name);
444 98cd2746 2004-04-19 devnull break;
445 98cd2746 2004-04-19 devnull case Pointer:
446 98cd2746 2004-04-19 devnull ttt = defer(tt->sub);
447 98cd2746 2004-04-19 devnull if(ttt && ttt->ty == Aggr)
448 98cd2746 2004-04-19 devnull Bprint(b, "\tprint(indent, \"%s\t%s(\", addr.%s, \")\\n\");\n",
449 98cd2746 2004-04-19 devnull name, nameof(ttt, 1), name);
450 98cd2746 2004-04-19 devnull else
451 98cd2746 2004-04-19 devnull goto base;
452 98cd2746 2004-04-19 devnull break;
453 98cd2746 2004-04-19 devnull case Array:
454 98cd2746 2004-04-19 devnull Bprint(b, "\tprint(indent, \"%s\t\", addr.%s\\X, \"\\n\");\n",
455 98cd2746 2004-04-19 devnull name, name);
456 98cd2746 2004-04-19 devnull break;
457 98cd2746 2004-04-19 devnull case Enum:
458 98cd2746 2004-04-19 devnull Bprint(b, "\tprint(indent, \"%s\t\", addr.%s, \" \", %s(addr.%s), \"\\n\");\n",
459 98cd2746 2004-04-19 devnull name, name, nameof(tt, 1), name);
460 98cd2746 2004-04-19 devnull break;
461 98cd2746 2004-04-19 devnull case Aggr:
462 98cd2746 2004-04-19 devnull Bprint(b, "\tprint(indent, \"%s\t%s{\\n\");\n",
463 98cd2746 2004-04-19 devnull name, nameof(tt, 0));
464 98cd2746 2004-04-19 devnull Bprint(b, "\tindent_%s(addr+%lud, indent+\" \");\n",
465 98cd2746 2004-04-19 devnull nameof(tt, 1), t->val[j]);
466 98cd2746 2004-04-19 devnull Bprint(b, "\tprint(indent, \"\t}\\n\");\n");
467 98cd2746 2004-04-19 devnull break;
468 98cd2746 2004-04-19 devnull }
469 98cd2746 2004-04-19 devnull }
470 98cd2746 2004-04-19 devnull Bprint(b, "};\n\n");
471 98cd2746 2004-04-19 devnull break;
472 98cd2746 2004-04-19 devnull
473 98cd2746 2004-04-19 devnull case Enum:
474 98cd2746 2004-04-19 devnull name = nameof(t, 1);
475 98cd2746 2004-04-19 devnull Bprint(b, "// enum %s\n", name);
476 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++)
477 98cd2746 2004-04-19 devnull Bprint(b, "%s = %ld;\n", fixname(t->tname[j]), t->val[j]);
478 98cd2746 2004-04-19 devnull
479 98cd2746 2004-04-19 devnull Bprint(b, "vals_%s = {\n", name);
480 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++)
481 98cd2746 2004-04-19 devnull Bprint(b, "\t%lud,\n", t->val[j]);
482 98cd2746 2004-04-19 devnull Bprint(b, "};\n");
483 98cd2746 2004-04-19 devnull Bprint(b, "names_%s = {\n", name);
484 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++)
485 98cd2746 2004-04-19 devnull Bprint(b, "\t\"%s\",\n", fixname(t->tname[j]));
486 98cd2746 2004-04-19 devnull Bprint(b, "};\n");
487 98cd2746 2004-04-19 devnull Bprint(b, "defn\n%s(val) {\n", name);
488 98cd2746 2004-04-19 devnull Bprint(b, "\tlocal i;\n");
489 98cd2746 2004-04-19 devnull Bprint(b, "\ti = match(val, vals_%s);\n", name);
490 98cd2746 2004-04-19 devnull Bprint(b, "\tif i >= 0 then return names_%s[i];\n", name);
491 98cd2746 2004-04-19 devnull Bprint(b, "\treturn \"???\";\n");
492 98cd2746 2004-04-19 devnull Bprint(b, "};\n");
493 98cd2746 2004-04-19 devnull break;
494 98cd2746 2004-04-19 devnull }
495 98cd2746 2004-04-19 devnull }
496 98cd2746 2004-04-19 devnull
497 98cd2746 2004-04-19 devnull void
498 98cd2746 2004-04-19 devnull printtypes(Biobuf *b)
499 98cd2746 2004-04-19 devnull {
500 98cd2746 2004-04-19 devnull int i, n, nn;
501 98cd2746 2004-04-19 devnull Type *t, *tt, **all;
502 98cd2746 2004-04-19 devnull TypeList *tl;
503 98cd2746 2004-04-19 devnull
504 98cd2746 2004-04-19 devnull /* check that pointer resolved */
505 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl){
506 98cd2746 2004-04-19 devnull t = tl->hd;
507 98cd2746 2004-04-19 devnull if(t->ty==None){
508 98cd2746 2004-04-19 devnull if(t->n1 || t->n2)
509 98cd2746 2004-04-19 devnull warn("type %d,%d referenced but not defined", t->n1, t->n2);
510 98cd2746 2004-04-19 devnull else if(t->sue && t->suename)
511 98cd2746 2004-04-19 devnull warn("%s %s referenced but not defined",
512 98cd2746 2004-04-19 devnull t->sue=='s' ? "struct" :
513 98cd2746 2004-04-19 devnull t->sue=='u' ? "union" :
514 98cd2746 2004-04-19 devnull t->sue=='e' ? "enum" : "???", t->suename);
515 98cd2746 2004-04-19 devnull }
516 98cd2746 2004-04-19 devnull }
517 98cd2746 2004-04-19 devnull
518 98cd2746 2004-04-19 devnull /* push typedefs down, base types up */
519 98cd2746 2004-04-19 devnull n = 0;
520 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl){
521 98cd2746 2004-04-19 devnull n++;
522 98cd2746 2004-04-19 devnull t = tl->hd;
523 98cd2746 2004-04-19 devnull if(t->ty == Typedef || t->ty == Defer)
524 98cd2746 2004-04-19 devnull dotypedef(t);
525 98cd2746 2004-04-19 devnull }
526 98cd2746 2004-04-19 devnull
527 98cd2746 2004-04-19 devnull /* push ranges around */
528 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl)
529 98cd2746 2004-04-19 devnull dorange(tl->hd);
530 98cd2746 2004-04-19 devnull
531 98cd2746 2004-04-19 devnull /*
532 98cd2746 2004-04-19 devnull * only take one type of a given name; acid is going to do this anyway,
533 98cd2746 2004-04-19 devnull * and this will reduce the amount of code we output considerably.
534 98cd2746 2004-04-19 devnull * we could run a DFA equivalence relaxation sort of algorithm
535 98cd2746 2004-04-19 devnull * to find the actual equivalence classes, and then rename types
536 98cd2746 2004-04-19 devnull * appropriately, but this will do for now.
537 98cd2746 2004-04-19 devnull */
538 98cd2746 2004-04-19 devnull all = emalloc(n*sizeof(all[0]));
539 98cd2746 2004-04-19 devnull n = 0;
540 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl)
541 98cd2746 2004-04-19 devnull all[n++] = tl->hd;
542 98cd2746 2004-04-19 devnull
543 98cd2746 2004-04-19 devnull qsort(all, n, sizeof(all[0]), qtypecmp);
544 98cd2746 2004-04-19 devnull
545 98cd2746 2004-04-19 devnull nn = 0;
546 98cd2746 2004-04-19 devnull for(i=0; i<n; i++){
547 98cd2746 2004-04-19 devnull if(i==0 || typecmp(all[i-1], all[i]) != 0)
548 98cd2746 2004-04-19 devnull all[nn++] = all[i];
549 98cd2746 2004-04-19 devnull else
550 98cd2746 2004-04-19 devnull all[i]->equiv = all[nn-1];
551 98cd2746 2004-04-19 devnull }
552 98cd2746 2004-04-19 devnull
553 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl){
554 98cd2746 2004-04-19 devnull t = tl->hd;
555 98cd2746 2004-04-19 devnull tt = defer(t);
556 98cd2746 2004-04-19 devnull if(tt && tt->equiv)
557 98cd2746 2004-04-19 devnull t->equiv = tt->equiv;
558 98cd2746 2004-04-19 devnull }
559 98cd2746 2004-04-19 devnull
560 98cd2746 2004-04-19 devnull for(i=0; i<nn; i++)
561 98cd2746 2004-04-19 devnull printtype(b, all[i]);
562 98cd2746 2004-04-19 devnull
563 98cd2746 2004-04-19 devnull free(all);
564 98cd2746 2004-04-19 devnull }
565 98cd2746 2004-04-19 devnull
566 98cd2746 2004-04-19 devnull void
567 98cd2746 2004-04-19 devnull freetypes(void)
568 98cd2746 2004-04-19 devnull {
569 98cd2746 2004-04-19 devnull memset(thash, 0, sizeof(thash));
570 98cd2746 2004-04-19 devnull memset(namehash, 0, sizeof namehash);
571 98cd2746 2004-04-19 devnull }