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 cbeb0b26 2006-04-01 devnull "FPSCR", "$FPSCR"
239 98cd2746 2004-04-19 devnull };
240 d58b36f9 2005-11-28 devnull
241 d58b36f9 2005-11-28 devnull char*
242 d58b36f9 2005-11-28 devnull nonempty(char *name)
243 d58b36f9 2005-11-28 devnull {
244 d58b36f9 2005-11-28 devnull if(name[0] == '\0')
245 d58b36f9 2005-11-28 devnull return "__empty__name__";
246 d58b36f9 2005-11-28 devnull return name;
247 d58b36f9 2005-11-28 devnull }
248 d58b36f9 2005-11-28 devnull
249 d58b36f9 2005-11-28 devnull char*
250 d58b36f9 2005-11-28 devnull cleanstl(char *name)
251 d58b36f9 2005-11-28 devnull {
252 d58b36f9 2005-11-28 devnull char *b, *p;
253 d58b36f9 2005-11-28 devnull static char buf[65536]; /* These can be huge. */
254 d58b36f9 2005-11-28 devnull
255 d58b36f9 2005-11-28 devnull if(strchr(name, '<') == nil)
256 d58b36f9 2005-11-28 devnull return nonempty(name);
257 d58b36f9 2005-11-28 devnull
258 d58b36f9 2005-11-28 devnull b = buf;
259 d58b36f9 2005-11-28 devnull for(p = name; *p != 0; p++){
260 d58b36f9 2005-11-28 devnull switch(*p){
261 d58b36f9 2005-11-28 devnull case '<':
262 d58b36f9 2005-11-28 devnull strcpy(b, "_L_");
263 d58b36f9 2005-11-28 devnull b += 3;
264 d58b36f9 2005-11-28 devnull break;
265 d58b36f9 2005-11-28 devnull case '>':
266 d58b36f9 2005-11-28 devnull strcpy(b, "_R_");
267 d58b36f9 2005-11-28 devnull b += 3;
268 d58b36f9 2005-11-28 devnull break;
269 d58b36f9 2005-11-28 devnull case '*':
270 d58b36f9 2005-11-28 devnull strcpy(b, "_A_");
271 d58b36f9 2005-11-28 devnull b += 3;
272 d58b36f9 2005-11-28 devnull break;
273 d58b36f9 2005-11-28 devnull case ',':
274 d58b36f9 2005-11-28 devnull strcpy(b, "_C_");
275 d58b36f9 2005-11-28 devnull b += 3;
276 d58b36f9 2005-11-28 devnull break;
277 d58b36f9 2005-11-28 devnull case '.':
278 d58b36f9 2005-11-28 devnull strcpy(b, "_D_");
279 d58b36f9 2005-11-28 devnull b += 3;
280 d58b36f9 2005-11-28 devnull break;
281 d58b36f9 2005-11-28 devnull default:
282 d58b36f9 2005-11-28 devnull *b++ = *p;
283 d58b36f9 2005-11-28 devnull break;
284 d58b36f9 2005-11-28 devnull }
285 d58b36f9 2005-11-28 devnull }
286 d58b36f9 2005-11-28 devnull *b = 0;
287 d58b36f9 2005-11-28 devnull return buf;
288 d58b36f9 2005-11-28 devnull }
289 98cd2746 2004-04-19 devnull
290 98cd2746 2004-04-19 devnull char*
291 98cd2746 2004-04-19 devnull fixname(char *name)
292 98cd2746 2004-04-19 devnull {
293 98cd2746 2004-04-19 devnull int i;
294 d58b36f9 2005-11-28 devnull char *s;
295 d58b36f9 2005-11-28 devnull static int nbuf;
296 d58b36f9 2005-11-28 devnull static char buf[8][65536];
297 98cd2746 2004-04-19 devnull
298 98cd2746 2004-04-19 devnull if(name == nil)
299 98cd2746 2004-04-19 devnull return nil;
300 d58b36f9 2005-11-28 devnull s = demangle(name, buf[nbuf], 1);
301 d58b36f9 2005-11-28 devnull if(s != name){
302 d58b36f9 2005-11-28 devnull if(++nbuf == nelem(buf))
303 d58b36f9 2005-11-28 devnull nbuf = 0;
304 d58b36f9 2005-11-28 devnull name = s;
305 d58b36f9 2005-11-28 devnull }
306 98cd2746 2004-04-19 devnull for(i=0; i<nelem(fixes); i++)
307 98cd2746 2004-04-19 devnull if(name[0]==fixes[i].old[0] && strcmp(name, fixes[i].old)==0)
308 d58b36f9 2005-11-28 devnull return nonempty(fixes[i].new);
309 d58b36f9 2005-11-28 devnull return nonempty(name);
310 98cd2746 2004-04-19 devnull }
311 98cd2746 2004-04-19 devnull
312 98cd2746 2004-04-19 devnull void
313 98cd2746 2004-04-19 devnull denumber(void)
314 98cd2746 2004-04-19 devnull {
315 98cd2746 2004-04-19 devnull memset(thash, 0, sizeof thash);
316 98cd2746 2004-04-19 devnull memset(namehash, 0, sizeof namehash);
317 98cd2746 2004-04-19 devnull }
318 98cd2746 2004-04-19 devnull
319 98cd2746 2004-04-19 devnull void
320 98cd2746 2004-04-19 devnull renumber(TypeList *tl, uint n1)
321 98cd2746 2004-04-19 devnull {
322 4a4a4f26 2005-11-28 devnull int n;
323 d58b36f9 2005-11-28 devnull Type *t, *tt;
324 98cd2746 2004-04-19 devnull
325 98cd2746 2004-04-19 devnull for(; tl; tl=tl->tl){
326 98cd2746 2004-04-19 devnull t = tl->hd;
327 d58b36f9 2005-11-28 devnull tt = typebynum(n1, t->n2);
328 d58b36f9 2005-11-28 devnull *tt = *t;
329 d58b36f9 2005-11-28 devnull tt->n1 = n1;
330 4a4a4f26 2005-11-28 devnull if(tt->n){
331 4a4a4f26 2005-11-28 devnull n = (tt->n+31)&~31;
332 4a4a4f26 2005-11-28 devnull if(tt->tname){
333 4a4a4f26 2005-11-28 devnull tt->tname = emalloc(n*sizeof tt->tname[0]);
334 4a4a4f26 2005-11-28 devnull memmove(tt->tname, t->tname, n*sizeof tt->tname[0]);
335 4a4a4f26 2005-11-28 devnull }
336 4a4a4f26 2005-11-28 devnull if(tt->val){
337 4a4a4f26 2005-11-28 devnull tt->val = emalloc(n*sizeof tt->val[0]);
338 4a4a4f26 2005-11-28 devnull memmove(tt->val, t->val, n*sizeof tt->val[0]);
339 4a4a4f26 2005-11-28 devnull }
340 4a4a4f26 2005-11-28 devnull if(tt->t){
341 4a4a4f26 2005-11-28 devnull tt->t = emalloc(n*sizeof tt->t[0]);
342 4a4a4f26 2005-11-28 devnull memmove(tt->t, t->t, n*sizeof tt->t[0]);
343 4a4a4f26 2005-11-28 devnull }
344 4a4a4f26 2005-11-28 devnull }
345 d58b36f9 2005-11-28 devnull addhash(tt);
346 98cd2746 2004-04-19 devnull }
347 98cd2746 2004-04-19 devnull }
348 98cd2746 2004-04-19 devnull
349 733e9d39 2004-04-21 devnull Type*
350 98cd2746 2004-04-19 devnull defer(Type *t)
351 98cd2746 2004-04-19 devnull {
352 98cd2746 2004-04-19 devnull Type *u, *oldt;
353 98cd2746 2004-04-19 devnull int n;
354 98cd2746 2004-04-19 devnull
355 d58b36f9 2005-11-28 devnull if(t == nil)
356 d58b36f9 2005-11-28 devnull return nil;
357 d58b36f9 2005-11-28 devnull
358 d58b36f9 2005-11-28 devnull /* XXX rob has return t; here */
359 98cd2746 2004-04-19 devnull u = t;
360 98cd2746 2004-04-19 devnull n = 0;
361 98cd2746 2004-04-19 devnull oldt = t;
362 98cd2746 2004-04-19 devnull while(t && (t->ty == Defer || t->ty == Typedef)){
363 98cd2746 2004-04-19 devnull if(n++%2)
364 98cd2746 2004-04-19 devnull u = u->sub;
365 98cd2746 2004-04-19 devnull t = t->sub;
366 98cd2746 2004-04-19 devnull if(t == u) /* cycle */
367 98cd2746 2004-04-19 devnull goto cycle;
368 98cd2746 2004-04-19 devnull }
369 d58b36f9 2005-11-28 devnull if(oldt != t)
370 d58b36f9 2005-11-28 devnull oldt->sub = t;
371 98cd2746 2004-04-19 devnull return t;
372 98cd2746 2004-04-19 devnull
373 98cd2746 2004-04-19 devnull cycle:
374 98cd2746 2004-04-19 devnull fprint(2, "cycle\n");
375 98cd2746 2004-04-19 devnull t = oldt;
376 98cd2746 2004-04-19 devnull n = 0;
377 98cd2746 2004-04-19 devnull while(t && (t->ty==Defer || t->ty==Typedef)){
378 98cd2746 2004-04-19 devnull fprint(2, "t %p/%d %s\n", t, t->ty, t->name);
379 98cd2746 2004-04-19 devnull if(t == u && n++ == 2)
380 98cd2746 2004-04-19 devnull break;
381 98cd2746 2004-04-19 devnull t = t->sub;
382 98cd2746 2004-04-19 devnull }
383 98cd2746 2004-04-19 devnull return u;
384 98cd2746 2004-04-19 devnull }
385 98cd2746 2004-04-19 devnull
386 98cd2746 2004-04-19 devnull static void
387 98cd2746 2004-04-19 devnull dotypedef(Type *t)
388 98cd2746 2004-04-19 devnull {
389 98cd2746 2004-04-19 devnull if(t->ty != Typedef && t->ty != Defer)
390 98cd2746 2004-04-19 devnull return;
391 98cd2746 2004-04-19 devnull
392 98cd2746 2004-04-19 devnull if(t->didtypedef)
393 98cd2746 2004-04-19 devnull return;
394 98cd2746 2004-04-19 devnull
395 98cd2746 2004-04-19 devnull t->didtypedef = 1;
396 98cd2746 2004-04-19 devnull if(t->sub == nil)
397 98cd2746 2004-04-19 devnull return;
398 98cd2746 2004-04-19 devnull
399 98cd2746 2004-04-19 devnull /* push names downward to remove anonymity */
400 98cd2746 2004-04-19 devnull if(t->name && t->sub->name == nil)
401 98cd2746 2004-04-19 devnull t->sub->name = t->name;
402 98cd2746 2004-04-19 devnull
403 98cd2746 2004-04-19 devnull dotypedef(t->sub);
404 98cd2746 2004-04-19 devnull }
405 98cd2746 2004-04-19 devnull
406 98cd2746 2004-04-19 devnull static int
407 98cd2746 2004-04-19 devnull countbytes(uvlong x)
408 98cd2746 2004-04-19 devnull {
409 98cd2746 2004-04-19 devnull int n;
410 98cd2746 2004-04-19 devnull
411 98cd2746 2004-04-19 devnull for(n=0; x; n++)
412 98cd2746 2004-04-19 devnull x>>=8;
413 98cd2746 2004-04-19 devnull return n;
414 98cd2746 2004-04-19 devnull }
415 98cd2746 2004-04-19 devnull
416 98cd2746 2004-04-19 devnull static void
417 98cd2746 2004-04-19 devnull dorange(Type *t)
418 98cd2746 2004-04-19 devnull {
419 98cd2746 2004-04-19 devnull Type *tt;
420 98cd2746 2004-04-19 devnull
421 98cd2746 2004-04-19 devnull if(t->ty != Range)
422 98cd2746 2004-04-19 devnull return;
423 98cd2746 2004-04-19 devnull if(t->didrange)
424 98cd2746 2004-04-19 devnull return;
425 98cd2746 2004-04-19 devnull t->didrange = 1;
426 98cd2746 2004-04-19 devnull tt = defer(t->sub);
427 98cd2746 2004-04-19 devnull if(tt == nil)
428 98cd2746 2004-04-19 devnull return;
429 98cd2746 2004-04-19 devnull dorange(tt);
430 98cd2746 2004-04-19 devnull if(t != tt && tt->ty != Base)
431 98cd2746 2004-04-19 devnull return;
432 98cd2746 2004-04-19 devnull t->ty = Base;
433 98cd2746 2004-04-19 devnull t->xsizeof = tt->xsizeof;
434 98cd2746 2004-04-19 devnull if(t->lo == 0)
435 98cd2746 2004-04-19 devnull t->printfmt = 'x';
436 98cd2746 2004-04-19 devnull else
437 98cd2746 2004-04-19 devnull t->printfmt = 'd';
438 98cd2746 2004-04-19 devnull if(t->xsizeof == 0)
439 98cd2746 2004-04-19 devnull t->xsizeof = countbytes(t->hi);
440 98cd2746 2004-04-19 devnull }
441 98cd2746 2004-04-19 devnull
442 e3de25fe 2005-11-29 devnull char*
443 e3de25fe 2005-11-29 devnull mkname(char *prefix, char *name)
444 e3de25fe 2005-11-29 devnull {
445 e3de25fe 2005-11-29 devnull static char buf[65536];
446 e3de25fe 2005-11-29 devnull
447 e3de25fe 2005-11-29 devnull snprint(buf, sizeof buf, "%s%s", prefix, name);
448 e3de25fe 2005-11-29 devnull return buf;
449 e3de25fe 2005-11-29 devnull }
450 98cd2746 2004-04-19 devnull
451 98cd2746 2004-04-19 devnull char*
452 98cd2746 2004-04-19 devnull nameof(Type *t, int doanon)
453 98cd2746 2004-04-19 devnull {
454 d58b36f9 2005-11-28 devnull static char buf[65536];
455 98cd2746 2004-04-19 devnull char *p;
456 98cd2746 2004-04-19 devnull
457 98cd2746 2004-04-19 devnull if(t->name)
458 98cd2746 2004-04-19 devnull strcpy(buf, fixname(t->name));
459 98cd2746 2004-04-19 devnull else if(t->suename)
460 98cd2746 2004-04-19 devnull snprint(buf, sizeof buf, "%s_%s", t->isunion ? "union" : "struct", t->suename);
461 98cd2746 2004-04-19 devnull else if(doanon)
462 98cd2746 2004-04-19 devnull snprint(buf, sizeof buf, "%s_%lud_", prefix, t->gen);
463 98cd2746 2004-04-19 devnull else
464 98cd2746 2004-04-19 devnull return "";
465 98cd2746 2004-04-19 devnull for(p=buf; *p; p++)
466 3bd56b04 2005-09-09 devnull if(isspace((uchar)*p))
467 98cd2746 2004-04-19 devnull *p = '_';
468 98cd2746 2004-04-19 devnull return buf;
469 98cd2746 2004-04-19 devnull }
470 98cd2746 2004-04-19 devnull
471 98cd2746 2004-04-19 devnull static char
472 cbeb0b26 2006-04-01 devnull basecharof(Type *t) /*XXX */
473 98cd2746 2004-04-19 devnull {
474 98cd2746 2004-04-19 devnull switch(t->xsizeof){
475 98cd2746 2004-04-19 devnull default:
476 98cd2746 2004-04-19 devnull return 'X';
477 98cd2746 2004-04-19 devnull case 1:
478 98cd2746 2004-04-19 devnull return 'b';
479 98cd2746 2004-04-19 devnull case 2:
480 98cd2746 2004-04-19 devnull if(t->printfmt=='d')
481 98cd2746 2004-04-19 devnull return 'd';
482 98cd2746 2004-04-19 devnull else
483 98cd2746 2004-04-19 devnull return 'x';
484 98cd2746 2004-04-19 devnull case 4:
485 98cd2746 2004-04-19 devnull if(t->printfmt=='d')
486 98cd2746 2004-04-19 devnull return 'D';
487 98cd2746 2004-04-19 devnull else if(t->printfmt=='f')
488 98cd2746 2004-04-19 devnull return 'f';
489 98cd2746 2004-04-19 devnull else
490 98cd2746 2004-04-19 devnull return 'X';
491 98cd2746 2004-04-19 devnull case 8:
492 98cd2746 2004-04-19 devnull if(t->printfmt=='d')
493 98cd2746 2004-04-19 devnull return 'V';
494 98cd2746 2004-04-19 devnull else if(t->printfmt=='f')
495 98cd2746 2004-04-19 devnull return 'F';
496 98cd2746 2004-04-19 devnull else
497 98cd2746 2004-04-19 devnull return 'Y';
498 98cd2746 2004-04-19 devnull }
499 98cd2746 2004-04-19 devnull }
500 98cd2746 2004-04-19 devnull
501 98cd2746 2004-04-19 devnull static int
502 98cd2746 2004-04-19 devnull nilstrcmp(char *a, char *b)
503 98cd2746 2004-04-19 devnull {
504 98cd2746 2004-04-19 devnull if(a == b)
505 98cd2746 2004-04-19 devnull return 0;
506 98cd2746 2004-04-19 devnull if(a == nil)
507 98cd2746 2004-04-19 devnull return -1;
508 98cd2746 2004-04-19 devnull if(b == nil)
509 98cd2746 2004-04-19 devnull return 1;
510 98cd2746 2004-04-19 devnull return strcmp(a, b);
511 98cd2746 2004-04-19 devnull }
512 df7993f9 2004-06-09 devnull
513 df7993f9 2004-06-09 devnull int careaboutaggrcount;
514 98cd2746 2004-04-19 devnull
515 98cd2746 2004-04-19 devnull static int
516 98cd2746 2004-04-19 devnull typecmp(Type *t, Type *u)
517 98cd2746 2004-04-19 devnull {
518 98cd2746 2004-04-19 devnull int i;
519 98cd2746 2004-04-19 devnull
520 98cd2746 2004-04-19 devnull if(t == u)
521 98cd2746 2004-04-19 devnull return 0;
522 98cd2746 2004-04-19 devnull if(t == nil)
523 98cd2746 2004-04-19 devnull return -1;
524 98cd2746 2004-04-19 devnull if(u == nil)
525 98cd2746 2004-04-19 devnull return 1;
526 98cd2746 2004-04-19 devnull
527 98cd2746 2004-04-19 devnull if(t->ty < u->ty)
528 98cd2746 2004-04-19 devnull return -1;
529 98cd2746 2004-04-19 devnull if(t->ty > u->ty)
530 98cd2746 2004-04-19 devnull return 1;
531 98cd2746 2004-04-19 devnull
532 98cd2746 2004-04-19 devnull if(t->isunion != u->isunion)
533 98cd2746 2004-04-19 devnull return t->isunion - u->isunion;
534 98cd2746 2004-04-19 devnull
535 98cd2746 2004-04-19 devnull i = nilstrcmp(t->name, u->name);
536 98cd2746 2004-04-19 devnull if(i)
537 98cd2746 2004-04-19 devnull return i;
538 98cd2746 2004-04-19 devnull
539 98cd2746 2004-04-19 devnull i = nilstrcmp(t->suename, u->suename);
540 98cd2746 2004-04-19 devnull if(i)
541 98cd2746 2004-04-19 devnull return i;
542 98cd2746 2004-04-19 devnull
543 df7993f9 2004-06-09 devnull if(careaboutaggrcount && t->ty == Aggr){
544 f1ad4977 2004-05-23 devnull if(t->n > u->n)
545 f1ad4977 2004-05-23 devnull return -1;
546 f1ad4977 2004-05-23 devnull if(t->n < u->n)
547 f1ad4977 2004-05-23 devnull return 1;
548 f1ad4977 2004-05-23 devnull }
549 f1ad4977 2004-05-23 devnull
550 98cd2746 2004-04-19 devnull if(t->name || t->suename)
551 98cd2746 2004-04-19 devnull return 0;
552 98cd2746 2004-04-19 devnull
553 98cd2746 2004-04-19 devnull if(t->ty==Enum){
554 98cd2746 2004-04-19 devnull if(t->n < u->n)
555 98cd2746 2004-04-19 devnull return -1;
556 98cd2746 2004-04-19 devnull if(t->n > u->n)
557 98cd2746 2004-04-19 devnull return 1;
558 98cd2746 2004-04-19 devnull if(t->n == 0)
559 98cd2746 2004-04-19 devnull return 0;
560 98cd2746 2004-04-19 devnull i = strcmp(t->tname[0], u->tname[0]);
561 98cd2746 2004-04-19 devnull return i;
562 98cd2746 2004-04-19 devnull }
563 98cd2746 2004-04-19 devnull if(t < u)
564 98cd2746 2004-04-19 devnull return -1;
565 98cd2746 2004-04-19 devnull if(t > u)
566 98cd2746 2004-04-19 devnull return 1;
567 98cd2746 2004-04-19 devnull return 0;
568 98cd2746 2004-04-19 devnull }
569 98cd2746 2004-04-19 devnull
570 98cd2746 2004-04-19 devnull static int
571 98cd2746 2004-04-19 devnull qtypecmp(const void *va, const void *vb)
572 98cd2746 2004-04-19 devnull {
573 98cd2746 2004-04-19 devnull Type *t, *u;
574 98cd2746 2004-04-19 devnull
575 98cd2746 2004-04-19 devnull t = *(Type**)va;
576 98cd2746 2004-04-19 devnull u = *(Type**)vb;
577 98cd2746 2004-04-19 devnull return typecmp(t, u);
578 98cd2746 2004-04-19 devnull }
579 98cd2746 2004-04-19 devnull
580 98cd2746 2004-04-19 devnull void
581 98cd2746 2004-04-19 devnull printtype(Biobuf *b, Type *t)
582 98cd2746 2004-04-19 devnull {
583 98cd2746 2004-04-19 devnull char *name;
584 98cd2746 2004-04-19 devnull int j, nprint;
585 98cd2746 2004-04-19 devnull Type *tt, *ttt;
586 98cd2746 2004-04-19 devnull
587 98cd2746 2004-04-19 devnull if(t->printed)
588 98cd2746 2004-04-19 devnull return;
589 98cd2746 2004-04-19 devnull t->printed = 1;
590 98cd2746 2004-04-19 devnull switch(t->ty){
591 98cd2746 2004-04-19 devnull case Aggr:
592 e3de25fe 2005-11-29 devnull name = nameof(t, 1);
593 e3de25fe 2005-11-29 devnull Bprint(b, "%B = %lud;\n", mkname("sizeof", name), t->xsizeof);
594 e3de25fe 2005-11-29 devnull Bprint(b, "aggr %B {\n", name);
595 98cd2746 2004-04-19 devnull nprint = 0;
596 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++){
597 98cd2746 2004-04-19 devnull tt = defer(t->t[j]);
598 98cd2746 2004-04-19 devnull if(tt && tt->equiv)
599 98cd2746 2004-04-19 devnull tt = tt->equiv;
600 98cd2746 2004-04-19 devnull if(tt == nil){
601 98cd2746 2004-04-19 devnull Bprint(b, "// oops: nil type\n");
602 98cd2746 2004-04-19 devnull continue;
603 98cd2746 2004-04-19 devnull }
604 98cd2746 2004-04-19 devnull switch(tt->ty){
605 98cd2746 2004-04-19 devnull default:
606 98cd2746 2004-04-19 devnull Bprint(b, "// oops: unknown type %d for %p/%s (%d,%d; %c,%s; %p)\n",
607 98cd2746 2004-04-19 devnull tt->ty, tt, fixname(t->tname[j]),
608 98cd2746 2004-04-19 devnull tt->n1, tt->n2, tt->sue ? tt->sue : '.', tt->suename, tt->sub);
609 d58b36f9 2005-11-28 devnull if(0){
610 98cd2746 2004-04-19 devnull Bprint(b, "// t->t[j] = %p\n", ttt=t->t[j]);
611 98cd2746 2004-04-19 devnull while(ttt){
612 98cd2746 2004-04-19 devnull Bprint(b, "// %s %d (%d,%d) sub %p\n", ttt->name, ttt->ty, ttt->n1, ttt->n2, ttt->sub);
613 98cd2746 2004-04-19 devnull ttt=ttt->sub;
614 98cd2746 2004-04-19 devnull }
615 d58b36f9 2005-11-28 devnull }
616 98cd2746 2004-04-19 devnull case Base:
617 98cd2746 2004-04-19 devnull case Pointer:
618 98cd2746 2004-04-19 devnull case Enum:
619 98cd2746 2004-04-19 devnull case Array:
620 98cd2746 2004-04-19 devnull case Function:
621 98cd2746 2004-04-19 devnull nprint++;
622 e3de25fe 2005-11-29 devnull Bprint(b, "\t'%c' %lud %B;\n", basecharof(tt), t->val[j], fixname(t->tname[j]));
623 98cd2746 2004-04-19 devnull break;
624 98cd2746 2004-04-19 devnull case Aggr:
625 98cd2746 2004-04-19 devnull nprint++;
626 e3de25fe 2005-11-29 devnull Bprint(b, "\t%B %lud %B;\n", nameof(tt, 1), t->val[j], fixname(t->tname[j]));
627 98cd2746 2004-04-19 devnull break;
628 98cd2746 2004-04-19 devnull }
629 98cd2746 2004-04-19 devnull }
630 98cd2746 2004-04-19 devnull if(nprint == 0)
631 98cd2746 2004-04-19 devnull Bprint(b, "\t'X' 0 __dummy;\n");
632 98cd2746 2004-04-19 devnull Bprint(b, "};\n\n");
633 98cd2746 2004-04-19 devnull
634 e3de25fe 2005-11-29 devnull name = nameof(t, 1); /* might have smashed it */
635 e3de25fe 2005-11-29 devnull Bprint(b, "defn %B(addr) { %B(addr, \"\"); }\n", name, mkname("indent_", name));
636 e3de25fe 2005-11-29 devnull Bprint(b, "defn %B(addr, indent) {\n", mkname("indent_", name));
637 e3de25fe 2005-11-29 devnull Bprint(b, "\tcomplex %B addr;\n", name);
638 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++){
639 98cd2746 2004-04-19 devnull name = fixname(t->tname[j]);
640 98cd2746 2004-04-19 devnull tt = defer(t->t[j]);
641 98cd2746 2004-04-19 devnull if(tt == nil){
642 98cd2746 2004-04-19 devnull Bprint(b, "// oops nil %s\n", name);
643 98cd2746 2004-04-19 devnull continue;
644 98cd2746 2004-04-19 devnull }
645 98cd2746 2004-04-19 devnull switch(tt->ty){
646 98cd2746 2004-04-19 devnull case Base:
647 98cd2746 2004-04-19 devnull base:
648 e3de25fe 2005-11-29 devnull Bprint(b, "\tprint(indent, \"%s\t\", addr.%B, \"\\n\");\n",
649 98cd2746 2004-04-19 devnull name, name);
650 98cd2746 2004-04-19 devnull break;
651 98cd2746 2004-04-19 devnull case Pointer:
652 98cd2746 2004-04-19 devnull ttt = defer(tt->sub);
653 98cd2746 2004-04-19 devnull if(ttt && ttt->ty == Aggr)
654 e3de25fe 2005-11-29 devnull Bprint(b, "\tprint(indent, \"%s\t(%s)\", addr.%B, \"\\n\");\n",
655 98cd2746 2004-04-19 devnull name, nameof(ttt, 1), name);
656 98cd2746 2004-04-19 devnull else
657 98cd2746 2004-04-19 devnull goto base;
658 98cd2746 2004-04-19 devnull break;
659 98cd2746 2004-04-19 devnull case Array:
660 e3de25fe 2005-11-29 devnull Bprint(b, "\tprint(indent, \"%s\t\", addr.%B\\X, \"\\n\");\n",
661 98cd2746 2004-04-19 devnull name, name);
662 98cd2746 2004-04-19 devnull break;
663 98cd2746 2004-04-19 devnull case Enum:
664 e3de25fe 2005-11-29 devnull Bprint(b, "\tprint(indent, \"%s\t\", addr.%B, \" \", %B(addr.%B), \"\\n\");\n",
665 98cd2746 2004-04-19 devnull name, name, nameof(tt, 1), name);
666 98cd2746 2004-04-19 devnull break;
667 98cd2746 2004-04-19 devnull case Aggr:
668 98cd2746 2004-04-19 devnull Bprint(b, "\tprint(indent, \"%s\t%s{\\n\");\n",
669 98cd2746 2004-04-19 devnull name, nameof(tt, 0));
670 e3de25fe 2005-11-29 devnull Bprint(b, "\t%B(addr+%lud, indent+\" \");\n",
671 e3de25fe 2005-11-29 devnull mkname("indent_", nameof(tt, 1)), t->val[j]);
672 be36ff68 2004-04-29 devnull Bprint(b, "\tprint(indent, \"}\\n\");\n");
673 98cd2746 2004-04-19 devnull break;
674 98cd2746 2004-04-19 devnull }
675 98cd2746 2004-04-19 devnull }
676 98cd2746 2004-04-19 devnull Bprint(b, "};\n\n");
677 98cd2746 2004-04-19 devnull break;
678 98cd2746 2004-04-19 devnull
679 98cd2746 2004-04-19 devnull case Enum:
680 98cd2746 2004-04-19 devnull name = nameof(t, 1);
681 98cd2746 2004-04-19 devnull Bprint(b, "// enum %s\n", name);
682 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++)
683 e3de25fe 2005-11-29 devnull Bprint(b, "%B = %ld;\n", fixname(t->tname[j]), t->val[j]);
684 98cd2746 2004-04-19 devnull
685 e3de25fe 2005-11-29 devnull Bprint(b, "%B = {\n", mkname("vals_", name));
686 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++)
687 98cd2746 2004-04-19 devnull Bprint(b, "\t%lud,\n", t->val[j]);
688 98cd2746 2004-04-19 devnull Bprint(b, "};\n");
689 e3de25fe 2005-11-29 devnull Bprint(b, "%B = {\n", mkname("names_", name));
690 98cd2746 2004-04-19 devnull for(j=0; j<t->n; j++)
691 98cd2746 2004-04-19 devnull Bprint(b, "\t\"%s\",\n", fixname(t->tname[j]));
692 98cd2746 2004-04-19 devnull Bprint(b, "};\n");
693 e3de25fe 2005-11-29 devnull Bprint(b, "defn %B(val) {\n", name);
694 98cd2746 2004-04-19 devnull Bprint(b, "\tlocal i;\n");
695 e3de25fe 2005-11-29 devnull Bprint(b, "\ti = match(val, %B);\n", mkname("vals_", name));
696 e3de25fe 2005-11-29 devnull Bprint(b, "\tif i >= 0 then return %B[i];\n", mkname("names_", name));
697 98cd2746 2004-04-19 devnull Bprint(b, "\treturn \"???\";\n");
698 98cd2746 2004-04-19 devnull Bprint(b, "};\n");
699 98cd2746 2004-04-19 devnull break;
700 98cd2746 2004-04-19 devnull }
701 98cd2746 2004-04-19 devnull }
702 98cd2746 2004-04-19 devnull
703 98cd2746 2004-04-19 devnull void
704 98cd2746 2004-04-19 devnull printtypes(Biobuf *b)
705 98cd2746 2004-04-19 devnull {
706 98cd2746 2004-04-19 devnull int i, n, nn;
707 98cd2746 2004-04-19 devnull Type *t, *tt, **all;
708 98cd2746 2004-04-19 devnull TypeList *tl;
709 98cd2746 2004-04-19 devnull
710 98cd2746 2004-04-19 devnull /* check that pointer resolved */
711 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl){
712 98cd2746 2004-04-19 devnull t = tl->hd;
713 98cd2746 2004-04-19 devnull if(t->ty==None){
714 98cd2746 2004-04-19 devnull if(t->n1 || t->n2)
715 d58b36f9 2005-11-28 devnull warn("type %d,%d referenced but not defined - %p", t->n1, t->n2, t);
716 98cd2746 2004-04-19 devnull else if(t->sue && t->suename)
717 98cd2746 2004-04-19 devnull warn("%s %s referenced but not defined",
718 98cd2746 2004-04-19 devnull t->sue=='s' ? "struct" :
719 98cd2746 2004-04-19 devnull t->sue=='u' ? "union" :
720 98cd2746 2004-04-19 devnull t->sue=='e' ? "enum" : "???", t->suename);
721 98cd2746 2004-04-19 devnull }
722 98cd2746 2004-04-19 devnull }
723 98cd2746 2004-04-19 devnull
724 98cd2746 2004-04-19 devnull /* push typedefs down, base types up */
725 98cd2746 2004-04-19 devnull n = 0;
726 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl){
727 98cd2746 2004-04-19 devnull n++;
728 98cd2746 2004-04-19 devnull t = tl->hd;
729 98cd2746 2004-04-19 devnull if(t->ty == Typedef || t->ty == Defer)
730 98cd2746 2004-04-19 devnull dotypedef(t);
731 98cd2746 2004-04-19 devnull }
732 98cd2746 2004-04-19 devnull
733 98cd2746 2004-04-19 devnull /* push ranges around */
734 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl)
735 98cd2746 2004-04-19 devnull dorange(tl->hd);
736 98cd2746 2004-04-19 devnull
737 98cd2746 2004-04-19 devnull /*
738 98cd2746 2004-04-19 devnull * only take one type of a given name; acid is going to do this anyway,
739 98cd2746 2004-04-19 devnull * and this will reduce the amount of code we output considerably.
740 98cd2746 2004-04-19 devnull * we could run a DFA equivalence relaxation sort of algorithm
741 98cd2746 2004-04-19 devnull * to find the actual equivalence classes, and then rename types
742 98cd2746 2004-04-19 devnull * appropriately, but this will do for now.
743 98cd2746 2004-04-19 devnull */
744 98cd2746 2004-04-19 devnull all = emalloc(n*sizeof(all[0]));
745 98cd2746 2004-04-19 devnull n = 0;
746 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl)
747 98cd2746 2004-04-19 devnull all[n++] = tl->hd;
748 98cd2746 2004-04-19 devnull
749 df7993f9 2004-06-09 devnull careaboutaggrcount = 1;
750 98cd2746 2004-04-19 devnull qsort(all, n, sizeof(all[0]), qtypecmp);
751 df7993f9 2004-06-09 devnull careaboutaggrcount = 0;
752 98cd2746 2004-04-19 devnull
753 98cd2746 2004-04-19 devnull nn = 0;
754 98cd2746 2004-04-19 devnull for(i=0; i<n; i++){
755 98cd2746 2004-04-19 devnull if(i==0 || typecmp(all[i-1], all[i]) != 0)
756 98cd2746 2004-04-19 devnull all[nn++] = all[i];
757 98cd2746 2004-04-19 devnull else
758 98cd2746 2004-04-19 devnull all[i]->equiv = all[nn-1];
759 98cd2746 2004-04-19 devnull }
760 98cd2746 2004-04-19 devnull
761 98cd2746 2004-04-19 devnull for(tl=alltypes; tl; tl=tl->tl){
762 98cd2746 2004-04-19 devnull t = tl->hd;
763 98cd2746 2004-04-19 devnull tt = defer(t);
764 98cd2746 2004-04-19 devnull if(tt && tt->equiv)
765 98cd2746 2004-04-19 devnull t->equiv = tt->equiv;
766 98cd2746 2004-04-19 devnull }
767 98cd2746 2004-04-19 devnull
768 98cd2746 2004-04-19 devnull for(i=0; i<nn; i++)
769 98cd2746 2004-04-19 devnull printtype(b, all[i]);
770 98cd2746 2004-04-19 devnull
771 98cd2746 2004-04-19 devnull free(all);
772 98cd2746 2004-04-19 devnull }
773 98cd2746 2004-04-19 devnull
774 98cd2746 2004-04-19 devnull void
775 98cd2746 2004-04-19 devnull freetypes(void)
776 98cd2746 2004-04-19 devnull {
777 98cd2746 2004-04-19 devnull memset(thash, 0, sizeof(thash));
778 98cd2746 2004-04-19 devnull memset(namehash, 0, sizeof namehash);
779 98cd2746 2004-04-19 devnull }