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 b16534fd 2005-02-11 devnull "var", "$var",
133 a05c312b 2005-01-23 devnull "whatis", "$whatis",
134 98cd2746 2004-04-19 devnull "while", "$while",
136 a05c312b 2005-01-23 devnull /* register names! */
137 a05c312b 2005-01-23 devnull /* generic */
138 a05c312b 2005-01-23 devnull "PC", "$PC",
139 a05c312b 2005-01-23 devnull "SP", "$SP",
140 a05c312b 2005-01-23 devnull "LR", "$LR",
141 a05c312b 2005-01-23 devnull "R0", "$R0",
142 a05c312b 2005-01-23 devnull "R1", "$R1",
143 a05c312b 2005-01-23 devnull "R2", "$R2",
144 a05c312b 2005-01-23 devnull "R3", "$R3",
145 a05c312b 2005-01-23 devnull "R4", "$R4",
146 a05c312b 2005-01-23 devnull "R5", "$R5",
147 a05c312b 2005-01-23 devnull "R6", "$R6",
148 a05c312b 2005-01-23 devnull "R7", "$R7",
149 a05c312b 2005-01-23 devnull "R8", "$R8",
150 a05c312b 2005-01-23 devnull "R9", "$R9",
151 a05c312b 2005-01-23 devnull "R10", "$R10",
152 a05c312b 2005-01-23 devnull "R11", "$R11",
153 a05c312b 2005-01-23 devnull "R12", "$R12",
154 a05c312b 2005-01-23 devnull "R13", "$R13",
155 a05c312b 2005-01-23 devnull "R14", "$R14",
156 a05c312b 2005-01-23 devnull "R15", "$R15",
157 a05c312b 2005-01-23 devnull "R16", "$R16",
158 a05c312b 2005-01-23 devnull "R17", "$R17",
159 a05c312b 2005-01-23 devnull "R18", "$R18",
160 a05c312b 2005-01-23 devnull "R19", "$R19",
161 a05c312b 2005-01-23 devnull "R20", "$R20",
162 a05c312b 2005-01-23 devnull "R21", "$R21",
163 a05c312b 2005-01-23 devnull "R22", "$R22",
164 a05c312b 2005-01-23 devnull "R23", "$R23",
165 a05c312b 2005-01-23 devnull "R24", "$R24",
166 a05c312b 2005-01-23 devnull "R25", "$R25",
167 a05c312b 2005-01-23 devnull "R26", "$R26",
168 a05c312b 2005-01-23 devnull "R27", "$R27",
169 a05c312b 2005-01-23 devnull "R28", "$R28",
170 a05c312b 2005-01-23 devnull "R29", "$R29",
171 a05c312b 2005-01-23 devnull "R30", "$R30",
172 a05c312b 2005-01-23 devnull "R31", "$R31",
173 a05c312b 2005-01-23 devnull "E0", "$E0",
174 a05c312b 2005-01-23 devnull "E1", "$E1",
175 a05c312b 2005-01-23 devnull "E2", "$E2",
176 a05c312b 2005-01-23 devnull "E3", "$E3",
177 a05c312b 2005-01-23 devnull "E4", "$E4",
178 a05c312b 2005-01-23 devnull "E5", "$E5",
179 a05c312b 2005-01-23 devnull "E6", "$E6",
180 a05c312b 2005-01-23 devnull "F0", "$F0",
181 a05c312b 2005-01-23 devnull "F1", "$F1",
182 a05c312b 2005-01-23 devnull "F2", "$F2",
183 a05c312b 2005-01-23 devnull "F3", "$F3",
184 a05c312b 2005-01-23 devnull "F4", "$F4",
185 a05c312b 2005-01-23 devnull "F5", "$F5",
186 a05c312b 2005-01-23 devnull "F6", "$F6",
187 a05c312b 2005-01-23 devnull "F7", "$F7",
188 a05c312b 2005-01-23 devnull "F8", "$F8",
189 a05c312b 2005-01-23 devnull "F9", "$F9",
190 a05c312b 2005-01-23 devnull "F10", "$F10",
191 a05c312b 2005-01-23 devnull "F11", "$F11",
192 a05c312b 2005-01-23 devnull "F12", "$F12",
193 a05c312b 2005-01-23 devnull "F13", "$F13",
194 a05c312b 2005-01-23 devnull "F14", "$F14",
195 a05c312b 2005-01-23 devnull "F15", "$F15",
196 a05c312b 2005-01-23 devnull "F16", "$F16",
197 a05c312b 2005-01-23 devnull "F17", "$F17",
198 a05c312b 2005-01-23 devnull "F18", "$F18",
199 a05c312b 2005-01-23 devnull "F19", "$F19",
200 a05c312b 2005-01-23 devnull "F20", "$F20",
201 a05c312b 2005-01-23 devnull "F21", "$F21",
202 a05c312b 2005-01-23 devnull "F22", "$F22",
203 a05c312b 2005-01-23 devnull "F23", "$F23",
204 a05c312b 2005-01-23 devnull "F24", "$F24",
205 a05c312b 2005-01-23 devnull "F25", "$F25",
206 a05c312b 2005-01-23 devnull "F26", "$F26",
207 a05c312b 2005-01-23 devnull "F27", "$F27",
208 a05c312b 2005-01-23 devnull "F28", "$F28",
209 a05c312b 2005-01-23 devnull "F29", "$F29",
210 a05c312b 2005-01-23 devnull "F30", "$F30",
211 a05c312b 2005-01-23 devnull "F31", "$F31",
213 a05c312b 2005-01-23 devnull /* 386 */
214 a05c312b 2005-01-23 devnull "DI", "$DI",
215 a05c312b 2005-01-23 devnull "SI", "$SI",
216 a05c312b 2005-01-23 devnull "BP", "$BP",
217 a05c312b 2005-01-23 devnull "BX", "$BX",
218 a05c312b 2005-01-23 devnull "DX", "$DX",
219 a05c312b 2005-01-23 devnull "CX", "$CX",
220 a05c312b 2005-01-23 devnull "AX", "$AX",
221 a05c312b 2005-01-23 devnull "GS", "$GS",
222 a05c312b 2005-01-23 devnull "FS", "$FS",
223 a05c312b 2005-01-23 devnull "ES", "$ES",
224 a05c312b 2005-01-23 devnull "DS", "$DS",
225 a05c312b 2005-01-23 devnull "TRAP", "$TRAP",
226 a05c312b 2005-01-23 devnull "ECODE", "$ECODE",
227 a05c312b 2005-01-23 devnull "CS", "$CS",
228 a05c312b 2005-01-23 devnull "EFLAGS", "$EFLAGS",
229 a05c312b 2005-01-23 devnull "SS", "$SS",
231 a05c312b 2005-01-23 devnull /* power */
232 a05c312b 2005-01-23 devnull "CAUSE", "$CAUSE",
233 a05c312b 2005-01-23 devnull "SRR1", "$SRR1",
234 a05c312b 2005-01-23 devnull "CR", "$CR",
235 a05c312b 2005-01-23 devnull "XER", "$XER",
236 a05c312b 2005-01-23 devnull "CTR", "$CTR",
237 a05c312b 2005-01-23 devnull "VRSAVE", "$VRSAVE",
238 a05c312b 2005-01-23 devnull "FPSCR", "$FPSCR",
242 98cd2746 2004-04-19 devnull fixname(char *name)
246 98cd2746 2004-04-19 devnull if(name == nil)
247 98cd2746 2004-04-19 devnull return nil;
248 98cd2746 2004-04-19 devnull for(i=0; i<nelem(fixes); i++)
249 98cd2746 2004-04-19 devnull if(name[0]==fixes[i].old[0] && strcmp(name, fixes[i].old)==0)
250 98cd2746 2004-04-19 devnull return fixes[i].new;
251 98cd2746 2004-04-19 devnull return name;
255 98cd2746 2004-04-19 devnull denumber(void)
257 98cd2746 2004-04-19 devnull memset(thash, 0, sizeof thash);
258 98cd2746 2004-04-19 devnull memset(namehash, 0, sizeof namehash);
262 98cd2746 2004-04-19 devnull renumber(TypeList *tl, uint n1)
264 98cd2746 2004-04-19 devnull Type *t;
266 98cd2746 2004-04-19 devnull for(; tl; tl=tl->tl){
267 98cd2746 2004-04-19 devnull t = tl->hd;
268 98cd2746 2004-04-19 devnull t->n1 = n1;
269 98cd2746 2004-04-19 devnull addhash(t);
274 98cd2746 2004-04-19 devnull defer(Type *t)
276 98cd2746 2004-04-19 devnull Type *u, *oldt;
281 98cd2746 2004-04-19 devnull oldt = t;
282 98cd2746 2004-04-19 devnull while(t && (t->ty == Defer || t->ty == Typedef)){
283 98cd2746 2004-04-19 devnull if(n++%2)
284 98cd2746 2004-04-19 devnull u = u->sub;
285 98cd2746 2004-04-19 devnull t = t->sub;
286 98cd2746 2004-04-19 devnull if(t == u) /* cycle */
287 98cd2746 2004-04-19 devnull goto cycle;
289 98cd2746 2004-04-19 devnull return t;
292 98cd2746 2004-04-19 devnull fprint(2, "cycle\n");
293 98cd2746 2004-04-19 devnull t = oldt;
295 98cd2746 2004-04-19 devnull while(t && (t->ty==Defer || t->ty==Typedef)){
296 98cd2746 2004-04-19 devnull fprint(2, "t %p/%d %s\n", t, t->ty, t->name);
297 98cd2746 2004-04-19 devnull if(t == u && n++ == 2)
299 98cd2746 2004-04-19 devnull t = t->sub;
301 98cd2746 2004-04-19 devnull return u;
304 98cd2746 2004-04-19 devnull static void
305 98cd2746 2004-04-19 devnull dotypedef(Type *t)
307 98cd2746 2004-04-19 devnull if(t->ty != Typedef && t->ty != Defer)
310 98cd2746 2004-04-19 devnull if(t->didtypedef)
313 98cd2746 2004-04-19 devnull t->didtypedef = 1;
314 98cd2746 2004-04-19 devnull if(t->sub == nil)
317 98cd2746 2004-04-19 devnull /* push names downward to remove anonymity */
318 98cd2746 2004-04-19 devnull if(t->name && t->sub->name == nil)
319 98cd2746 2004-04-19 devnull t->sub->name = t->name;
321 98cd2746 2004-04-19 devnull dotypedef(t->sub);
324 98cd2746 2004-04-19 devnull static int
325 98cd2746 2004-04-19 devnull countbytes(uvlong x)
329 98cd2746 2004-04-19 devnull for(n=0; x; n++)
331 98cd2746 2004-04-19 devnull return n;
334 98cd2746 2004-04-19 devnull static void
335 98cd2746 2004-04-19 devnull dorange(Type *t)
337 98cd2746 2004-04-19 devnull Type *tt;
339 98cd2746 2004-04-19 devnull if(t->ty != Range)
341 98cd2746 2004-04-19 devnull if(t->didrange)
343 98cd2746 2004-04-19 devnull t->didrange = 1;
344 98cd2746 2004-04-19 devnull tt = defer(t->sub);
345 98cd2746 2004-04-19 devnull if(tt == nil)
347 98cd2746 2004-04-19 devnull dorange(tt);
348 98cd2746 2004-04-19 devnull if(t != tt && tt->ty != Base)
350 98cd2746 2004-04-19 devnull t->ty = Base;
351 98cd2746 2004-04-19 devnull t->xsizeof = tt->xsizeof;
352 98cd2746 2004-04-19 devnull if(t->lo == 0)
353 98cd2746 2004-04-19 devnull t->printfmt = 'x';
355 98cd2746 2004-04-19 devnull t->printfmt = 'd';
356 98cd2746 2004-04-19 devnull if(t->xsizeof == 0)
357 98cd2746 2004-04-19 devnull t->xsizeof = countbytes(t->hi);
362 98cd2746 2004-04-19 devnull nameof(Type *t, int doanon)
364 98cd2746 2004-04-19 devnull static char buf[1024];
365 98cd2746 2004-04-19 devnull char *p;
367 98cd2746 2004-04-19 devnull if(t->name)
368 98cd2746 2004-04-19 devnull strcpy(buf, fixname(t->name));
369 98cd2746 2004-04-19 devnull else if(t->suename)
370 98cd2746 2004-04-19 devnull snprint(buf, sizeof buf, "%s_%s", t->isunion ? "union" : "struct", t->suename);
371 98cd2746 2004-04-19 devnull else if(doanon)
372 98cd2746 2004-04-19 devnull snprint(buf, sizeof buf, "%s_%lud_", prefix, t->gen);
374 98cd2746 2004-04-19 devnull return "";
375 98cd2746 2004-04-19 devnull for(p=buf; *p; p++)
376 3bd56b04 2005-09-09 devnull if(isspace((uchar)*p))
377 98cd2746 2004-04-19 devnull *p = '_';
378 98cd2746 2004-04-19 devnull return buf;
381 98cd2746 2004-04-19 devnull static char
382 98cd2746 2004-04-19 devnull basecharof(Type *t) //XXX
384 98cd2746 2004-04-19 devnull switch(t->xsizeof){
385 98cd2746 2004-04-19 devnull default:
386 98cd2746 2004-04-19 devnull return 'X';
388 98cd2746 2004-04-19 devnull return 'b';
390 98cd2746 2004-04-19 devnull if(t->printfmt=='d')
391 98cd2746 2004-04-19 devnull return 'd';
393 98cd2746 2004-04-19 devnull return 'x';
395 98cd2746 2004-04-19 devnull if(t->printfmt=='d')
396 98cd2746 2004-04-19 devnull return 'D';
397 98cd2746 2004-04-19 devnull else if(t->printfmt=='f')
398 98cd2746 2004-04-19 devnull return 'f';
400 98cd2746 2004-04-19 devnull return 'X';
402 98cd2746 2004-04-19 devnull if(t->printfmt=='d')
403 98cd2746 2004-04-19 devnull return 'V';
404 98cd2746 2004-04-19 devnull else if(t->printfmt=='f')
405 98cd2746 2004-04-19 devnull return 'F';
407 98cd2746 2004-04-19 devnull return 'Y';
411 98cd2746 2004-04-19 devnull static int
412 98cd2746 2004-04-19 devnull nilstrcmp(char *a, char *b)
414 98cd2746 2004-04-19 devnull if(a == b)
415 98cd2746 2004-04-19 devnull return 0;
416 98cd2746 2004-04-19 devnull if(a == nil)
417 98cd2746 2004-04-19 devnull return -1;
418 98cd2746 2004-04-19 devnull if(b == nil)
419 98cd2746 2004-04-19 devnull return 1;
420 98cd2746 2004-04-19 devnull return strcmp(a, b);
423 df7993f9 2004-06-09 devnull int careaboutaggrcount;
425 98cd2746 2004-04-19 devnull static int
426 98cd2746 2004-04-19 devnull typecmp(Type *t, Type *u)
430 98cd2746 2004-04-19 devnull if(t == u)
431 98cd2746 2004-04-19 devnull return 0;
432 98cd2746 2004-04-19 devnull if(t == nil)
433 98cd2746 2004-04-19 devnull return -1;
434 98cd2746 2004-04-19 devnull if(u == nil)
435 98cd2746 2004-04-19 devnull return 1;
437 98cd2746 2004-04-19 devnull if(t->ty < u->ty)
438 98cd2746 2004-04-19 devnull return -1;
439 98cd2746 2004-04-19 devnull if(t->ty > u->ty)
440 98cd2746 2004-04-19 devnull return 1;
442 98cd2746 2004-04-19 devnull if(t->isunion != u->isunion)
443 98cd2746 2004-04-19 devnull return t->isunion - u->isunion;
445 98cd2746 2004-04-19 devnull i = nilstrcmp(t->name, u->name);
447 98cd2746 2004-04-19 devnull return i;
449 98cd2746 2004-04-19 devnull i = nilstrcmp(t->suename, u->suename);
451 98cd2746 2004-04-19 devnull return i;
453 df7993f9 2004-06-09 devnull if(careaboutaggrcount && t->ty == Aggr){
454 f1ad4977 2004-05-23 devnull if(t->n > u->n)
455 f1ad4977 2004-05-23 devnull return -1;
456 f1ad4977 2004-05-23 devnull if(t->n < u->n)
457 f1ad4977 2004-05-23 devnull return 1;
460 98cd2746 2004-04-19 devnull if(t->name || t->suename)
461 98cd2746 2004-04-19 devnull return 0;
463 98cd2746 2004-04-19 devnull if(t->ty==Enum){
464 98cd2746 2004-04-19 devnull if(t->n < u->n)
465 98cd2746 2004-04-19 devnull return -1;
466 98cd2746 2004-04-19 devnull if(t->n > u->n)
467 98cd2746 2004-04-19 devnull return 1;
468 98cd2746 2004-04-19 devnull if(t->n == 0)
469 98cd2746 2004-04-19 devnull return 0;
470 98cd2746 2004-04-19 devnull i = strcmp(t->tname[0], u->tname[0]);
471 98cd2746 2004-04-19 devnull return i;
473 98cd2746 2004-04-19 devnull if(t < u)
474 98cd2746 2004-04-19 devnull return -1;
475 98cd2746 2004-04-19 devnull if(t > u)
476 98cd2746 2004-04-19 devnull return 1;
477 98cd2746 2004-04-19 devnull return 0;
480 98cd2746 2004-04-19 devnull static int
481 98cd2746 2004-04-19 devnull qtypecmp(const void *va, const void *vb)
483 98cd2746 2004-04-19 devnull Type *t, *u;
485 98cd2746 2004-04-19 devnull t = *(Type**)va;
486 98cd2746 2004-04-19 devnull u = *(Type**)vb;
487 98cd2746 2004-04-19 devnull return typecmp(t, u);
491 98cd2746 2004-04-19 devnull printtype(Biobuf *b, Type *t)
493 98cd2746 2004-04-19 devnull char *name;
494 98cd2746 2004-04-19 devnull int j, nprint;
495 98cd2746 2004-04-19 devnull Type *tt, *ttt;
497 98cd2746 2004-04-19 devnull if(t->printed)
499 98cd2746 2004-04-19 devnull t->printed = 1;
500 98cd2746 2004-04-19 devnull switch(t->ty){
501 98cd2746 2004-04-19 devnull case Aggr:
502 98cd2746 2004-04-19 devnull name = nameof(t, 1);
503 98cd2746 2004-04-19 devnull Bprint(b, "sizeof%s = %lud;\n", name, t->xsizeof);
504 98cd2746 2004-04-19 devnull Bprint(b, "aggr %s {\n", name);
505 98cd2746 2004-04-19 devnull nprint = 0;
506 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++){
507 98cd2746 2004-04-19 devnull tt = defer(t->t[j]);
508 98cd2746 2004-04-19 devnull if(tt && tt->equiv)
509 98cd2746 2004-04-19 devnull tt = tt->equiv;
510 98cd2746 2004-04-19 devnull if(tt == nil){
511 98cd2746 2004-04-19 devnull Bprint(b, "// oops: nil type\n");
512 98cd2746 2004-04-19 devnull continue;
514 98cd2746 2004-04-19 devnull switch(tt->ty){
515 98cd2746 2004-04-19 devnull default:
516 98cd2746 2004-04-19 devnull Bprint(b, "// oops: unknown type %d for %p/%s (%d,%d; %c,%s; %p)\n",
517 98cd2746 2004-04-19 devnull tt->ty, tt, fixname(t->tname[j]),
518 98cd2746 2004-04-19 devnull tt->n1, tt->n2, tt->sue ? tt->sue : '.', tt->suename, tt->sub);
519 98cd2746 2004-04-19 devnull Bprint(b, "// t->t[j] = %p\n", ttt=t->t[j]);
520 98cd2746 2004-04-19 devnull while(ttt){
521 98cd2746 2004-04-19 devnull Bprint(b, "// %s %d (%d,%d) sub %p\n", ttt->name, ttt->ty, ttt->n1, ttt->n2, ttt->sub);
522 98cd2746 2004-04-19 devnull ttt=ttt->sub;
524 98cd2746 2004-04-19 devnull case Base:
525 98cd2746 2004-04-19 devnull case Pointer:
526 98cd2746 2004-04-19 devnull case Enum:
527 98cd2746 2004-04-19 devnull case Array:
528 98cd2746 2004-04-19 devnull case Function:
529 98cd2746 2004-04-19 devnull nprint++;
530 98cd2746 2004-04-19 devnull Bprint(b, "\t'%c' %lud %s;\n", basecharof(tt), t->val[j], fixname(t->tname[j]));
532 98cd2746 2004-04-19 devnull case Aggr:
533 98cd2746 2004-04-19 devnull nprint++;
534 98cd2746 2004-04-19 devnull Bprint(b, "\t%s %lud %s;\n", nameof(tt, 1), t->val[j], fixname(t->tname[j]));
538 98cd2746 2004-04-19 devnull if(nprint == 0)
539 98cd2746 2004-04-19 devnull Bprint(b, "\t'X' 0 __dummy;\n");
540 98cd2746 2004-04-19 devnull Bprint(b, "};\n\n");
542 98cd2746 2004-04-19 devnull name = nameof(t, 1); /* might have smashed it */
543 98cd2746 2004-04-19 devnull Bprint(b, "defn %s(addr) { indent_%s(addr, \"\"); }\n", name, name);
544 98cd2746 2004-04-19 devnull Bprint(b, "defn\nindent_%s(addr, indent) {\n", name);
545 98cd2746 2004-04-19 devnull Bprint(b, "\tcomplex %s addr;\n", name);
546 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++){
547 98cd2746 2004-04-19 devnull name = fixname(t->tname[j]);
548 98cd2746 2004-04-19 devnull tt = defer(t->t[j]);
549 98cd2746 2004-04-19 devnull if(tt == nil){
550 98cd2746 2004-04-19 devnull Bprint(b, "// oops nil %s\n", name);
551 98cd2746 2004-04-19 devnull continue;
553 98cd2746 2004-04-19 devnull switch(tt->ty){
554 98cd2746 2004-04-19 devnull case Base:
556 98cd2746 2004-04-19 devnull Bprint(b, "\tprint(indent, \"%s\t\", addr.%s, \"\\n\");\n",
557 98cd2746 2004-04-19 devnull name, name);
559 98cd2746 2004-04-19 devnull case Pointer:
560 98cd2746 2004-04-19 devnull ttt = defer(tt->sub);
561 98cd2746 2004-04-19 devnull if(ttt && ttt->ty == Aggr)
562 f1ad4977 2004-05-23 devnull Bprint(b, "\tprint(indent, \"%s\t(%s)\", addr.%s, \"\\n\");\n",
563 98cd2746 2004-04-19 devnull name, nameof(ttt, 1), name);
565 98cd2746 2004-04-19 devnull goto base;
567 98cd2746 2004-04-19 devnull case Array:
568 98cd2746 2004-04-19 devnull Bprint(b, "\tprint(indent, \"%s\t\", addr.%s\\X, \"\\n\");\n",
569 98cd2746 2004-04-19 devnull name, name);
571 98cd2746 2004-04-19 devnull case Enum:
572 98cd2746 2004-04-19 devnull Bprint(b, "\tprint(indent, \"%s\t\", addr.%s, \" \", %s(addr.%s), \"\\n\");\n",
573 98cd2746 2004-04-19 devnull name, name, nameof(tt, 1), name);
575 98cd2746 2004-04-19 devnull case Aggr:
576 98cd2746 2004-04-19 devnull Bprint(b, "\tprint(indent, \"%s\t%s{\\n\");\n",
577 98cd2746 2004-04-19 devnull name, nameof(tt, 0));
578 98cd2746 2004-04-19 devnull Bprint(b, "\tindent_%s(addr+%lud, indent+\" \");\n",
579 98cd2746 2004-04-19 devnull nameof(tt, 1), t->val[j]);
580 be36ff68 2004-04-29 devnull Bprint(b, "\tprint(indent, \"}\\n\");\n");
584 98cd2746 2004-04-19 devnull Bprint(b, "};\n\n");
587 98cd2746 2004-04-19 devnull case Enum:
588 98cd2746 2004-04-19 devnull name = nameof(t, 1);
589 98cd2746 2004-04-19 devnull Bprint(b, "// enum %s\n", name);
590 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++)
591 98cd2746 2004-04-19 devnull Bprint(b, "%s = %ld;\n", fixname(t->tname[j]), t->val[j]);
593 98cd2746 2004-04-19 devnull Bprint(b, "vals_%s = {\n", name);
594 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++)
595 98cd2746 2004-04-19 devnull Bprint(b, "\t%lud,\n", t->val[j]);
596 98cd2746 2004-04-19 devnull Bprint(b, "};\n");
597 98cd2746 2004-04-19 devnull Bprint(b, "names_%s = {\n", name);
598 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++)
599 98cd2746 2004-04-19 devnull Bprint(b, "\t\"%s\",\n", fixname(t->tname[j]));
600 98cd2746 2004-04-19 devnull Bprint(b, "};\n");
601 98cd2746 2004-04-19 devnull Bprint(b, "defn\n%s(val) {\n", name);
602 98cd2746 2004-04-19 devnull Bprint(b, "\tlocal i;\n");
603 98cd2746 2004-04-19 devnull Bprint(b, "\ti = match(val, vals_%s);\n", name);
604 98cd2746 2004-04-19 devnull Bprint(b, "\tif i >= 0 then return names_%s[i];\n", name);
605 98cd2746 2004-04-19 devnull Bprint(b, "\treturn \"???\";\n");
606 98cd2746 2004-04-19 devnull Bprint(b, "};\n");
612 98cd2746 2004-04-19 devnull printtypes(Biobuf *b)
614 98cd2746 2004-04-19 devnull int i, n, nn;
615 98cd2746 2004-04-19 devnull Type *t, *tt, **all;
616 98cd2746 2004-04-19 devnull TypeList *tl;
618 98cd2746 2004-04-19 devnull /* check that pointer resolved */
619 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl){
620 98cd2746 2004-04-19 devnull t = tl->hd;
621 98cd2746 2004-04-19 devnull if(t->ty==None){
622 98cd2746 2004-04-19 devnull if(t->n1 || t->n2)
623 98cd2746 2004-04-19 devnull warn("type %d,%d referenced but not defined", t->n1, t->n2);
624 98cd2746 2004-04-19 devnull else if(t->sue && t->suename)
625 98cd2746 2004-04-19 devnull warn("%s %s referenced but not defined",
626 98cd2746 2004-04-19 devnull t->sue=='s' ? "struct" :
627 98cd2746 2004-04-19 devnull t->sue=='u' ? "union" :
628 98cd2746 2004-04-19 devnull t->sue=='e' ? "enum" : "???", t->suename);
632 98cd2746 2004-04-19 devnull /* push typedefs down, base types up */
634 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl){
636 98cd2746 2004-04-19 devnull t = tl->hd;
637 98cd2746 2004-04-19 devnull if(t->ty == Typedef || t->ty == Defer)
638 98cd2746 2004-04-19 devnull dotypedef(t);
641 98cd2746 2004-04-19 devnull /* push ranges around */
642 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl)
643 98cd2746 2004-04-19 devnull dorange(tl->hd);
646 98cd2746 2004-04-19 devnull * only take one type of a given name; acid is going to do this anyway,
647 98cd2746 2004-04-19 devnull * and this will reduce the amount of code we output considerably.
648 98cd2746 2004-04-19 devnull * we could run a DFA equivalence relaxation sort of algorithm
649 98cd2746 2004-04-19 devnull * to find the actual equivalence classes, and then rename types
650 98cd2746 2004-04-19 devnull * appropriately, but this will do for now.
652 98cd2746 2004-04-19 devnull all = emalloc(n*sizeof(all[0]));
654 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl)
655 98cd2746 2004-04-19 devnull all[n++] = tl->hd;
657 df7993f9 2004-06-09 devnull careaboutaggrcount = 1;
658 98cd2746 2004-04-19 devnull qsort(all, n, sizeof(all[0]), qtypecmp);
659 df7993f9 2004-06-09 devnull careaboutaggrcount = 0;
662 98cd2746 2004-04-19 devnull for(i=0; i<n; i++){
663 98cd2746 2004-04-19 devnull if(i==0 || typecmp(all[i-1], all[i]) != 0)
664 98cd2746 2004-04-19 devnull all[nn++] = all[i];
666 98cd2746 2004-04-19 devnull all[i]->equiv = all[nn-1];
669 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl){
670 98cd2746 2004-04-19 devnull t = tl->hd;
671 98cd2746 2004-04-19 devnull tt = defer(t);
672 98cd2746 2004-04-19 devnull if(tt && tt->equiv)
673 98cd2746 2004-04-19 devnull t->equiv = tt->equiv;
676 98cd2746 2004-04-19 devnull for(i=0; i<nn; i++)
677 98cd2746 2004-04-19 devnull printtype(b, all[i]);
679 98cd2746 2004-04-19 devnull free(all);
683 98cd2746 2004-04-19 devnull freetypes(void)
685 98cd2746 2004-04-19 devnull memset(thash, 0, sizeof(thash));
686 98cd2746 2004-04-19 devnull memset(namehash, 0, sizeof namehash);