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 b16534fd 2005-02-11 devnull "var", "$var",
133 a05c312b 2005-01-23 devnull "whatis", "$whatis",
134 98cd2746 2004-04-19 devnull "while", "$while",
135 a05c312b 2005-01-23 devnull
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",
212 a05c312b 2005-01-23 devnull
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",
230 a05c312b 2005-01-23 devnull
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",
239 98cd2746 2004-04-19 devnull };
240 98cd2746 2004-04-19 devnull
241 98cd2746 2004-04-19 devnull char*
242 98cd2746 2004-04-19 devnull fixname(char *name)
243 98cd2746 2004-04-19 devnull {
244 98cd2746 2004-04-19 devnull int i;
245 98cd2746 2004-04-19 devnull
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;
252 98cd2746 2004-04-19 devnull }
253 98cd2746 2004-04-19 devnull
254 98cd2746 2004-04-19 devnull void
255 98cd2746 2004-04-19 devnull denumber(void)
256 98cd2746 2004-04-19 devnull {
257 98cd2746 2004-04-19 devnull memset(thash, 0, sizeof thash);
258 98cd2746 2004-04-19 devnull memset(namehash, 0, sizeof namehash);
259 98cd2746 2004-04-19 devnull }
260 98cd2746 2004-04-19 devnull
261 98cd2746 2004-04-19 devnull void
262 98cd2746 2004-04-19 devnull renumber(TypeList *tl, uint n1)
263 98cd2746 2004-04-19 devnull {
264 98cd2746 2004-04-19 devnull Type *t;
265 98cd2746 2004-04-19 devnull
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);
270 98cd2746 2004-04-19 devnull }
271 98cd2746 2004-04-19 devnull }
272 98cd2746 2004-04-19 devnull
273 733e9d39 2004-04-21 devnull Type*
274 98cd2746 2004-04-19 devnull defer(Type *t)
275 98cd2746 2004-04-19 devnull {
276 98cd2746 2004-04-19 devnull Type *u, *oldt;
277 98cd2746 2004-04-19 devnull int n;
278 98cd2746 2004-04-19 devnull
279 98cd2746 2004-04-19 devnull u = t;
280 98cd2746 2004-04-19 devnull n = 0;
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;
288 98cd2746 2004-04-19 devnull }
289 98cd2746 2004-04-19 devnull return t;
290 98cd2746 2004-04-19 devnull
291 98cd2746 2004-04-19 devnull cycle:
292 98cd2746 2004-04-19 devnull fprint(2, "cycle\n");
293 98cd2746 2004-04-19 devnull t = oldt;
294 98cd2746 2004-04-19 devnull n = 0;
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)
298 98cd2746 2004-04-19 devnull break;
299 98cd2746 2004-04-19 devnull t = t->sub;
300 98cd2746 2004-04-19 devnull }
301 98cd2746 2004-04-19 devnull return u;
302 98cd2746 2004-04-19 devnull }
303 98cd2746 2004-04-19 devnull
304 98cd2746 2004-04-19 devnull static void
305 98cd2746 2004-04-19 devnull dotypedef(Type *t)
306 98cd2746 2004-04-19 devnull {
307 98cd2746 2004-04-19 devnull if(t->ty != Typedef && t->ty != Defer)
308 98cd2746 2004-04-19 devnull return;
309 98cd2746 2004-04-19 devnull
310 98cd2746 2004-04-19 devnull if(t->didtypedef)
311 98cd2746 2004-04-19 devnull return;
312 98cd2746 2004-04-19 devnull
313 98cd2746 2004-04-19 devnull t->didtypedef = 1;
314 98cd2746 2004-04-19 devnull if(t->sub == nil)
315 98cd2746 2004-04-19 devnull return;
316 98cd2746 2004-04-19 devnull
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;
320 98cd2746 2004-04-19 devnull
321 98cd2746 2004-04-19 devnull dotypedef(t->sub);
322 98cd2746 2004-04-19 devnull }
323 98cd2746 2004-04-19 devnull
324 98cd2746 2004-04-19 devnull static int
325 98cd2746 2004-04-19 devnull countbytes(uvlong x)
326 98cd2746 2004-04-19 devnull {
327 98cd2746 2004-04-19 devnull int n;
328 98cd2746 2004-04-19 devnull
329 98cd2746 2004-04-19 devnull for(n=0; x; n++)
330 98cd2746 2004-04-19 devnull x>>=8;
331 98cd2746 2004-04-19 devnull return n;
332 98cd2746 2004-04-19 devnull }
333 98cd2746 2004-04-19 devnull
334 98cd2746 2004-04-19 devnull static void
335 98cd2746 2004-04-19 devnull dorange(Type *t)
336 98cd2746 2004-04-19 devnull {
337 98cd2746 2004-04-19 devnull Type *tt;
338 98cd2746 2004-04-19 devnull
339 98cd2746 2004-04-19 devnull if(t->ty != Range)
340 98cd2746 2004-04-19 devnull return;
341 98cd2746 2004-04-19 devnull if(t->didrange)
342 98cd2746 2004-04-19 devnull return;
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)
346 98cd2746 2004-04-19 devnull return;
347 98cd2746 2004-04-19 devnull dorange(tt);
348 98cd2746 2004-04-19 devnull if(t != tt && tt->ty != Base)
349 98cd2746 2004-04-19 devnull return;
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';
354 98cd2746 2004-04-19 devnull else
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);
358 98cd2746 2004-04-19 devnull }
359 98cd2746 2004-04-19 devnull
360 98cd2746 2004-04-19 devnull
361 98cd2746 2004-04-19 devnull char*
362 98cd2746 2004-04-19 devnull nameof(Type *t, int doanon)
363 98cd2746 2004-04-19 devnull {
364 98cd2746 2004-04-19 devnull static char buf[1024];
365 98cd2746 2004-04-19 devnull char *p;
366 98cd2746 2004-04-19 devnull
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);
373 98cd2746 2004-04-19 devnull else
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;
379 98cd2746 2004-04-19 devnull }
380 98cd2746 2004-04-19 devnull
381 98cd2746 2004-04-19 devnull static char
382 98cd2746 2004-04-19 devnull basecharof(Type *t) //XXX
383 98cd2746 2004-04-19 devnull {
384 98cd2746 2004-04-19 devnull switch(t->xsizeof){
385 98cd2746 2004-04-19 devnull default:
386 98cd2746 2004-04-19 devnull return 'X';
387 98cd2746 2004-04-19 devnull case 1:
388 98cd2746 2004-04-19 devnull return 'b';
389 98cd2746 2004-04-19 devnull case 2:
390 98cd2746 2004-04-19 devnull if(t->printfmt=='d')
391 98cd2746 2004-04-19 devnull return 'd';
392 98cd2746 2004-04-19 devnull else
393 98cd2746 2004-04-19 devnull return 'x';
394 98cd2746 2004-04-19 devnull case 4:
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';
399 98cd2746 2004-04-19 devnull else
400 98cd2746 2004-04-19 devnull return 'X';
401 98cd2746 2004-04-19 devnull case 8:
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';
406 98cd2746 2004-04-19 devnull else
407 98cd2746 2004-04-19 devnull return 'Y';
408 98cd2746 2004-04-19 devnull }
409 98cd2746 2004-04-19 devnull }
410 98cd2746 2004-04-19 devnull
411 98cd2746 2004-04-19 devnull static int
412 98cd2746 2004-04-19 devnull nilstrcmp(char *a, char *b)
413 98cd2746 2004-04-19 devnull {
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);
421 98cd2746 2004-04-19 devnull }
422 df7993f9 2004-06-09 devnull
423 df7993f9 2004-06-09 devnull int careaboutaggrcount;
424 98cd2746 2004-04-19 devnull
425 98cd2746 2004-04-19 devnull static int
426 98cd2746 2004-04-19 devnull typecmp(Type *t, Type *u)
427 98cd2746 2004-04-19 devnull {
428 98cd2746 2004-04-19 devnull int i;
429 98cd2746 2004-04-19 devnull
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;
436 98cd2746 2004-04-19 devnull
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;
441 98cd2746 2004-04-19 devnull
442 98cd2746 2004-04-19 devnull if(t->isunion != u->isunion)
443 98cd2746 2004-04-19 devnull return t->isunion - u->isunion;
444 98cd2746 2004-04-19 devnull
445 98cd2746 2004-04-19 devnull i = nilstrcmp(t->name, u->name);
446 98cd2746 2004-04-19 devnull if(i)
447 98cd2746 2004-04-19 devnull return i;
448 98cd2746 2004-04-19 devnull
449 98cd2746 2004-04-19 devnull i = nilstrcmp(t->suename, u->suename);
450 98cd2746 2004-04-19 devnull if(i)
451 98cd2746 2004-04-19 devnull return i;
452 98cd2746 2004-04-19 devnull
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;
458 f1ad4977 2004-05-23 devnull }
459 f1ad4977 2004-05-23 devnull
460 98cd2746 2004-04-19 devnull if(t->name || t->suename)
461 98cd2746 2004-04-19 devnull return 0;
462 98cd2746 2004-04-19 devnull
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;
472 98cd2746 2004-04-19 devnull }
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;
478 98cd2746 2004-04-19 devnull }
479 98cd2746 2004-04-19 devnull
480 98cd2746 2004-04-19 devnull static int
481 98cd2746 2004-04-19 devnull qtypecmp(const void *va, const void *vb)
482 98cd2746 2004-04-19 devnull {
483 98cd2746 2004-04-19 devnull Type *t, *u;
484 98cd2746 2004-04-19 devnull
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);
488 98cd2746 2004-04-19 devnull }
489 98cd2746 2004-04-19 devnull
490 98cd2746 2004-04-19 devnull void
491 98cd2746 2004-04-19 devnull printtype(Biobuf *b, Type *t)
492 98cd2746 2004-04-19 devnull {
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;
496 98cd2746 2004-04-19 devnull
497 98cd2746 2004-04-19 devnull if(t->printed)
498 98cd2746 2004-04-19 devnull return;
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;
513 98cd2746 2004-04-19 devnull }
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;
523 98cd2746 2004-04-19 devnull }
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]));
531 98cd2746 2004-04-19 devnull break;
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]));
535 98cd2746 2004-04-19 devnull break;
536 98cd2746 2004-04-19 devnull }
537 98cd2746 2004-04-19 devnull }
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");
541 98cd2746 2004-04-19 devnull
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;
552 98cd2746 2004-04-19 devnull }
553 98cd2746 2004-04-19 devnull switch(tt->ty){
554 98cd2746 2004-04-19 devnull case Base:
555 98cd2746 2004-04-19 devnull 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);
558 98cd2746 2004-04-19 devnull break;
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);
564 98cd2746 2004-04-19 devnull else
565 98cd2746 2004-04-19 devnull goto base;
566 98cd2746 2004-04-19 devnull break;
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);
570 98cd2746 2004-04-19 devnull break;
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);
574 98cd2746 2004-04-19 devnull break;
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");
581 98cd2746 2004-04-19 devnull break;
582 98cd2746 2004-04-19 devnull }
583 98cd2746 2004-04-19 devnull }
584 98cd2746 2004-04-19 devnull Bprint(b, "};\n\n");
585 98cd2746 2004-04-19 devnull break;
586 98cd2746 2004-04-19 devnull
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]);
592 98cd2746 2004-04-19 devnull
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");
607 98cd2746 2004-04-19 devnull break;
608 98cd2746 2004-04-19 devnull }
609 98cd2746 2004-04-19 devnull }
610 98cd2746 2004-04-19 devnull
611 98cd2746 2004-04-19 devnull void
612 98cd2746 2004-04-19 devnull printtypes(Biobuf *b)
613 98cd2746 2004-04-19 devnull {
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;
617 98cd2746 2004-04-19 devnull
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);
629 98cd2746 2004-04-19 devnull }
630 98cd2746 2004-04-19 devnull }
631 98cd2746 2004-04-19 devnull
632 98cd2746 2004-04-19 devnull /* push typedefs down, base types up */
633 98cd2746 2004-04-19 devnull n = 0;
634 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl){
635 98cd2746 2004-04-19 devnull n++;
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);
639 98cd2746 2004-04-19 devnull }
640 98cd2746 2004-04-19 devnull
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);
644 98cd2746 2004-04-19 devnull
645 98cd2746 2004-04-19 devnull /*
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.
651 98cd2746 2004-04-19 devnull */
652 98cd2746 2004-04-19 devnull all = emalloc(n*sizeof(all[0]));
653 98cd2746 2004-04-19 devnull n = 0;
654 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl)
655 98cd2746 2004-04-19 devnull all[n++] = tl->hd;
656 98cd2746 2004-04-19 devnull
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;
660 98cd2746 2004-04-19 devnull
661 98cd2746 2004-04-19 devnull nn = 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];
665 98cd2746 2004-04-19 devnull else
666 98cd2746 2004-04-19 devnull all[i]->equiv = all[nn-1];
667 98cd2746 2004-04-19 devnull }
668 98cd2746 2004-04-19 devnull
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;
674 98cd2746 2004-04-19 devnull }
675 98cd2746 2004-04-19 devnull
676 98cd2746 2004-04-19 devnull for(i=0; i<nn; i++)
677 98cd2746 2004-04-19 devnull printtype(b, all[i]);
678 98cd2746 2004-04-19 devnull
679 98cd2746 2004-04-19 devnull free(all);
680 98cd2746 2004-04-19 devnull }
681 98cd2746 2004-04-19 devnull
682 98cd2746 2004-04-19 devnull void
683 98cd2746 2004-04-19 devnull freetypes(void)
684 98cd2746 2004-04-19 devnull {
685 98cd2746 2004-04-19 devnull memset(thash, 0, sizeof(thash));
686 98cd2746 2004-04-19 devnull memset(namehash, 0, sizeof namehash);
687 98cd2746 2004-04-19 devnull }