1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- /*
- * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
- * See the copyright notice in the ACK home directory, in the file "Copyright".
- */
- #ifndef NORCSID
- static char rcsid[]= "$Id$";
- #endif
- #include <stdlib.h>
- #include <string.h>
- #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);
- enter("lab", op_lab);
- }
- 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);
- }
- }
|