From 5bab03fcf8db5771b6a9fc22d917e61bf143dde2 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 11 Dec 2002 05:20:31 +0000 Subject: [PATCH] Rename struniq to uniqstr, to avoid collision with . --- src/uniqstr.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/uniqstr.h | 52 ++++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100644 src/uniqstr.c create mode 100644 src/uniqstr.h diff --git a/src/uniqstr.c b/src/uniqstr.c new file mode 100644 index 00000000..9350df1b --- /dev/null +++ b/src/uniqstr.c @@ -0,0 +1,149 @@ +/* Keeping a unique copy of strings. + Copyright (C) 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + 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. + + Bison 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 + 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. */ + +#include "system.h" + +#include +#include +#include + +#include "uniqstr.h" + +/*-----------------------. +| A uniqstr hash table. | +`-----------------------*/ + +/* Initial capacity of uniqstr hash table. */ +#define HT_INITIAL_CAPACITY 257 + +static struct hash_table *uniqstrs_table = NULL; + +/*-------------------------------------. +| Create the uniqstr for S if needed. | +`-------------------------------------*/ + +uniqstr +uniqstr_new (const char *s) +{ + uniqstr res = hash_lookup (uniqstrs_table, s); + if (!res) + { + /* First insertion in the hash. */ + res = xstrdup (s); + hash_insert (uniqstrs_table, res); + } + return res; +} + + +/*------------------------------. +| Abort if S is not a uniqstr. | +`------------------------------*/ + +void +uniqstr_assert (const char *s) +{ + if (!hash_lookup (uniqstrs_table, s)) + { + error (0, 0, "not a uniqstr: %s", quotearg (s)); + abort (); + } +} + + +/*--------------------. +| Print the uniqstr. | +`--------------------*/ + +static bool +uniqstr_print (const uniqstr s) +{ + fprintf (stderr, "%s\n", s); + return true; +} + + +/*-----------------------. +| A uniqstr hash table. | +`-----------------------*/ + +static bool +hash_compare_uniqstr (const uniqstr m1, const uniqstr m2) +{ + return strcmp (m1, m2) == 0; +} + +static unsigned int +hash_uniqstr (const uniqstr m, unsigned int tablesize) +{ + return hash_string (m, tablesize); +} + +/* A function to apply to each symbol. */ +typedef bool (*uniqstr_processor) (const uniqstr); + +/*----------------------------. +| Create the uniqstrs table. | +`----------------------------*/ + +void +uniqstrs_new (void) +{ + uniqstrs_table = hash_initialize (HT_INITIAL_CAPACITY, + NULL, + (Hash_hasher) hash_uniqstr, + (Hash_comparator) hash_compare_uniqstr, + (Hash_data_freer) free); +} + + +/*-------------------------------------. +| Perform a task on all the uniqstrs. | +`-------------------------------------*/ + +static void +uniqstrs_do (uniqstr_processor processor, void *processor_data) +{ + hash_do_for_each (uniqstrs_table, + (Hash_processor) processor, + processor_data); +} + + +/*-----------------. +| Print them all. | +`-----------------*/ + +void +uniqstrs_print (void) +{ + uniqstrs_do (uniqstr_print, NULL); +} + + +/*--------------------. +| Free the uniqstrs. | +`--------------------*/ + +void +uniqstrs_free (void) +{ + hash_free (uniqstrs_table); +} diff --git a/src/uniqstr.h b/src/uniqstr.h new file mode 100644 index 00000000..6dc7f3f8 --- /dev/null +++ b/src/uniqstr.h @@ -0,0 +1,52 @@ +/* Keeping a unique copy of strings. + Copyright (C) 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + 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. + + Bison 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 + 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. */ + +#ifndef UNIQSTR_H_ +# define UNIQSTR_H_ + +/*-----------------------------------------. +| Pointers to unique copies of C strings. | +`-----------------------------------------*/ + +typedef char const *uniqstr; + +/* Return the uniqstr for S. */ +uniqstr uniqstr_new (char const *s); + +/* Two uniqstr have the same value iff they are the same. */ +#define UNIQSTR_EQ(S1, S2) ((S1) == (S2)) + +/*--------------------------------------. +| Initializing, destroying, debugging. | +`--------------------------------------*/ + +/* Create the string table. */ +void uniqstrs_new (void); + +/* Die if S is not a uniqstr. */ +void uniqstr_assert (const char *s); + +/* Free all the memory allocated for symbols. */ +void uniqstrs_free (void); + +/* Report them all. */ +void uniqstrs_print (void); + +#endif /* ! defined UNIQSTR_H_ */ -- 2.45.2