/* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #include #include #include "param.h" #include "expr.h" #include #include extern char em_mnem[][4]; #define HASHSIZE (2*(sp_lmnem-sp_fmnem)) void enter(char *name, int value); struct emhashmnem { char h_name[3]; char h_value; } emhashmnem[HASHSIZE]; void initemhash() { int i; for(i=0;i<=sp_lmnem-sp_fmnem;i++) enter(em_mnem[i],i+sp_fmnem); enter("lab", op_lab); } unsigned int emhash(char *name) { unsigned int sum; int i; for (sum=i=0;*name;i+=3) sum ^= (*name++)<<(i&07); return(sum); } void enter(char *name, int value) { unsigned int 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(char *name) { unsigned int 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[]; int argtyp(int 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); } }