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"
8 98cd2746 2004-04-19 devnull char *prefix = "";
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;
14 98cd2746 2004-04-19 devnull static uint
15 98cd2746 2004-04-19 devnull hash(uint num, uint num1)
17 98cd2746 2004-04-19 devnull return (num*1009 + num1*1013) % nelem(thash);
20 98cd2746 2004-04-19 devnull static uint
21 98cd2746 2004-04-19 devnull shash(char *s)
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);
32 98cd2746 2004-04-19 devnull addnamehash(Type *t)
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]);
42 98cd2746 2004-04-19 devnull static void
43 98cd2746 2004-04-19 devnull addhash(Type *t)
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]);
51 98cd2746 2004-04-19 devnull if(t->name)
52 98cd2746 2004-04-19 devnull addnamehash(t);
56 98cd2746 2004-04-19 devnull typebysue(char sue, char *name)
59 98cd2746 2004-04-19 devnull TypeList *tl;
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;
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;
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;
80 98cd2746 2004-04-19 devnull typebynum(uint n1, uint n2)
83 98cd2746 2004-04-19 devnull TypeList *tl;
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;
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;
101 98cd2746 2004-04-19 devnull newtype(void)
103 98cd2746 2004-04-19 devnull Type *t;
104 98cd2746 2004-04-19 devnull static int gen;
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;
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",
137 98cd2746 2004-04-19 devnull fixname(char *name)
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;
150 98cd2746 2004-04-19 devnull denumber(void)
152 98cd2746 2004-04-19 devnull memset(thash, 0, sizeof thash);
153 98cd2746 2004-04-19 devnull memset(namehash, 0, sizeof namehash);
157 98cd2746 2004-04-19 devnull renumber(TypeList *tl, uint n1)
159 98cd2746 2004-04-19 devnull Type *t;
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);
169 98cd2746 2004-04-19 devnull defer(Type *t)
171 98cd2746 2004-04-19 devnull Type *u, *oldt;
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;
184 98cd2746 2004-04-19 devnull return t;
187 98cd2746 2004-04-19 devnull fprint(2, "cycle\n");
188 98cd2746 2004-04-19 devnull t = oldt;
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)
194 98cd2746 2004-04-19 devnull t = t->sub;
196 98cd2746 2004-04-19 devnull return u;
199 98cd2746 2004-04-19 devnull static void
200 98cd2746 2004-04-19 devnull dotypedef(Type *t)
202 98cd2746 2004-04-19 devnull if(t->ty != Typedef && t->ty != Defer)
205 98cd2746 2004-04-19 devnull if(t->didtypedef)
208 98cd2746 2004-04-19 devnull t->didtypedef = 1;
209 98cd2746 2004-04-19 devnull if(t->sub == nil)
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;
216 98cd2746 2004-04-19 devnull dotypedef(t->sub);
219 98cd2746 2004-04-19 devnull static int
220 98cd2746 2004-04-19 devnull countbytes(uvlong x)
224 98cd2746 2004-04-19 devnull for(n=0; x; n++)
226 98cd2746 2004-04-19 devnull return n;
229 98cd2746 2004-04-19 devnull static void
230 98cd2746 2004-04-19 devnull dorange(Type *t)
232 98cd2746 2004-04-19 devnull Type *tt;
234 98cd2746 2004-04-19 devnull if(t->ty != Range)
236 98cd2746 2004-04-19 devnull if(t->didrange)
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)
242 98cd2746 2004-04-19 devnull dorange(tt);
243 98cd2746 2004-04-19 devnull if(t != tt && tt->ty != Base)
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';
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);
257 98cd2746 2004-04-19 devnull nameof(Type *t, int doanon)
259 98cd2746 2004-04-19 devnull static char buf[1024];
260 98cd2746 2004-04-19 devnull char *p;
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);
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;
276 98cd2746 2004-04-19 devnull static char
277 98cd2746 2004-04-19 devnull basecharof(Type *t) //XXX
279 98cd2746 2004-04-19 devnull switch(t->xsizeof){
280 98cd2746 2004-04-19 devnull default:
281 98cd2746 2004-04-19 devnull return 'X';
283 98cd2746 2004-04-19 devnull return 'b';
285 98cd2746 2004-04-19 devnull if(t->printfmt=='d')
286 98cd2746 2004-04-19 devnull return 'd';
288 98cd2746 2004-04-19 devnull return 'x';
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';
295 98cd2746 2004-04-19 devnull return 'X';
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';
302 98cd2746 2004-04-19 devnull return 'Y';
306 98cd2746 2004-04-19 devnull static int
307 98cd2746 2004-04-19 devnull nilstrcmp(char *a, char *b)
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);
318 df7993f9 2004-06-09 devnull int careaboutaggrcount;
320 98cd2746 2004-04-19 devnull static int
321 98cd2746 2004-04-19 devnull typecmp(Type *t, Type *u)
325 98cd2746 2004-04-19 devnull if(t == u)
326 98cd2746 2004-04-19 devnull return 0;
327 98cd2746 2004-04-19 devnull if(t == nil)
328 98cd2746 2004-04-19 devnull return -1;
329 98cd2746 2004-04-19 devnull if(u == nil)
330 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 if(t->ty > u->ty)
335 98cd2746 2004-04-19 devnull return 1;
337 98cd2746 2004-04-19 devnull if(t->isunion != u->isunion)
338 98cd2746 2004-04-19 devnull return t->isunion - u->isunion;
340 98cd2746 2004-04-19 devnull i = nilstrcmp(t->name, u->name);
342 98cd2746 2004-04-19 devnull return i;
344 98cd2746 2004-04-19 devnull i = nilstrcmp(t->suename, u->suename);
346 98cd2746 2004-04-19 devnull return i;
348 df7993f9 2004-06-09 devnull if(careaboutaggrcount && t->ty == Aggr){
349 f1ad4977 2004-05-23 devnull if(t->n > u->n)
350 f1ad4977 2004-05-23 devnull return -1;
351 f1ad4977 2004-05-23 devnull if(t->n < u->n)
352 f1ad4977 2004-05-23 devnull return 1;
355 98cd2746 2004-04-19 devnull if(t->name || t->suename)
356 98cd2746 2004-04-19 devnull return 0;
358 98cd2746 2004-04-19 devnull if(t->ty==Enum){
359 98cd2746 2004-04-19 devnull if(t->n < u->n)
360 98cd2746 2004-04-19 devnull return -1;
361 98cd2746 2004-04-19 devnull if(t->n > u->n)
362 98cd2746 2004-04-19 devnull return 1;
363 98cd2746 2004-04-19 devnull if(t->n == 0)
364 98cd2746 2004-04-19 devnull return 0;
365 98cd2746 2004-04-19 devnull i = strcmp(t->tname[0], u->tname[0]);
366 98cd2746 2004-04-19 devnull return i;
368 98cd2746 2004-04-19 devnull if(t < u)
369 98cd2746 2004-04-19 devnull return -1;
370 98cd2746 2004-04-19 devnull if(t > u)
371 98cd2746 2004-04-19 devnull return 1;
372 98cd2746 2004-04-19 devnull return 0;
375 98cd2746 2004-04-19 devnull static int
376 98cd2746 2004-04-19 devnull qtypecmp(const void *va, const void *vb)
378 98cd2746 2004-04-19 devnull Type *t, *u;
380 98cd2746 2004-04-19 devnull t = *(Type**)va;
381 98cd2746 2004-04-19 devnull u = *(Type**)vb;
382 98cd2746 2004-04-19 devnull return typecmp(t, u);
386 98cd2746 2004-04-19 devnull printtype(Biobuf *b, Type *t)
388 98cd2746 2004-04-19 devnull char *name;
389 98cd2746 2004-04-19 devnull int j, nprint;
390 98cd2746 2004-04-19 devnull Type *tt, *ttt;
392 98cd2746 2004-04-19 devnull if(t->printed)
394 98cd2746 2004-04-19 devnull t->printed = 1;
395 98cd2746 2004-04-19 devnull switch(t->ty){
396 98cd2746 2004-04-19 devnull case Aggr:
397 98cd2746 2004-04-19 devnull name = nameof(t, 1);
398 98cd2746 2004-04-19 devnull Bprint(b, "sizeof%s = %lud;\n", name, t->xsizeof);
399 98cd2746 2004-04-19 devnull Bprint(b, "aggr %s {\n", name);
400 98cd2746 2004-04-19 devnull nprint = 0;
401 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++){
402 98cd2746 2004-04-19 devnull tt = defer(t->t[j]);
403 98cd2746 2004-04-19 devnull if(tt && tt->equiv)
404 98cd2746 2004-04-19 devnull tt = tt->equiv;
405 98cd2746 2004-04-19 devnull if(tt == nil){
406 98cd2746 2004-04-19 devnull Bprint(b, "// oops: nil type\n");
407 98cd2746 2004-04-19 devnull continue;
409 98cd2746 2004-04-19 devnull switch(tt->ty){
410 98cd2746 2004-04-19 devnull default:
411 98cd2746 2004-04-19 devnull Bprint(b, "// oops: unknown type %d for %p/%s (%d,%d; %c,%s; %p)\n",
412 98cd2746 2004-04-19 devnull tt->ty, tt, fixname(t->tname[j]),
413 98cd2746 2004-04-19 devnull tt->n1, tt->n2, tt->sue ? tt->sue : '.', tt->suename, tt->sub);
414 98cd2746 2004-04-19 devnull Bprint(b, "// t->t[j] = %p\n", ttt=t->t[j]);
415 98cd2746 2004-04-19 devnull while(ttt){
416 98cd2746 2004-04-19 devnull Bprint(b, "// %s %d (%d,%d) sub %p\n", ttt->name, ttt->ty, ttt->n1, ttt->n2, ttt->sub);
417 98cd2746 2004-04-19 devnull ttt=ttt->sub;
419 98cd2746 2004-04-19 devnull case Base:
420 98cd2746 2004-04-19 devnull case Pointer:
421 98cd2746 2004-04-19 devnull case Enum:
422 98cd2746 2004-04-19 devnull case Array:
423 98cd2746 2004-04-19 devnull case Function:
424 98cd2746 2004-04-19 devnull nprint++;
425 98cd2746 2004-04-19 devnull Bprint(b, "\t'%c' %lud %s;\n", basecharof(tt), t->val[j], fixname(t->tname[j]));
427 98cd2746 2004-04-19 devnull case Aggr:
428 98cd2746 2004-04-19 devnull nprint++;
429 98cd2746 2004-04-19 devnull Bprint(b, "\t%s %lud %s;\n", nameof(tt, 1), t->val[j], fixname(t->tname[j]));
433 98cd2746 2004-04-19 devnull if(nprint == 0)
434 98cd2746 2004-04-19 devnull Bprint(b, "\t'X' 0 __dummy;\n");
435 98cd2746 2004-04-19 devnull Bprint(b, "};\n\n");
437 98cd2746 2004-04-19 devnull name = nameof(t, 1); /* might have smashed it */
438 98cd2746 2004-04-19 devnull Bprint(b, "defn %s(addr) { indent_%s(addr, \"\"); }\n", name, name);
439 98cd2746 2004-04-19 devnull Bprint(b, "defn\nindent_%s(addr, indent) {\n", name);
440 98cd2746 2004-04-19 devnull Bprint(b, "\tcomplex %s addr;\n", name);
441 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++){
442 98cd2746 2004-04-19 devnull name = fixname(t->tname[j]);
443 98cd2746 2004-04-19 devnull tt = defer(t->t[j]);
444 98cd2746 2004-04-19 devnull if(tt == nil){
445 98cd2746 2004-04-19 devnull Bprint(b, "// oops nil %s\n", name);
446 98cd2746 2004-04-19 devnull continue;
448 98cd2746 2004-04-19 devnull switch(tt->ty){
449 98cd2746 2004-04-19 devnull case Base:
451 98cd2746 2004-04-19 devnull Bprint(b, "\tprint(indent, \"%s\t\", addr.%s, \"\\n\");\n",
452 98cd2746 2004-04-19 devnull name, name);
454 98cd2746 2004-04-19 devnull case Pointer:
455 98cd2746 2004-04-19 devnull ttt = defer(tt->sub);
456 98cd2746 2004-04-19 devnull if(ttt && ttt->ty == Aggr)
457 f1ad4977 2004-05-23 devnull Bprint(b, "\tprint(indent, \"%s\t(%s)\", addr.%s, \"\\n\");\n",
458 98cd2746 2004-04-19 devnull name, nameof(ttt, 1), name);
460 98cd2746 2004-04-19 devnull goto base;
462 98cd2746 2004-04-19 devnull case Array:
463 98cd2746 2004-04-19 devnull Bprint(b, "\tprint(indent, \"%s\t\", addr.%s\\X, \"\\n\");\n",
464 98cd2746 2004-04-19 devnull name, name);
466 98cd2746 2004-04-19 devnull case Enum:
467 98cd2746 2004-04-19 devnull Bprint(b, "\tprint(indent, \"%s\t\", addr.%s, \" \", %s(addr.%s), \"\\n\");\n",
468 98cd2746 2004-04-19 devnull name, name, nameof(tt, 1), name);
470 98cd2746 2004-04-19 devnull case Aggr:
471 98cd2746 2004-04-19 devnull Bprint(b, "\tprint(indent, \"%s\t%s{\\n\");\n",
472 98cd2746 2004-04-19 devnull name, nameof(tt, 0));
473 98cd2746 2004-04-19 devnull Bprint(b, "\tindent_%s(addr+%lud, indent+\" \");\n",
474 98cd2746 2004-04-19 devnull nameof(tt, 1), t->val[j]);
475 be36ff68 2004-04-29 devnull Bprint(b, "\tprint(indent, \"}\\n\");\n");
479 98cd2746 2004-04-19 devnull Bprint(b, "};\n\n");
482 98cd2746 2004-04-19 devnull case Enum:
483 98cd2746 2004-04-19 devnull name = nameof(t, 1);
484 98cd2746 2004-04-19 devnull Bprint(b, "// enum %s\n", name);
485 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++)
486 98cd2746 2004-04-19 devnull Bprint(b, "%s = %ld;\n", fixname(t->tname[j]), t->val[j]);
488 98cd2746 2004-04-19 devnull Bprint(b, "vals_%s = {\n", name);
489 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++)
490 98cd2746 2004-04-19 devnull Bprint(b, "\t%lud,\n", t->val[j]);
491 98cd2746 2004-04-19 devnull Bprint(b, "};\n");
492 98cd2746 2004-04-19 devnull Bprint(b, "names_%s = {\n", name);
493 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++)
494 98cd2746 2004-04-19 devnull Bprint(b, "\t\"%s\",\n", fixname(t->tname[j]));
495 98cd2746 2004-04-19 devnull Bprint(b, "};\n");
496 98cd2746 2004-04-19 devnull Bprint(b, "defn\n%s(val) {\n", name);
497 98cd2746 2004-04-19 devnull Bprint(b, "\tlocal i;\n");
498 98cd2746 2004-04-19 devnull Bprint(b, "\ti = match(val, vals_%s);\n", name);
499 98cd2746 2004-04-19 devnull Bprint(b, "\tif i >= 0 then return names_%s[i];\n", name);
500 98cd2746 2004-04-19 devnull Bprint(b, "\treturn \"???\";\n");
501 98cd2746 2004-04-19 devnull Bprint(b, "};\n");
507 98cd2746 2004-04-19 devnull printtypes(Biobuf *b)
509 98cd2746 2004-04-19 devnull int i, n, nn;
510 98cd2746 2004-04-19 devnull Type *t, *tt, **all;
511 98cd2746 2004-04-19 devnull TypeList *tl;
513 98cd2746 2004-04-19 devnull /* check that pointer resolved */
514 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl){
515 98cd2746 2004-04-19 devnull t = tl->hd;
516 98cd2746 2004-04-19 devnull if(t->ty==None){
517 98cd2746 2004-04-19 devnull if(t->n1 || t->n2)
518 98cd2746 2004-04-19 devnull warn("type %d,%d referenced but not defined", t->n1, t->n2);
519 98cd2746 2004-04-19 devnull else if(t->sue && t->suename)
520 98cd2746 2004-04-19 devnull warn("%s %s referenced but not defined",
521 98cd2746 2004-04-19 devnull t->sue=='s' ? "struct" :
522 98cd2746 2004-04-19 devnull t->sue=='u' ? "union" :
523 98cd2746 2004-04-19 devnull t->sue=='e' ? "enum" : "???", t->suename);
527 98cd2746 2004-04-19 devnull /* push typedefs down, base types up */
529 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl){
531 98cd2746 2004-04-19 devnull t = tl->hd;
532 98cd2746 2004-04-19 devnull if(t->ty == Typedef || t->ty == Defer)
533 98cd2746 2004-04-19 devnull dotypedef(t);
536 98cd2746 2004-04-19 devnull /* push ranges around */
537 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl)
538 98cd2746 2004-04-19 devnull dorange(tl->hd);
541 98cd2746 2004-04-19 devnull * only take one type of a given name; acid is going to do this anyway,
542 98cd2746 2004-04-19 devnull * and this will reduce the amount of code we output considerably.
543 98cd2746 2004-04-19 devnull * we could run a DFA equivalence relaxation sort of algorithm
544 98cd2746 2004-04-19 devnull * to find the actual equivalence classes, and then rename types
545 98cd2746 2004-04-19 devnull * appropriately, but this will do for now.
547 98cd2746 2004-04-19 devnull all = emalloc(n*sizeof(all[0]));
549 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl)
550 98cd2746 2004-04-19 devnull all[n++] = tl->hd;
552 df7993f9 2004-06-09 devnull careaboutaggrcount = 1;
553 98cd2746 2004-04-19 devnull qsort(all, n, sizeof(all[0]), qtypecmp);
554 df7993f9 2004-06-09 devnull careaboutaggrcount = 0;
557 98cd2746 2004-04-19 devnull for(i=0; i<n; i++){
558 98cd2746 2004-04-19 devnull if(i==0 || typecmp(all[i-1], all[i]) != 0)
559 98cd2746 2004-04-19 devnull all[nn++] = all[i];
561 98cd2746 2004-04-19 devnull all[i]->equiv = all[nn-1];
564 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl){
565 98cd2746 2004-04-19 devnull t = tl->hd;
566 98cd2746 2004-04-19 devnull tt = defer(t);
567 98cd2746 2004-04-19 devnull if(tt && tt->equiv)
568 98cd2746 2004-04-19 devnull t->equiv = tt->equiv;
571 98cd2746 2004-04-19 devnull for(i=0; i<nn; i++)
572 98cd2746 2004-04-19 devnull printtype(b, all[i]);
574 98cd2746 2004-04-19 devnull free(all);
578 98cd2746 2004-04-19 devnull freetypes(void)
580 98cd2746 2004-04-19 devnull memset(thash, 0, sizeof(thash));
581 98cd2746 2004-04-19 devnull memset(namehash, 0, sizeof namehash);