merge from gcc
authorJason Merrill <jason@redhat.com>
Fri, 24 Mar 2000 21:31:22 +0000 (21:31 +0000)
committerJason Merrill <jason@redhat.com>
Fri, 24 Mar 2000 21:31:22 +0000 (21:31 +0000)
include/ChangeLog
include/hashtab.h
libiberty/ChangeLog
libiberty/Makefile.in
libiberty/hashtab.c

index 0d0ebf3d287b79715c0e6fb993e937d10bdc2bc7..0fa1c220a125c0856e0452ebd124ef545f9610c2 100644 (file)
@@ -1,3 +1,30 @@
+2000-03-14  Bernd Schmidt  <bernds@cygnus.co.uk>
+
+       * hashtab.h (htab_trav): Modify type so that first arg is of type
+       void **.
+       (htab_find_with_hash, htab_find_slot_with_hash): Declare new
+       functions.
+
+2000-03-09  Alex Samuel  <samuel@codesourcery.com>
+
+       * partition.h: New file.
+
+2000-03-09  Zack Weinberg  <zack@wolery.cumb.org>
+
+       * hashtab.h (struct htab): Add del_f.
+       (htab_del): New type.
+       (htab_create): Add fourth argument.
+
+2000-03-08  Zack Weinberg  <zack@wolery.cumb.org>
+
+       * hashtab.h (hash_table_t): Rename to htab_t.
+       (struct hash_table): Rename to struct htab.  Shorten element
+       names.  Reorder elements by size.
+       (htab_hash, htab_eq, htab_trav): New typedefs for the callback
+       function pointers.
+       (hash_table_entry_t): Discard; just use void * for element
+       type.
+
 2000-03-01  H.J. Lu  <hjl@gnu.org>
 
        * bfdlink.h (bfd_link_callbacks): Add a boolean arg to
@@ -85,7 +112,7 @@ Wed Dec 15 11:22:56 1999  Jeffrey A Law  (law@cygnus.com)
        (asprintf, vasprintf): Provide declarations.
 
 Wed Nov 10 12:43:21 1999  Philippe De Muyter  <phdm@macqel.be>
-                          Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+                         Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * ansidecl.h: Define and test `GCC_VERSION', not `HAVE_GCC_VERSION'.
 
@@ -117,7 +144,7 @@ Fri Oct 15 01:47:51 1999  Vladimir Makarov  <vmakarov@loony.cygnus.com>
 
        * ansidecl.h (HAVE_GCC_VERSION): New macro.  Use it instead of
        explicitly testing __GNUC__ and __GNUC_MINOR__.
-       
+
        (ATTRIBUTE_PRINTF): Use `__format__', not `format'.
 
 1999-09-25  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
@@ -234,18 +261,18 @@ Tue Dec  8 00:30:31 1998  Elena Zannoni  <ezannoni@kwikemart.cygnus.com>
        from FILE* to void*, for use with gdb's new type GDB_FILE.
        (fprintf_ftype): change FILE* parameter type to void*.
 
-        * demangle.h: (DMGL_EDG): new macro for Kuck and Associates
-        (DMGL_STYLE_MASK): modify to include Kuck and Assoc style
-        (demangling_styles): add new edg_demangling style
-        (EDG_DEMANGLING_STYLE_STRING): new macro
-        (EDG_DEMANGLING): new macro
+       * demangle.h: (DMGL_EDG): new macro for Kuck and Associates
+       (DMGL_STYLE_MASK): modify to include Kuck and Assoc style
+       (demangling_styles): add new edg_demangling style
+       (EDG_DEMANGLING_STYLE_STRING): new macro
+       (EDG_DEMANGLING): new macro
 
-        * demangle.h (DMGL_HP): new macro, for HP/aCC compiler.
-        (DMGL_STYLE_MASK): modify to include new HP's style.
-        (demangling_styles): add new hp_demangling value.
-        (HP_DEMANGLING_STYLE_STRING): new macro.
-        (ARM_DEMANGLING): coerce to int.
-        (HP_DEMANGLING): new macro.
+       * demangle.h (DMGL_HP): new macro, for HP/aCC compiler.
+       (DMGL_STYLE_MASK): modify to include new HP's style.
+       (demangling_styles): add new hp_demangling value.
+       (HP_DEMANGLING_STYLE_STRING): new macro.
+       (ARM_DEMANGLING): coerce to int.
+       (HP_DEMANGLING): new macro.
 
        * hp-symtab.h: rewritten, from HP.
        (quick_procedure): change type of language field to unsigned int
@@ -969,8 +996,8 @@ Thu Apr 28 19:06:50 1994  Ken Raeburn  (raeburn@cujo.cygnus.com)
 
 Fri Apr  1 00:38:17 1994  Jim Wilson  (wilson@mole.gnu.ai.mit.edu)
 
-        * obstack.h: Delete use of IN_GCC to control whether
-        stddef.h or gstddef.h is included.
+       * obstack.h: Delete use of IN_GCC to control whether
+       stddef.h or gstddef.h is included.
 
 Tue Mar 22 13:06:02 1994  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
 
