emlookup.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #ifndef NORCSID
  2. static char rcsid[]= "$Header$";
  3. #endif
  4. #include "param.h"
  5. #include "expr.h"
  6. #include <em_spec.h>
  7. #include <em_flag.h>
  8. extern char em_mnem[][4];
  9. #define HASHSIZE (2*(sp_lmnem-sp_fmnem))
  10. struct emhashmnem {
  11. char h_name[3];
  12. char h_value;
  13. } emhashmnem[HASHSIZE];
  14. initemhash() {
  15. register i;
  16. for(i=0;i<=sp_lmnem-sp_fmnem;i++)
  17. enter(em_mnem[i],i+sp_fmnem);
  18. }
  19. unsigned emhash(name) register char *name; {
  20. register unsigned sum;
  21. register i;
  22. for (sum=i=0;*name;i+=3)
  23. sum ^= (*name++)<<(i&07);
  24. return(sum);
  25. }
  26. enter(name,value) char *name; {
  27. register unsigned h;
  28. h=emhash(name)%HASHSIZE;
  29. while (emhashmnem[h].h_name[0] != 0)
  30. h = (h+1)%HASHSIZE;
  31. strncpy(emhashmnem[h].h_name,name,3);
  32. emhashmnem[h].h_value = value;
  33. }
  34. int mlookup(name) char *name; {
  35. register unsigned h;
  36. h = emhash(name)%HASHSIZE;
  37. while (strncmp(emhashmnem[h].h_name,name,3) != 0 &&
  38. emhashmnem[h].h_name[0] != 0)
  39. h = (h+1)%HASHSIZE;
  40. return(emhashmnem[h].h_value&0xFF); /* 0 if not found */
  41. }
  42. extern char em_flag[];
  43. argtyp(mn) {
  44. switch(em_flag[mn-sp_fmnem]&EM_PAR) {
  45. case PAR_W:
  46. case PAR_S:
  47. case PAR_Z:
  48. case PAR_O:
  49. case PAR_N:
  50. case PAR_L:
  51. case PAR_F:
  52. case PAR_R:
  53. case PAR_C:
  54. return(TYPINT);
  55. default:
  56. return(TYPADDR);
  57. }
  58. }