Blame


1 98cd2746 2004-04-19 devnull #include <u.h>
2 98cd2746 2004-04-19 devnull #include <errno.h>
3 98cd2746 2004-04-19 devnull #include <libc.h>
4 98cd2746 2004-04-19 devnull #include <bio.h>
5 98cd2746 2004-04-19 devnull #include <mach.h>
6 98cd2746 2004-04-19 devnull #include <stabs.h>
7 98cd2746 2004-04-19 devnull #include <ctype.h>
8 98cd2746 2004-04-19 devnull #include "dat.h"
9 98cd2746 2004-04-19 devnull
10 98cd2746 2004-04-19 devnull static jmp_buf kaboom;
11 98cd2746 2004-04-19 devnull
12 98cd2746 2004-04-19 devnull static Type *parsename(char*, char**);
13 98cd2746 2004-04-19 devnull static Type *parseinfo(char*, char**);
14 98cd2746 2004-04-19 devnull static int parsenum(char*, int*, int*, char**);
15 98cd2746 2004-04-19 devnull static int parseattr(char*, char**, char**);
16 98cd2746 2004-04-19 devnull static Type *parsedefn(char *p, Type *t, char **pp);
17 98cd2746 2004-04-19 devnull static int parsebound(char**);
18 98cd2746 2004-04-19 devnull static vlong parsebigint(char**);
19 98cd2746 2004-04-19 devnull
20 98cd2746 2004-04-19 devnull typedef struct Ftypes Ftypes;
21 98cd2746 2004-04-19 devnull struct Ftypes
22 98cd2746 2004-04-19 devnull {
23 98cd2746 2004-04-19 devnull Ftypes *down;
24 98cd2746 2004-04-19 devnull Ftypes *next;
25 98cd2746 2004-04-19 devnull char *file;
26 98cd2746 2004-04-19 devnull TypeList *list;
27 98cd2746 2004-04-19 devnull };
28 98cd2746 2004-04-19 devnull
29 98cd2746 2004-04-19 devnull Ftypes *fstack;
30 98cd2746 2004-04-19 devnull Ftypes *allftypes;
31 98cd2746 2004-04-19 devnull
32 98cd2746 2004-04-19 devnull static char*
33 98cd2746 2004-04-19 devnull estrndup(char *s, int n)
34 98cd2746 2004-04-19 devnull {
35 98cd2746 2004-04-19 devnull char *t;
36 98cd2746 2004-04-19 devnull
37 98cd2746 2004-04-19 devnull t = emalloc(n+1);
38 98cd2746 2004-04-19 devnull memmove(t, s, n);
39 98cd2746 2004-04-19 devnull return t;
40 98cd2746 2004-04-19 devnull }
41 98cd2746 2004-04-19 devnull
42 98cd2746 2004-04-19 devnull static char*
43 98cd2746 2004-04-19 devnull mkpath(char *dir, char *name)
44 98cd2746 2004-04-19 devnull {
45 98cd2746 2004-04-19 devnull char *s;
46 d58b36f9 2005-11-28 devnull if(name[0] == '/' || dir == nil)
47 98cd2746 2004-04-19 devnull return estrdup(name);
48 98cd2746 2004-04-19 devnull else{
49 98cd2746 2004-04-19 devnull s = emalloc(strlen(dir)+strlen(name)+1);
50 98cd2746 2004-04-19 devnull strcpy(s, dir);
51 98cd2746 2004-04-19 devnull strcat(s, name);
52 98cd2746 2004-04-19 devnull return s;
53 98cd2746 2004-04-19 devnull }
54 98cd2746 2004-04-19 devnull }
55 98cd2746 2004-04-19 devnull
56 98cd2746 2004-04-19 devnull static Ftypes*
57 98cd2746 2004-04-19 devnull mkftypes(char *dir, char *name)
58 98cd2746 2004-04-19 devnull {
59 98cd2746 2004-04-19 devnull Ftypes *f;
60 98cd2746 2004-04-19 devnull
61 98cd2746 2004-04-19 devnull f = emalloc(sizeof(*f));
62 98cd2746 2004-04-19 devnull f->file = mkpath(dir, name);
63 98cd2746 2004-04-19 devnull f->next = allftypes;
64 98cd2746 2004-04-19 devnull allftypes = f;
65 98cd2746 2004-04-19 devnull return f;
66 98cd2746 2004-04-19 devnull }
67 98cd2746 2004-04-19 devnull
68 98cd2746 2004-04-19 devnull static Ftypes*
69 98cd2746 2004-04-19 devnull findftypes(char *dir, char *name)
70 98cd2746 2004-04-19 devnull {
71 98cd2746 2004-04-19 devnull char *s;
72 98cd2746 2004-04-19 devnull Ftypes *f, *found;
73 98cd2746 2004-04-19 devnull
74 98cd2746 2004-04-19 devnull found = nil;
75 98cd2746 2004-04-19 devnull s = mkpath(dir, name);
76 98cd2746 2004-04-19 devnull for(f=allftypes; f; f=f->next)
77 98cd2746 2004-04-19 devnull if(strcmp(f->file, s) == 0)
78 98cd2746 2004-04-19 devnull found = f;
79 98cd2746 2004-04-19 devnull return found;
80 98cd2746 2004-04-19 devnull }
81 98cd2746 2004-04-19 devnull
82 98cd2746 2004-04-19 devnull static void
83 98cd2746 2004-04-19 devnull oops(void)
84 98cd2746 2004-04-19 devnull {
85 98cd2746 2004-04-19 devnull longjmp(kaboom, 1);
86 98cd2746 2004-04-19 devnull }
87 98cd2746 2004-04-19 devnull
88 98cd2746 2004-04-19 devnull /* find a : but skip over :: */
89 98cd2746 2004-04-19 devnull static char*
90 98cd2746 2004-04-19 devnull findcolon(char *p)
91 98cd2746 2004-04-19 devnull {
92 98cd2746 2004-04-19 devnull while((p = strchr(p, ':')) != nil && *(p+1) == ':')
93 98cd2746 2004-04-19 devnull p += 2;
94 98cd2746 2004-04-19 devnull if(p == nil)
95 98cd2746 2004-04-19 devnull oops();
96 98cd2746 2004-04-19 devnull return p;
97 98cd2746 2004-04-19 devnull }
98 98cd2746 2004-04-19 devnull
99 98cd2746 2004-04-19 devnull static void
100 98cd2746 2004-04-19 devnull semi(char **p)
101 98cd2746 2004-04-19 devnull {
102 98cd2746 2004-04-19 devnull if(**p != ';')
103 98cd2746 2004-04-19 devnull oops();
104 98cd2746 2004-04-19 devnull (*p)++;
105 98cd2746 2004-04-19 devnull }
106 98cd2746 2004-04-19 devnull
107 98cd2746 2004-04-19 devnull static void
108 98cd2746 2004-04-19 devnull comma(char **p)
109 98cd2746 2004-04-19 devnull {
110 98cd2746 2004-04-19 devnull if(**p != ',')
111 98cd2746 2004-04-19 devnull oops();
112 98cd2746 2004-04-19 devnull (*p)++;
113 98cd2746 2004-04-19 devnull }
114 98cd2746 2004-04-19 devnull
115 98cd2746 2004-04-19 devnull static int
116 98cd2746 2004-04-19 devnull parseint(char **pp)
117 98cd2746 2004-04-19 devnull {
118 3bd56b04 2005-09-09 devnull if(!isdigit((uchar)**pp))
119 98cd2746 2004-04-19 devnull oops();
120 98cd2746 2004-04-19 devnull return strtol(*pp, pp, 10);
121 98cd2746 2004-04-19 devnull }
122 98cd2746 2004-04-19 devnull
123 98cd2746 2004-04-19 devnull /*
124 98cd2746 2004-04-19 devnull name ::= symbol_opt info
125 98cd2746 2004-04-19 devnull */
126 98cd2746 2004-04-19 devnull static Type*
127 98cd2746 2004-04-19 devnull parsename(char *desc, char **pp)
128 98cd2746 2004-04-19 devnull {
129 98cd2746 2004-04-19 devnull if(*desc == 'c')
130 98cd2746 2004-04-19 devnull return nil;
131 98cd2746 2004-04-19 devnull
132 3bd56b04 2005-09-09 devnull if(isdigit((uchar)*desc) || *desc=='-' || *desc=='(')
133 98cd2746 2004-04-19 devnull return parseinfo(desc, pp);
134 98cd2746 2004-04-19 devnull if(*desc == 0)
135 98cd2746 2004-04-19 devnull oops();
136 98cd2746 2004-04-19 devnull return parseinfo(desc+1, pp);
137 98cd2746 2004-04-19 devnull }
138 98cd2746 2004-04-19 devnull
139 98cd2746 2004-04-19 devnull /*
140 98cd2746 2004-04-19 devnull info ::= num | num '=' attr* defn
141 98cd2746 2004-04-19 devnull */
142 98cd2746 2004-04-19 devnull static Type*
143 98cd2746 2004-04-19 devnull parseinfo(char *desc, char **pp)
144 98cd2746 2004-04-19 devnull {
145 98cd2746 2004-04-19 devnull int n1, n2;
146 98cd2746 2004-04-19 devnull Type *t;
147 98cd2746 2004-04-19 devnull char *attr;
148 98cd2746 2004-04-19 devnull
149 a8ec4910 2005-07-13 devnull n1 = n2 = 0;
150 98cd2746 2004-04-19 devnull parsenum(desc, &n1, &n2, &desc);
151 98cd2746 2004-04-19 devnull t = typebynum(n1, n2);
152 98cd2746 2004-04-19 devnull if(*desc != '='){
153 98cd2746 2004-04-19 devnull *pp = desc;
154 98cd2746 2004-04-19 devnull return t;
155 98cd2746 2004-04-19 devnull }
156 98cd2746 2004-04-19 devnull desc++;
157 98cd2746 2004-04-19 devnull if(fstack)
158 98cd2746 2004-04-19 devnull fstack->list = mktl(t, fstack->list);
159 98cd2746 2004-04-19 devnull while(parseattr(desc, &attr, &desc) >= 0){
160 98cd2746 2004-04-19 devnull if(*attr == 's')
161 98cd2746 2004-04-19 devnull t->xsizeof = atoi(attr+1)/8;
162 98cd2746 2004-04-19 devnull }
163 98cd2746 2004-04-19 devnull return parsedefn(desc, t, pp);
164 98cd2746 2004-04-19 devnull }
165 98cd2746 2004-04-19 devnull
166 98cd2746 2004-04-19 devnull /*
167 98cd2746 2004-04-19 devnull num ::= integer | '(' integer ',' integer ')'
168 98cd2746 2004-04-19 devnull */
169 98cd2746 2004-04-19 devnull static int
170 98cd2746 2004-04-19 devnull parsenum(char *p, int *n1, int *n2, char **pp)
171 98cd2746 2004-04-19 devnull {
172 3bd56b04 2005-09-09 devnull if(isdigit((uchar)*p)){
173 98cd2746 2004-04-19 devnull *n1 = strtol(p, &p, 10);
174 98cd2746 2004-04-19 devnull *n2 = 0;
175 98cd2746 2004-04-19 devnull *pp = p;
176 98cd2746 2004-04-19 devnull return 0;
177 98cd2746 2004-04-19 devnull }
178 98cd2746 2004-04-19 devnull if(*p == '('){
179 98cd2746 2004-04-19 devnull *n1 = strtol(p+1, &p, 10);
180 98cd2746 2004-04-19 devnull if(*p != ',')
181 98cd2746 2004-04-19 devnull oops();
182 98cd2746 2004-04-19 devnull *n2 = strtol(p+1, &p, 10);
183 98cd2746 2004-04-19 devnull if(*p != ')')
184 98cd2746 2004-04-19 devnull oops();
185 98cd2746 2004-04-19 devnull *pp = p+1;
186 98cd2746 2004-04-19 devnull return 0;
187 98cd2746 2004-04-19 devnull }
188 98cd2746 2004-04-19 devnull oops();
189 98cd2746 2004-04-19 devnull return -1;
190 98cd2746 2004-04-19 devnull }
191 98cd2746 2004-04-19 devnull
192 98cd2746 2004-04-19 devnull /*
193 98cd2746 2004-04-19 devnull attr ::= '@' text ';'
194 98cd2746 2004-04-19 devnull
195 fa325e9b 2020-01-10 cross text is
196 98cd2746 2004-04-19 devnull 'a' integer (alignment)
197 98cd2746 2004-04-19 devnull 'p' integer (pointer class)
198 98cd2746 2004-04-19 devnull 'P' (packed type)
199 98cd2746 2004-04-19 devnull 's' integer (size of type in bits)
200 98cd2746 2004-04-19 devnull 'S' (string instead of array of chars)
201 98cd2746 2004-04-19 devnull */
202 98cd2746 2004-04-19 devnull static int
203 98cd2746 2004-04-19 devnull parseattr(char *p, char **text, char **pp)
204 98cd2746 2004-04-19 devnull {
205 98cd2746 2004-04-19 devnull if(*p != '@')
206 98cd2746 2004-04-19 devnull return -1;
207 98cd2746 2004-04-19 devnull *text = p+1;
208 98cd2746 2004-04-19 devnull if((p = strchr(p, ';')) == nil)
209 98cd2746 2004-04-19 devnull oops();
210 98cd2746 2004-04-19 devnull *pp = p+1;
211 98cd2746 2004-04-19 devnull return 0;
212 98cd2746 2004-04-19 devnull }
213 98cd2746 2004-04-19 devnull
214 98cd2746 2004-04-19 devnull
215 98cd2746 2004-04-19 devnull typedef struct Basic Basic;
216 98cd2746 2004-04-19 devnull struct Basic
217 98cd2746 2004-04-19 devnull {
218 98cd2746 2004-04-19 devnull int size;
219 98cd2746 2004-04-19 devnull int fmt;
220 98cd2746 2004-04-19 devnull };
221 98cd2746 2004-04-19 devnull
222 98cd2746 2004-04-19 devnull static Basic baseints[] =
223 98cd2746 2004-04-19 devnull {
224 98cd2746 2004-04-19 devnull 0, 0,
225 98cd2746 2004-04-19 devnull /*1*/ 4, 'd', /* int32 */
226 98cd2746 2004-04-19 devnull /*2*/ 1, 'd', /* char8 */
227 98cd2746 2004-04-19 devnull /*3*/ 2, 'd', /* int16 */
228 98cd2746 2004-04-19 devnull /*4*/ 4, 'd', /* long int32 */
229 98cd2746 2004-04-19 devnull /*5*/ 1, 'x', /* uchar8 */
230 98cd2746 2004-04-19 devnull /*6*/ 1, 'd', /* schar8 */
231 98cd2746 2004-04-19 devnull /*7*/ 2, 'x', /* uint16 */
232 98cd2746 2004-04-19 devnull /*8*/ 4, 'x', /* uint32 */
233 98cd2746 2004-04-19 devnull /*9*/ 4, 'x', /* uint32 */
234 98cd2746 2004-04-19 devnull /*10*/ 4, 'x', /* ulong32 */
235 98cd2746 2004-04-19 devnull /*11*/ 0, 0, /* void */
236 98cd2746 2004-04-19 devnull /*12*/ 4, 'f', /* float */
237 98cd2746 2004-04-19 devnull /*13*/ 8, 'f', /* double */
238 98cd2746 2004-04-19 devnull /*14*/ 10, 'f', /* long double */
239 98cd2746 2004-04-19 devnull /*15*/ 4, 'd', /* int32 */
240 fa325e9b 2020-01-10 cross /*16*/ 4, 'd', /* bool32 */
241 98cd2746 2004-04-19 devnull /*17*/ 2, 'f', /* short real */
242 98cd2746 2004-04-19 devnull /*18*/ 4, 'f', /* real */
243 98cd2746 2004-04-19 devnull /*19*/ 4, 'x', /* stringptr */
244 98cd2746 2004-04-19 devnull /*20*/ 1, 'd', /* character8 */
245 98cd2746 2004-04-19 devnull /*21*/ 1, 'x', /* logical*1 */
246 98cd2746 2004-04-19 devnull /*22*/ 2, 'x', /* logical*2 */
247 98cd2746 2004-04-19 devnull /*23*/ 4, 'X', /* logical*4 */
248 98cd2746 2004-04-19 devnull /*24*/ 4, 'X', /* logical32 */
249 98cd2746 2004-04-19 devnull /*25*/ 8, 'F', /* complex (two single) */
250 98cd2746 2004-04-19 devnull /*26*/ 16, 'F', /* complex (two double) */
251 98cd2746 2004-04-19 devnull /*27*/ 1, 'd', /* integer*1 */
252 98cd2746 2004-04-19 devnull /*28*/ 2, 'd', /* integer*2 */
253 98cd2746 2004-04-19 devnull /*29*/ 4, 'd', /* integer*4 */
254 98cd2746 2004-04-19 devnull /*30*/ 2, 'x', /* wide char */
255 98cd2746 2004-04-19 devnull /*31*/ 8, 'd', /* int64 */
256 98cd2746 2004-04-19 devnull /*32*/ 8, 'x', /* uint64 */
257 98cd2746 2004-04-19 devnull /*33*/ 8, 'x', /* logical*8 */
258 98cd2746 2004-04-19 devnull /*34*/ 8, 'd', /* integer*8 */
259 98cd2746 2004-04-19 devnull };
260 98cd2746 2004-04-19 devnull
261 98cd2746 2004-04-19 devnull static Basic basefloats[] =
262 98cd2746 2004-04-19 devnull {
263 98cd2746 2004-04-19 devnull 0,0,
264 98cd2746 2004-04-19 devnull /*1*/ 4, 'f', /* 32-bit */
265 98cd2746 2004-04-19 devnull /*2*/ 8, 'f', /* 64-bit */
266 98cd2746 2004-04-19 devnull /*3*/ 8, 'F', /* complex */
267 98cd2746 2004-04-19 devnull /*4*/ 4, 'F', /* complex16 */
268 98cd2746 2004-04-19 devnull /*5*/ 8, 'F', /* complex32 */
269 98cd2746 2004-04-19 devnull /*6*/ 10, 'f', /* long double */
270 98cd2746 2004-04-19 devnull };
271 98cd2746 2004-04-19 devnull
272 98cd2746 2004-04-19 devnull /*
273 98cd2746 2004-04-19 devnull defn ::= info
274 98cd2746 2004-04-19 devnull | 'b' ('u' | 's') 'c'? width; offset; nbits; (builtin, signed/unsigned, char/not, width in bytes, offset & nbits of type)
275 98cd2746 2004-04-19 devnull | 'w' (aix wide char type, not used)
276 98cd2746 2004-04-19 devnull | 'R' fptype; bytes; (fptype 1=32-bit, 2=64-bit, 3=complex, 4=complex16, 5=complex32, 6=long double)
277 98cd2746 2004-04-19 devnull | 'g' typeinfo ';' nbits (aix floating, not used)
278 98cd2746 2004-04-19 devnull | 'c' typeinfo ';' nbits (aix complex, not used)
279 98cd2746 2004-04-19 devnull | 'b' typeinfo ';' bytes (ibm, no idea)
280 98cd2746 2004-04-19 devnull | 'B' typeinfo (volatile typref)
281 98cd2746 2004-04-19 devnull | 'd' typeinfo (file of typeref)
282 98cd2746 2004-04-19 devnull | 'k' typeinfo (const typeref)
283 98cd2746 2004-04-19 devnull | 'M' typeinfo ';' length (multiple instance type, fortran)
284 98cd2746 2004-04-19 devnull | 'S' typeinfo (set, typeref must have small number of values)
285 98cd2746 2004-04-19 devnull | '*' typeinfo (pointer to typeref)
286 98cd2746 2004-04-19 devnull | 'x' ('s'|'u'|'e') name ':' (struct, union, enum reference. name can have '::' in it)
287 98cd2746 2004-04-19 devnull | 'r' typeinfo ';' low ';' high ';' (subrange. typeref can be type being defined for base types!)
288 98cd2746 2004-04-19 devnull low and high are bounds
289 98cd2746 2004-04-19 devnull if bound is octal power of two, it's a big negative number
290 98cd2746 2004-04-19 devnull | ('a'|'P') indextypedef arraytypeinfo (array, index should be range type)
291 98cd2746 2004-04-19 devnull indextype is type definition not typeinfo (need not say typenum=)
292 98cd2746 2004-04-19 devnull P means packed array
293 98cd2746 2004-04-19 devnull | 'A' arraytypeinfo (open array (no index bounds))
294 98cd2746 2004-04-19 devnull | 'D' dims ';' typeinfo (dims-dimensional dynamic array)
295 98cd2746 2004-04-19 devnull | 'E' dims ';' typeinfo (subarray of N-dimensional array)
296 98cd2746 2004-04-19 devnull | 'n' typeinfo ';' bytes (max length string)
297 98cd2746 2004-04-19 devnull | 'z' typeinfo ';' bytes (no idea what difference is from 'n')
298 98cd2746 2004-04-19 devnull | 'N' (pascal stringptr)
299 98cd2746 2004-04-19 devnull | 'e' (name ':' bigint ',')* ';' (enum listing)
300 98cd2746 2004-04-19 devnull | ('s'|'u') bytes (name ':' type ',' bitoffset ',' bitsize ';')* ';' (struct/union defn)
301 98cd2746 2004-04-19 devnull tag is given as name in stabs entry, with 'T' symbol
302 98cd2746 2004-04-19 devnull | 'f' typeinfo ';' (function returning type)
303 98cd2746 2004-04-19 devnull | 'f' rettypeinfo ',' paramcount ';' (typeinfo ',' (0|1) ';')* ';'
304 98cd2746 2004-04-19 devnull | 'p' paramcount ';' (typeinfo ',' (0|1) ';')* ';'
305 98cd2746 2004-04-19 devnull | 'F' rettypeinfo ',' paramcount ';' (name ':' typeinfo ',' (0|1) ';')* ';'
306 98cd2746 2004-04-19 devnull | 'R' paramcount ';' (name ':' typeinfo ',' (0|1) ';')* ';'
307 98cd2746 2004-04-19 devnull (the 0 or 1 is pass-by-reference vs pass-by-value)
308 98cd2746 2004-04-19 devnull (the 0 or 1 is pass-by-reference vs pass-by-value)
309 98cd2746 2004-04-19 devnull */
310 98cd2746 2004-04-19 devnull
311 98cd2746 2004-04-19 devnull static Type*
312 98cd2746 2004-04-19 devnull parsedefn(char *p, Type *t, char **pp)
313 98cd2746 2004-04-19 devnull {
314 98cd2746 2004-04-19 devnull char c, *name;
315 98cd2746 2004-04-19 devnull int ischar, namelen, n, wid, offset, bits, sign;
316 98cd2746 2004-04-19 devnull long val;
317 98cd2746 2004-04-19 devnull Type *tt;
318 98cd2746 2004-04-19 devnull
319 3bd56b04 2005-09-09 devnull if(*p == '(' || isdigit((uchar)*p)){
320 98cd2746 2004-04-19 devnull t->ty = Defer;
321 98cd2746 2004-04-19 devnull t->sub = parseinfo(p, pp);
322 98cd2746 2004-04-19 devnull return t;
323 98cd2746 2004-04-19 devnull }
324 98cd2746 2004-04-19 devnull
325 98cd2746 2004-04-19 devnull switch(c = *p){
326 98cd2746 2004-04-19 devnull case '-': /* builtin */
327 98cd2746 2004-04-19 devnull n = strtol(p+1, &p, 10);
328 98cd2746 2004-04-19 devnull if(n >= nelem(baseints) || n < 0)
329 98cd2746 2004-04-19 devnull n = 0;
330 98cd2746 2004-04-19 devnull t->ty = Base;
331 98cd2746 2004-04-19 devnull t->xsizeof = baseints[n].size;
332 98cd2746 2004-04-19 devnull t->printfmt = baseints[n].fmt;
333 98cd2746 2004-04-19 devnull break;
334 98cd2746 2004-04-19 devnull case 'b': /* builtin */
335 98cd2746 2004-04-19 devnull p++;
336 98cd2746 2004-04-19 devnull if(*p != 'u' && *p != 's')
337 98cd2746 2004-04-19 devnull oops();
338 98cd2746 2004-04-19 devnull sign = (*p == 's');
339 98cd2746 2004-04-19 devnull p++;
340 c5bfba48 2012-10-21 rsc ischar = 0;
341 98cd2746 2004-04-19 devnull if(*p == 'c'){
342 98cd2746 2004-04-19 devnull ischar = 1;
343 98cd2746 2004-04-19 devnull p++;
344 98cd2746 2004-04-19 devnull }
345 98cd2746 2004-04-19 devnull wid = parseint(&p);
346 98cd2746 2004-04-19 devnull semi(&p);
347 98cd2746 2004-04-19 devnull offset = parseint(&p);
348 98cd2746 2004-04-19 devnull semi(&p);
349 98cd2746 2004-04-19 devnull bits = parseint(&p);
350 98cd2746 2004-04-19 devnull semi(&p);
351 98cd2746 2004-04-19 devnull t->ty = Base;
352 98cd2746 2004-04-19 devnull t->xsizeof = wid;
353 98cd2746 2004-04-19 devnull if(sign == 1)
354 98cd2746 2004-04-19 devnull t->printfmt = 'd';
355 98cd2746 2004-04-19 devnull else
356 98cd2746 2004-04-19 devnull t->printfmt = 'x';
357 c5bfba48 2012-10-21 rsc USED(bits);
358 c5bfba48 2012-10-21 rsc USED(ischar);
359 98cd2746 2004-04-19 devnull break;
360 98cd2746 2004-04-19 devnull case 'R': /* fp type */
361 98cd2746 2004-04-19 devnull n = parseint(&p);
362 98cd2746 2004-04-19 devnull semi(&p);
363 98cd2746 2004-04-19 devnull wid = parseint(&p);
364 98cd2746 2004-04-19 devnull semi(&p);
365 98cd2746 2004-04-19 devnull t->ty = Base;
366 98cd2746 2004-04-19 devnull t->xsizeof = wid;
367 98cd2746 2004-04-19 devnull if(n < 0 || n >= nelem(basefloats))
368 98cd2746 2004-04-19 devnull n = 0;
369 98cd2746 2004-04-19 devnull t->xsizeof = basefloats[n].size;
370 98cd2746 2004-04-19 devnull t->printfmt = basefloats[n].fmt;
371 98cd2746 2004-04-19 devnull break;
372 98cd2746 2004-04-19 devnull case 'r': /* subrange */
373 98cd2746 2004-04-19 devnull t->ty = Range;
374 98cd2746 2004-04-19 devnull t->sub = parseinfo(p+1, &p);
375 98cd2746 2004-04-19 devnull if(*(p-1) == ';' && *p != ';')
376 98cd2746 2004-04-19 devnull p--;
377 98cd2746 2004-04-19 devnull semi(&p);
378 98cd2746 2004-04-19 devnull t->lo = parsebound(&p);
379 98cd2746 2004-04-19 devnull semi(&p);
380 98cd2746 2004-04-19 devnull t->hi = parsebound(&p);
381 98cd2746 2004-04-19 devnull semi(&p);
382 98cd2746 2004-04-19 devnull break;
383 98cd2746 2004-04-19 devnull case 'B': /* volatile */
384 98cd2746 2004-04-19 devnull case 'k': /* const */
385 98cd2746 2004-04-19 devnull t->ty = Defer;
386 98cd2746 2004-04-19 devnull t->sub = parseinfo(p+1, &p);
387 98cd2746 2004-04-19 devnull break;
388 98cd2746 2004-04-19 devnull case '*': /* pointer */
389 98cd2746 2004-04-19 devnull case 'A': /* open array */
390 d58b36f9 2005-11-28 devnull case '&': /* reference */ /* guess - C++? (rob) */
391 98cd2746 2004-04-19 devnull t->ty = Pointer;
392 98cd2746 2004-04-19 devnull t->sub = parseinfo(p+1, &p);
393 98cd2746 2004-04-19 devnull break;
394 fa325e9b 2020-01-10 cross case 'a': /* array */
395 98cd2746 2004-04-19 devnull case 'P': /* packed array */
396 98cd2746 2004-04-19 devnull t->ty = Pointer;
397 98cd2746 2004-04-19 devnull tt = newtype();
398 98cd2746 2004-04-19 devnull parsedefn(p+1, tt, &p); /* index type */
399 98cd2746 2004-04-19 devnull if(*p == ';')
400 98cd2746 2004-04-19 devnull p++;
401 98cd2746 2004-04-19 devnull tt = newtype();
402 98cd2746 2004-04-19 devnull t->sub = tt;
403 98cd2746 2004-04-19 devnull parsedefn(p, tt, &p); /* element type */
404 98cd2746 2004-04-19 devnull break;
405 98cd2746 2004-04-19 devnull case 'e': /* enum listing */
406 98cd2746 2004-04-19 devnull p++;
407 98cd2746 2004-04-19 devnull t->sue = 'e';
408 98cd2746 2004-04-19 devnull t->ty = Enum;
409 98cd2746 2004-04-19 devnull while(*p != ';'){
410 98cd2746 2004-04-19 devnull name = p;
411 98cd2746 2004-04-19 devnull p = findcolon(p)+1;
412 98cd2746 2004-04-19 devnull namelen = (p-name)-1;
413 98cd2746 2004-04-19 devnull val = parsebigint(&p);
414 98cd2746 2004-04-19 devnull comma(&p);
415 98cd2746 2004-04-19 devnull if(t->n%32 == 0){
416 98cd2746 2004-04-19 devnull t->tname = erealloc(t->tname, (t->n+32)*sizeof(t->tname[0]));
417 98cd2746 2004-04-19 devnull t->val = erealloc(t->val, (t->n+32)*sizeof(t->val[0]));
418 98cd2746 2004-04-19 devnull }
419 98cd2746 2004-04-19 devnull t->tname[t->n] = estrndup(name, namelen);
420 98cd2746 2004-04-19 devnull t->val[t->n] = val;
421 98cd2746 2004-04-19 devnull t->n++;
422 98cd2746 2004-04-19 devnull }
423 98cd2746 2004-04-19 devnull semi(&p);
424 98cd2746 2004-04-19 devnull break;
425 fa325e9b 2020-01-10 cross
426 98cd2746 2004-04-19 devnull case 's': /* struct */
427 98cd2746 2004-04-19 devnull case 'u': /* union */
428 98cd2746 2004-04-19 devnull p++;
429 98cd2746 2004-04-19 devnull t->sue = c;
430 98cd2746 2004-04-19 devnull t->ty = Aggr;
431 98cd2746 2004-04-19 devnull n = parseint(&p);
432 98cd2746 2004-04-19 devnull while(*p != ';'){
433 98cd2746 2004-04-19 devnull name = p;
434 98cd2746 2004-04-19 devnull p = findcolon(p)+1;
435 98cd2746 2004-04-19 devnull namelen = (p-name)-1;
436 98cd2746 2004-04-19 devnull tt = parseinfo(p, &p);
437 98cd2746 2004-04-19 devnull comma(&p);
438 98cd2746 2004-04-19 devnull offset = parseint(&p);
439 98cd2746 2004-04-19 devnull comma(&p);
440 98cd2746 2004-04-19 devnull bits = parseint(&p);
441 98cd2746 2004-04-19 devnull semi(&p);
442 98cd2746 2004-04-19 devnull if(t->n%32 == 0){
443 98cd2746 2004-04-19 devnull t->tname = erealloc(t->tname, (t->n+32)*sizeof(t->tname[0]));
444 98cd2746 2004-04-19 devnull t->val = erealloc(t->val, (t->n+32)*sizeof(t->val[0]));
445 98cd2746 2004-04-19 devnull t->t = erealloc(t->t, (t->n+32)*sizeof(t->t[0]));
446 98cd2746 2004-04-19 devnull }
447 98cd2746 2004-04-19 devnull t->tname[t->n] = estrndup(name, namelen);
448 98cd2746 2004-04-19 devnull t->val[t->n] = offset;
449 98cd2746 2004-04-19 devnull t->t[t->n] = tt;
450 98cd2746 2004-04-19 devnull t->n++;
451 98cd2746 2004-04-19 devnull }
452 98cd2746 2004-04-19 devnull semi(&p);
453 98cd2746 2004-04-19 devnull break;
454 98cd2746 2004-04-19 devnull
455 98cd2746 2004-04-19 devnull case 'x': /* struct, union, enum reference */
456 98cd2746 2004-04-19 devnull p++;
457 98cd2746 2004-04-19 devnull t->ty = Defer;
458 98cd2746 2004-04-19 devnull if(*p != 's' && *p != 'u' && *p != 'e')
459 98cd2746 2004-04-19 devnull oops();
460 98cd2746 2004-04-19 devnull c = *p;
461 98cd2746 2004-04-19 devnull name = p+1;
462 98cd2746 2004-04-19 devnull p = findcolon(p+1);
463 98cd2746 2004-04-19 devnull name = estrndup(name, p-name);
464 98cd2746 2004-04-19 devnull t->sub = typebysue(c, name);
465 98cd2746 2004-04-19 devnull p++;
466 98cd2746 2004-04-19 devnull break;
467 98cd2746 2004-04-19 devnull
468 98cd2746 2004-04-19 devnull #if 0 /* AIX */
469 98cd2746 2004-04-19 devnull case 'f': /* function */
470 98cd2746 2004-04-19 devnull case 'p': /* procedure */
471 98cd2746 2004-04-19 devnull case 'F': /* Pascal function */
472 98cd2746 2004-04-19 devnull /* case 'R': /* Pascal procedure */
473 98cd2746 2004-04-19 devnull /*
474 98cd2746 2004-04-19 devnull * Even though we don't use the info, we have
475 98cd2746 2004-04-19 devnull * to parse it in case it is embedded in other descriptions.
476 98cd2746 2004-04-19 devnull */
477 98cd2746 2004-04-19 devnull t->ty = Function;
478 98cd2746 2004-04-19 devnull p++;
479 98cd2746 2004-04-19 devnull if(c == 'f' || c == 'F'){
480 98cd2746 2004-04-19 devnull t->sub = parseinfo(p, &p);
481 98cd2746 2004-04-19 devnull if(*p != ','){
482 98cd2746 2004-04-19 devnull if(*p == ';')
483 98cd2746 2004-04-19 devnull p++;
484 98cd2746 2004-04-19 devnull break;
485 98cd2746 2004-04-19 devnull }
486 98cd2746 2004-04-19 devnull comma(&p);
487 98cd2746 2004-04-19 devnull }
488 98cd2746 2004-04-19 devnull n = parseint(&p); /* number of params */
489 98cd2746 2004-04-19 devnull semi(&p);
490 98cd2746 2004-04-19 devnull while(*p != ';'){
491 98cd2746 2004-04-19 devnull if(c == 'F' || c == 'R'){
492 98cd2746 2004-04-19 devnull name = p; /* parameter name */
493 98cd2746 2004-04-19 devnull p = findcolon(p)+1;
494 98cd2746 2004-04-19 devnull }
495 98cd2746 2004-04-19 devnull parseinfo(p, &p); /* param type */
496 98cd2746 2004-04-19 devnull comma(&p);
497 98cd2746 2004-04-19 devnull parseint(&p); /* bool: passed by value? */
498 98cd2746 2004-04-19 devnull semi(&p);
499 98cd2746 2004-04-19 devnull }
500 98cd2746 2004-04-19 devnull semi(&p);
501 98cd2746 2004-04-19 devnull break;
502 98cd2746 2004-04-19 devnull #endif
503 98cd2746 2004-04-19 devnull
504 98cd2746 2004-04-19 devnull case 'f': /* static function */
505 98cd2746 2004-04-19 devnull case 'F': /* global function */
506 98cd2746 2004-04-19 devnull t->ty = Function;
507 98cd2746 2004-04-19 devnull p++;
508 98cd2746 2004-04-19 devnull t->sub = parseinfo(p, &p);
509 98cd2746 2004-04-19 devnull break;
510 98cd2746 2004-04-19 devnull
511 98cd2746 2004-04-19 devnull /*
512 98cd2746 2004-04-19 devnull * We'll never see any of this stuff.
513 98cd2746 2004-04-19 devnull * When we do, we can worry about it.
514 98cd2746 2004-04-19 devnull */
515 98cd2746 2004-04-19 devnull case 'D': /* n-dimensional array */
516 98cd2746 2004-04-19 devnull case 'E': /* subarray of n-dimensional array */
517 98cd2746 2004-04-19 devnull case 'M': /* fortran multiple instance type */
518 98cd2746 2004-04-19 devnull case 'N': /* pascal string ptr */
519 98cd2746 2004-04-19 devnull case 'S': /* set */
520 98cd2746 2004-04-19 devnull case 'c': /* aix complex */
521 98cd2746 2004-04-19 devnull case 'd': /* file of */
522 98cd2746 2004-04-19 devnull case 'g': /* aix float */
523 98cd2746 2004-04-19 devnull case 'n': /* max length string */
524 98cd2746 2004-04-19 devnull case 'w': /* aix wide char */
525 98cd2746 2004-04-19 devnull case 'z': /* another max length string */
526 98cd2746 2004-04-19 devnull default:
527 98cd2746 2004-04-19 devnull fprint(2, "unsupported type char %c (%d)\n", *p, *p);
528 98cd2746 2004-04-19 devnull oops();
529 98cd2746 2004-04-19 devnull }
530 98cd2746 2004-04-19 devnull *pp = p;
531 98cd2746 2004-04-19 devnull return t;
532 98cd2746 2004-04-19 devnull }
533 98cd2746 2004-04-19 devnull
534 98cd2746 2004-04-19 devnull /*
535 fa325e9b 2020-01-10 cross bound ::=
536 98cd2746 2004-04-19 devnull 'A' offset (bound is on stack by ref at offset offset from arg list)
537 98cd2746 2004-04-19 devnull | 'T' offset (bound is on stack by val at offset offset from arg list)
538 98cd2746 2004-04-19 devnull | 'a' regnum (bound passed by reference in register)
539 98cd2746 2004-04-19 devnull | 't' regnum (bound passed by value in register)
540 98cd2746 2004-04-19 devnull | 'J' (no bound)
541 98cd2746 2004-04-19 devnull | bigint
542 98cd2746 2004-04-19 devnull */
543 98cd2746 2004-04-19 devnull static int
544 98cd2746 2004-04-19 devnull parsebound(char **pp)
545 98cd2746 2004-04-19 devnull {
546 98cd2746 2004-04-19 devnull char *p;
547 98cd2746 2004-04-19 devnull int n;
548 98cd2746 2004-04-19 devnull
549 98cd2746 2004-04-19 devnull n = 0;
550 98cd2746 2004-04-19 devnull p = *pp;
551 98cd2746 2004-04-19 devnull switch(*p){
552 98cd2746 2004-04-19 devnull case 'A': /* bound is on stack by reference at offset n from arg list */
553 98cd2746 2004-04-19 devnull case 'T': /* bound is on stack by value at offset n from arg list */
554 98cd2746 2004-04-19 devnull case 'a': /* bound is passed by reference in register n */
555 98cd2746 2004-04-19 devnull case 't': /* bound is passed by value in register n */
556 98cd2746 2004-04-19 devnull p++;
557 98cd2746 2004-04-19 devnull parseint(&p);
558 98cd2746 2004-04-19 devnull break;
559 98cd2746 2004-04-19 devnull case 'J': /* no bound */
560 98cd2746 2004-04-19 devnull p++;
561 98cd2746 2004-04-19 devnull break;
562 98cd2746 2004-04-19 devnull default:
563 98cd2746 2004-04-19 devnull n = parsebigint(&p);
564 98cd2746 2004-04-19 devnull break;
565 98cd2746 2004-04-19 devnull }
566 98cd2746 2004-04-19 devnull *pp = p;
567 98cd2746 2004-04-19 devnull return n;
568 98cd2746 2004-04-19 devnull }
569 98cd2746 2004-04-19 devnull
570 98cd2746 2004-04-19 devnull /*
571 98cd2746 2004-04-19 devnull bigint ::= '-'? decimal
572 98cd2746 2004-04-19 devnull | 0 octal
573 98cd2746 2004-04-19 devnull | -1
574 98cd2746 2004-04-19 devnull */
575 98cd2746 2004-04-19 devnull static vlong
576 98cd2746 2004-04-19 devnull parsebigint(char **pp)
577 98cd2746 2004-04-19 devnull {
578 98cd2746 2004-04-19 devnull char *p;
579 98cd2746 2004-04-19 devnull int n, neg;
580 98cd2746 2004-04-19 devnull
581 98cd2746 2004-04-19 devnull p = *pp;
582 98cd2746 2004-04-19 devnull if(*p == '0'){
583 98cd2746 2004-04-19 devnull errno = 0;
584 98cd2746 2004-04-19 devnull n = strtoll(p, &p, 8);
585 98cd2746 2004-04-19 devnull if(errno)
586 98cd2746 2004-04-19 devnull n = 0;
587 98cd2746 2004-04-19 devnull goto out;
588 98cd2746 2004-04-19 devnull }
589 98cd2746 2004-04-19 devnull neg = 0;
590 98cd2746 2004-04-19 devnull if(*p == '-'){
591 98cd2746 2004-04-19 devnull neg = 1;
592 98cd2746 2004-04-19 devnull p++;
593 98cd2746 2004-04-19 devnull }
594 3bd56b04 2005-09-09 devnull if(!isdigit((uchar)*p))
595 98cd2746 2004-04-19 devnull oops();
596 98cd2746 2004-04-19 devnull n = strtol(p, &p, 10);
597 98cd2746 2004-04-19 devnull if(neg)
598 98cd2746 2004-04-19 devnull n = -n;
599 98cd2746 2004-04-19 devnull
600 98cd2746 2004-04-19 devnull out:
601 98cd2746 2004-04-19 devnull *pp = p;
602 98cd2746 2004-04-19 devnull return n;
603 98cd2746 2004-04-19 devnull }
604 98cd2746 2004-04-19 devnull
605 98cd2746 2004-04-19 devnull int
606 98cd2746 2004-04-19 devnull stabs2acid(Stab *stabs, Biobuf *b)
607 98cd2746 2004-04-19 devnull {
608 f7b74c17 2004-12-28 devnull volatile int fno, i;
609 220c15d2 2012-10-20 rsc char c, *desc, *p;
610 f7b74c17 2004-12-28 devnull char *volatile dir, *volatile fn, *volatile name;
611 98cd2746 2004-04-19 devnull Ftypes *f;
612 98cd2746 2004-04-19 devnull Type *t, *tt;
613 98cd2746 2004-04-19 devnull StabSym sym;
614 98cd2746 2004-04-19 devnull
615 98cd2746 2004-04-19 devnull dir = nil;
616 98cd2746 2004-04-19 devnull fno = 0;
617 98cd2746 2004-04-19 devnull fn = nil;
618 98cd2746 2004-04-19 devnull for(i=0; stabsym(stabs, i, &sym)>=0; i++){
619 d58b36f9 2005-11-28 devnull if(verbose)
620 d58b36f9 2005-11-28 devnull print("%d %s\n", sym.type, sym.name);
621 98cd2746 2004-04-19 devnull switch(sym.type){
622 98cd2746 2004-04-19 devnull case N_SO:
623 98cd2746 2004-04-19 devnull if(sym.name){
624 98cd2746 2004-04-19 devnull if(sym.name[0] && sym.name[strlen(sym.name)-1] == '/')
625 98cd2746 2004-04-19 devnull dir = sym.name;
626 98cd2746 2004-04-19 devnull }
627 98cd2746 2004-04-19 devnull denumber();
628 98cd2746 2004-04-19 devnull fstack = nil;
629 98cd2746 2004-04-19 devnull fno = 0;
630 98cd2746 2004-04-19 devnull break;
631 98cd2746 2004-04-19 devnull case N_BINCL:
632 98cd2746 2004-04-19 devnull fno++;
633 98cd2746 2004-04-19 devnull f = mkftypes(dir, sym.name);
634 98cd2746 2004-04-19 devnull f->down = fstack;
635 98cd2746 2004-04-19 devnull fstack = f;
636 98cd2746 2004-04-19 devnull break;
637 98cd2746 2004-04-19 devnull case N_EINCL:
638 98cd2746 2004-04-19 devnull if(fstack)
639 98cd2746 2004-04-19 devnull fstack = fstack->down;
640 98cd2746 2004-04-19 devnull break;
641 98cd2746 2004-04-19 devnull case N_EXCL:
642 98cd2746 2004-04-19 devnull fno++;
643 98cd2746 2004-04-19 devnull if((f = findftypes(dir, sym.name)) == nil){
644 d58b36f9 2005-11-28 devnull static int cannotprint;
645 fa325e9b 2020-01-10 cross
646 d58b36f9 2005-11-28 devnull if(cannotprint++ == 0)
647 d58b36f9 2005-11-28 devnull fprint(2, "cannot find remembered %s\n", sym.name);
648 98cd2746 2004-04-19 devnull continue;
649 98cd2746 2004-04-19 devnull }
650 98cd2746 2004-04-19 devnull renumber(f->list, fno);
651 98cd2746 2004-04-19 devnull break;
652 98cd2746 2004-04-19 devnull case N_GSYM:
653 98cd2746 2004-04-19 devnull case N_FUN:
654 98cd2746 2004-04-19 devnull case N_PSYM:
655 98cd2746 2004-04-19 devnull case N_LSYM:
656 98cd2746 2004-04-19 devnull case N_LCSYM:
657 98cd2746 2004-04-19 devnull case N_STSYM:
658 98cd2746 2004-04-19 devnull case N_RSYM:
659 98cd2746 2004-04-19 devnull name = sym.name;
660 98cd2746 2004-04-19 devnull if(name == nil){
661 98cd2746 2004-04-19 devnull if(sym.type==N_FUN)
662 98cd2746 2004-04-19 devnull fn = nil;
663 98cd2746 2004-04-19 devnull continue;
664 98cd2746 2004-04-19 devnull }
665 d58b36f9 2005-11-28 devnull if((p = findcolon(name)) == nil)
666 98cd2746 2004-04-19 devnull continue;
667 98cd2746 2004-04-19 devnull name = estrndup(name, p-name);
668 98cd2746 2004-04-19 devnull desc = ++p;
669 98cd2746 2004-04-19 devnull c = *desc;
670 98cd2746 2004-04-19 devnull if(c == 'c'){
671 98cd2746 2004-04-19 devnull fprint(2, "skip constant %s\n", name);
672 98cd2746 2004-04-19 devnull continue;
673 98cd2746 2004-04-19 devnull }
674 98cd2746 2004-04-19 devnull if(setjmp(kaboom)){
675 d58b36f9 2005-11-28 devnull static int cannotparse;
676 fa325e9b 2020-01-10 cross
677 d58b36f9 2005-11-28 devnull if(cannotparse++ == 0)
678 d58b36f9 2005-11-28 devnull fprint(2, "cannot parse %s\n", name);
679 98cd2746 2004-04-19 devnull continue;
680 98cd2746 2004-04-19 devnull }
681 98cd2746 2004-04-19 devnull t = parsename(desc, &p);
682 98cd2746 2004-04-19 devnull if(t == nil)
683 98cd2746 2004-04-19 devnull continue;
684 d58b36f9 2005-11-28 devnull if(*p != 0){
685 d58b36f9 2005-11-28 devnull static int extradesc;
686 fa325e9b 2020-01-10 cross
687 d58b36f9 2005-11-28 devnull if(extradesc++ == 0)
688 d58b36f9 2005-11-28 devnull fprint(2, "extra desc '%s' in '%s'\n", p, desc);
689 d58b36f9 2005-11-28 devnull }
690 98cd2746 2004-04-19 devnull /* void is defined as itself */
691 98cd2746 2004-04-19 devnull if(t->ty==Defer && t->sub==t && strcmp(name, "void")==0){
692 98cd2746 2004-04-19 devnull t->ty = Base;
693 98cd2746 2004-04-19 devnull t->xsizeof = 0;
694 98cd2746 2004-04-19 devnull t->printfmt = '0';
695 98cd2746 2004-04-19 devnull }
696 98cd2746 2004-04-19 devnull if(*name==' ' && *(name+1) == 0)
697 98cd2746 2004-04-19 devnull *name = 0;
698 98cd2746 2004-04-19 devnull /* attach names to structs, unions, enums */
699 98cd2746 2004-04-19 devnull if(c=='T' && *name && t->sue){
700 98cd2746 2004-04-19 devnull t->suename = name;
701 98cd2746 2004-04-19 devnull if(t->name == nil)
702 98cd2746 2004-04-19 devnull t->name = name;
703 98cd2746 2004-04-19 devnull tt = typebysue(t->sue, name);
704 98cd2746 2004-04-19 devnull tt->ty = Defer;
705 98cd2746 2004-04-19 devnull tt->sub = t;
706 98cd2746 2004-04-19 devnull }
707 98cd2746 2004-04-19 devnull if(c=='t'){
708 98cd2746 2004-04-19 devnull tt = newtype();
709 98cd2746 2004-04-19 devnull tt->ty = Typedef;
710 98cd2746 2004-04-19 devnull tt->name = name;
711 98cd2746 2004-04-19 devnull tt->sub = t;
712 98cd2746 2004-04-19 devnull }
713 98cd2746 2004-04-19 devnull /* define base c types */
714 98cd2746 2004-04-19 devnull if(t->ty==None || t->ty==Range){
715 98cd2746 2004-04-19 devnull if(strcmp(name, "char") == 0){
716 98cd2746 2004-04-19 devnull t->ty = Base;
717 98cd2746 2004-04-19 devnull t->xsizeof = 1;
718 98cd2746 2004-04-19 devnull t->printfmt = 'x';
719 98cd2746 2004-04-19 devnull }
720 98cd2746 2004-04-19 devnull if(strcmp(name, "int") == 0){
721 98cd2746 2004-04-19 devnull t->ty = Base;
722 98cd2746 2004-04-19 devnull t->xsizeof = 4;
723 98cd2746 2004-04-19 devnull t->printfmt = 'd';
724 98cd2746 2004-04-19 devnull }
725 98cd2746 2004-04-19 devnull }
726 98cd2746 2004-04-19 devnull /* record declaration in list for later. */
727 98cd2746 2004-04-19 devnull if(c != 't' && c != 'T')
728 98cd2746 2004-04-19 devnull switch(sym.type){
729 98cd2746 2004-04-19 devnull case N_GSYM:
730 87a478a3 2004-04-21 devnull addsymx(nil, name, t);
731 98cd2746 2004-04-19 devnull break;
732 98cd2746 2004-04-19 devnull case N_FUN:
733 98cd2746 2004-04-19 devnull fn = name;
734 98cd2746 2004-04-19 devnull break;
735 98cd2746 2004-04-19 devnull case N_PSYM:
736 98cd2746 2004-04-19 devnull case N_LSYM:
737 98cd2746 2004-04-19 devnull case N_LCSYM:
738 98cd2746 2004-04-19 devnull case N_STSYM:
739 98cd2746 2004-04-19 devnull case N_RSYM:
740 87a478a3 2004-04-21 devnull addsymx(fn, name, t);
741 98cd2746 2004-04-19 devnull break;
742 98cd2746 2004-04-19 devnull }
743 98cd2746 2004-04-19 devnull break;
744 98cd2746 2004-04-19 devnull }
745 d58b36f9 2005-11-28 devnull if(1) print("");
746 98cd2746 2004-04-19 devnull }
747 98cd2746 2004-04-19 devnull
748 98cd2746 2004-04-19 devnull printtypes(b);
749 87a478a3 2004-04-21 devnull dumpsyms(b);
750 87a478a3 2004-04-21 devnull freetypes();
751 98cd2746 2004-04-19 devnull
752 98cd2746 2004-04-19 devnull return 0;
753 98cd2746 2004-04-19 devnull }