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