emlookup.c 1.4 KB

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