]> sjero.net Git - wget/blob - src/hash.c
[svn] Make hash.c compilable outside the source tree.
[wget] / src / hash.c
1 /* Hash tables.
2    Copyright (C) 2000, 2001 Free Software Foundation, Inc.
3
4 This file is part of GNU Wget.
5
6 GNU Wget is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or (at
9 your option) any later version.
10
11 GNU Wget is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with Wget; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19
20 In addition, as a special exception, the Free Software Foundation
21 gives permission to link the code of its release of Wget with the
22 OpenSSL project's "OpenSSL" library (or with modified versions of it
23 that use the same license as the "OpenSSL" library), and distribute
24 the linked executables.  You must obey the GNU General Public License
25 in all respects for all of the code used other than "OpenSSL".  If you
26 modify this file, you may extend this exception to your version of the
27 file, but you are not obligated to do so.  If you do not wish to do
28 so, delete this exception statement from your version.  */
29
30 /* With -DSTANDALONE, this file can be compiled outside Wget source
31    tree.  To test, also use -DTEST.  */
32
33 #ifndef STANDALONE
34 # include <config.h>
35 # ifdef HAVE_STRING_H
36 #  include <string.h>
37 # else
38 #  include <strings.h>
39 # endif
40 # ifdef HAVE_LIMITS_H
41 #  include <limits.h>
42 # endif
43 #else
44 /* If running without Autoconf, go ahead and assume presence of
45    standard C89 headers.  */
46 # include <string.h>
47 # include <limits.h>
48 #endif
49
50 #include <stdlib.h>
51 #include <assert.h>
52
53 #ifndef STANDALONE
54 /* Get Wget's utility headers. */
55 # include "wget.h"
56 # include "utils.h"
57 #else
58 /* Make do without them. */
59 # define xnew(x) xmalloc (sizeof (x))
60 # define xnew_array(type, x) xmalloc (sizeof (type) * (x))
61 # define xmalloc malloc         /* or something that exits
62                                    if not enough memory */
63 # define xfree free
64 # define countof(x) (sizeof (x) / sizeof ((x)[0]))
65 # define TOLOWER(x) ('A' <= (x) && (x) <= 'Z' ? (x) - 32 : (x))
66 # define PARAMS(x) x
67 #endif
68
69 #include "hash.h"
70
71 /* INTERFACE:
72
73    Hash tables are a technique used to implement mapping between
74    objects with near-constant-time access and storage.  The table
75    associates keys to values, and a value can be very quickly
76    retrieved by providing the key.  Fast lookup tables are typically
77    implemented as hash tables.
78
79    The entry points are
80      hash_table_new       -- creates the table.
81      hash_table_destroy   -- destroys the table.
82      hash_table_put       -- establishes or updates key->value mapping.
83      hash_table_get       -- retrieves value of key.
84      hash_table_get_pair  -- get key/value pair for key.
85      hash_table_contains  -- test whether the table contains key.
86      hash_table_remove    -- remove the key->value mapping for key.
87      hash_table_map       -- iterate through table mappings.
88      hash_table_clear     -- clear hash table contents.
89      hash_table_count     -- return the number of entries in the table.
90
91    The hash table grows internally as new entries are added and is not
92    limited in size, except by available memory.  The table doubles
93    with each resize, which ensures that the amortized time per
94    operation remains constant.
95
96    By default, tables created by hash_table_new consider the keys to
97    be equal if their pointer values are the same.  You can use
98    make_string_hash_table to create tables whose keys are considered
99    equal if their string contents are the same.  In the general case,
100    the criterion of equality used to compare keys is specified at
101    table creation time with two callback functions, "hash" and "test".
102    The hash function transforms the key into an arbitrary number that
103    must be the same for two equal keys.  The test function accepts two
104    keys and returns non-zero if they are to be considered equal.
105
106    Note that neither keys nor values are copied when inserted into the
107    hash table, so they must exist for the lifetime of the table.  This
108    means that e.g. the use of static strings is OK, but objects with a
109    shorter life-time need to be copied (with strdup() or the like in
110    the case of strings) before being inserted.  */
111
112 /* IMPLEMENTATION:
113
114    The hash table is implemented as an open-addressed table with
115    linear probing collision resolution.
116
117    The above means that all the hash entries (pairs of pointers, key
118    and value) are stored in a contiguous array.  The position of each
119    mapping is determined by the hash value of its key and the size of
120    the table: location := hash(key) % size.  If two different keys end
121    up on the same position (collide), the one that came second is
122    placed at the next empty position following the occupied place.
123    This collision resolution technique is called "linear probing".
124
125    There are more advanced collision resolution methods (quadratic
126    probing, double hashing), but we don't use them because they incur
127    more non-sequential access to the array, which results in worse CPU
128    cache behavior.  Linear probing works well as long as the
129    count/size ratio (fullness) is kept below 75%.  We make sure to
130    grow and rehash the table whenever this threshold is exceeded.
131
132    Collisions make deletion tricky because clearing a position
133    followed by a colliding entry would make the position seem empty
134    and the colliding entry not found.  One solution is to leave a
135    "tombstone" instead of clearing the entry, and another is to
136    carefully rehash the entries immediately following the deleted one.
137    We use the latter method because it results in less bookkeeping and
138    faster retrieval at the (slight) expense of deletion.  */
139
140 /* Maximum allowed fullness: when hash table's fullness exceeds this
141    value, the table is resized.  */
142 #define HASH_MAX_FULLNESS 0.75
143
144 /* The hash table size is multiplied by this factor (and then rounded
145    to the next prime) with each resize.  This guarantees infrequent
146    resizes.  */
147 #define HASH_RESIZE_FACTOR 2
148
149 struct mapping {
150   void *key;
151   void *value;
152 };
153
154 typedef unsigned long (*hashfun_t) PARAMS ((const void *));
155 typedef int (*testfun_t) PARAMS ((const void *, const void *));
156
157 struct hash_table {
158   hashfun_t hash_function;
159   testfun_t test_function;
160
161   struct mapping *mappings;     /* pointer to the table entries. */
162   int size;                     /* size of the array. */
163
164   int count;                    /* number of non-empty entries. */
165   int resize_threshold;         /* after size exceeds this number of
166                                    entries, resize the table.  */
167   int prime_offset;             /* the offset of the current prime in
168                                    the prime table. */
169 };
170
171 /* We use the all-bits-set constant (INVALID_PTR) marker to mean that
172    a mapping is empty.  It is unaligned and therefore illegal as a
173    pointer.  INVALID_PTR_BYTE (0xff) is the one-byte value used to
174    initialize the mappings array as empty.
175
176    The all-bits-set value is a better choice than NULL because it
177    allows the use of NULL/0 keys.  Since the keys are either integers
178    or pointers, the only key that cannot be used is the integer value
179    -1.  This is acceptable because it still allows the use of
180    nonnegative integer keys.  */
181
182 #define INVALID_PTR ((void *) ~(unsigned long)0)
183 #ifndef UCHAR_MAX
184 # define UCHAR_MAX 0xff
185 #endif
186 #define INVALID_PTR_BYTE UCHAR_MAX
187
188 #define NON_EMPTY(mp) ((mp)->key != INVALID_PTR)
189 #define MARK_AS_EMPTY(mp) ((mp)->key = INVALID_PTR)
190
191 /* "Next" mapping is the mapping after MP, but wrapping back to
192    MAPPINGS when MP would reach MAPPINGS+SIZE.  */
193 #define NEXT_MAPPING(mp, mappings, size) (mp != mappings + (size - 1)   \
194                                           ? mp + 1 : mappings)
195
196 /* Loop over non-empty mappings starting at MP. */
197 #define LOOP_NON_EMPTY(mp, mappings, size)                              \
198   for (; NON_EMPTY (mp); mp = NEXT_MAPPING (mp, mappings, size))
199
200 /* Return the position of KEY in hash table SIZE large, hash function
201    being HASHFUN.  */
202 #define HASH_POSITION(key, hashfun, size) ((hashfun) (key) % size)
203
204 /* Find a prime near, but greather than or equal to SIZE.  The primes
205    are looked up from a table with a selection of primes convenient
206    for this purpose.
207
208    PRIME_OFFSET is a minor optimization: it specifies start position
209    for the search for the large enough prime.  The final offset is
210    stored in the same variable.  That way the list of primes does not
211    have to be scanned from the beginning each time around.  */
212
213 static int
214 prime_size (int size, int *prime_offset)
215 {
216   static const unsigned long primes [] = {
217     13, 19, 29, 41, 59, 79, 107, 149, 197, 263, 347, 457, 599, 787, 1031,
218     1361, 1777, 2333, 3037, 3967, 5167, 6719, 8737, 11369, 14783,
219     19219, 24989, 32491, 42257, 54941, 71429, 92861, 120721, 156941,
220     204047, 265271, 344857, 448321, 582821, 757693, 985003, 1280519,
221     1664681, 2164111, 2813353, 3657361, 4754591, 6180989, 8035301,
222     10445899, 13579681, 17653589, 22949669, 29834603, 38784989,
223     50420551, 65546729, 85210757, 110774011, 144006217, 187208107,
224     243370577, 316381771, 411296309, 534685237, 695090819, 903618083,
225     1174703521, 1527114613, 1985248999,
226     (unsigned long)0x99d43ea5, (unsigned long)0xc7fa5177
227   };
228   int i;
229
230   for (i = *prime_offset; i < countof (primes); i++)
231     if (primes[i] >= size)
232       {
233         /* Set the offset to the next prime.  That is safe because,
234            next time we are called, it will be with a larger SIZE,
235            which means we could never return the same prime anyway.
236            (If that is not the case, the caller can simply reset
237            *prime_offset.)  */
238         *prime_offset = i + 1;
239         return primes[i];
240       }
241
242   abort ();
243   return 0;
244 }
245
246 static unsigned long ptrhash PARAMS ((const void *));
247 static int ptrcmp PARAMS ((const void *, const void *));
248
249 /* Create a hash table with hash function HASH_FUNCTION and test
250    function TEST_FUNCTION.  The table is empty (its count is 0), but
251    pre-allocated to store at least ITEMS items.
252
253    ITEMS is the number of items that the table can accept without
254    needing to resize.  It is useful when creating a table that is to
255    be immediately filled with a known number of items.  In that case,
256    the regrows are a waste of time, and specifying ITEMS correctly
257    will avoid them altogether.
258
259    Note that hash tables grow dynamically regardless of ITEMS.  The
260    only use of ITEMS is to preallocate the table and avoid unnecessary
261    dynamic regrows.  Don't bother making ITEMS prime because it's not
262    used as size unchanged.  To start with a small table that grows as
263    needed, simply specify zero ITEMS.
264
265    If hash and test callbacks are not specified, identity mapping is
266    assumed, i.e. pointer values are used for key comparison.  (Common
267    Lisp calls such tables EQ hash tables, and Java calls them
268    IdentityHashMaps.)  If your keys require different comparison,
269    specify hash and test functions.  For easy use of C strings as hash
270    keys, you can use the convenience functions make_string_hash_table
271    and make_nocase_string_hash_table.  */
272
273 struct hash_table *
274 hash_table_new (int items,
275                 unsigned long (*hash_function) (const void *),
276                 int (*test_function) (const void *, const void *))
277 {
278   int size;
279   struct hash_table *ht = xnew (struct hash_table);
280
281   ht->hash_function = hash_function ? hash_function : ptrhash;
282   ht->test_function = test_function ? test_function : ptrcmp;
283
284   /* If the size of struct hash_table ever becomes a concern, this
285      field can go.  (Wget doesn't create many hashes.)  */
286   ht->prime_offset = 0;
287
288   /* Calculate the size that ensures that the table will store at
289      least ITEMS keys without the need to resize.  */
290   size = 1 + items / HASH_MAX_FULLNESS;
291   size = prime_size (size, &ht->prime_offset);
292   ht->size = size;
293   ht->resize_threshold = size * HASH_MAX_FULLNESS;
294   /*assert (ht->resize_threshold >= items);*/
295
296   ht->mappings = xnew_array (struct mapping, ht->size);
297
298   /* Mark mappings as empty.  We use 0xff rather than 0 to mark empty
299      keys because it allows us to use NULL/0 as keys.  */
300   memset (ht->mappings, INVALID_PTR_BYTE, size * sizeof (struct mapping));
301
302   ht->count = 0;
303
304   return ht;
305 }
306
307 /* Free the data associated with hash table HT. */
308
309 void
310 hash_table_destroy (struct hash_table *ht)
311 {
312   xfree (ht->mappings);
313   xfree (ht);
314 }
315
316 /* The heart of most functions in this file -- find the mapping whose
317    KEY is equal to key, using linear probing.  Returns the mapping
318    that matches KEY, or the first empty mapping if none matches.  */
319
320 static inline struct mapping *
321 find_mapping (const struct hash_table *ht, const void *key)
322 {
323   struct mapping *mappings = ht->mappings;
324   int size = ht->size;
325   struct mapping *mp = mappings + HASH_POSITION (key, ht->hash_function, size);
326   testfun_t equals = ht->test_function;
327
328   LOOP_NON_EMPTY (mp, mappings, size)
329     if (equals (key, mp->key))
330       break;
331   return mp;
332 }
333
334 /* Get the value that corresponds to the key KEY in the hash table HT.
335    If no value is found, return NULL.  Note that NULL is a legal value
336    for value; if you are storing NULLs in your hash table, you can use
337    hash_table_contains to be sure that a (possibly NULL) value exists
338    in the table.  Or, you can use hash_table_get_pair instead of this
339    function.  */
340
341 void *
342 hash_table_get (const struct hash_table *ht, const void *key)
343 {
344   struct mapping *mp = find_mapping (ht, key);
345   if (NON_EMPTY (mp))
346     return mp->value;
347   else
348     return NULL;
349 }
350
351 /* Like hash_table_get, but writes out the pointers to both key and
352    value.  Returns non-zero on success.  */
353
354 int
355 hash_table_get_pair (const struct hash_table *ht, const void *lookup_key,
356                      void *orig_key, void *value)
357 {
358   struct mapping *mp = find_mapping (ht, lookup_key);
359   if (NON_EMPTY (mp))
360     {
361       if (orig_key)
362         *(void **)orig_key = mp->key;
363       if (value)
364         *(void **)value = mp->value;
365       return 1;
366     }
367   else
368     return 0;
369 }
370
371 /* Return 1 if HT contains KEY, 0 otherwise. */
372
373 int
374 hash_table_contains (const struct hash_table *ht, const void *key)
375 {
376   struct mapping *mp = find_mapping (ht, key);
377   return NON_EMPTY (mp);
378 }
379
380 /* Grow hash table HT as necessary, and rehash all the key-value
381    mappings.  */
382
383 static void
384 grow_hash_table (struct hash_table *ht)
385 {
386   hashfun_t hasher = ht->hash_function;
387   struct mapping *old_mappings = ht->mappings;
388   struct mapping *old_end      = ht->mappings + ht->size;
389   struct mapping *mp, *mappings;
390   int newsize;
391
392   newsize = prime_size (ht->size * HASH_RESIZE_FACTOR, &ht->prime_offset);
393 #if 0
394   printf ("growing from %d to %d; fullness %.2f%% to %.2f%%\n",
395           ht->size, newsize,
396           100.0 * ht->count / ht->size,
397           100.0 * ht->count / newsize);
398 #endif
399
400   ht->size = newsize;
401   ht->resize_threshold = newsize * HASH_MAX_FULLNESS;
402
403   mappings = xnew_array (struct mapping, newsize);
404   memset (mappings, INVALID_PTR_BYTE, newsize * sizeof (struct mapping));
405   ht->mappings = mappings;
406
407   for (mp = old_mappings; mp < old_end; mp++)
408     if (NON_EMPTY (mp))
409       {
410         struct mapping *new_mp;
411         /* We don't need to test for uniqueness of keys because they
412            come from the hash table and are therefore known to be
413            unique.  */
414         new_mp = mappings + HASH_POSITION (mp->key, hasher, newsize);
415         LOOP_NON_EMPTY (new_mp, mappings, newsize)
416           ;
417         *new_mp = *mp;
418       }
419
420   xfree (old_mappings);
421 }
422
423 /* Put VALUE in the hash table HT under the key KEY.  This regrows the
424    table if necessary.  */
425
426 void
427 hash_table_put (struct hash_table *ht, const void *key, void *value)
428 {
429   struct mapping *mp = find_mapping (ht, key);
430   if (NON_EMPTY (mp))
431     {
432       /* update existing item */
433       mp->key   = (void *)key; /* const? */
434       mp->value = value;
435       return;
436     }
437
438   /* If adding the item would make the table exceed max. fullness,
439      grow the table first.  */
440   if (ht->count >= ht->resize_threshold)
441     {
442       grow_hash_table (ht);
443       mp = find_mapping (ht, key);
444     }
445
446   /* add new item */
447   ++ht->count;
448   mp->key   = (void *)key;      /* const? */
449   mp->value = value;
450 }
451
452 /* Remove a mapping that matches KEY from HT.  Return 0 if there was
453    no such entry; return 1 if an entry was removed.  */
454
455 int
456 hash_table_remove (struct hash_table *ht, const void *key)
457 {
458   struct mapping *mp = find_mapping (ht, key);
459   if (!NON_EMPTY (mp))
460     return 0;
461   else
462     {
463       int size = ht->size;
464       struct mapping *mappings = ht->mappings;
465       hashfun_t hasher = ht->hash_function;
466
467       MARK_AS_EMPTY (mp);
468       --ht->count;
469
470       /* Rehash all the entries following MP.  The alternative
471          approach is to mark the entry as deleted, i.e. create a
472          "tombstone".  That speeds up removal, but leaves a lot of
473          garbage and slows down hash_table_get and hash_table_put.  */
474
475       mp = NEXT_MAPPING (mp, mappings, size);
476       LOOP_NON_EMPTY (mp, mappings, size)
477         {
478           const void *key2 = mp->key;
479           struct mapping *mp_new;
480
481           /* Find the new location for the key. */
482           mp_new = mappings + HASH_POSITION (key2, hasher, size);
483           LOOP_NON_EMPTY (mp_new, mappings, size)
484             if (key2 == mp_new->key)
485               /* The mapping MP (key2) is already where we want it (in
486                  MP_NEW's "chain" of keys.)  */
487               goto next_rehash;
488
489           *mp_new = *mp;
490           MARK_AS_EMPTY (mp);
491
492         next_rehash:
493           ;
494         }
495       return 1;
496     }
497 }
498
499 /* Clear HT of all entries.  After calling this function, the count
500    and the fullness of the hash table will be zero.  The size will
501    remain unchanged.  */
502
503 void
504 hash_table_clear (struct hash_table *ht)
505 {
506   memset (ht->mappings, INVALID_PTR_BYTE, ht->size * sizeof (struct mapping));
507   ht->count = 0;
508 }
509
510 /* Map MAPFUN over all the mappings in hash table HT.  MAPFUN is
511    called with three arguments: the key, the value, and MAPARG.
512
513    It is undefined what happens if you add or remove entries in the
514    hash table while hash_table_map is running.  The exception is the
515    entry you're currently mapping over; you may remove or change that
516    entry.  */
517
518 void
519 hash_table_map (struct hash_table *ht,
520                 int (*mapfun) (void *, void *, void *),
521                 void *maparg)
522 {
523   struct mapping *mp  = ht->mappings;
524   struct mapping *end = ht->mappings + ht->size;
525
526   for (; mp < end; mp++)
527     if (NON_EMPTY (mp))
528       {
529         void *key;
530       repeat:
531         key = mp->key;
532         if (mapfun (key, mp->value, maparg))
533           return;
534         /* hash_table_remove might have moved the adjacent
535            mappings. */
536         if (mp->key != key && NON_EMPTY (mp))
537           goto repeat;
538       }
539 }
540
541 /* Return the number of elements in the hash table.  This is not the
542    same as the physical size of the hash table, which is always
543    greater than the number of elements.  */
544
545 int
546 hash_table_count (const struct hash_table *ht)
547 {
548   return ht->count;
549 }
550 \f
551 /* Functions from this point onward are meant for convenience and
552    don't strictly belong to this file.  However, this is as good a
553    place for them as any.  */
554
555 /* Rules for creating custom hash and test functions:
556
557    - The test function returns non-zero for keys that are considered
558      "equal", zero otherwise.
559
560    - The hash function returns a number that represents the
561      "distinctness" of the object.  In more precise terms, it means
562      that for any two objects that test "equal" under the test
563      function, the hash function MUST produce the same result.
564
565      This does not mean that all different objects must produce
566      different values (that would be "perfect" hashing), only that
567      non-distinct objects must produce the same values!  For instance,
568      a hash function that returns 0 for any given object is a
569      perfectly valid (albeit extremely bad) hash function.  A hash
570      function that hashes a string by adding up all its characters is
571      another example of a valid (but quite bad) hash function.
572
573      It is not hard to make hash and test functions agree about
574      equality.  For example, if the test function compares strings
575      case-insensitively, the hash function can lower-case the
576      characters when calculating the hash value.  That ensures that
577      two strings differing only in case will hash the same.
578
579    - If you care about performance, choose a hash function with as
580      good "spreading" as possible.  A good hash function will use all
581      the bits of the input when calculating the hash, and will react
582      to even small changes in input with a completely different
583      output.  Finally, don't make the hash function itself overly
584      slow, because you'll be incurring a non-negligible overhead to
585      all hash table operations.  */
586
587 /*
588  * Support for hash tables whose keys are strings.
589  *
590  */
591    
592 /* 31 bit hash function.  Taken from Gnome's glib, modified to use
593    standard C types.
594
595    We used to use the popular hash function from the Dragon Book, but
596    this one seems to perform much better.  */
597
598 unsigned long
599 string_hash (const void *key)
600 {
601   const char *p = key;
602   unsigned int h = *p;
603   
604   if (h)
605     for (p += 1; *p != '\0'; p++)
606       h = (h << 5) - h + *p;
607   
608   return h;
609 }
610
611 /* Frontend for strcmp usable for hash tables. */
612
613 int
614 string_cmp (const void *s1, const void *s2)
615 {
616   return !strcmp ((const char *)s1, (const char *)s2);
617 }
618
619 /* Return a hash table of preallocated to store at least ITEMS items
620    suitable to use strings as keys.  */
621
622 struct hash_table *
623 make_string_hash_table (int items)
624 {
625   return hash_table_new (items, string_hash, string_cmp);
626 }
627
628 /*
629  * Support for hash tables whose keys are strings, but which are
630  * compared case-insensitively.
631  *
632  */
633
634 /* Like string_hash, but produce the same hash regardless of the case. */
635
636 static unsigned long
637 string_hash_nocase (const void *key)
638 {
639   const char *p = key;
640   unsigned int h = TOLOWER (*p);
641   
642   if (h)
643     for (p += 1; *p != '\0'; p++)
644       h = (h << 5) - h + TOLOWER (*p);
645   
646   return h;
647 }
648
649 /* Like string_cmp, but doing case-insensitive compareison. */
650
651 static int
652 string_cmp_nocase (const void *s1, const void *s2)
653 {
654   return !strcasecmp ((const char *)s1, (const char *)s2);
655 }
656
657 /* Like make_string_hash_table, but uses string_hash_nocase and
658    string_cmp_nocase.  */
659
660 struct hash_table *
661 make_nocase_string_hash_table (int items)
662 {
663   return hash_table_new (items, string_hash_nocase, string_cmp_nocase);
664 }
665
666 /* Hashing of numeric values, such as pointers and integers.
667
668    This implementation is the Robert Jenkins' 32 bit Mix Function,
669    with a simple adaptation for 64-bit values.  It offers excellent
670    spreading of values and doesn't need to know the hash table size to
671    work (unlike the very popular Knuth's multiplication hash).  */
672
673 static unsigned long
674 ptrhash (const void *ptr)
675 {
676   unsigned long key = (unsigned long)ptr;
677   key += (key << 12);
678   key ^= (key >> 22);
679   key += (key << 4);
680   key ^= (key >> 9);
681   key += (key << 10);
682   key ^= (key >> 2);
683   key += (key << 7);
684   key ^= (key >> 12);
685 #if SIZEOF_LONG > 4
686   key += (key << 44);
687   key ^= (key >> 54);
688   key += (key << 36);
689   key ^= (key >> 41);
690   key += (key << 42);
691   key ^= (key >> 34);
692   key += (key << 39);
693   key ^= (key >> 44);
694 #endif
695   return key;
696 }
697
698 static int
699 ptrcmp (const void *ptr1, const void *ptr2)
700 {
701   return ptr1 == ptr2;
702 }
703 \f
704 #ifdef TEST
705
706 #include <stdio.h>
707 #include <string.h>
708
709 int
710 print_hash_table_mapper (void *key, void *value, void *count)
711 {
712   ++*(int *)count;
713   printf ("%s: %s\n", (const char *)key, (char *)value);
714   return 0;
715 }
716
717 void
718 print_hash (struct hash_table *sht)
719 {
720   int debug_count = 0;
721   hash_table_map (sht, print_hash_table_mapper, &debug_count);
722   assert (debug_count == sht->count);
723 }
724
725 int
726 main (void)
727 {
728   struct hash_table *ht = make_string_hash_table (0);
729   char line[80];
730   while ((fgets (line, sizeof (line), stdin)))
731     {
732       int len = strlen (line);
733       if (len <= 1)
734         continue;
735       line[--len] = '\0';
736       if (!hash_table_contains (ht, line))
737         hash_table_put (ht, strdup (line), "here I am!");
738 #if 1
739       if (len % 5 == 0)
740         {
741           char *line_copy;
742           if (hash_table_get_pair (ht, line, &line_copy, NULL))
743             {
744               hash_table_remove (ht, line);
745               xfree (line_copy);
746             }
747         }
748 #endif
749     }
750 #if 0
751   print_hash (ht);
752 #endif
753 #if 1
754   printf ("%d %d\n", ht->count, ht->size);
755 #endif
756   return 0;
757 }
758 #endif /* TEST */