]> 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
7d6bad19 3 Copyright (C) 2002-2005, 2009-2013 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
55439a1c
AD
106
107int
108uniqstr_cmp(uniqstr l, uniqstr r)
109{
110 return (l == r ? 0
111 : !l ? -1
112 : !r ? +1
113 : strcmp (l, r));
114}
115
116
5bab03fc
PE
117/*-----------------------.
118| A uniqstr hash table. |
119`-----------------------*/
120
121static bool
ac72f3e9 122hash_compare_uniqstr (void const *m1, void const *m2)
5bab03fc 123{
f518dbaf 124 return STREQ (m1, m2);
5bab03fc
PE
125}
126
233a88ad
PE
127static size_t
128hash_uniqstr (void const *m, size_t tablesize)
5bab03fc
PE
129{
130 return hash_string (m, tablesize);
131}
132
55439a1c 133
5bab03fc
PE
134/*----------------------------.
135| Create the uniqstrs table. |
136`----------------------------*/
137
138void
139uniqstrs_new (void)
140{
141 uniqstrs_table = hash_initialize (HT_INITIAL_CAPACITY,
e9690142
JD
142 NULL,
143 hash_uniqstr,
144 hash_compare_uniqstr,
145 free);
5bab03fc
PE
146}
147
148
149/*-------------------------------------.
150| Perform a task on all the uniqstrs. |
151`-------------------------------------*/
152
153static void
ac72f3e9 154uniqstrs_do (Hash_processor processor, void *processor_data)
5bab03fc 155{
ac72f3e9 156 hash_do_for_each (uniqstrs_table, processor, processor_data);
5bab03fc
PE
157}
158
159
160/*-----------------.
161| Print them all. |
162`-----------------*/
163
164void
165uniqstrs_print (void)
166{
ac72f3e9 167 uniqstrs_do (uniqstr_print_processor, NULL);
5bab03fc
PE
168}
169
170
171/*--------------------.
172| Free the uniqstrs. |
173`--------------------*/
174
175void
176uniqstrs_free (void)
177{
178 hash_free (uniqstrs_table);
179}