3 * (C) Copyright Apr 15 1995, Edmond J. Breen.
5 * This code may be copied for personal, non-profit use only.
19 #define crt_type() (type_expr *) xcalloc(sizeof(type_expr), 1)
20 #define rtn_type(x) xfree(x)
23 int EiC_gettype(type_expr * t)
30 void *EiC_getInf(type_expr * t)
39 type_expr *EiC_copytype(type_expr * t)
41 type_expr *copy = NULL, *h;
43 copy = h = crt_type();
58 type_expr *EiC_copyBaseType(type_expr * t)
60 type_expr *copy = NULL, *h;
64 copy = h = crt_type();
79 type_expr *EiC_transtype(type_expr * t)
81 type_expr *copy = NULL, *h;
83 copy = h = crt_type();
96 type_expr *EiC_addtype(unsigned obj, type_expr * t)
98 extern int EiC_ptrSafe;
105 if(obj == t_pointer) {
114 type_expr *EiC_catTypes(type_expr *t1, type_expr * t2)
127 int compareConst(type_expr * t1, type_expr *t2)
130 if(!isconst(t1) && isconst(t2))
139 int EiC_compareSafe(type_expr * t1, type_expr *t2)
142 while (t1 && t2 && (EiC_gettype(t1) == EiC_gettype(t2)))
143 if(issafe(t1) != issafe(t2))
153 int EiC_compatibletypes(type_expr *t1, type_expr * t2)
155 /* A weaker version of sametypes */
158 case t_array: /* do pointers & arrays */
159 if(t2->obj != t_pointer && t2->obj != t_array)
161 if (t1->obj == t_pointer && t2->obj == t_pointer)
162 if (t1->nxt->obj == t_void ||
163 t2->nxt->obj == t_void)
165 return EiC_sametypes(t1->nxt, t2->nxt);
167 return EiC_sametypes(t1,t2);
170 int EiC_sametypes(type_expr * t1, type_expr * t2)
174 case t_struct: /* do structures */
175 if (t2->obj != t_struct)
179 s1 = (struct_t *) EiC_getInf(t1);
180 s2 = (struct_t *) EiC_getInf(t2);
183 else if (s1->n != s2->n)
186 for (i = 0; i < s1->n; i++) {
187 if (!EiC_sametypes(s1->type[i], s2->type[i]))
189 if(strcmp(s1->id[i],s2->id[i]) != 0)
197 case t_funcdec: /* check functions are compatible */
198 if(t2->obj != t_func && t2->obj != t_funcdec &&
199 t2->obj != t_builtin)
201 return EiC_sameFuncs(t1,t2);
203 case t_array: /* do pointers & arrays */
204 if(t2->obj != t1->obj)
206 if (t1->obj == t_pointer && t2->obj == t_pointer)
207 if (t1->nxt->obj == t_void ||
208 t2->nxt->obj == t_void)
210 return EiC_sametypes(t1->nxt, t2->nxt);
213 if(t2->obj == t_int || t2->obj == t_enum)
218 if (t1->obj != t2->obj)
228 void EiC_setAsBaseType(type_expr * t)
236 int EiC_bastype(type_expr * t)
245 static void *basinf(type_expr * t)
254 static char basalias(type_expr * t)
264 void EiC_set_bastype(unsigned t, type_expr * typ)
266 while (typ && typ->nxt)
272 void EiC_setaliases(type_expr * t, char a)
280 static void free1type(type_expr * type)
282 void EiC_free_func_inf(func_t * f);
283 void EiC_free_un_mem(type_expr * e);
287 if ((t = EiC_gettype(type)) == t_func || t == t_funcdec
289 EiC_free_func_inf(EiC_getInf(type));
290 else if (t == t_struct || t == t_union)
291 EiC_free_un_mem(type);
297 void *EiC_freetype(type_expr * t)
311 type_expr *EiC_revtype(type_expr * t)
314 * reverse the type list by reversing
315 * separate-ably the dec-spec and decl
317 * REM decl-spec is the base type(s).
319 type_expr *h, *r = NULL;
321 while (t && !t->base) {
322 r = EiC_addtype(t->obj, r);
323 setInf(r,EiC_getInf(t));
345 type_expr *EiC_succType(type_expr * t)
356 void EiC_exchtype(int obj, type_expr * t)
358 extern int EiC_ptrSafe;
360 if(obj == t_pointer) {
368 int EiC_get_sizeof(type_expr * t)
370 switch (EiC_gettype(t)) {
372 case t_char: return EiC_metric[m_char][0];
374 case t_ushort: return EiC_metric[m_short][0];
377 case t_int: return EiC_metric[m_int][0];
379 case t_ulong: return EiC_metric[m_long][0];
380 case t_llong: return EiC_metric[m_llong][0];
381 case t_float: return EiC_metric[m_float][0];
382 case t_double: return EiC_metric[m_double][0];
383 case t_lval: return EiC_get_sizeof(t->nxt);
386 return EiC_metric[m_pointer][0];
388 return sizeof(ptr_t);
389 case t_array: return EiC_get_sizeof(t->nxt) * getNumElems(t);
391 case t_union: return ((struct_t *) EiC_getInf(t))->tsize;
396 int EiC_get_align(type_expr * t)
398 switch (EiC_gettype(t)) {
400 case t_char: return EiC_metric[m_char][1];
402 case t_ushort: return EiC_metric[m_short][1];
404 case t_int: return EiC_metric[m_int][1];
406 case t_ulong: return EiC_metric[m_long][1];
407 case t_llong: return EiC_metric[m_llong][1];
408 case t_float: return EiC_metric[m_float][1];
409 case t_double: return EiC_metric[m_double][1];
410 case t_lval: return EiC_get_align(t->nxt);
411 case t_pointer:return EiC_metric[m_pointer][1];
412 case t_array: return EiC_get_align(t->nxt);
414 case t_union: return ((struct_t *) EiC_getInf(t))->align;
419 type_expr *EiC_getcontype(type_expr * t1, type_expr * t2)
422 return EiC_copytype(t2);