index 3990c14cbcaaad318c1a74d8dfea696ed5995b6b..5fe239391ffb284f3d4efc966799bd834b5f87c3 100644 (file)
@@ -38,69 +38,88 @@ extern "C" {
 
 #include <ansidecl.h>
 
-/* The hash table element is represented by the following type. */
-
-typedef const void *hash_table_entry_t;
+/* Callback function pointer types.  */
+
+/* Calculate hash of a table entry.  */
+typedef unsigned int (*htab_hash) PARAMS ((const void *));
+
+/* Compare a table entry with a possible entry.  The entry already in
+   the table always comes first, so the second element can be of a
+   different type (but in this case htab_find and htab_find_slot
+   cannot be used; instead the variants that accept a hash value
+   must be used).  */
+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 slot of the element (which can be passed to htab_clear_slot
+   if desired), the second arg is the auxiliary pointer handed to
+   htab_traverse.  Return 1 to continue scan, 0 to stop.  */
+typedef int (*htab_trav) PARAMS ((void **, void *));
 
 /* Hash tables are of the following type.  The structure
    (implementation) of this type is not needed for using the hash
    tables.  All work with hash table should be executed only through
    functions mentioned below. */
 
-typedef struct hash_table
+struct htab
 {
-  /* Current size (in entries) of the hash table */
-  size_t size;
-  /* Current number of elements including also deleted elements */
-  size_t number_of_elements;
-  /* Current number of deleted elements in the table */
-  size_t number_of_deleted_elements;
-  /* The following member is used for debugging. Its value is number
-     of all calls of `find_hash_table_entry' for the hash table. */
-  int searches;
-  /* The following member is used for debugging.  Its value is number
-     of collisions fixed for time of work with the hash table. */
-  int collisions;
-  /* Pointer to function for evaluation of hash value (any unsigned value).
-     This function has one parameter of type hash_table_entry_t. */
-  unsigned (*hash_function) PARAMS ((hash_table_entry_t));
-  /* Pointer to function for test on equality of hash table elements (two
-     parameter of type hash_table_entry_t. */
-  int (*eq_function) PARAMS ((hash_table_entry_t, hash_table_entry_t));
-  /* Table itself */
-  hash_table_entry_t *entries;
-} *hash_table_t;
-
+  /* Pointer to hash function.  */
+  htab_hash hash_f;
 
-/* The prototypes of the package functions. */
+  /* Pointer to comparison function.  */
+  htab_eq eq_f;
 
-extern hash_table_t create_hash_table
-  PARAMS ((size_t, unsigned (*) (hash_table_entry_t),
-          int (*) (hash_table_entry_t, hash_table_entry_t)));
+  /* Pointer to cleanup function.  */
+  htab_del del_f;
 
-extern void delete_hash_table PARAMS ((hash_table_t));
+  /* Table itself.  */
+  void **entries;
 
-extern void empty_hash_table PARAMS ((hash_table_t));
+  /* Current size (in entries) of the hash table */
+  size_t size;
 
-extern hash_table_entry_t *find_hash_table_entry
-  PARAMS ((hash_table_t, hash_table_entry_t, int));
+  /* Current number of elements including also deleted elements */
+  size_t n_elements;
 
-extern void remove_element_from_hash_table_entry PARAMS ((hash_table_t,
-                                                         hash_table_entry_t));
+  /* Current number of deleted elements in the table */
+  size_t n_deleted;
 
-extern void clear_hash_table_slot PARAMS ((hash_table_t, hash_table_entry_t *));
+  /* The following member is used for debugging. Its value is number
+     of all calls of `htab_find_slot' for the hash table. */
+  unsigned int searches;
 
-extern void traverse_hash_table PARAMS ((hash_table_t,
-                                        int (*) (hash_table_entry_t, void *),
-                                        void *));
-    
-extern size_t hash_table_size PARAMS ((hash_table_t));
+  /* The following member is used for debugging.  Its value is number
+     of collisions fixed for time of work with the hash table. */
+  unsigned int collisions;
+};
 
-extern size_t hash_table_elements_number PARAMS ((hash_table_t));
+typedef struct htab *htab_t;
 
-extern int hash_table_collisions PARAMS ((hash_table_t));
+/* The prototypes of the package functions. */
 
-extern int all_hash_table_collisions PARAMS ((void));
+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));
+
+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 *,
+                                                        unsigned int));
+extern void   **htab_find_slot_with_hash       PARAMS ((htab_t, const void *,
+                                                        unsigned int, int));
+extern void    htab_clear_slot PARAMS ((htab_t, void **));
+extern void    htab_remove_elt PARAMS ((htab_t, void *));
+
+extern void    htab_traverse   PARAMS ((htab_t, htab_trav, void *));
+
+extern size_t  htab_size       PARAMS ((htab_t));
+extern size_t  htab_elements   PARAMS ((htab_t));
+extern double  htab_collisions PARAMS ((htab_t));
 
 #ifdef __cplusplus
 }
index c59399a1fd6f77fa55888ad8b230e8cd1633be85..c858409d301e51de9e05d34cbf8f3c0b50038ddd 100644 (file)
@@ -1,3 +1,49 @@
+Thu Mar 16 01:33:58 2000  Jeffrey A Law  (law@cygnus.com)
+
+       * Makefile.in (partition.o): Depend on config.h
+
+2000-03-14  Bernd Schmidt  <bernds@cygnus.co.uk>
+
+       * hashtab.c (find_empty_slot_for_expand): New function.
+       (htab_expand): Use it instead of htab_find_slot.
+       (htab_find_with_hash): Renamed from htab_find; now accepts extra
+       argument HASH.
+       (htab_find_slot_with_hash): Likewise for htab_find_slot.
+       (htab_find): New wrapper function.
+       (htab_find_slot): Likewise.
+       (htab_traverse): Pass slot, not entry, to called function.
+
+2000-03-09  Alex Samuel  <samuel@codesourcery.com>
+
+       * Makefile.in (CFILES): Add partition.c.
+       (REQUIRED_OFILES): Add partition.o.
+       (partition.o): New rule.
+       * partition.c: New file.
+       
+2000-03-09  Zack Weinberg  <zack@wolery.cumb.org>
+
+       * hashtab.c (htab_create): Set del_f.
+       (htab_delete, htab_empty, htab_remove_elt, htab_clear_slot):
+       Use it.
+
+2000-03-08  Zack Weinberg  <zack@wolery.cumb.org>
+
+       * hashtab.c: Remove debugging variables (all_searches,
+       all_collisions, all_expansions). Delete
+       all_hash_table_collisions.
+       (create_hash_table, delete_hash_table, empty_hash_table,
+       find_hash_table_entry, remove_element_from_hash_table_entry,
+       clear_hash_table_slot, traverse_hash_table, hash_table_size,
+       hash_table_elements_number, hash_table_collisions): Rename to:
+       htab_create, htab_delete, htab_empty, htab_find_slot,
+       htab_remove_elt, htab_clear_slot, htab_traverse, htab_size,
+       htab_elements, htab_collisions.
+       (htab_find): New function, handles common case where you don't
+       plan to add or delete an entry.
+       (htab_expand): Don't create a whole new table, just a new
+       entry vector.
+       (htab_find_slot): Simplify logic.
+
 1999-08-03  Ian Lance Taylor  <ian@zembu.com>
 
        * floatformat.c: Add casts to avoid signed/unsigned warnings.
@@ -21,7 +67,7 @@
 2000-01-04  Mumit Khan  <khan@xraylith.wisc.edu>
 
        * pexecute.c: Conditionally include string.h.
-       (fix_argv): Handle embedded whitespace in args for Mingw32. 
+       (fix_argv): Handle embedded whitespace in args for Mingw32.
 
 2000-01-04  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
@@ -100,7 +146,7 @@ Tue Nov  2 03:23:13 1999  Philippe De Muyter  <phdm@macqel.be>
        (demangle_qualified): Use consume_count_with_underscores.
        (get_count): Tweak formatting.
        (do_type): Use string_append_template_idx.
-       
+
 1999-10-18  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * calloc.c: Add a public domain notice.
@@ -163,7 +209,7 @@ Wed Sep  8 20:03:28 1999  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
 Tue Sep  7 23:32:18 1999  Linas Vepstas  <linas@linas.org>
 
-        * config.table: Add openedition target.
+       * config.table: Add openedition target.
        * config/mh-openedition: New file.
 
 Thu Sep  2 01:36:12 1999  Marc Espie <espie@cvs.openbsd.org>
@@ -192,7 +238,7 @@ Thu Sep  2 01:36:12 1999  Marc Espie <espie@cvs.openbsd.org>
        (arm_special): Likewise.
        (demangle_fund_type): Likewise.
        (do_hpacc_template_const_value): Mark parameter `work' with
-       ATTRIBUTE_UNUSED.       
+       ATTRIBUTE_UNUSED.
        (main): Constify variable `valid_symbols'.
 
 Tue Aug 24 02:50:45 1999  Philippe De Muyter  <phdm@macqel.be>
@@ -210,7 +256,7 @@ Fri Aug  6 23:32:29 1999  Daniel Jacobowitz <drow@drow.them.org>
 
 1999-07-14  Richard Henderson  <rth@cygnus.com>
 
-       * argv.c: Include stdlib.h and string.h instead of 
+       * argv.c: Include stdlib.h and string.h instead of
        prototyping directly.
        * choose-temp.c: Conditionally include string.h.
 
@@ -304,7 +350,7 @@ Sun Apr 25 01:18:21 1999  Mumit Khan  <khan@xraylith.wisc.edu>
 1999-04-20  Jim Blandy  <jimb@zwingli.cygnus.com>
 
        Fix from Dale Hawkins:
-       * cplus-dem.c (mop_up): Set typevec_size to zero, so it'll be 
+       * cplus-dem.c (mop_up): Set typevec_size to zero, so it'll be
        reallocated properly if we use it again.
 
        * cplus-dem.c (demangle_fund_type): Check for buffer overrun.  Be
@@ -395,7 +441,7 @@ Sun Apr 11 23:20:59 1999  Mumit Khan  <khan@xraylith.wisc.edu>
        * cplus-dem.c (demangle_prefix): Don't grab all the '__' strings
        when doing arm or hp style.
        (demangle_nested_args): Decr forgetting_types field when done.
-       
+
 Thu Mar 11 01:22:58 1999  Mumit Khan  <khan@xraylith.wisc.edu>
 
        * pexecute.c (__CYGWIN32__): Rename to
@@ -429,10 +475,10 @@ Tue Feb  9 01:12:27 1999  Marc Espie <Marc.Espie@liafa.jussieu.fr>
        * configure.in (funcs): Check for and conditionally add mkstemps to
        the list of functions libiberty will provide.
        * configure: Rebuilt.
-       
+
 Wed Feb  3 00:01:15 1999  Mumit Khan  <khan@xraylith.wisc.edu>
 
-       * clock.c (HZ): Define in terms of (ISO C) CLOCKS_PER_SEC on 
+       * clock.c (HZ): Define in terms of (ISO C) CLOCKS_PER_SEC on
        platforms that don't have HZ.
        * getruntime.c (HZ): Likewise.
 
@@ -501,7 +547,7 @@ Fri Dec 18 17:50:18 1998  David Taylor  <taylor@texas.cygnus.com>
        * cplus-dem.c (demangle_arm_pt): remove declaration -- function
        doesn't exist.
        (do_hpacc_template_literal): remove unused variable `i'.
-       
+
 Fri Dec 18 16:11:43 EST 1998  Andrew MacLeod  <amacleod@cygnus.com>
 
        * cplus-dem.c (demangle_fund_type): Process CV and u codes before
@@ -607,7 +653,7 @@ Mon Nov 23 16:59:49 1998  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
 1998-11-16  Benjamin Kosnik  <bkoz@haight.constant.com>
 
-        * cplus-dem.c (demangle_fund_type): Add demangling for C9x types.
+       * cplus-dem.c (demangle_fund_type): Add demangling for C9x types.
 
 Thu Nov 19 22:15:50 1998  Jeffrey A Law  (law@cygnus.com)
 
@@ -660,8 +706,8 @@ Sat Nov  7 16:02:10 1998  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
 Mon Nov  2 15:05:33 1998  Geoffrey Noer  <noer@cygnus.com>
 
-        * configure.in: detect cygwin* instead of cygwin32*
-        * configure: regenerate
+       * configure.in: detect cygwin* instead of cygwin32*
+       * configure: regenerate
 
 Mon Nov  2 10:22:01 1998  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
@@ -751,9 +797,9 @@ Thu Oct 15 18:51:12 1998  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
 Tue Oct 13 23:51:51 1998  Jeffrey A Law  (law@cygnus.com)
 
-        * mkstemp.c: Check HAVE_SYS_TIME_H before including sys/time.h
-        * configure.in (AC_CHECK_HEADERS): Check for sys/time.h too.
-        * config.in, configure: Rebuilt.
+       * mkstemp.c: Check HAVE_SYS_TIME_H before including sys/time.h
+       * configure.in (AC_CHECK_HEADERS): Check for sys/time.h too.
+       * config.in, configure: Rebuilt.
 
        * getopt.c: Check HAVE_STRINGS_H before including strings.h.
        * configure.in (AC_CHECK_HEADERS): Check for strings.h too.
@@ -761,7 +807,7 @@ Tue Oct 13 23:51:51 1998  Jeffrey A Law  (law@cygnus.com)
 
 Mon Oct 12 19:15:59 1998  Geoffrey Noer  <noer@cygnus.com>
 
-        * configure.in: in comment, call AC_EXEEXT instead of AM_EXEEXT
+       * configure.in: in comment, call AC_EXEEXT instead of AM_EXEEXT
 
 Sun Oct 11 17:36:06 1998  Michael Tiemann  <tiemann@holodeck.cygnus.com>
 
@@ -1201,8 +1247,8 @@ Fri Feb  6 01:35:17 1998  Manfred Hollstein  <manfred@s-direktnet.de>
 
 Thu Feb  5 18:48:56 1998  Geoffrey Noer  <noer@cygnus.com>
 
-        * config/mh-cygwin32: remove vasprintf.o from EXTRA_OFILES
-        since it gets built automatically
+       * config/mh-cygwin32: remove vasprintf.o from EXTRA_OFILES
+       since it gets built automatically
 
 Sun Feb  1 02:52:32 1998  Mike Stump  <mrs@wrs.com>
 
@@ -1287,24 +1333,24 @@ Mon Sep 29 12:28:41 1997  Ian Lance Taylor  <ian@cygnus.com>
 
        Mon Sep 29 12:27:59 1997  Ian Lance Taylor  <ian@cygnus.com>
 
-        * pexecute.c: Use spawn if __CYGWIN32__.
+       * pexecute.c: Use spawn if __CYGWIN32__.
 
        1997-08-08  Paul Eggert  <eggert@twinsun.com>
 
-        * pexecute.c: Include "config.h" first, as per autoconf manual.
+       * pexecute.c: Include "config.h" first, as per autoconf manual.
 
        Fri Jun 27 15:20:29 1997  Scott Christley <scottc@net-community.com>
 
-        * pexecute.c (fix_argv): New function.
-        (pexecute): Win32 but not Cygwin32 needs its arguments fixed.
-        Add underscore to cwait function call.
+       * pexecute.c (fix_argv): New function.
+       (pexecute): Win32 but not Cygwin32 needs its arguments fixed.
+       Add underscore to cwait function call.
 
 Sun Sep 28 12:00:52 1997  Mark Mitchell  <mmitchell@usa.net>
 
-        * cplus-dem.c (demangle_template): Add new parameter.  Handle new
-        template-function mangling.
-        (consume_count_with_underscores): New function.
-        (demangle_signature): Handle new name-mangling scheme.
+       * cplus-dem.c (demangle_template): Add new parameter.  Handle new
+       template-function mangling.
+       (consume_count_with_underscores): New function.
+       (demangle_signature): Handle new name-mangling scheme.
 
 Wed Sep 24 00:31:59 1997  Felix Lee  <flee@yin.cygnus.com>
 
@@ -1682,7 +1728,7 @@ Tue Jun 25 23:01:07 1996  Jason Molenda  (crash@godzilla.cygnus.co.jp)
 
 Tue Jun 25 22:50:07 1996  Jason Molenda  (crash@godzilla.cygnus.co.jp)
 
-        * Makefile.in (datadir): Set to $(prefix)/share.
+       * Makefile.in (datadir): Set to $(prefix)/share.
 
 Thu Jun 20 21:17:52 1996  Ian Lance Taylor  <ian@cygnus.com>
 
@@ -1728,7 +1774,7 @@ Wed Apr 17 11:17:55 1996  Doug Evans  <dje@canuck.cygnus.com>
 
 Tue Apr 16 11:27:16 1996  Jeffrey A Law  (law@cygnus.com)
 
-        * Makefile.in (lneeded-list): If alloca.o is needed, so is xmalloc.o.
+       * Makefile.in (lneeded-list): If alloca.o is needed, so is xmalloc.o.
        Reverts Feb 8, 1995 change.
 
 Mon Apr 15 12:53:26 1996  Doug Evans  <dje@canuck.cygnus.com>
@@ -1982,7 +2028,7 @@ Wed Jun 28 19:13:23 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
        * cplus-dem.c: Update from gcc.
 
        * argv.c, dummy.c: If __STDC__, #include "alloca-conf.h" after
-        <stddef.h>.
+       <stddef.h>.
        * alloca-norm.h: If __STDC__, declare alloca with its parameter.
 
 Thu Jun 22 18:57:47 1995  Stan Shebs  <shebs@andros.cygnus.com>
@@ -2075,17 +2121,17 @@ Mon May 15 19:53:17 1995  Per Bothner  <bothner@kalessin.cygnus.com>
 Thu May  4 14:36:42 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
 
        * cplus-dem.c: Use const instead of CONST.  Don't include
-        ansidecl.h directly.
+       ansidecl.h directly.
 
 Wed Apr 19 01:30:27 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
 
        * cplus-dem.c: Don't include libiberty.h.  Do declare xmalloc and
-        xrealloc.
+       xrealloc.
        (-DMAIN): Don't rely on an externally-defined version number;
-        instead, require the version number to be defined as a
-        preprocessor macro.  Handle the RS/6000 leading dot.  Define
-        xmalloc, xrealloc and fatal.  Don't strip a leading underscore
-        if we couldn't demangle the word.
+       instead, require the version number to be defined as a
+       preprocessor macro.  Handle the RS/6000 leading dot.  Define
+       xmalloc, xrealloc and fatal.  Don't strip a leading underscore
+       if we couldn't demangle the word.
 
 Tue Apr  4 13:03:51 1995  Stan Shebs  <shebs@andros.cygnus.com>
 
@@ -2259,7 +2305,7 @@ Fri Aug 19 15:29:12 1994  Kung Hsu  (kung@mexican.cygnus.com)
 Thu Aug 18 14:37:14 1994  Kung Hsu  (kung@mexican.cygnus.com)
 
        * cplus-dem.c (demangle args): Handle ARM repeat encoding where
-        the type index is greater than 9.
+       the type index is greater than 9.
 
 Wed Aug 17 16:13:49 1994  Kung Hsu  (kung@mexican.cygnus.com)
 
@@ -2321,7 +2367,7 @@ Thu Jun 16 17:54:01 1994  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
 Sun Jun 12 01:37:09 1994  Jason Merrill  (jason@deneb.cygnus.com)
 
        * cplus-dem.c (demangle_template): Separate consecutive >'s with a
-        space.
+       space.
        (gnu_special): Demangle template and qualified names in a vtable name.
 
 Fri May 27 12:27:52 1994  Ken Raeburn  (raeburn@cujo.cygnus.com)
@@ -2365,13 +2411,13 @@ Fri May  6 11:01:59 1994  D. V. Henkel-Wallace  (gumby@rtl.cygnus.com)
 
 Mon Apr 11 00:54:33 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
-        * getopt.c [not __GNU_LIBRARY__] [__GCC__] [not __STDC__]:
-        Declare strlen to return int.  Don't include stddef.h.
+       * getopt.c [not __GNU_LIBRARY__] [__GCC__] [not __STDC__]:
+       Declare strlen to return int.  Don't include stddef.h.
 
 Fri Apr  1 00:38:17 1994  Jim Wilson  (wilson@mole.gnu.ai.mit.edu)
 
-        * getopt.c: Delete use of IN_GCC to control whether
-        stddef.h or gstddef.h is included.
+       * getopt.c: Delete use of IN_GCC to control whether
+       stddef.h or gstddef.h is included.
 
 Thu Apr 14 14:00:56 1994  Kung Hsu  (kung@mexican.cygnus.com)
 
@@ -2444,27 +2490,27 @@ Thu Feb 24 11:51:12 1994  David J. Mackenzie  (djm@rtl.cygnus.com)
 
 Thu Feb 10 14:44:16 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
-        * getopt.c [not __GNU_LIBRARY__] [__GNUC__] [not IN_GCC]:
-        Test just __STDC__, not emacs.
+       * getopt.c [not __GNU_LIBRARY__] [__GNUC__] [not IN_GCC]:
+       Test just __STDC__, not emacs.
 
 Wed Feb  9 00:14:00 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
-        * getopt.c [not __GNU_LIBRARY__] [__GNUC__] [not IN_GCC]
-        [emacs] [not __STDC__]: Don't include stddef.h.  Don't declare strlen.
+       * getopt.c [not __GNU_LIBRARY__] [__GNUC__] [not IN_GCC]
+       [emacs] [not __STDC__]: Don't include stddef.h.  Don't declare strlen.
 
 Fri Dec 24 19:43:00 1993  Noah Friedman  (friedman@nutrimat.gnu.ai.mit.edu)
 
-        * getopt.c (_NO_PROTO): Define before config.h is included.
+       * getopt.c (_NO_PROTO): Define before config.h is included.
 
 Mon Sep 20 15:59:03 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)
 
-        * getopt.c, getopt1.c [emacs || CONFIG_BROKETS]: Include
+       * getopt.c, getopt1.c [emacs || CONFIG_BROKETS]: Include
        <config.h> only under these, else "config.h".
 
 Thu Aug 12 18:16:49 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)
 
-        * getopt.c, getopt1.c [HAVE_CONFIG_H]: Include
-        <config.h> instead of "config.h".
+       * getopt.c, getopt1.c [HAVE_CONFIG_H]: Include
+       <config.h> instead of "config.h".
 
 Sun Feb 20 17:17:01 1994  Ian Lance Taylor  (ian@lisa.cygnus.com)
 
@@ -2840,7 +2886,7 @@ Fri May 21 09:53:57 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
 
 Tue May 18 17:12:10 1993  Fred Fish  (fnf@cygnus.com)
 
-        (merge changes from dlong@cse.ucsc.edu)
+       (merge changes from dlong@cse.ucsc.edu)
        * cplus-dem.c (consume_count):  Simplify.
        * cplus-dem.c (arm_pt, demangle_class_name):  New functions.
        * cplus-dem.c (various):  Calls to arm_pt, demangle_class_name.
index cc25df5f3f939443d48ca7f9a38eb33bf81f1fca..9aa57f06d4bf141ba386a64f4a4a31a86d2f66fc 100644 (file)
@@ -123,21 +123,22 @@ HFILES = alloca-conf.h
 # NOTE: If you add new files to the library, add them to this list
 # (alphabetical), and add them to REQUIRED_OFILES or funcs in
 # configure.in.
-CFILES = asprintf.c alloca.c argv.c atexit.c basename.c bcmp.c bcopy.c \
+CFILES = asprintf.c alloca.c argv.c atexit.c basename.c bcmp.c bcopy.c       \
        bzero.c calloc.c choose-temp.c clock.c concat.c cplus-dem.c fdmatch.c \
-       fnmatch.c getcwd.c getpwd.c getopt.c getopt1.c getpagesize.c \
-       getruntime.c floatformat.c hashtab.c hex.c index.c insque.c memchr.c \
-       memcmp.c memcpy.c memmove.c memset.c mkstemps.c objalloc.c obstack.c \
-       pexecute.c putenv.c random.c rename.c rindex.c setenv.c sigsetmask.c \
-       spaces.c splay-tree.c strcasecmp.c strncasecmp.c strchr.c strdup.c \
-       strerror.c strrchr.c strsignal.c strstr.c strtod.c strtol.c strtoul.c \
-       tmpnam.c vasprintf.c vfork.c vfprintf.c vprintf.c vsprintf.c \
-       waitpid.c xatexit.c xexit.c xmalloc.c xmemdup.c xstrdup.c xstrerror.c
+       fnmatch.c getcwd.c getpwd.c getopt.c getopt1.c getpagesize.c          \
+       getruntime.c floatformat.c hashtab.c hex.c index.c insque.c memchr.c  \
+       memcmp.c memcpy.c memmove.c memset.c mkstemps.c objalloc.c obstack.c  \
+       partition.c pexecute.c putenv.c random.c rename.c rindex.c            \
+       setenv.c sigsetmask.c spaces.c splay-tree.c strcasecmp.c              \
+       strncasecmp.c strchr.c strdup.c strerror.c strrchr.c                  \
+       strsignal.c strstr.c strtod.c strtol.c strtoul.c tmpnam.c             \
+       vasprintf.c vfork.c vfprintf.c vprintf.c vsprintf.c waitpid.c         \
+       xatexit.c xexit.c xmalloc.c xmemdup.c xstrdup.c xstrerror.c
 
 # These are always included in the library.
 REQUIRED_OFILES = argv.o choose-temp.o concat.o cplus-dem.o \
   fdmatch.o fnmatch.o getopt.o getopt1.o getpwd.o getruntime.o hashtab.o \
-  hex.o floatformat.o objalloc.o obstack.o pexecute.o spaces.o \
+  hex.o floatformat.o objalloc.o obstack.o partition.o pexecute.o spaces.o \
   splay-tree.o strerror.o strsignal.o xatexit.o xexit.o xmalloc.o \
   xmemdup.o xstrdup.o xstrerror.o
 
@@ -271,6 +272,7 @@ floatformat.o: $(INCDIR)/floatformat.h
 mkstemps.o: config.h
 objalloc.o: $(INCDIR)/objalloc.h
 obstack.o: config.h $(INCDIR)/obstack.h
+partition.o: config.h $(INCDIR)/partition.h
 pexecute.o: config.h $(INCDIR)/libiberty.h
 setenv.o: config.h
 spaces.o: $(INCDIR)/libiberty.h
index 3f5b3030422f19185b687fdc485a58dd6c4517d3..16c5d3e4b12eb08569ad745f20cfaba701db8ba3 100644 (file)
@@ -46,25 +46,9 @@ Boston, MA 02111-1307, USA.  */
 #include "libiberty.h"
 #include "hashtab.h"
 
-/* The following variable is used for debugging. Its value is number
-   of all calls of `find_hash_table_entry' for all hash tables. */
-
-static int all_searches = 0;
-
-/* The following variable is used for debugging. Its value is number
-   of collisions fixed for time of work with all hash tables. */
-
-static int all_collisions = 0;
-
-/* The following variable is used for debugging. Its value is number
-   of all table expansions fixed for time of work with all hash
-   tables. */
-
-static int all_expansions = 0;
-
 /* This macro defines reserved value for empty table entry. */
 
-#define EMPTY_ENTRY    NULL
+#define EMPTY_ENTRY    ((void *) 0)
 
 /* This macro defines reserved value for table entry which contained
    a deleted element. */
@@ -75,19 +59,27 @@ static int all_expansions = 0;
    greater than given source number. */
 
 static unsigned long
-higher_prime_number (number)
-     unsigned long number;
+higher_prime_number (n)
+     unsigned long n;
 {
   unsigned long i;
 
-  for (number = (number / 2) * 2 + 3;; number += 2)
+  n |= 0x01;  /* Force N to be odd.  */
+  if (n < 9)
+    return n; /* All odd numbers < 9 are prime.  */
+
+ next:
+  n += 2;
+  i = 3;
+  do
     {
-      for (i = 3; i * i <= number; i += 2)
-        if (number % i == 0)
-          break;
-      if (i * i > number)
-        return number;
+      if (n % i == 0)
+       goto next;
+      i += 2;
     }
+  while ((i * i) <= n);
+
+  return n;
 }
 
 /* This function creates table with length slightly longer than given
@@ -95,26 +87,22 @@ higher_prime_number (number)
    hash table entries are EMPTY_ENTRY).  The function returns the
    created hash table. */
 
-hash_table_t
-create_hash_table (size, hash_function, eq_function)
+htab_t
+htab_create (size, hash_f, eq_f, del_f)
      size_t size;
