1 /* Symbol table manager for Bison, 
   2    Copyright (C) 1984, 1989, 2000, 2001, 2002 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.  */ 
  27 /*---------------------------------. 
  28 | Create a new symbol, named TAG.  | 
  29 `---------------------------------*/ 
  32 symbol_new (const char *tag
) 
  34   symbol_t 
*res 
= XMALLOC (symbol_t
, 1); 
  36   res
->tag 
= xstrdup (tag
); 
  37   res
->type_name 
= NULL
; 
  38   res
->number 
= NUMBER_UNDEFINED
; 
  40   res
->assoc 
= right_assoc
; 
  41   res
->user_token_number 
= SUNDEF
; 
  43   res
->class = unknown_sym
; 
  56 symbol_free (symbol_t 
*this) 
  59   /* This causes crashes because one string can appear more 
  61   XFREE (this->type_name
); 
  69 /*----------------------. 
  70 | A symbol_t hash table.  | 
  71 `----------------------*/ 
  73 /* Initial capacity of symbols hash table.  */ 
  74 #define HT_INITIAL_CAPACITY 257 
  76 static struct hash_table 
*symbol_table 
= NULL
; 
  79 hash_compare_symbol_t (const symbol_t 
*m1
, const symbol_t 
*m2
) 
  81   return strcmp (m1
->tag
, m2
->tag
) ? FALSE 
: TRUE
; 
  85 hash_symbol_t (const symbol_t 
*m
, unsigned int tablesize
) 
  87   return hash_string (m
->tag
, tablesize
); 
  91 /*-------------------------------. 
  92 | Create the symbol_t hash table.  | 
  93 `-------------------------------*/ 
  98   symbol_table 
= hash_initialize (HT_INITIAL_CAPACITY
, 
 100                                   (Hash_hasher
) hash_symbol_t
, 
 101                                   (Hash_comparator
) hash_compare_symbol_t
, 
 102                                   (Hash_data_freer
) symbol_free
); 
 106 /*----------------------------------------------------------------. 
 107 | Find the symbol named KEY, and return it.  If it does not exist | 
 109 `----------------------------------------------------------------*/ 
 112 getsym (const char *key
) 
 117   (const char *) probe
.tag 
= key
; 
 118   entry 
= hash_lookup (symbol_table
, &probe
); 
 122       /* First insertion in the hash. */ 
 123       entry 
= symbol_new (key
); 
 124       hash_insert (symbol_table
, entry
); 
 130 /*-------------------. 
 131 | Free the symbols.  | 
 132 `-------------------*/ 
 137   hash_free (symbol_table
); 
 141 /*---------------------------------------------------------------. 
 142 | Look for undefined symbols, report an error, and consider them | 
 144 `---------------------------------------------------------------*/ 
 147 symbols_do (symbol_processor processor
, void *processor_data
) 
 149   hash_do_for_each (symbol_table
, 
 150                     (Hash_processor
) processor
,