ack/util/ncgg/lookup.c

66 lines
1.2 KiB
C
Raw Normal View History

1985-01-08 09:59:28 +00:00
#ifndef NORCSID
static char rcsid[]= "$Header$";
#endif
#include "assert.h"
#include "param.h"
#include "lookup.h"
char *myalloc();
char *mystrcpy();
symbol dumsym; /* dummy to return in case of error */
symbol *lookup(name,type,style)
char *name;
symtype type;
lookupstyle style;
{
symbol *sy_p,**sy_pp;
for (sy_pp = &symhash[hashvalue(name)];(sy_p= *sy_pp) != 0;sy_pp= &sy_p->sy_next) {
if (strcmp(sy_p->sy_name,name)!=0)
continue;
switch(style) {
default:
assert(0);
case justlooking:
case mustexist:
case makeexist:
if (type==symany || type==sy_p->sy_type)
return(sy_p);
continue;
case newsymbol:
error("%s already defined",name);
return(&dumsym);
}
}
switch(style) {
default:
assert(0);
case justlooking:
return((symbol *) 0);
case mustexist:
fatal("%s is unknown symbol",name);
/* NOTREACHED */
case newsymbol:
case makeexist:
NEW(sy_p,symbol);
sy_p->sy_next = 0;
sy_p->sy_name = mystrcpy(name);
assert(type!=symany);
sy_p->sy_type = type;
*sy_pp = sy_p;
return(sy_p);
}
}
hashvalue(s) register char *s; {
register unsigned sum=0;
register i;
for(i=0;*s;s++,i=(i+3)&07)
sum += *s<<i;
return(sum%NSYMHASH);
}