-     unsigned (*hash_function) PARAMS ((hash_table_entry_t));
-     int (*eq_function) PARAMS ((hash_table_entry_t, hash_table_entry_t));
+     htab_hash hash_f;
+     htab_eq eq_f;
+     htab_del del_f;
 {
-  hash_table_t result;
+  htab_t result;
 
   size = higher_prime_number (size);
-  result = (hash_table_t) xmalloc (sizeof (*result));
-  result->entries
-    = (hash_table_entry_t *) xmalloc (size * sizeof (hash_table_entry_t));
+  result = (htab_t) xcalloc (1, sizeof (struct htab));
+  result->entries = (void **) xcalloc (size, sizeof (void *));
   result->size = size;
-  result->hash_function = hash_function;
-  result->eq_function = eq_function;
-  result->number_of_elements = 0;
-  result->number_of_deleted_elements = 0;
-  result->searches = 0;
-  result->collisions = 0;
-  memset (result->entries, 0, size * sizeof (hash_table_entry_t));
+  result->hash_f = hash_f;
+  result->eq_f = eq_f;
+  result->del_f = del_f;
   return result;
 }
 
@@ -122,9 +110,18 @@ create_hash_table (size, hash_function, eq_function)
    Naturally the hash table must already exist. */
 
 void
-delete_hash_table (htab)
-     hash_table_t htab;
+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);
 }
