aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog55
-rw-r--r--gcc/cpperror.c1
-rw-r--r--gcc/cppexp.c10
-rw-r--r--gcc/cppfiles.c20
-rw-r--r--gcc/cpphash.c12
-rw-r--r--gcc/cpphash.h3
-rw-r--r--gcc/cppinit.c5
-rw-r--r--gcc/cpplex.c1
-rw-r--r--gcc/cpplib.c11
-rw-r--r--gcc/emit-rtl.c3
-rw-r--r--gcc/simplify-rtx.c7
-rw-r--r--include/ChangeLog5
-rw-r--r--include/hashtab.h15
-rw-r--r--libiberty/ChangeLog6
-rw-r--r--libiberty/hashtab.c100
15 files changed, 149 insertions, 105 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1515aa6..8f96af3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,41 @@
+Tue Apr 18 14:16:47 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * conflict.c (conflict_graph_add): Pass enum type to htab_find_slot.
+ * cpperror.c (hashtab.h): Now include.
+ * cppexp.c (hashtab.h): Likewise.
+ * cpplex.c (hashtab.h): Likewise.
+ * cppfiles.c (hashtab.h): Likewise.
+ (find_include_file, _cpp_calc_hash, cpp_read_file): Pass enum type
+ to htab_find_slot_with_hash.
+ * cpphash.c (hashtab.h): Now include.
+ (_cpp_lookup_slot): INSERT is now enum insert_option.
+ * cpphash.h (_cpp_lookup_slot): Likewise.
+ * cppinit.c (hashtab.h): Include earlier.
+ (initialize_builtins): Pass enum to htab_find_slot.
+ * cpplib.c (hashtab.h): Now include.
+ (do_define, do_undef): Pass enum type to _cpp_lookup_slot.
+ (do_pragma_poison, do_assert): Likewise.
+ * emit-rtl.c (gen_rtx_CONST_INT): Pass enum to
+ htab_find_slot_with_hash.
+ * simplify-rtx.c (cselib_lookup_mem, cselib_lookup): Likewise.
+ * tree.c (type_hash_add): Likewise.
+ (build1): Minor cleanup.
+
+ * ggc-common.c: Add missing blanks.
+ * print-tree.c (print_node): Print DECL_OFFSET_ALIGN.
+ * tree.h (DECL_OFFSET_ALIGN): Fix typo in comment.
+
+ * stmt.c (mark_case_node): New function.
+ (mark_case_nesting): Call it.
+
+ * expmed.c (emit_store_flag): If comparing two-word integer
+ with zero, can optimize NE, EQ, GE, and LT.
+
+ * c-decl.c (mark_binding_level): Use 'for' instead of `while'.
+ * conflict.c: Minor cleanups.
+ * optabs.c: Add blank line
+ * simplify-rtx.c: Minor cleanups.
+
2000-04-18 Stan Cox <scox@cygnus.com>
* gengenrtl.c (genlegend): Fix misspelling.
@@ -20,23 +58,6 @@
(OLD_CC): Likewise.
* config/m68k/x-ccur (X_CFLAGS): Likewise.
-Tue Apr 18 14:16:47 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
-
- * ggc-common.c: Add missing blanks.
- * print-tree.c (print_node): Print DECL_OFFSET_ALIGN.
- * tree.h (DECL_OFFSET_ALIGN): Fix typo in comment.
-
- * stmt.c (mark_case_node): New function.
- (mark_case_nesting): Call it.
-
- * expmed.c (emit_store_flag): If comparing two-word integer
- with zero, can optimize NE, EQ, GE, and LT.
-
- * c-decl.c (mark_binding_level): Use 'for' instead of `while'.
- * conflict.c: Minor cleanups.
- * optabs.c: Add blank line
- * simplify-rtx.c: Minor cleanups.
-
2000-04-18 Mark Mitchell <mark@codesourcery.com>
* cpplex.c (_cpp_lex_token): Don't call CPP_BUMP_LINE when the
diff --git a/gcc/cpperror.c b/gcc/cpperror.c
index 0e8afc4..e798b78 100644
--- a/gcc/cpperror.c
+++ b/gcc/cpperror.c
@@ -25,6 +25,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "config.h"
#include "system.h"
+#include "hashtab.h"
#include "cpplib.h"
#include "cpphash.h"
#include "intl.h"
diff --git a/gcc/cppexp.c b/gcc/cppexp.c
index 237b8e6..91ffc5d 100644
--- a/gcc/cppexp.c
+++ b/gcc/cppexp.c
@@ -1,5 +1,6 @@
/* Parse C expressions for cpplib.
Copyright (C) 1987, 92, 94, 95, 97, 98, 1999, 2000 Free Software Foundation.
+ Contributed by Per Bothner, 1994.
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 the
@@ -14,19 +15,14 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.
-
- In other words, you are welcome to use, share and improve this program.
- You are forbidden to forbid anyone else to use, share and improve
- what you give them. Help stamp out software-hoarding!
-
-Written by Per Bothner 1994. */
+Boston, MA 02111-1307, USA. */
/* Parse a C expression from text in a string */
#include "config.h"
#include "system.h"
#include "cpplib.h"
+#include "hashtab.h"
#include "cpphash.h"
#ifndef CHAR_TYPE_SIZE
diff --git a/gcc/cppfiles.c b/gcc/cppfiles.c
index cc891d4..f7cdd31 100644
--- a/gcc/cppfiles.c
+++ b/gcc/cppfiles.c
@@ -18,17 +18,13 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- In other words, you are welcome to use, share and improve this program.
- You are forbidden to forbid anyone else to use, share and improve
- what you give them. Help stamp out software-hoarding! */
+Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "config.h"
#include "system.h"
+#include "hashtab.h"
#include "cpplib.h"
#include "cpphash.h"
-#include "hashtab.h"
#include "intl.h"
#include "mkdeps.h"
@@ -263,8 +259,8 @@ find_include_file (pfile, fname, search_start, ihash, before)
dummy.hash = _cpp_calc_hash (fname, strlen (fname));
path = (fname[0] == '/') ? ABSOLUTE_PATH : search_start;
slot = (IHASH **) htab_find_slot_with_hash (pfile->all_include_files,
- (const void *)&dummy,
- dummy.hash, 1);
+ (const void *) &dummy,
+ dummy.hash, INSERT);
if (*slot && (ih = redundant_include_p (pfile, *slot, path)))
{
@@ -333,8 +329,8 @@ _cpp_fake_ihash (pfile, fname)
dummy.nshort = fname;
dummy.hash = _cpp_calc_hash (fname, strlen (fname));
slot = (IHASH **) htab_find_slot_with_hash (pfile->all_include_files,
- (const void *)&dummy,
- dummy.hash, 1);
+ (const void *) &dummy,
+ dummy.hash, INSERT);
if (*slot)
return (*slot)->name;
ih = make_IHASH (fname, 0, ABSOLUTE_PATH, dummy.hash, slot);
@@ -670,10 +666,10 @@ cpp_read_file (pfile, fname)
dummy.hash = _cpp_calc_hash (fname, strlen (fname));
slot = (IHASH **) htab_find_slot_with_hash (pfile->all_include_files,
(const void *) &dummy,
- dummy.hash, 1);
+ dummy.hash, INSERT);
if (*slot && (ih = redundant_include_p (pfile, *slot, ABSOLUTE_PATH)))
{
- if (ih == (IHASH *)-1)
+ if (ih == (IHASH *) -1)
return 1; /* Already included. */
}
else
diff --git a/gcc/cpphash.c b/gcc/cpphash.c
index bb13dda..6f28295 100644
--- a/gcc/cpphash.c
+++ b/gcc/cpphash.c
@@ -26,8 +26,9 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "config.h"
#include "system.h"
#include "cpplib.h"
-#include "cpphash.h"
#include "hashtab.h"
+#include "cpphash.h"
+
#undef abort
static unsigned int hash_HASHNODE PARAMS ((const void *));
@@ -200,12 +201,13 @@ _cpp_lookup (pfile, name, len)
}
/* Find the hashtable slot for name "name". Used to insert or delete. */
+
HASHNODE **
_cpp_lookup_slot (pfile, name, len, insert, hash)
cpp_reader *pfile;
const U_CHAR *name;
int len;
- int insert;
+ enum insert_option insert;
unsigned long *hash;
{
const U_CHAR *bp;
@@ -214,7 +216,9 @@ _cpp_lookup_slot (pfile, name, len, insert, hash)
if (len < 0)
{
- for (bp = name; is_idchar (*bp); bp++);
+ for (bp = name; is_idchar (*bp); bp++)
+ ;
+
len = bp - name;
}
@@ -223,7 +227,7 @@ _cpp_lookup_slot (pfile, name, len, insert, hash)
dummy.hash = _cpp_calc_hash (name, len);
slot = (HASHNODE **) htab_find_slot_with_hash (pfile->hashtab,
- (void *)&dummy,
+ (void *) &dummy,
dummy.hash, insert);
if (insert)
*hash = dummy.hash;
diff --git a/gcc/cpphash.h b/gcc/cpphash.h
index 90fff64..9779fad 100644
--- a/gcc/cpphash.h
+++ b/gcc/cpphash.h
@@ -274,7 +274,8 @@ extern unsigned int _cpp_calc_hash PARAMS ((const U_CHAR *, size_t));
extern HASHNODE *_cpp_lookup PARAMS ((cpp_reader *,
const U_CHAR *, int));
extern HASHNODE **_cpp_lookup_slot PARAMS ((cpp_reader *,
- const U_CHAR *, int, int,
+ const U_CHAR *, int,
+ enum insert_option,
unsigned long *));
extern void _cpp_free_definition PARAMS ((DEFINITION *));
extern DEFINITION *_cpp_create_definition PARAMS ((cpp_reader *, int));
diff --git a/gcc/cppinit.c b/gcc/cppinit.c
index 7d20b2c..6feb060 100644
--- a/gcc/cppinit.c
+++ b/gcc/cppinit.c
@@ -21,14 +21,13 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "config.h"
#include "system.h"
-
+#include "hashtab.h"
#include "cpplib.h"
#include "cpphash.h"
#include "output.h"
#include "prefix.h"
#include "intl.h"
#include "version.h"
-#include "hashtab.h"
#include "mkdeps.h"
/* Predefined symbols, built-in macros, and the default include path. */
@@ -683,7 +682,7 @@ initialize_builtins (pfile)
hp = _cpp_make_hashnode (b->name, len, b->type,
_cpp_calc_hash (b->name, len));
hp->value.cpval = val;
- *(htab_find_slot (pfile->hashtab, (void *)hp, 1)) = hp;
+ *(htab_find_slot (pfile->hashtab, (void *) hp, INSERT)) = hp;
if ((b->flags & DUMP) && CPP_OPTION (pfile, debug_output))
dump_special_to_buffer (pfile, b->name);
diff --git a/gcc/cpplex.c b/gcc/cpplex.c
index 06bee99..9d0a792 100644
--- a/gcc/cpplex.c
+++ b/gcc/cpplex.c
@@ -22,6 +22,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "config.h"
#include "system.h"
#include "intl.h"
+#include "hashtab.h"
#include "cpplib.h"
#include "cpphash.h"
diff --git a/gcc/cpplib.c b/gcc/cpplib.c
index 44cc189..87f245c 100644
--- a/gcc/cpplib.c
+++ b/gcc/cpplib.c
@@ -22,6 +22,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "config.h"
#include "system.h"
+#include "hashtab.h"
#include "cpplib.h"
#include "cpphash.h"
#include "hashtab.h"
@@ -392,7 +393,7 @@ do_define (pfile)
goto out;
}
- slot = _cpp_lookup_slot (pfile, sym, len, 1, &hash);
+ slot = _cpp_lookup_slot (pfile, sym, len, INSERT, &hash);
if (*slot)
{
int ok;
@@ -770,7 +771,7 @@ do_undef (pfile)
name = pfile->token_buffer + here;
CPP_SET_WRITTEN (pfile, here);
- slot = _cpp_lookup_slot (pfile, name, len, 0, 0);
+ slot = _cpp_lookup_slot (pfile, name, len, NO_INSERT, 0);
if (slot)
{
HASHNODE *hp = *slot;
@@ -1028,7 +1029,7 @@ do_pragma_poison (pfile)
p = pfile->token_buffer + written;
len = strlen (p);
- slot = _cpp_lookup_slot (pfile, p, len, 1, &hash);
+ slot = _cpp_lookup_slot (pfile, p, len, INSERT, &hash);
if (*slot)
{
HASHNODE *hp = *slot;
@@ -1586,14 +1587,14 @@ do_assert (pfile)
sym = pfile->token_buffer + old_written;
blen = (U_CHAR *) strchr (sym, '(') - sym;
- tslot = _cpp_lookup_slot (pfile, sym, tlen, 1, &thash);
+ tslot = _cpp_lookup_slot (pfile, sym, tlen, INSERT, &thash);
if (*tslot)
{
cpp_warning (pfile, "%s re-asserted", sym);
goto error;
}
- bslot = _cpp_lookup_slot (pfile, sym, blen, 1, &bhash);
+ bslot = _cpp_lookup_slot (pfile, sym, blen, INSERT, &bhash);
if (! *bslot)
{
*bslot = base = _cpp_make_hashnode (sym, blen, T_ASSERT, bhash);
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 98009ec..9044fb5 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -248,7 +248,8 @@ gen_rtx_CONST_INT (mode, arg)
#endif
/* Look up the CONST_INT in the hash table. */
- slot = htab_find_slot_with_hash (const_int_htab, &arg, (hashval_t) arg, 1);
+ slot = htab_find_slot_with_hash (const_int_htab, &arg,
+ (hashval_t) arg, INSERT);
if (*slot == 0)
{
if (!ggc_p)
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index ffe7b24..a959557 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -2662,7 +2662,7 @@ cselib_lookup_mem (x, create)
mem_elt = new_cselib_val (++next_unknown_value, GET_MODE (x));
add_mem_for_addr (addr, mem_elt, x);
- slot = htab_find_slot_with_hash (hash_table, x, mem_elt->value, 1);
+ slot = htab_find_slot_with_hash (hash_table, x, mem_elt->value, INSERT);
*slot = mem_elt;
return mem_elt;
}
@@ -2782,7 +2782,7 @@ cselib_lookup (x, mode, create)
e = new_cselib_val (++next_unknown_value, GET_MODE (x));
e->locs = new_elt_loc_list (e->locs, x);
REG_VALUES (i) = new_elt_list (REG_VALUES (i), e);
- slot = htab_find_slot_with_hash (hash_table, x, e->value, 1);
+ slot = htab_find_slot_with_hash (hash_table, x, e->value, INSERT);
*slot = e;
return e;
}
@@ -2795,7 +2795,8 @@ cselib_lookup (x, mode, create)
if (! hashval)
return 0;
- slot = htab_find_slot_with_hash (hash_table, x, hashval, create);
+ slot = htab_find_slot_with_hash (hash_table, x, hashval,
+ create ? INSERT : NO_INSERT);
if (slot == 0)
return 0;
diff --git a/include/ChangeLog b/include/ChangeLog
index 4be8ffb..06c2894 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,8 @@
+Tue Apr 18 16:22:30 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * hashtab.h (enum insert_option): New type.
+ (htab_find_slot, htab_find_slot_with_hash): Use it.
+
2000-04-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* symcat.h: Honor autoconf macro HAVE_STRINGIZE. Add
diff --git a/include/hashtab.h b/include/hashtab.h
index 2426708..a516c45 100644
--- a/include/hashtab.h
+++ b/include/hashtab.h
@@ -102,6 +102,9 @@ struct htab
typedef struct htab *htab_t;
+/* An enum saying whether we insert into the hash table or not. */
+enum insert_option {NO_INSERT, INSERT};
+
/* The prototypes of the package functions. */
extern htab_t htab_create PARAMS ((size_t, htab_hash,
@@ -110,11 +113,13 @@ extern void htab_delete PARAMS ((htab_t));
extern void htab_empty PARAMS ((htab_t));
extern void *htab_find PARAMS ((htab_t, const void *));
-extern void **htab_find_slot PARAMS ((htab_t, const void *, int));
-extern void *htab_find_with_hash PARAMS ((htab_t, const void *,
- hashval_t));
-extern void **htab_find_slot_with_hash PARAMS ((htab_t, const void *,
- hashval_t, int));
+extern void **htab_find_slot PARAMS ((htab_t, const void *,
+ enum insert_option));
+extern void *htab_find_with_hash PARAMS ((htab_t, const void *,
+ hashval_t));
+extern void **htab_find_slot_with_hash PARAMS ((htab_t, const void *,
+ hashval_t,
+ enum insert_option));
extern void htab_clear_slot PARAMS ((htab_t, void **));
extern void htab_remove_elt PARAMS ((htab_t, void *));
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index f0d9395..238e877 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,9 @@
+Tue Apr 18 16:23:31 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * hashtab.c: Various minor cleanups.
+ (htab_find_slot_with_hash): INSERT is now enum insert_option.
+ (htab_find_slot): Likewise.
+
2000-04-16 Dave Pitts <dpitts@cozx.com>
* cplus-dem.c (cplus_demangle_opname): Changed to use islower.
diff --git a/libiberty/hashtab.c b/libiberty/hashtab.c
index ba897b2..2d1c09d 100644
--- a/libiberty/hashtab.c
+++ b/libiberty/hashtab.c
@@ -58,7 +58,7 @@ Boston, MA 02111-1307, USA. */
static unsigned long higher_prime_number PARAMS ((unsigned long));
/* The following function returns the nearest prime number which is
- greater than a given source number. */
+ greater than a given source number, N. */
static unsigned long
higher_prime_number (n)
@@ -66,20 +66,24 @@ higher_prime_number (n)
{
unsigned long i;
- n |= 0x01; /* Force N to be odd. */
+ /* Ensure we have a larger number and then force to odd. */
+ n++;
+ n |= 0x01;
+
+ /* All odd numbers < 9 are prime. */
if (n < 9)
- return n; /* All odd numbers < 9 are prime. */
+ return n;
+
+ /* Otherwise find the next prime using a sieve. */
next:
- n += 2;
- i = 3;
- do
- {
- if (n % i == 0)
- goto next;
- i += 2;
- }
- while ((i * i) <= n);
+
+ for (i = 3; i * i <= n; i += 2)
+ if (n % i == 0)
+ {
+ n += 2;
+ goto next;
+ }
return n;
}
@@ -116,13 +120,12 @@ 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]);
- }
+ if (htab->entries[i] != EMPTY_ENTRY
+ && htab->entries[i] != DELETED_ENTRY)
+ (*htab->del_f) (htab->entries[i]);
free (htab->entries);
free (htab);
@@ -135,13 +138,12 @@ 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]);
- }
+ 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 *));
}
@@ -152,6 +154,7 @@ htab_empty (htab)
hash table.
This function also assumes there are no deleted entries in the table.
HASH is the hash value for the element to be inserted. */
+
static void **
find_empty_slot_for_expand (htab, hash)
htab_t htab;
@@ -164,10 +167,10 @@ find_empty_slot_for_expand (htab, hash)
for (;;)
{
void **slot = htab->entries + index;
+
if (*slot == EMPTY_ENTRY)
return slot;
-
- if (*slot == DELETED_ENTRY)
+ else if (*slot == DELETED_ENTRY)
abort ();
index += hash2;
@@ -203,14 +206,18 @@ htab_expand (htab)
do
{
void *x = *p;
+
if (x != EMPTY_ENTRY && x != DELETED_ENTRY)
{
void **q = find_empty_slot_for_expand (htab, (*htab->hash_f) (x));
+
*q = x;
}
+
p++;
}
while (p < olimit);
+
free (oentries);
}
@@ -255,6 +262,7 @@ htab_find_with_hash (htab, element, hash)
/* Like htab_find_slot_with_hash, but compute the hash value from the
element. */
+
void *
htab_find (htab, element)
htab_t htab;
@@ -274,14 +282,14 @@ htab_find_slot_with_hash (htab, element, hash, insert)
htab_t htab;
const void *element;
hashval_t hash;
- int insert;
+ enum insert_option insert;
{
void **first_deleted_slot;
unsigned int index;
hashval_t hash2;
size_t size;
- if (insert && htab->size * 3 <= htab->n_elements * 4)
+ if (insert == INSERT && htab->size * 3 <= htab->n_elements * 4)
htab_expand (htab);
size = htab->size;
@@ -296,7 +304,7 @@ htab_find_slot_with_hash (htab, element, hash, insert)
void *entry = htab->entries[index];
if (entry == EMPTY_ENTRY)
{
- if (!insert)
+ if (insert == NO_INSERT)
return NULL;
htab->n_elements++;
@@ -315,11 +323,8 @@ htab_find_slot_with_hash (htab, element, hash, insert)
if (!first_deleted_slot)
first_deleted_slot = &htab->entries[index];
}
- else
- {
- if ((*htab->eq_f) (entry, element))
- return &htab->entries[index];
- }
+ else if ((*htab->eq_f) (entry, element))
+ return &htab->entries[index];
htab->collisions++;
index += hash2;
@@ -330,11 +335,12 @@ htab_find_slot_with_hash (htab, element, hash, insert)
/* Like htab_find_slot_with_hash, but compute the hash value from the
element. */
+
void **
htab_find_slot (htab, element, insert)
htab_t htab;
const void *element;
- int insert;
+ enum insert_option insert;
{
return htab_find_slot_with_hash (htab, element, (*htab->hash_f) (element),
insert);
@@ -351,7 +357,7 @@ htab_remove_elt (htab, element)
{
void **slot;
- slot = htab_find_slot (htab, element, 0);
+ slot = htab_find_slot (htab, element, NO_INSERT);
if (*slot == EMPTY_ENTRY)
return;
@@ -374,8 +380,10 @@ 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++;
}
@@ -391,12 +399,13 @@ htab_traverse (htab, callback, info)
htab_trav callback;
void *info;
{
- void **slot, **limit;
- slot = htab->entries;
- limit = slot + htab->size;
+ void **slot = htab->entries;
+ void **limit = slot + htab->size;
+
do
{
void *x = *slot;
+
if (x != EMPTY_ENTRY && x != DELETED_ENTRY)
if (!(*callback) (slot, info))
break;
@@ -404,7 +413,7 @@ htab_traverse (htab, callback, info)
while (++slot < limit);
}
-/* The following function returns current size of given hash table. */
+/* Return the current size of given hash table. */
size_t
htab_size (htab)
@@ -413,8 +422,7 @@ htab_size (htab)
return htab->size;
}
-/* The following function returns current number of elements in given
- hash table. */
+/* Return the current number of elements in given hash table. */
size_t
htab_elements (htab)
@@ -423,17 +431,15 @@ htab_elements (htab)
return htab->n_elements - htab->n_deleted;
}
-/* The following function returns number of percents of fixed
- collisions during all work with given hash table. */
+/* Return the fraction of fixed collisions during all work with given
+ hash table. */
double
htab_collisions (htab)
htab_t htab;
{
- int searches;
-
- searches = htab->searches;
- if (searches == 0)
+ if (htab->searches == 0)
return 0.0;
- return (double)htab->collisions / (double)searches;
+
+ return (double) htab->collisions / (double) htab->searches;
}