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

📄 func.c

📁 guide and some example with visualC++
💻 C
字号:
/* func.c * *	(C) Copyright Nov 23 1996, Edmond J. Breen. *		   ALL RIGHTS RESERVED. * This code may be copied for personal, non-profit use only. * * * This file contains the methods for dealing with EiC function * house keeping. */#include <stdlib.h>#include <stdio.h>#include <string.h>#include "global.h"#include "typemod.h"#include "func.h"#include "xalloc.h"#include "error.h"#include "symbol.h"#include "cdecl.h"int EiC_gotMissingNames(func_t *f){    /* check to see that all parameters have a name */    int i;    if(!EiC_hasPrototype(f) || EiC_gettype(getFPty(f, 0)) == t_void)	return 0;    for (i = 0; i < getFNp(f); ++i)	if(!getFPname(f,i)) 	    if(EiC_gettype(getFPty(f, i)) != t_var)	       return i+1;    return 0;}int EiC_IsVariadic(func_t *f){    return f ? getFNp(f) > 1 && EiC_gettype(getFPty(f,getFNp(f)-1)) ==	t_var : 0;}int EiC_hasPrototype(func_t *f){        return f ? EiC_gettype(getFPty(f, 0)) != t_var: 0;}void EiC_swapFPLists(func_t *f1, func_t *f2){    /* swap parameter lists */    parm_t *t = getFPtyList(f1);    setFPtyList(f1,getFPtyList(f2));    setFPtyList(f2,t);}int EiC_HasHiddenParm(type_expr *ty){    int t = EiC_gettype(nextType(ty));    if(t == t_struct || t == t_union)	return 1;    return 0;}int EiC_sameFuncs(type_expr * t1, type_expr * t2){    /* check for compatible function types */    func_t * f1, *f2;    int i;    f1 = EiC_getInf(t1);    f2 = EiC_getInf(t2);    if(!f1 || !f2)   /* watch for builtin types before prototype */        return 0;    if(EiC_hasPrototype(f1) && EiC_hasPrototype(f2)) {        if (getFNp(f1) != getFNp(f2))            return 0;        for (i = 0; i < getFNp(f1); ++i)            if(!EiC_sametypes(getFPty(f1,i),getFPty(f2,i)))                return 0;    } else if(EiC_IsVariadic(f1) || EiC_IsVariadic(f2))        return 0;    else { /* now check parameters are not convertable */        if(EiC_hasPrototype(f2))            f1 = f2;        for (i = 0; i < getFNp(f1); ++i)            switch(EiC_gettype(getFPty(f1,i))) {              case t_char: case t_uchar:              case t_short: case t_ushort:              case t_float:                return 0;            }    }    /* check function return types */    return EiC_sametypes(t1->nxt, t2->nxt);}void EiC_make_func(token_t * e1){    /*    if (EiC_gettype(e1->type) == t_array ||	EiC_gettype(e1->type) == t_funcdec) {	    EiC_error("Illegal type construction");	    }	    */    e1->Type = EiC_addtype(t_funcdec, e1->Type);    setInf(e1->Type,xcalloc(1, sizeof(func_t)));}void EiC_adjustParam(type_expr **type){    int t = EiC_gettype(*type);    if(t == t_funcdec)       *type = EiC_addtype(t_pointer, *type);    else if(t == t_array)      EiC_exchtype(t_pointer,*type);}static void newParam(func_t *f,char *name, type_expr *type){    setFPtyList(f,xrealloc(getFPtyList(f),			   sizeof(parm_t) * (getFNp(f) +1)));            if(name)	setFPname(f,getFNp(f), EiC_strsave(name));    else	setFPname(f,getFNp(f), NULL);    setFPcomm(f,getFNp(f),NULL);    setFPval(f,getFNp(f),NULL);        setFPty(f,getFNp(f),EiC_copytype(type));}void EiC_add_func_parm(func_t * f, type_expr ** type, char * name){    int t;    type_expr *t1, *t2;    /* must handle storage class, as yet not done. */    if ((t = EiC_gettype(*type)) != t_funcdec && t != t_array)	t = 0;    newParam(f,name,*type);    /*     * Because, parameters will be removed     * from the lookup table the function types stored     * need to be as complete as possible.     */    t1 = getFPty(f,getFNp(f));    t2 = *type;    while (t2) {	if (!t2->alias) {	    t2->alias = 1;	    t1->alias = 0;	}	t2 = nextType(t2);	t1 = nextType(t1);    }    EiC_adjustParam(&getFPty(f,getFNp(f)));    setFNp(f,getFNp(f)+1);}void EiC_add_func_str(func_t * f, char *s){    if (!f->sn)	f->strs = (char **) xcalloc(1, sizeof(char *));    else	f->strs = (char **) xrealloc(f->strs,				     sizeof(char *) * (f->sn + 1));    f->strs[f->sn] = s;    f->sn++;}void EiC_add_func_static(func_t * f, int n){    if (!f->stn)	f->st = (int *) xcalloc(1, sizeof(int));    else	f->st = (int *) xrealloc(f->st,				     sizeof(int) * (f->stn + 1));    f->st[f->stn] = n;    f->stn++;}void EiC_add_func_initialiser(func_t * f, void *s){    if (!f->ni)	f->inzs = (void **) xcalloc(1, sizeof(void *));    else	f->inzs = (void **) xrealloc(f->inzs,				     sizeof(void *) * (f->ni + 1));    f->inzs[f->ni] = s;    f->ni++;}void add_param_initialiser(func_t *f){    if (f->ni) 	setFPval(f,f->ni-1,f->inzs[f->ni-1]);    else	EiC_error("Error in with parameter initialisation");}void EiC_freeFuncComments(func_t *f){    if(getFComm(f)) {	xfree(getFComm(f));	setFComm(f,NULL);    }}		    static void freeCallBack(func_t *f){		        if(f->callBack) {	void EiC_freecode(code_t * code);	EiC_freecode(getFcallBack(f));	xfree(getFcallBack(f));	setFcallBack(f,NULL);    }}void EiC_free_func_inf(func_t * f){    int i;    if (!f)	return;    if (getFNp(f)) {	for (i = 0; i < getFNp(f); i++) {	    EiC_freetype(getFPty(f,i));	    if(getFPname(f,i))		xfree(getFPname(f,i));       }	    	xfree(getFPtyList(f));    }    if (f->sn) {	for (i = 0; i < f->sn; ++i)	    xfree(f->strs[i]);	xfree(f->strs);	f->sn = 0;    }    if (f->ni) {	for (i = 0; i < f->ni; ++i)	    xfree(f->inzs[i]);	xfree(f->inzs);	f->ni= 0;    }    if (f->stn) {	for (i = 0; i < f->stn; ++i)	    xfree(EiC_ENV->AR[f->st[i]].v.p.p);	xfree(f->st);	f->stn = 0;    }    freeCallBack(f);    EiC_freeFuncComments(f);    xfree(f);}void EiC_markFunc(type_expr * type, int mark){    func_t * f = EiC_getInf(type);    int i;        xmark(f,mark);    /* mark paramaters */    if(getFNp(f)) {	xmark(getFPtyList(f),mark);	for(i=0;i<getFNp(f);i++) {	    EiC_marktype(getFPty(f,i),mark);	    if(getFPname(f,i))		xmark(getFPname(f,i),mark);	    if(getFPcomm(f,i))		xmark(getFPcomm(f,i),mark);	}    }    /* mark strings */    if(f->sn) {	xmark(f->strs,mark);	for(i=0;i<f->sn;i++) 	    xmark(f->strs[i],mark);		    }    /* mark initializers */    if(f->ni) {	xmark(f->inzs,mark);	for(i=0;i<f->ni;i++)	    xmark(f->inzs[i],mark);    }     /* mark static arrays */    if(f->stn) {	xmark(f->st,mark);	for(i=0;i<f->stn;i++)	    xmark(EiC_ENV->AR[f->st[i]].v.p.p,mark);    }    if(getFcallBack(f)) {	code_t *code = getFcallBack(f);	xmark(code,mark);	xmark(code->inst,mark);    }    if(getFComm(f))	xmark(getFComm(f),mark);}void add_func_comment(char *s){    extern token_t *EiC_RETURNEXPR;    func_t * f = EiC_getInf(EiC_RETURNEXPR->Type);    setFComm(f,s);}void (*EiC_saveComment(void)) (char * s){    if(EiC_INFUNC) {	 extern token_t *EiC_RETURNEXPR;	 func_t * f = EiC_getInf(EiC_RETURNEXPR->Type);	 if(f && !getFComm(f))	     return add_func_comment;    } 	    return NULL;}#if 0void savecode(char * filename,	      func_t *func){    int i;    FILE *fp = fopen(filename,"wb");    for(i=0;i<CODE->nextinst;++i) 	fwrite(&CODE->inst[i],sizeof(InsT_t),1,fp);	#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -