📄 typemod.c
字号:
/* typemod%.c * * (C) Copyright Apr 15 1995, Edmond J. Breen. * ALL RIGHTS RESERVED. * This code may be copied for personal, non-profit use only. * * Type Construction */#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#include "global.h"#include "func.h"#include "xalloc.h"#include "metric.h"#include "cdecl.h"#define crt_type() (type_expr *) xcalloc(sizeof(type_expr), 1)#define rtn_type(x) xfree(x)int EiC_gettype(type_expr * t){ if(t) return t->obj; else return -1;}void *EiC_getInf(type_expr * t){ if(t) return t->u.inf; else return NULL; }type_expr *EiC_copytype(type_expr * t){ type_expr *copy = NULL, *h; if (t) { copy = h = crt_type(); *h = *t; h->alias = 1; t = t->nxt; while (t) { h->nxt = crt_type(); h = h->nxt; *h = *t; h->alias = 1; t = t->nxt; } } return copy;}type_expr *EiC_copyBaseType(type_expr * t){ type_expr *copy = NULL, *h; while(t && !t->base) t = t->nxt; if (t) { copy = h = crt_type(); *h = *t; h->alias = 1; t = t->nxt; while (t) { h->nxt = crt_type(); h = h->nxt; *h = *t; h->alias = 1; t = t->nxt; } } return copy;}type_expr *EiC_transtype(type_expr * t){ type_expr *copy = NULL, *h; if (t) { copy = h = crt_type(); *h = *t; t = t->nxt; while (t) { h->nxt = crt_type(); h = h->nxt; *h = *t; t = t->nxt; } } return copy;}type_expr *EiC_addtype(unsigned obj, type_expr * t){ extern int EiC_ptrSafe; type_expr *new; new = crt_type(); if (new) { new->obj = obj; new->nxt = t; } if(obj == t_pointer) { if(EiC_ptrSafe) setSafe(new); else setUnSafe(new); } return new;}type_expr *EiC_catTypes(type_expr *t1, type_expr * t2){ type_expr *p; p = t1; if(p) { while(p->nxt) p = p->nxt; p->nxt = t2; return t1; } return t2;}int compareConst(type_expr * t1, type_expr *t2){ while (t1 && t2) if(!isconst(t1) && isconst(t2)) return 0; else { t1 = t1->nxt; t2 = t2->nxt; } return 1;}int EiC_compareSafe(type_expr * t1, type_expr *t2){ /* compare Safe */ while (t1 && t2 && (EiC_gettype(t1) == EiC_gettype(t2))) if(issafe(t1) != issafe(t2)) return 0; else { t1 = t1->nxt; t2 = t2->nxt; } return 1;}int EiC_compatibletypes(type_expr *t1, type_expr * t2){ /* A weaker version of sametypes */ switch(t1->obj) { case t_pointer: case t_array: /* do pointers & arrays */ if(t2->obj != t_pointer && t2->obj != t_array) break; if (t1->obj == t_pointer && t2->obj == t_pointer) if (t1->nxt->obj == t_void || t2->nxt->obj == t_void) return 1; return EiC_sametypes(t1->nxt, t2->nxt); } return EiC_sametypes(t1,t2);}int EiC_sametypes(type_expr * t1, type_expr * t2){ int i; switch(t1->obj) { case t_struct: /* do structures */ if (t2->obj != t_struct) return 0; else { struct_t *s1, *s2; s1 = (struct_t *) EiC_getInf(t1); s2 = (struct_t *) EiC_getInf(t2); if(s1 == s2) return 1; else if (s1->n != s2->n) return 0; else { for (i = 0; i < s1->n; i++) { if (!EiC_sametypes(s1->type[i], s2->type[i])) return 0; if(strcmp(s1->id[i],s2->id[i]) != 0) return 0; } } } return 1; case t_builtin: case t_func: case t_funcdec: /* check functions are compatible */ if(t2->obj != t_func && t2->obj != t_funcdec && t2->obj != t_builtin) break; return EiC_sameFuncs(t1,t2); case t_pointer: case t_array: /* do pointers & arrays */ if(t2->obj != t1->obj) break; if (t1->obj == t_pointer && t2->obj == t_pointer) if (t1->nxt->obj == t_void || t2->nxt->obj == t_void) return 1; return EiC_sametypes(t1->nxt, t2->nxt); case t_int: case t_enum: if(t2->obj == t_int || t2->obj == t_enum) return 1; } while (t1 && t2) { if (t1->obj != t2->obj) break; t1 = t1->nxt; t2 = t2->nxt; } if (t1 != t2) return 0; return 1;}void EiC_setAsBaseType(type_expr * t){ while (t) { t->base = 1; t = t->nxt; }}int EiC_bastype(type_expr * t){ while (t && t->nxt) t = t->nxt; if(t) return t->obj; else return -1;}static void *basinf(type_expr * t){ while (t && t->nxt) t = t->nxt; if(t) return t->u.inf; else return NULL;}static char basalias(type_expr * t){ while (t && t->nxt) t = t->nxt; if(t) return t->alias; else return -1; }void EiC_set_bastype(unsigned t, type_expr * typ){ while (typ && typ->nxt) typ = typ->nxt; if(typ) typ->obj = t;}void EiC_setaliases(type_expr * t, char a){ while (t) { t->alias = a; t = t->nxt; }}static void free1type(type_expr * type){ void EiC_free_func_inf(func_t * f); void EiC_free_un_mem(type_expr * e); if (!type->alias) { int t; if ((t = EiC_gettype(type)) == t_func || t == t_funcdec || t== t_builtin) EiC_free_func_inf(EiC_getInf(type)); else if (t == t_struct || t == t_union) EiC_free_un_mem(type); } rtn_type(type);}void *EiC_freetype(type_expr * t){ type_expr *f; if(!t) return NULL; if (t) do { f = t->nxt; free1type(t); t = f; } while (t); return NULL;}type_expr *EiC_revtype(type_expr * t){ /* * reverse the type list by reversing * separate-ably the dec-spec and decl * parts. * REM decl-spec is the base type(s). */ type_expr *h, *r = NULL; if (t) { while (t && !t->base) { r = EiC_addtype(t->obj, r); setInf(r,EiC_getInf(t)); r->alias = t->alias; r->base = t->base; r->qual = t->qual; h = t->nxt; t->alias = 1; free1type(t); t = h; } if(r) { h = r; while(h->nxt) h = h->nxt; h->nxt = t; } else r = t; } return r;} type_expr *EiC_succType(type_expr * t){ if (t) { type_expr *p; p = t->nxt; free1type(t); return p; } return t;}void EiC_exchtype(int obj, type_expr * t){ extern int EiC_ptrSafe; t->obj = obj; if(obj == t_pointer) { if(EiC_ptrSafe) setSafe(t); else setUnSafe(t); }}int EiC_get_sizeof(type_expr * t){ switch (EiC_gettype(t)) { case t_uchar: case t_char: return EiC_metric[m_char][0]; case t_short: case t_ushort: return EiC_metric[m_short][0]; case t_enum: case t_uint: case t_int: return EiC_metric[m_int][0]; case t_long: case t_ulong: return EiC_metric[m_long][0]; case t_llong: return EiC_metric[m_llong][0]; case t_float: return EiC_metric[m_float][0]; case t_double: return EiC_metric[m_double][0]; case t_lval: return EiC_get_sizeof(t->nxt); case t_pointer: if(isunsafe(t)) return EiC_metric[m_pointer][0]; else return sizeof(ptr_t); case t_array: return EiC_get_sizeof(t->nxt) * getNumElems(t); case t_struct: case t_union: return ((struct_t *) EiC_getInf(t))->tsize; } return 0;}int EiC_get_align(type_expr * t){ switch (EiC_gettype(t)) { case t_uchar: case t_char: return EiC_metric[m_char][1]; case t_short: case t_ushort: return EiC_metric[m_short][1]; case t_uint: case t_int: return EiC_metric[m_int][1]; case t_long: case t_ulong: return EiC_metric[m_long][1]; case t_llong: return EiC_metric[m_llong][1]; case t_float: return EiC_metric[m_float][1]; case t_double: return EiC_metric[m_double][1]; case t_lval: return EiC_get_align(t->nxt); case t_pointer:return EiC_metric[m_pointer][1]; case t_array: return EiC_get_align(t->nxt); case t_struct: case t_union: return ((struct_t *) EiC_getInf(t))->align; } return 0;}type_expr *EiC_getcontype(type_expr * t1, type_expr * t2){ if (t1 == NULL) return EiC_copytype(t2); else return t1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -