]> git.saurik.com Git - bison.git/blame - src/uniqstr.c
Merge remote-tracking branch 'origin/maint'
[bison.git] / src / uniqstr.c
CommitLineData
ac72f3e9
PE
1/* Keep a unique copy of strings.
2
34136e65 3 Copyright (C) 2002-2005, 2009-2012 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>
10659d0e 26#include <stdarg.h>
5bab03fc
PE
27
28#include "uniqstr.h"
29
30/*-----------------------.
31| A uniqstr hash table. |
32`-----------------------*/
33
34/* Initial capacity of uniqstr hash table. */
35#define HT_INITIAL_CAPACITY 257
36
37static struct hash_table *uniqstrs_table = NULL;
38
39/*-------------------------------------.
40| Create the uniqstr for S if needed. |
41`-------------------------------------*/
42
43uniqstr
a737b216 44uniqstr_new (char const *str)
5bab03fc 45{
a737b216 46 uniqstr res = hash_lookup (uniqstrs_table, str);
5bab03fc
PE
47 if (!res)
48 {
49 /* First insertion in the hash. */
a737b216 50 res = xstrdup (str);
b5c212b6
AD
51 if (!hash_insert (uniqstrs_table, res))
52 xalloc_die ();
5bab03fc
PE
53 }
54 return res;
55}
56
10659d0e
JD
57uniqstr
58uniqstr_vsprintf (char const *format, ...)
59{
60 va_list args;
61 size_t length;
62 va_start (args, format);
63 length = vsnprintf (NULL, 0, format, args);
64 va_end (args);
65
66 char res[length + 1];
67 va_start (args, format);
68 vsprintf (res, format, args);
69 va_end (args);
70 return uniqstr_new (res);
71}
5bab03fc
PE
72
73/*------------------------------.
74| Abort if S is not a uniqstr. |
75`------------------------------*/
76
77void
a737b216 78uniqstr_assert (char const *str)
5bab03fc 79{
a737b216 80 if (!hash_lookup (uniqstrs_table, str))
5bab03fc 81 {
04098407 82 error (0, 0,
e9690142 83 "not a uniqstr: %s", quotearg (str));
5bab03fc
PE
84 abort ();
85 }
86}
87
88
89/*--------------------.
90| Print the uniqstr. |
91`--------------------*/
92
ac72f3e9 93static inline bool
a737b216 94uniqstr_print (uniqstr ustr)
5bab03fc 95{
a737b216 96 fprintf (stderr, "%s\n", ustr);
5bab03fc
PE
97 return true;
98}
99
ac72f3e9 100static bool
a737b216 101uniqstr_print_processor (void *ustr, void *null ATTRIBUTE_UNUSED)
ac72f3e9 102{
a737b216 103 return uniqstr_print (ustr);
ac72f3e9
PE
104}
105
5bab03fc
PE
106\f
107/*-----------------------.
108| A uniqstr hash table. |
109`-----------------------*/
110
111static bool
ac72f3e9 112hash_compare_uniqstr (void const *m1, void const *m2)
5bab03fc 113{
f518dbaf 114 return STREQ (m1, m2);
5bab03fc
PE
115}
116
233a88ad
PE
117static size_t
118hash_uniqstr (void const *m, size_t tablesize)
5bab03fc
PE
119{
120 return hash_string (m, tablesize);
121}
122
5bab03fc
PE
123/*----------------------------.
124| Create the uniqstrs table. |
125`----------------------------*/
126
127void
128uniqstrs_new (void)
129{
130 uniqstrs_table = hash_initialize (HT_INITIAL_CAPACITY,
e9690142
JD
131 NULL,
132 hash_uniqstr,
133 hash_compare_uniqstr,
134 free);
5bab03fc
PE
135}
136
137
138/*-------------------------------------.
139| Perform a task on all the uniqstrs. |
140`-------------------------------------*/
141
142static void
ac72f3e9 143uniqstrs_do (Hash_processor processor, void *processor_data)
5bab03fc 144{
ac72f3e9 145 hash_do_for_each (uniqstrs_table, processor, processor_data);
5bab03fc
PE
146}
147
148
149/*-----------------.
150| Print them all. |
151`-----------------*/
152
153void
154uniqstrs_print (void)
155{
ac72f3e9 156 uniqstrs_do (uniqstr_print_processor, NULL);
5bab03fc
PE
157}
158
159
160/*--------------------.
161| Free the uniqstrs. |
162`--------------------*/
163
164void
165uniqstrs_free (void)
166{
167 hash_free (uniqstrs_table);
168}