]>
git.saurik.com Git - bison.git/blob - src/symtab.c
   1 /* Symbol table manager for Bison, 
   2    Copyright 1984, 1989, 2000 Free Software Foundation, Inc. 
   4    This file is part of Bison, the GNU Compiler Compiler. 
   6    Bison is free software; you can redistribute it and/or modify 
   7    it under the terms of the GNU General Public License as published by 
   8    the Free Software Foundation; either version 2, or (at your option) 
  11    Bison is distributed in the hope that it will be useful, 
  12    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  14    GNU General Public License for more details. 
  16    You should have received a copy of the GNU General Public License 
  17    along with Bison; see the file COPYING.  If not, write to 
  18    the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
  19    Boston, MA 02111-1307, USA.  */ 
  28 static bucket 
*lastsymbol
; 
  29 static bucket 
**symtab
; 
  32 hash (const char *key
) 
  40     k 
= ((k 
<< 1) ^ (*cp
++)) & 0x3fff; 
  45 /*--------------------------------------------------------------. 
  46 | Create a new symbol, named TAG, which hash value is HASHVAL.  | 
  47 `--------------------------------------------------------------*/ 
  50 bucket_new (const char *tag
, int hashval
) 
  52   bucket 
*res 
= XMALLOC (bucket
, 1); 
  54   res
->link 
= symtab
[hashval
]; 
  56   res
->tag 
= xstrdup (tag
); 
  57   res
->type_name 
= NULL
; 
  60   res
->assoc 
= right_assoc
; 
  61   res
->user_token_number 
= 0; 
  63   res
->class = unknown_sym
; 
  74   symtab 
= XCALLOC (bucket 
*, TABSIZE
); 
  81 /*----------------------------------------------------------------. 
  82 | Find the symbol named KEY, and return it.  If it does not exist | 
  84 `----------------------------------------------------------------*/ 
  87 getsym (const char *key
) 
  97   while (bp 
!= NULL 
&& found 
== 0) 
  99       if (strcmp (key
, bp
->tag
) == 0) 
 107       bp 
= bucket_new (key
, hashval
); 
 109       if (firstsymbol 
== NULL
) 
 116           lastsymbol
->next 
= bp
; 
 120       symtab
[hashval
] = bp
; 
 131   bucket 
*bp
, *bptmp
;           /* JF don't use ptr after free */ 
 133   for (i 
= 0; i 
< TABSIZE
; i
++) 
 140           /* This causes crashes because one string can appear more 
 143             XFREE (bp
->type_name
);