ack/util/ncgg/emlookup.c

79 lines
1.4 KiB
C
Raw Normal View History

1987-03-09 19:15:41 +00:00
/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
1985-01-08 09:59:28 +00:00
#ifndef NORCSID
1994-06-24 11:31:16 +00:00
static char rcsid[]= "$Id$";
1985-01-08 09:59:28 +00:00
#endif
#include "param.h"
#include "expr.h"
#include <em_spec.h>
#include <em_flag.h>
extern char em_mnem[][4];
#define HASHSIZE (2*(sp_lmnem-sp_fmnem))
struct emhashmnem {
char h_name[3];
char h_value;
} emhashmnem[HASHSIZE];
initemhash() {
register i;
for(i=0;i<=sp_lmnem-sp_fmnem;i++)
enter(em_mnem[i],i+sp_fmnem);
1990-07-18 14:53:19 +00:00
enter("lab", op_lab);
1985-01-08 09:59:28 +00:00
}
unsigned emhash(name) register char *name; {
register unsigned sum;
register i;
for (sum=i=0;*name;i+=3)
sum ^= (*name++)<<(i&07);
return(sum);
}
enter(name,value) char *name; {
register unsigned h;
h=emhash(name)%HASHSIZE;
while (emhashmnem[h].h_name[0] != 0)
h = (h+1)%HASHSIZE;
strncpy(emhashmnem[h].h_name,name,3);
emhashmnem[h].h_value = value;
}
int mlookup(name) char *name; {
register unsigned h;
h = emhash(name)%HASHSIZE;
while (strncmp(emhashmnem[h].h_name,name,3) != 0 &&
emhashmnem[h].h_name[0] != 0)
h = (h+1)%HASHSIZE;
return(emhashmnem[h].h_value&0xFF); /* 0 if not found */
}
extern char em_flag[];
argtyp(mn) {
switch(em_flag[mn-sp_fmnem]&EM_PAR) {
case PAR_W:
case PAR_S:
case PAR_Z:
case PAR_O:
case PAR_N:
case PAR_L:
case PAR_F:
case PAR_R:
case PAR_C:
return(TYPINT);
default:
return(TYPADDR);
}
}