]> git.saurik.com Git - bison.git/blame - src/uniqstr.c
Work around Java's ``code too large'' problem for parser tables.
[bison.git] / src / uniqstr.c
CommitLineData
ac72f3e9
PE
1/* Keep a unique copy of strings.
2
04098407 3 Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
5bab03fc
PE
4
5 This file is part of Bison, the GNU Compiler Compiler.
6
f16b0819 7 This program is free software: you can redistribute it and/or modify
5bab03fc 8 it under the terms of the GNU General Public License as published by
f16b0819
PE
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
5bab03fc 11
f16b0819 12 This program is distributed in the hope that it will be useful,
5bab03fc
PE
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
f16b0819 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
5bab03fc 19
2cec9080 20#include <config.h>
5bab03fc
PE
21#include "system.h"
22
23#include <error.h>
24#include <hash.h>
25#include <quotearg.h>
26
27#include "uniqstr.h"
28
29/*-----------------------.
30| A uniqstr hash table. |
31`-----------------------*/
32
33/* Initial capacity of uniqstr hash table. */
34#define HT_INITIAL_CAPACITY 257
35
36static struct hash_table *uniqstrs_table = NULL;
37
38/*-------------------------------------.
39| Create the uniqstr for S if needed. |
40`-------------------------------------*/
41
42uniqstr
a737b216 43uniqstr_new (char const *str)
5bab03fc 44{
a737b216 45 uniqstr res = hash_lookup (uniqstrs_table, str);
5bab03fc
PE
46 if (!res)
47 {
48 /* First insertion in the hash. */
a737b216 49 res = xstrdup (str);
5bab03fc
PE
50 hash_insert (uniqstrs_table, res);
51 }
52 return res;
53}
54
55
56/*------------------------------.
57| Abort if S is not a uniqstr. |
58`------------------------------*/
59
60void
a737b216 61uniqstr_assert (char const *str)
5bab03fc 62{
a737b216 63 if (!hash_lookup (uniqstrs_table, str))
5bab03fc 64 {
04098407
PE
65 error (0, 0,
66 "not a uniqstr: %s", quotearg (str));
5bab03fc
PE
67 abort ();
68 }
69}
70
71
72/*--------------------.
73| Print the uniqstr. |
74`--------------------*/
75
ac72f3e9 76static inline bool
a737b216 77uniqstr_print (uniqstr ustr)
5bab03fc 78{
a737b216 79 fprintf (stderr, "%s\n", ustr);
5bab03fc
PE
80 return true;
81}
82
ac72f3e9 83static bool
a737b216 84uniqstr_print_processor (void *ustr, void *null ATTRIBUTE_UNUSED)
ac72f3e9 85{
a737b216 86 return uniqstr_print (ustr);
ac72f3e9
PE
87}
88
5bab03fc
PE
89\f
90/*-----------------------.
91| A uniqstr hash table. |
92`-----------------------*/
93
94static bool
ac72f3e9 95hash_compare_uniqstr (void const *m1, void const *m2)
5bab03fc
PE
96{
97 return strcmp (m1, m2) == 0;
98}
99
233a88ad
PE
100static size_t
101hash_uniqstr (void const *m, size_t tablesize)
5bab03fc
PE
102{
103 return hash_string (m, tablesize);
104}
105
5bab03fc
PE
106/*----------------------------.
107| Create the uniqstrs table. |
108`----------------------------*/
109
110void
111uniqstrs_new (void)
112{
113 uniqstrs_table = hash_initialize (HT_INITIAL_CAPACITY,
114 NULL,
ac72f3e9
PE
115 hash_uniqstr,
116 hash_compare_uniqstr,
117 free);
5bab03fc
PE
118}
119
120
121/*-------------------------------------.
122| Perform a task on all the uniqstrs. |
123`-------------------------------------*/
124
125static void
ac72f3e9 126uniqstrs_do (Hash_processor processor, void *processor_data)
5bab03fc 127{
ac72f3e9 128 hash_do_for_each (uniqstrs_table, processor, processor_data);
5bab03fc
PE
129}
130
131
132/*-----------------.
133| Print them all. |
134`-----------------*/
135
136void
137uniqstrs_print (void)
138{
ac72f3e9 139 uniqstrs_do (uniqstr_print_processor, NULL);
5bab03fc
PE
140}
141
142
143/*--------------------.
144| Free the uniqstrs. |
145`--------------------*/
146
147void
148uniqstrs_free (void)
149{
150 hash_free (uniqstrs_table);
151}