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