1 /* Keep a unique copy of strings. 2 3 Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 4 5 This file is part of Bison, the GNU Compiler Compiler. 6 7 Bison is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2, or (at your option) 10 any later version. 11 12 Bison is distributed in the hope that it will be useful, 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 18 along with Bison; see the file COPYING. If not, write to 19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 20 Boston, MA 02110-1301, USA. */ 21 22 #include <config.h> 23 #include "system.h" 24 25 #include <error.h> 26 #include <hash.h> 27 #include <quotearg.h> 28 29 #include "uniqstr.h" 30 31 /*-----------------------. 32 | A uniqstr hash table. | 33 `-----------------------*/ 34 35 /* Initial capacity of uniqstr hash table. */ 36 #define HT_INITIAL_CAPACITY 257 37 38 static struct hash_table *uniqstrs_table = NULL; 39 40 /*-------------------------------------. 41 | Create the uniqstr for S if needed. | 42 `-------------------------------------*/ 43 44 uniqstr 45 uniqstr_new (char const *str) 46 { 47 uniqstr res = hash_lookup (uniqstrs_table, str); 48 if (!res) 49 { 50 /* First insertion in the hash. */ 51 res = xstrdup (str); 52 hash_insert (uniqstrs_table, res); 53 } 54 return res; 55 } 56 57 58 /*------------------------------. 59 | Abort if S is not a uniqstr. | 60 `------------------------------*/ 61 62 void 63 uniqstr_assert (char const *str) 64 { 65 if (!hash_lookup (uniqstrs_table, str)) 66 { 67 error (0, 0, 68 "not a uniqstr: %s", quotearg (str)); 69 abort (); 70 } 71 } 72 73 74 /*--------------------. 75 | Print the uniqstr. | 76 `--------------------*/ 77 78 static inline bool 79 uniqstr_print (uniqstr ustr) 80 { 81 fprintf (stderr, "%s\n", ustr); 82 return true; 83 } 84 85 static bool 86 uniqstr_print_processor (void *ustr, void *null ATTRIBUTE_UNUSED) 87 { 88 return uniqstr_print (ustr); 89 } 90 91 92 /*-----------------------. 94 | A uniqstr hash table. | 95 `-----------------------*/ 96 97 static bool 98 hash_compare_uniqstr (void const *m1, void const *m2) 99 { 100 return strcmp (m1, m2) == 0; 101 } 102 103 static size_t 104 hash_uniqstr (void const *m, size_t tablesize) 105 { 106 return hash_string (m, tablesize); 107 } 108 109 /*----------------------------. 110 | Create the uniqstrs table. | 111 `----------------------------*/ 112 113 void 114 uniqstrs_new (void) 115 { 116 uniqstrs_table = hash_initialize (HT_INITIAL_CAPACITY, 117 NULL, 118 hash_uniqstr, 119 hash_compare_uniqstr, 120 free); 121 } 122 123 124 /*-------------------------------------. 125 | Perform a task on all the uniqstrs. | 126 `-------------------------------------*/ 127 128 static void 129 uniqstrs_do (Hash_processor processor, void *processor_data) 130 { 131 hash_do_for_each (uniqstrs_table, processor, processor_data); 132 } 133 134 135 /*-----------------. 136 | Print them all. | 137 `-----------------*/ 138 139 void 140 uniqstrs_print (void) 141 { 142 uniqstrs_do (uniqstr_print_processor, NULL); 143 } 144 145 146 /*--------------------. 147 | Free the uniqstrs. | 148 `--------------------*/ 149 150 void 151 uniqstrs_free (void) 152 { 153 hash_free (uniqstrs_table); 154 } 155