home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / BYACC.ZIP / SYMTAB.C < prev    next >
C/C++ Source or Header  |  1992-03-16  |  2KB  |  116 lines

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