Merged silc_1_0_branch to trunk.
[silc.git] / lib / silcutil / silchashtable.c
index 6478382a94e51e19eadfe4d6ae261aafa1cceca9..192204a4d08e90781eb76a6d2cd47d986dd63de1 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 2001 - 2003 Pekka Riikonen
+  Copyright (C) 2001 - 2005 Pekka Riikonen
 
   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
@@ -38,7 +38,7 @@
 #endif
 
 /* Default size of the hash table (index to prime table) */
-#define SILC_HASH_TABLE_SIZE 3
+#define SILC_HASH_TABLE_SIZE 2
 
 /* Produce the index by hashing the key */
 #define SILC_HASH_TABLE_HASH(f, c) \
@@ -77,12 +77,13 @@ struct SilcHashTableStruct {
 
 /* Prime sizes for the hash table. The size of the table will always
    be one of these. */
-const SilcUInt32 primesize[42] =
+const SilcUInt32 primesize[] =
 {
-  1, 3, 5, 11, 17, 37, 67, 109, 131, 163, 257, 367, 521, 823, 1031,
-  1237, 2053, 2777, 4099, 6247, 8209, 14057, 16411, 21089, 32771, 47431,
-  65537, 106721, 131101, 262147, 360163, 524309, 810343, 1048583, 2097169,
-  4194319, 6153409, 8388617, 13845163, 16777259, 33554467, 67108879
+  3, 5, 11, 17, 37, 67, 109, 131, 163, 257, 367, 521, 823, 1031,
+  1237, 1447, 2053, 2389, 2777, 3323, 4099, 5059, 6247, 7001, 8209, 10993,
+  14057, 16411, 19181, 21089, 25033, 32771, 40009, 47431, 65537, 106721,
+  131101, 262147, 360163, 524309, 810343, 1048583, 2097169, 4194319,
+  6153409, 8388617, 13845163, 16777259, 33554467, 67108879
 };
 
 /* Find appropriate size for the hash table. The size will be a prime. */
@@ -653,21 +654,8 @@ bool silc_hash_table_del_by_context_ext(SilcHashTable ht, void *key,
 bool silc_hash_table_find(SilcHashTable ht, void *key,
                          void **ret_key, void **ret_context)
 {
-  SilcHashTableEntry *entry;
-
-  entry = silc_hash_table_find_internal_simple(ht, key, ht->hash,
-                                              ht->hash_user_context,
-                                              ht->compare,
-                                              ht->compare_user_context);
-  if (*entry == NULL)
-    return FALSE;
-
-  if (ret_key)
-    *ret_key = (*entry)->key;
-  if (ret_context)
-    *ret_context = (*entry)->context;
-
-  return TRUE;
+  return silc_hash_table_find_ext(ht, key, ret_key, ret_context,
+                                 NULL, NULL, NULL, NULL);
 }
 
 /* Same as above but with specified hash and comparison functions. */
@@ -706,13 +694,31 @@ bool silc_hash_table_find_ext(SilcHashTable ht, void *key,
 
 bool silc_hash_table_find_by_context(SilcHashTable ht, void *key,
                                     void *context, void **ret_key)
+{
+  return silc_hash_table_find_by_context_ext(ht, key, context, ret_key,
+                                            NULL, NULL, NULL, NULL);
+}
+
+/* Same as above but with specified hash and comparison functions. */
+
+bool silc_hash_table_find_by_context_ext(SilcHashTable ht, void *key,
+                                        void *context, void **ret_key,
+                                        SilcHashFunction hash,
+                                        void *hash_user_context,
+                                        SilcHashCompare compare,
+                                        void *compare_user_context)
 {
   SilcHashTableEntry *entry;
 
   entry = silc_hash_table_find_internal_context(ht, key, context, NULL,
-                                               ht->hash,
+                                               hash ? hash : ht->hash,
+                                               hash_user_context ?
+                                               hash_user_context :
                                                ht->hash_user_context,
+                                               compare ? compare :
                                                ht->compare,
+                                               compare_user_context ?
+                                               compare_user_context :
                                                ht->compare_user_context);
   if (!entry || !(*entry))
     return FALSE;