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

📄 symtab.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
#include "defs"#ifdef HASHEDTABLE/* Basic symbol table maintainer.  Action depends on t:t = -1	Remove name from tablet =  0	Put name in table if not there.  Copy name stringt =  1	Find name in table if there, otherwise return 0.t =  2	Put name in table if not there.  Do not copy name*/struct stentry *hashtab[MAXEFLNAMES+1];struct stentry **hashend	= hashtab+MAXEFLNAMES+1;#define NEXT(x) (++x<hashend ? x : hashtab )struct stentry *name(s,t)char *s;int t;{int hash;register struct stentry *p, **hp;char *copys();hash = hashfunct(s);for(hp = hashtab + hash; (p = *hp) ; hp = NEXT(hp) )	if(hash==p->hashval && equals(s,p->namep))		switch(t)		{		case -1:			cfree(p->namep);			cfree(p);			delhash(hp);			--neflnames;			return(0);		case 0:		case 1:		case 2:			return(p);		default:			fatal("name: illegal argument");		}/* not in table */switch(t)	{	case -1:		fatal1("cannot delete nonexistent name %s from symbol table", s);	case 1:		return(0);	case 0:	case 2:		if(++neflnames >= MAXEFLNAMES)			fatal("hash table full");		*hp = p = ALLOC(stentry);		p->namep = (t==0 ? copys(s) : s);		p->hashval = hash;		return(p);	default:		fatal("illegal call to name");	}}hashfunct(s)register char *s;{register int h;h = 0;while(*s)	h += *s++;return( h % (MAXEFLNAMES+1) );}delhash(hp)struct stentry **hp;{struct stentry **hq, **hvp;for ( ; ; )	{	*hp = 0;	hq = hp;	for(hp = NEXT(hp) ; *hp &&		( (hq < (hvp = hashtab + (*hp)->hashval) && hvp<=hp)		|| (hp<hq && hq<hvp) || (hvp<=hp && hp<hq) ) ;		hp = NEXT(hp) )			;	if(*hp == 0)		return;	*hq = *hp;	}}#endif#ifndef HASHEDTABLE/* Basic symbol table maintainer.  Action depends on t:t = -1	Remove name from tablet =  0	Put name in table if not there.  Copy name stringt =  1	Find name in table if there, otherwise return 0.t =  2	Put name in table if not there.  Do not copy name*/struct stentry *hashtab[MAXEFLNAMES];struct stentry **hashend hashtab;name(s,t)char *s;int t;{int hash;register struct stentry *p, **hp;char *copys();hash = hashfunct(s);for(hp = hashtab ; hp<hashend ; ++hp)	if( (p = *hp) && hash==p->hashval &&  equals(s,p->namep))		switch(t)		{		case -1:			cfree(p->namep);			cfree(p);			*hp = 0;			return(0);		case 0:		case 1:		case 2:			return(p);		default:			fatal("name: illegal argument");		}/* not in table */switch(t)	{	case -1:		fatal1("cannot delete nonexistent name %s from symbol table", s);	case 1:		return(0);	case 0:	case 2:		/* look for an empty slot */		for(hp = hashtab ; hp<hashend && *hp!=0 ; ++hp)			;		if(hp == hashend)			if(++neflnames >= MAXEFLNAMES)				fatal("hash table full");			else ++hashend;		*hp = p = ALLOC(stentry);		p->namep = (t==0 ? copys(s) : s);		p->hashval = hash;		return(p);	default:		fatal("illegal call to name");	}}hashfunct(s)register char *s;{register int h;h = 0;while(*s)	h = *s++;return(h);}#endif

⌨️ 快捷键说明

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