This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: A more consistent naming scheme for libiberty/hashtab.c
- To: rth at cygnus dot com, vmakarov at cygnus dot com
- Subject: Re: A more consistent naming scheme for libiberty/hashtab.c
- From: Zack Weinberg <zack at wolery dot cumb dot org>
- Date: Thu, 9 Mar 2000 13:03:58 -0800
- Cc: gcc-patches at gcc dot gnu dot org
- References: <20000229232325.R32089@wolery.cumb.org> <20000308142827.C13922@cygnus.com>
On Wed, Mar 08, 2000 at 02:28:27PM -0800, Richard Henderson wrote:
> On Tue, Feb 29, 2000 at 11:23:25PM -0800, Zack Weinberg wrote:
> > This patch renames all the functions to consistent, _short_ names, and
> > tunes the expansion and lookup functions a bit.
>
> Ok.
Thanks.
Here's an additional refinement: it adds a hook for deleting elements
from the hash table, so you don't have to worry about deallocating
them by hand. If you don't need this, you can set it to NULL.
zw
* hashtab.h (struct htab): Add del_f.
(htab_del): New type.
(htab_create): Add fourth argument.
* hashtab.c (htab_create): Set del_f.
(htab_delete, htab_empty, htab_remove_elt, htab_clear_slot):
Use it.
===================================================================
Index: include/hashtab.h
--- include/hashtab.h 2000/03/08 23:44:29 1.3
+++ include/hashtab.h 2000/03/09 21:02:19
@@ -47,6 +47,10 @@ typedef unsigned int (*htab_hash) PARAMS
the table always comes first. */
typedef int (*htab_eq) PARAMS ((const void *, const void *));
+/* Cleanup function called whenever a live element is removed from
+ the hash table. */
+typedef void (*htab_del) PARAMS ((void *));
+
/* Function called by htab_traverse for each live element. The first
arg is the element, the second arg is the auxiliary pointer handed
to htab_traverse. Return 1 to continue scan, 0 to stop. */
@@ -62,10 +66,13 @@ struct htab
/* Pointer to hash function. */
htab_hash hash_f;
- /* Pointer to comparison function. */
+ /* Pointer to comparison function. */
htab_eq eq_f;
- /* Table itself */
+ /* Pointer to cleanup function. */
+ htab_del del_f;
+
+ /* Table itself. */
void **entries;
/* Current size (in entries) of the hash table */
@@ -90,7 +97,8 @@ typedef struct htab *htab_t;
/* The prototypes of the package functions. */
-extern htab_t htab_create PARAMS ((size_t, htab_hash, htab_eq));
+extern htab_t htab_create PARAMS ((size_t, htab_hash,
+ htab_eq, htab_del));
extern void htab_delete PARAMS ((htab_t));
extern void htab_empty PARAMS ((htab_t));
===================================================================
Index: libiberty/hashtab.c
--- libiberty/hashtab.c 2000/03/08 23:44:29 1.6
+++ libiberty/hashtab.c 2000/03/09 21:02:19
@@ -88,10 +88,11 @@ higher_prime_number (n)
created hash table. */
htab_t
-htab_create (size, hash_f, eq_f)
+htab_create (size, hash_f, eq_f, del_f)
size_t size;
htab_hash hash_f;
htab_eq eq_f;
+ htab_del del_f;
{
htab_t result;
@@ -101,6 +102,7 @@ htab_create (size, hash_f, eq_f)
result->size = size;
result->hash_f = hash_f;
result->eq_f = eq_f;
+ result->del_f = del_f;
return result;
}
@@ -111,6 +113,15 @@ void
htab_delete (htab)
htab_t htab;
{
+ int i;
+ if (htab->del_f)
+ for (i = htab->size - 1; i >= 0; i--)
+ {
+ if (htab->entries[i] != EMPTY_ENTRY
+ && htab->entries[i] != DELETED_ENTRY)
+ (*htab->del_f) (htab->entries[i]);
+ }
+
free (htab->entries);
free (htab);
}
@@ -121,6 +132,15 @@ void
htab_empty (htab)
htab_t htab;
{
+ int i;
+ if (htab->del_f)
+ for (i = htab->size - 1; i >= 0; i--)
+ {
+ if (htab->entries[i] != EMPTY_ENTRY
+ && htab->entries[i] != DELETED_ENTRY)
+ (*htab->del_f) (htab->entries[i]);
+ }
+
memset (htab->entries, 0, htab->size * sizeof (void *));
}
@@ -273,6 +293,9 @@ htab_remove_elt (htab, element)
if (*slot == EMPTY_ENTRY)
return;
+ if (htab->del_f)
+ (*htab->del_f) (*slot);
+
*slot = DELETED_ENTRY;
htab->n_deleted++;
}
@@ -289,6 +312,8 @@ htab_clear_slot (htab, slot)
if (slot < htab->entries || slot >= htab->entries + htab->size
|| *slot == EMPTY_ENTRY || *slot == DELETED_ENTRY)
abort ();
+ if (htab->del_f)
+ (*htab->del_f) (*slot);
*slot = DELETED_ENTRY;
htab->n_deleted++;
}