@@ -132,10 +129,49 @@ delete_hash_table (htab)
 /* This function clears all entries in the given hash table.  */
 
 void
-empty_hash_table (htab)
-     hash_table_t htab;
+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 *));
+}
+
+/* Similar to htab_find_slot, but without several unwanted side effects:
+    - Does not call htab->eq_f when it finds an existing entry.
+    - Does not change the count of elements/searches/collisions in the
+      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;
+     unsigned int hash;
 {
-  memset (htab->entries, 0, htab->size * sizeof (hash_table_entry_t));
+  size_t size = htab->size;
+  unsigned int hash2 = 1 + hash % (size - 2);
+  unsigned int index = hash % size;
+
+  for (;;)
+    {
+      void **slot = htab->entries + index;
+      if (*slot == EMPTY_ENTRY)
+       return slot;
+
+      if (*slot == DELETED_ENTRY)
+       abort ();
+
+      index += hash2;
+      if (index >= size)
+       index -= size;
+    }
 }
 
 /* The following function changes size of memory allocated for the
@@ -145,121 +181,193 @@ empty_hash_table (htab)
    table entries is changed. */
 
 static void
-expand_hash_table (htab)
-     hash_table_t htab;
+htab_expand (htab)
+     htab_t htab;
 {
-  hash_table_t new_htab;
-  hash_table_entry_t *entry_ptr;
-  hash_table_entry_t *new_entry_ptr;
-
-  new_htab = create_hash_table (htab->number_of_elements * 2,
-                                htab->hash_function, htab->eq_function);
-  for (entry_ptr = htab->entries; entry_ptr < htab->entries + htab->size;
-       entry_ptr++)
-    if (*entry_ptr != EMPTY_ENTRY && *entry_ptr != DELETED_ENTRY)
-      {
-        new_entry_ptr = find_hash_table_entry (new_htab, *entry_ptr, 1);
-        *new_entry_ptr = (*entry_ptr);
-      }
-  free (htab->entries);
-  *htab = (*new_htab);
-  free (new_htab);
+  void **oentries;
+  void **olimit;
+  void **p;
+
+  oentries = htab->entries;
+  olimit = oentries + htab->size;
+
+  htab->size = higher_prime_number (htab->size * 2);
+  htab->entries = xcalloc (htab->size, sizeof (void **));
+
+  htab->n_elements -= htab->n_deleted;
+  htab->n_deleted = 0;
+
+  p = oentries;
+  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);
 }
 
-/* This function searches for hash table entry which contains element
-   equal to given value or empty entry in which given value can be
-   placed (if the element with given value does not exist in the
-   table).  The function works in two regimes.  The first regime is
-   used only for search.  The second is used for search and
-   reservation empty entry for given value.  The table is expanded if
-   occupancy (taking into accout also deleted elements) is more than
-   75%.  Naturally the hash table must already exist.  If reservation
-   flag is TRUE then the element with given value should be inserted
-   into the table entry before another call of
-   `find_hash_table_entry'. */
-
-hash_table_entry_t *
-find_hash_table_entry (htab, element, reserve)
-     hash_table_t htab;
-     hash_table_entry_t element;
-     int reserve;
+/* This function searches for a hash table entry equal to the given
+   element.  It cannot be used to insert or delete an element.  */
+
+void *
+htab_find_with_hash (htab, element, hash)
+     htab_t htab;
+     const void *element;
+     unsigned int hash;
 {
-  hash_table_entry_t *entry_ptr;
-  hash_table_entry_t *first_deleted_entry_ptr;
-  unsigned index, hash_value, secondary_hash_value;
+  unsigned int index, hash2;
+  size_t size;
 
-  if (htab->size * 3 <= htab->number_of_elements * 4)
+  htab->searches++;
+  size = htab->size;
+  hash2 = 1 + hash % (size - 2);
+  index = hash % size;
+
+  for (;;)
     {
-      all_expansions++;
-      expand_hash_table (htab);
+      void *entry = htab->entries[index];
+      if (entry == EMPTY_ENTRY)
+       return NULL;
+      else if (entry != DELETED_ENTRY && (*htab->eq_f) (entry, element))
+       return entry;
+
+      htab->collisions++;
+      index += hash2;
+      if (index >= size)
+       index -= size;
     }
-  hash_value = (*htab->hash_function) (element);
-  secondary_hash_value = 1 + hash_value % (htab->size - 2);
-  index = hash_value % htab->size;
+}
+
+/* Like htab_find_slot_with_hash, but compute the hash value from the
+   element.  */
+void *
+htab_find (htab, element)
+     htab_t htab;
+     const void *element;
+{
+  return htab_find_with_hash (htab, element, (*htab->hash_f) (element));
+}
+
+/* This function searches for a hash table slot containing an entry
+   equal to the given element.  To delete an entry, call this with
+   INSERT = 0, then call htab_clear_slot on the slot returned (possibly
+   after doing some checks).  To insert an entry, call this with
+   INSERT = 1, then write the value you want into the returned slot.  */
+
+void **
+htab_find_slot_with_hash (htab, element, hash, insert)
+     htab_t htab;
+     const void *element;
+     unsigned int hash;
+     int insert;
+{
+  void **first_deleted_slot;
+  unsigned int index, hash2;
+  size_t size;
+
+  if (insert && htab->size * 3 <= htab->n_elements * 4)
+    htab_expand (htab);
+
+  size = htab->size;
+  hash2 = 1 + hash % (size - 2);
+  index = hash % size;
+
   htab->searches++;
-  all_searches++;
-  first_deleted_entry_ptr = NULL;
-  for (;;htab->collisions++, all_collisions++)
+  first_deleted_slot = NULL;
+
+  for (;;)
     {
-      entry_ptr = htab->entries + index;
-      if (*entry_ptr == EMPTY_ENTRY)
-        {
-          if (reserve)
+      void *entry = htab->entries[index];
+      if (entry == EMPTY_ENTRY)
+       {
+         if (!insert)
+           return NULL;
+
+         htab->n_elements++;
+
+         if (first_deleted_slot)
            {
-             htab->number_of_elements++;
-             if (first_deleted_entry_ptr != NULL)
-               {
-                 entry_ptr = first_deleted_entry_ptr;
-                 *entry_ptr = EMPTY_ENTRY;
-               }
+             *first_deleted_slot = EMPTY_ENTRY;
+             return first_deleted_slot;
            }
-          break;
-        }
-      else if (*entry_ptr != DELETED_ENTRY)
-        {
-          if ((*htab->eq_function) (*entry_ptr, element))
-            break;
-        }
-      else if (first_deleted_entry_ptr == NULL)
-       first_deleted_entry_ptr = entry_ptr;
-      index += secondary_hash_value;
-      if (index >= htab->size)
-        index -= htab->size;
+
+         return &htab->entries[index];
+       }
+
+      if (entry == DELETED_ENTRY)
+       {
+         if (!first_deleted_slot)
+           first_deleted_slot = &htab->entries[index];
+       }
+      else
+       {
+         if ((*htab->eq_f) (entry, element))
+           return &htab->entries[index];
+       }
+      
+      htab->collisions++;
+      index += hash2;
+      if (index >= size)
+       index -= size;
     }
-  return entry_ptr;
 }
 
