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
,