symtab.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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
  9. hash(name)
  10. char *name;
  11. {
  12. register char *s;
  13. register int c, k;
  14. assert(name && *name);
  15. s = name;
  16. k = *s;
  17. while (c = *++s)
  18. k = (31*k + c) & (TABLE_SIZE - 1);
  19. return (k);
  20. }
  21. bucket *
  22. make_bucket(name)
  23. char *name;
  24. {
  25. register bucket *bp;
  26. assert(name);
  27. bp = (bucket *) MALLOC(sizeof(bucket));
  28. if (bp == 0) no_space();
  29. bp->link = 0;
  30. bp->next = 0;
  31. bp->name = MALLOC(strlen(name) + 1);
  32. if (bp->name == 0) no_space();
  33. bp->tag = 0;
  34. bp->value = UNDEFINED;
  35. bp->index = 0;
  36. bp->prec = 0;
  37. bp-> class = UNKNOWN;
  38. bp->assoc = TOKEN;
  39. if (bp->name == 0) no_space();
  40. strcpy(bp->name, name);
  41. return (bp);
  42. }
  43. bucket *
  44. lookup(name)
  45. char *name;
  46. {
  47. register bucket *bp, **bpp;
  48. bpp = symbol_table + hash(name);
  49. bp = *bpp;
  50. while (bp)
  51. {
  52. if (strcmp(name, bp->name) == 0) return (bp);
  53. bpp = &bp->link;
  54. bp = *bpp;
  55. }
  56. *bpp = bp = make_bucket(name);
  57. last_symbol->next = bp;
  58. last_symbol = bp;
  59. return (bp);
  60. }
  61. create_symbol_table()
  62. {
  63. register int i;
  64. register bucket *bp;
  65. symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *));
  66. if (symbol_table == 0) no_space();
  67. for (i = 0; i < TABLE_SIZE; i++)
  68. symbol_table[i] = 0;
  69. bp = make_bucket("error");
  70. bp->index = 1;
  71. bp->class = TERM;
  72. first_symbol = bp;
  73. last_symbol = bp;
  74. symbol_table[hash("error")] = bp;
  75. }
  76. free_symbol_table()
  77. {
  78. FREE(symbol_table);
  79. symbol_table = 0;
  80. }
  81. free_symbols()
  82. {
  83. register bucket *p, *q;
  84. for (p = first_symbol; p; p = q)
  85. {
  86. q = p->next;
  87. FREE(p);
  88. }
  89. }