-/* This function deletes element with given value from hash table.
-   The hash table entry value will be `DELETED_ENTRY' after the
-   function call.  Naturally the hash table must already exist.  Hash
-   table entry for given value should be not empty (or deleted). */
+/* 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;
+{
+  return htab_find_slot_with_hash (htab, element, (*htab->hash_f) (element),
+                                  insert);
+}
+
+/* This function deletes an element with the given value from hash
+   table.  If there is no matching element in the hash table, this
+   function does nothing.  */
 
 void
-remove_element_from_hash_table_entry (htab, element)
-     hash_table_t htab;
-     hash_table_entry_t element;
+htab_remove_elt (htab, element)
+     htab_t htab;
+     void *element;
 {
-  hash_table_entry_t *entry_ptr;
+  void **slot;
+
+  slot = htab_find_slot (htab, element, 0);
+  if (*slot == EMPTY_ENTRY)
+    return;
+
+  if (htab->del_f)
+    (*htab->del_f) (*slot);
 
-  entry_ptr = find_hash_table_entry (htab, element, 0);
-  *entry_ptr = DELETED_ENTRY;
-  htab->number_of_deleted_elements++;
+  *slot = DELETED_ENTRY;
+  htab->n_deleted++;
 }
 
-/* This function clears a specified slot in a hash table.
-   It is useful when you've already done the lookup and don't want to
-   do it again.  */
+/* This function clears a specified slot in a hash table.  It is
+   useful when you've already done the lookup and don't want to do it
+   again.  */
 
 void
-clear_hash_table_slot (htab, slot)
-     hash_table_t htab;
-     hash_table_entry_t *slot;
+htab_clear_slot (htab, slot)
+     htab_t htab;
+     void **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->number_of_deleted_elements++;
+  htab->n_deleted++;
 }
 
 /* This function scans over the entire hash table calling
@@ -268,24 +376,29 @@ clear_hash_table_slot (htab, slot)
    argument.  */
 
 void
-traverse_hash_table (htab, callback, info)
-     hash_table_t htab;
-     int (*callback) PARAMS ((hash_table_entry_t, void *));
+htab_traverse (htab, callback, info)
+     htab_t htab;
+     htab_trav callback;
      void *info;
 {
-  hash_table_entry_t *entry_ptr;
-  for (entry_ptr = htab->entries; entry_ptr < htab->entries + htab->size;
-       entry_ptr++)
-    if (*entry_ptr != EMPTY_ENTRY && *entry_ptr != DELETED_ENTRY)
-      if (!callback (*entry_ptr, info))
-       break;
+  void **slot, **limit;
+  slot = htab->entries;
+  limit = slot + htab->size;
+  do
+    {
+      void *x = *slot;
+      if (x != EMPTY_ENTRY && x != DELETED_ENTRY)
+       if (!(*callback) (slot, info))
+         break;
+    }
+  while (++slot < limit);
 }
 
 /* The following function returns current size of given hash table. */
 
 size_t
-hash_table_size (htab)
-     hash_table_t htab;
+htab_size (htab)
+     htab_t htab;
 {
   return htab->size;
 }
@@ -294,37 +407,23 @@ hash_table_size (htab)
    hash table. */
 
 size_t
-hash_table_elements_number (htab)
-     hash_table_t htab;
+htab_elements (htab)
+     htab_t htab;
 {
-  return htab->number_of_elements - htab->number_of_deleted_elements;
+  return htab->n_elements - htab->n_deleted;
 }
 
 /* The following function returns number of percents of fixed
    collisions during all work with given hash table. */
 
-int
-hash_table_collisions (htab)
-     hash_table_t htab;
+double
+htab_collisions (htab)
+     htab_t htab;
 {
   int searches;
 
   searches = htab->searches;
   if (searches == 0)
-    searches++;
-  return htab->collisions * 100 / searches;
-}
-
-/* The following function returns number of percents of fixed
-   collisions during all work with all hash tables. */
-
-int
-all_hash_table_collisions ()
-{
-  int searches;
-
-  searches = all_searches;
-  if (searches == 0)
-    searches++;
-  return all_collisions * 100 / searches;
+    return 0.0;
+  return (double)htab->collisions / (double)searches;
 }
This page took 0.04187 seconds and 4 git commands to generate.