home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / BYACC.ZIP / RCS / SYMTAB.C_V < prev    next >
Text File  |  1992-06-10  |  2KB  |  141 lines

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