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