Home | History | Annotate | Download | only in src
      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