home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 200-299 / ff299.lzh / Yacc / symtab.c < prev    next >
C/C++ Source or Header  |  1989-12-30  |  2KB  |  118 lines

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