⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 typemod.c

📁 guide and some example with visualC++
💻 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 + -