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

📄 symbol.c

📁 guide and some example with visualC++
💻 C
📖 第 1 页 / 共 2 页
字号:
/* symbol.c * *	(C) Copyright Apr 15 1995, Edmond J. Breen. *		   ALL RIGHTS RESERVED. * This code may be copied for personal, non-profit use only. * */#include <stdio.h>#include <stdlib.h>#include <string.h>#include "typemod.h"#include "MachSet.h"#include  "global.h"#include "lexer.h"#include "xalloc.h"#include "preproc.h"#include "symbol.h"#include "parser.h"int EiC_iskeyword(keyword_t *keywords,char*id,int n){    int i;    for(i=0;i<n;i++)	if(strcmp(keywords[i].id,id) == 0)	    return keywords[i].token;    return 0;}#define MoD 2void EiC_eicpush(eicstack_t *s, val_t v){    if(!(s->n%MoD)) {	if(!s->n)	    s->val = (val_t*)xcalloc(sizeof(val_t),MoD);	else	    s->val = (val_t*)xrealloc(s->val,(s->n+MoD)*sizeof(val_t));    }    s->val[s->n] = v;    s->n++;}int EiC_eicpop(eicstack_t *s, val_t *pop){    if(s->n == 0)	return 0;    s->n--;    *pop = s->val[s->n];    if(!(s->n%MoD)) {			if(!s->n)	    xfree(s->val);	else	    s->val = (val_t*)xrealloc(s->val,s->n*sizeof(val_t));    }    return 1;}/* LOOK UP TABLE ROUTINES   --------------------------*/static size_t _EnTrY_No = 0;int hashsmc(char * s,int mod);symentry_t *EiC_HTAB[HSIZE];/* code for generating tempories */unsigned int NumTemps=0, CurTemp =0;symentry_t * EiC_nxtTemp(int obj, int level){    symentry_t *sym;    char tmpName[50];    sprintf(tmpName,"%s%d","__TeMp",NumTemps);    /* There should be no need to watch out for change of level !!!!     * It will be assumed that the compound statement routine will     * handle it.     */    sym = EiC_insertLUT(EiC_work_tab,tmpName,obj);    NumTemps++;    CurTemp++;    if(sym->val.ival == -1) /* needs a home */ 	EiC_stackit(sym,level);    /* Setting up the token information is left     * to the caller of this routine.     */    sym->level = level;    return sym;}    size_t EiC_lut_NextEntryNum(void){    return _EnTrY_No;}                             /*CUT EiChashFunc*/int hashsmc(char * s,int mod){    register unsigned int h, c;    h = 0;    while(  (c = (int) *s++) > 0)	h =   (h << 1) + c;    return ( h % mod);}                           /*END CUT*/                            /*CUT lutLookUp*/int Pclash;char *EiC_getClashedfname(char nspace,char *id){    symentry_t *sym;    for(sym = EiC_HTAB[hashsmc(id,HSIZE)]; sym != NULL; sym = sym->next)	if(sym->nspace == nspace && strcmp(id,sym->id) == 0)	    if((sym->sclass & c_private) &&	       sym->fname != CurrentFileName()) {		return sym->fname;	    }    return NULL;}symentry_t * EiC_lookup(char nspace, char *id){    symentry_t *sym;    Pclash = 0;    for(sym = EiC_HTAB[hashsmc(id,HSIZE)]; sym != NULL; sym = sym->next)	if(sym->nspace == nspace && strcmp(id,sym->id) == 0) {	    if((sym->sclass & c_private) &&	       sym->fname != CurrentFileName()) {		Pclash = 1;		continue;	    }	    else		break;	}    return(sym);}                             /*END CUT*/                           /*CUT lutInsert*/symentry_t * EiC_insertLUT(char nspace,char *id,int type){    symentry_t *sym;    auto int  hashval;    sym = (symentry_t *) xcalloc(1,sizeof(symentry_t));    if(sym == NULL)	return(NULL);    if( (sym->id = EiC_strsave(id)) == NULL) {	xfree(sym);	return(NULL);    }    sym->entry = _EnTrY_No++;    hashval = hashsmc(sym->id,HSIZE);    sym->next = EiC_HTAB[hashval];    EiC_HTAB[hashval] = sym;    sym->nspace = nspace;    sym->val.ival = -1;		/* indicates  unused */    sym->type = EiC_addtype(type,NULL);    sym->fname =  CurrentFileName();    return(sym);}                           /*END CUT*/void delete(symentry_t *sym){    auto symentry_t * this;    auto int idx;        idx = hashsmc(sym->id,HSIZE);    this = EiC_HTAB[idx];    if(this == sym)	EiC_HTAB[idx] = sym->next;    else {			/* find and unlink  */	while(this && this->next != sym)	    this = this->next;	this->next = sym->next;    }}void EiC_UpdateSymPos(symentry_t * sym){    if(sym->next && sym->next->level > sym->level) {	symentry_t * p = EiC_HTAB[hashsmc(sym->id,HSIZE)];	delete(sym);	while(p->next != sym)	    if(p->next) {		if(p->next->level > sym->level)		    p=p->next;		else {		    sym->next = p->next;		    p->next = sym;		}	    } else {		p->next = sym;		sym->next = NULL;	    }    }}void EiC_remsym(symentry_t *sym){  delete(sym);  free_sym(sym);}/*END CUT*/#if 1void remBuiltin(symentry_t *sym){    /* removes the prototype of the builtin function only */    EiC_freetype(sym->type);    sym->type = EiC_addtype(t_builtin,NULL);    sym->fname = "::EiC::";}#endif/*CUT lutRemLevel*/void EiC_remlevel(int level){  int i;  symentry_t * sym, *symh;  for(i=0;i<HSIZE;i++) {    sym = EiC_HTAB[i];    while(sym && sym->level >= level) {      symh = sym->next;      free_sym(sym);      sym = symh;    }    EiC_HTAB[i] = sym;  }}/*END CUT*//*CUT lutRemTempories*/void EiC_remTempories(void){  int i;  symentry_t * sym, *symh;  for(i=0;i<HSIZE;i++) {    sym = EiC_HTAB[i];    while(sym && IsTemp(sym->type)) {      symh = sym->next;      free_sym(sym);      sym = symh;    }    EiC_HTAB[i] = sym;  }}/*END CUT*/int  EiC_lutClearFileEntries(char *FileName){    int i;    symentry_t * sym, *p, *t;    for(i=0;i<HSIZE;i++) {	t = sym = EiC_HTAB[i];	p = NULL;	while(sym){	    if(strcmp(sym->fname,FileName) == 0) {		if(p)		    p->next = sym->next;		else		    t = sym->next;		free_sym(sym);		if(!p) {		    sym = t;		    continue;		}	    } else		p = sym;	    sym=p->next;	}	EiC_HTAB[i] = t;    }    return 1;}                    /*END CUT*/                     /*CUT lutCleanUp*/void EiC_lut_CleanUp(size_t bot){    int i;    symentry_t * sym, *p, *t;    for(i=0;i<HSIZE;i++) {	t = sym = EiC_HTAB[i];	p = NULL;	while(sym){	    if(sym->entry >= bot) {		if(EiC_gettype(sym->type) == t_builtin) {		    remBuiltin(sym);		    p = sym;		} else {		    if(p)			p->next = sym->next;		    else			t = sym->next;		    free_sym(sym);		    if(!p) {			sym = t;			continue;		    }		}	    } else		p = sym;	    sym=p->next;	}	EiC_HTAB[i] = t;    }}                     /*END CUT*/                     /*CUT lutFreeSym*/#define freeAg(X)   do {\			    symentry_t *x = X; \			    if(!isconst(x->type)) \			         xfree(EiC_ENV->AR[x->val.ival].v.p.p);\			    else xfree(x->val.p.p);\		    } while (0)#define freeAg1(X)  xfree(EiC_ENV->AR[X->val.ival].v.p.p)static void free_sym(symentry_t *sym){#if 0          printf("Freeing [%s] %d  %d [%d]\n",  	sym->id, sym->entry, sym->val.ival,EiC_gettype(sym->type));    #endif            if(EiC_gettype(sym->type) == t_func) {	EiC_killcode(sym);    } else if(sym->level == 1)  { /* global value */	int t;	if((t=EiC_gettype(sym->type)) == t_array && sym->val.ival >=0) 	    freeAg(sym);	else if ((t== t_union || t == t_struct) && sym->val.ival >=0 ) 	    freeAg(sym);		    }    /*     * the conditions for pushing  onto the ARgar stack     * must be the same as those for stacking as found in     * function establish_id     * Except for ParseError     */    if( sym->val.ival >=0       && sym->level == 1       && EiC_gettype(sym->type) != t_builtin ) {	if(! isconst(sym->type)	   && sym->nspace == stand_tab	   && sym->sclass != c_typedef) {	    EiC_eicpush(&EiC_ENV->ARgar,sym->val);	}    }    EiC_freetype(sym->type);    xfree(sym->id);    xfree(sym);}                        /*END CUT*/void EiC_UpdateEntry(symentry_t *sym){    int t = EiC_gettype(sym->type);    if(CurrentFileName() != sym->fname &&       t != t_func &&       t != t_funcdec &&       t != t_builtin)	return;    sym->entry =  _EnTrY_No++;    sym->pname = sym->fname;    sym->fname = CurrentFileName();}void EiC_addoffsettolevel(char nspace,int level,int off){    int i;    symentry_t * sym;    for(i=0;i<HSIZE;i++) {	sym = EiC_HTAB[i];	while(sym && sym->level == level && sym->nspace == nspace) {	    sym->val.ival = -(sym->val.ival + off);	    sym = sym->next;	}    }}void EiC_marktype(type_expr *type, char mark){    int i;    struct_t *s;    void EiC_markFunc(type_expr *t,int mark);        while(type) {	xmark(type,mark);	switch(EiC_gettype(type)) {	  case t_builtin:	    if(EiC_getInf(type) == NULL)		break;	  case t_funcdec:	  case t_func:	    EiC_markFunc(type,mark);	    break;	  case t_union:

⌨️ 快捷键说明

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