symtab.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "defs.h"
  2. /* TABLE_SIZE is the number of entries in the symbol table. */
  3. /* TABLE_SIZE must be a power of two. */
  4. #define TABLE_SIZE 1024
  5. bucket **symbol_table;
  6. bucket *first_symbol;
  7. bucket *last_symbol;
  8. int hash(char *name)
  9. {
  10. register char *s;
  11. register int c, k;
  12. assert(name && *name);
  13. s = name;
  14. k = *s;
  15. while ((c = *++s))
  16. k = (31*k + c) & (TABLE_SIZE - 1);
  17. return (k);
  18. }
  19. bucket *make_bucket(char *name)
  20. {
  21. register bucket *bp;
  22. assert(name);
  23. bp = (bucket *) MALLOC(sizeof(bucket));
  24. if (bp == 0) no_space();
  25. bp->link = 0;
  26. bp->next = 0;
  27. bp->name = MALLOC(strlen(name) + 1);
  28. if (bp->name == 0) no_space();
  29. bp->tag = 0;
  30. bp->value = UNDEFINED;
  31. bp->index = 0;
  32. bp->prec = 0;
  33. bp->class = UNKNOWN;
  34. bp->assoc = TOKEN;
  35. bp->args = -1;
  36. bp->argnames = 0;
  37. bp->argtags = 0;
  38. if (bp->name == 0) no_space();
  39. strcpy(bp->name, name);
  40. return (bp);
  41. }
  42. bucket *lookup(char *name)
  43. {
  44. register bucket *bp, **bpp;
  45. bpp = symbol_table + hash(name);
  46. bp = *bpp;
  47. while (bp)
  48. {
  49. if (strcmp(name, bp->name) == 0) return (bp);
  50. bpp = &bp->link;
  51. bp = *bpp;
  52. }
  53. *bpp = bp = make_bucket(name);
  54. last_symbol->next = bp;
  55. last_symbol = bp;
  56. return (bp);
  57. }
  58. void create_symbol_table()
  59. {
  60. register int i;
  61. register bucket *bp;
  62. symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *));
  63. if (symbol_table == 0) no_space();
  64. for (i = 0; i < TABLE_SIZE; i++)
  65. symbol_table[i] = 0;
  66. bp = make_bucket("error");
  67. bp->index = 1;
  68. bp->class = TERM;
  69. first_symbol = bp;
  70. last_symbol = bp;
  71. symbol_table[hash("error")] = bp;
  72. }
  73. void free_symbol_table()
  74. {
  75. FREE(symbol_table);
  76. symbol_table = 0;
  77. }
  78. void free_symbols()
  79. {
  80. register bucket *p, *q;
  81. for (p = first_symbol; p; p = q)
  82. {
  83. q = p->next;
  84. FREE(p);
  85. }
  86. }