]> git.saurik.com Git - bison.git/blobdiff - src/uniqstr.c
hash: check insertion for memory exhaustion.
[bison.git] / src / uniqstr.c
index 9350df1bec731367cc50682d62c463f9dec0c23d..78b8a98d1aa99e2876b01151fb562034ae015120 100644 (file)
@@ -1,23 +1,23 @@
-/* Keeping a unique copy of strings.
-   Copyright (C) 2002 Free Software Foundation, Inc.
+/* Keep a unique copy of strings.
+
+   Copyright (C) 2002, 2003, 2004, 2005, 2009 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
-   Bison is free software; you can redistribute it and/or modify
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
 
 
-   Bison is distributed in the hope that it will be useful,
+   This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
+#include <config.h>
 #include "system.h"
 
 #include <error.h>
 #include "system.h"
 
 #include <error.h>
@@ -40,14 +40,15 @@ static struct hash_table *uniqstrs_table = NULL;
 `-------------------------------------*/
 
 uniqstr
 `-------------------------------------*/
 
 uniqstr
-uniqstr_new (const char *s)
+uniqstr_new (char const *str)
 {
 {
-  uniqstr res = hash_lookup (uniqstrs_table, s);
+  uniqstr res = hash_lookup (uniqstrs_table, str);
   if (!res)
     {
       /* First insertion in the hash. */
   if (!res)
     {
       /* First insertion in the hash. */
-      res = xstrdup (s);
-      hash_insert (uniqstrs_table, res);
+      res = xstrdup (str);
+      if (!hash_insert (uniqstrs_table, res))
+        xalloc_die ();
     }
   return res;
 }
     }
   return res;
 }
@@ -58,11 +59,12 @@ uniqstr_new (const char *s)
 `------------------------------*/
 
 void
 `------------------------------*/
 
 void
-uniqstr_assert (const char *s)
+uniqstr_assert (char const *str)
 {
 {
-  if (!hash_lookup (uniqstrs_table, s))
+  if (!hash_lookup (uniqstrs_table, str))
     {
     {
-      error (0, 0, "not a uniqstr: %s", quotearg (s));
+      error (0, 0,
+            "not a uniqstr: %s", quotearg (str));
       abort ();
     }
 }
       abort ();
     }
 }
@@ -72,33 +74,36 @@ uniqstr_assert (const char *s)
 | Print the uniqstr.  |
 `--------------------*/
 
 | Print the uniqstr.  |
 `--------------------*/
 
-static bool
-uniqstr_print (const uniqstr s)
+static inline bool
+uniqstr_print (uniqstr ustr)
 {
 {
-  fprintf (stderr, "%s\n", s);
+  fprintf (stderr, "%s\n", ustr);
   return true;
 }
 
   return true;
 }
 
+static bool
+uniqstr_print_processor (void *ustr, void *null ATTRIBUTE_UNUSED)
+{
+  return uniqstr_print (ustr);
+}
+
 \f
 /*-----------------------.
 | A uniqstr hash table.  |
 `-----------------------*/
 
 static bool
 \f
 /*-----------------------.
 | A uniqstr hash table.  |
 `-----------------------*/
 
 static bool
-hash_compare_uniqstr (const uniqstr m1, const uniqstr m2)
+hash_compare_uniqstr (void const *m1, void const *m2)
 {
   return strcmp (m1, m2) == 0;
 }
 
 {
   return strcmp (m1, m2) == 0;
 }
 
-static unsigned int
-hash_uniqstr (const uniqstr m, unsigned int tablesize)
+static size_t
+hash_uniqstr (void const *m, size_t tablesize)
 {
   return hash_string (m, tablesize);
 }
 
 {
   return hash_string (m, tablesize);
 }
 
-/* A function to apply to each symbol. */
-typedef bool (*uniqstr_processor) (const uniqstr);
-
 /*----------------------------.
 | Create the uniqstrs table.  |
 `----------------------------*/
 /*----------------------------.
 | Create the uniqstrs table.  |
 `----------------------------*/
@@ -108,9 +113,9 @@ uniqstrs_new (void)
 {
   uniqstrs_table = hash_initialize (HT_INITIAL_CAPACITY,
                                    NULL,
 {
   uniqstrs_table = hash_initialize (HT_INITIAL_CAPACITY,
                                    NULL,
-                                   (Hash_hasher) hash_uniqstr,
-                                   (Hash_comparator) hash_compare_uniqstr,
-                                   (Hash_data_freer) free);
+                                   hash_uniqstr,
+                                   hash_compare_uniqstr,
+                                   free);
 }
 
 
 }
 
 
@@ -119,11 +124,9 @@ uniqstrs_new (void)
 `-------------------------------------*/
 
 static void
 `-------------------------------------*/
 
 static void
-uniqstrs_do (uniqstr_processor processor, void *processor_data)
+uniqstrs_do (Hash_processor processor, void *processor_data)
 {
 {
-  hash_do_for_each (uniqstrs_table,
-                   (Hash_processor) processor,
-                   processor_data);
+  hash_do_for_each (uniqstrs_table, processor, processor_data);
 }
 
 
 }
 
 
@@ -134,7 +137,7 @@ uniqstrs_do (uniqstr_processor processor, void *processor_data)
 void
 uniqstrs_print (void)
 {
 void
 uniqstrs_print (void)
 {
-  uniqstrs_do (uniqstr_print, NULL);
+  uniqstrs_do (uniqstr_print_processor, NULL);
 }
 
 
 }