hash: make rotation more obvious
[gnulib.git] / lib / hash.c
1 /* hash - hashing table processing.
2
3    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2007,
4    2009 Free Software Foundation, Inc.
5
6    Written by Jim Meyering, 1992.
7
8    This program is free software: you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21 /* A generic hash table package.  */
22
23 /* Define USE_OBSTACK to 1 if you want the allocator to use obstacks instead
24    of malloc.  If you change USE_OBSTACK, you have to recompile!  */
25
26 #include <config.h>
27
28 #include "hash.h"
29
30 #include "bitrotate.h"
31 #include "xalloc.h"
32
33 #include <stdint.h>
34 #include <stdio.h>
35 #include <stdlib.h>
36
37 #if USE_OBSTACK
38 # include "obstack.h"
39 # ifndef obstack_chunk_alloc
40 #  define obstack_chunk_alloc malloc
41 # endif
42 # ifndef obstack_chunk_free
43 #  define obstack_chunk_free free
44 # endif
45 #endif
46
47 struct hash_entry
48   {
49     void *data;
50     struct hash_entry *next;
51   };
52
53 struct hash_table
54   {
55     /* The array of buckets starts at BUCKET and extends to BUCKET_LIMIT-1,
56        for a possibility of N_BUCKETS.  Among those, N_BUCKETS_USED buckets
57        are not empty, there are N_ENTRIES active entries in the table.  */
58     struct hash_entry *bucket;
59     struct hash_entry const *bucket_limit;
60     size_t n_buckets;
61     size_t n_buckets_used;
62     size_t n_entries;
63
64     /* Tuning arguments, kept in a physically separate structure.  */
65     const Hash_tuning *tuning;
66
67     /* Three functions are given to `hash_initialize', see the documentation
68        block for this function.  In a word, HASHER randomizes a user entry
69        into a number up from 0 up to some maximum minus 1; COMPARATOR returns
70        true if two user entries compare equally; and DATA_FREER is the cleanup
71        function for a user entry.  */
72     Hash_hasher hasher;
73     Hash_comparator comparator;
74     Hash_data_freer data_freer;
75
76     /* A linked list of freed struct hash_entry structs.  */
77     struct hash_entry *free_entry_list;
78
79 #if USE_OBSTACK
80     /* Whenever obstacks are used, it is possible to allocate all overflowed
81        entries into a single stack, so they all can be freed in a single
82        operation.  It is not clear if the speedup is worth the trouble.  */
83     struct obstack entry_stack;
84 #endif
85   };
86
87 /* A hash table contains many internal entries, each holding a pointer to
88    some user-provided data (also called a user entry).  An entry indistinctly
89    refers to both the internal entry and its associated user entry.  A user
90    entry contents may be hashed by a randomization function (the hashing
91    function, or just `hasher' for short) into a number (or `slot') between 0
92    and the current table size.  At each slot position in the hash table,
93    starts a linked chain of entries for which the user data all hash to this
94    slot.  A bucket is the collection of all entries hashing to the same slot.
95
96    A good `hasher' function will distribute entries rather evenly in buckets.
97    In the ideal case, the length of each bucket is roughly the number of
98    entries divided by the table size.  Finding the slot for a data is usually
99    done in constant time by the `hasher', and the later finding of a precise
100    entry is linear in time with the size of the bucket.  Consequently, a
101    larger hash table size (that is, a larger number of buckets) is prone to
102    yielding shorter chains, *given* the `hasher' function behaves properly.
103
104    Long buckets slow down the lookup algorithm.  One might use big hash table
105    sizes in hope to reduce the average length of buckets, but this might
106    become inordinate, as unused slots in the hash table take some space.  The
107    best bet is to make sure you are using a good `hasher' function (beware
108    that those are not that easy to write! :-), and to use a table size
109    larger than the actual number of entries.  */
110
111 /* If an insertion makes the ratio of nonempty buckets to table size larger
112    than the growth threshold (a number between 0.0 and 1.0), then increase
113    the table size by multiplying by the growth factor (a number greater than
114    1.0).  The growth threshold defaults to 0.8, and the growth factor
115    defaults to 1.414, meaning that the table will have doubled its size
116    every second time 80% of the buckets get used.  */
117 #define DEFAULT_GROWTH_THRESHOLD 0.8
118 #define DEFAULT_GROWTH_FACTOR 1.414
119
120 /* If a deletion empties a bucket and causes the ratio of used buckets to
121    table size to become smaller than the shrink threshold (a number between
122    0.0 and 1.0), then shrink the table by multiplying by the shrink factor (a
123    number greater than the shrink threshold but smaller than 1.0).  The shrink
124    threshold and factor default to 0.0 and 1.0, meaning that the table never
125    shrinks.  */
126 #define DEFAULT_SHRINK_THRESHOLD 0.0
127 #define DEFAULT_SHRINK_FACTOR 1.0
128
129 /* Use this to initialize or reset a TUNING structure to
130    some sensible values. */
131 static const Hash_tuning default_tuning =
132   {
133     DEFAULT_SHRINK_THRESHOLD,
134     DEFAULT_SHRINK_FACTOR,
135     DEFAULT_GROWTH_THRESHOLD,
136     DEFAULT_GROWTH_FACTOR,
137     false
138   };
139
140 /* Information and lookup.  */
141
142 /* The following few functions provide information about the overall hash
143    table organization: the number of entries, number of buckets and maximum
144    length of buckets.  */
145
146 /* Return the number of buckets in the hash table.  The table size, the total
147    number of buckets (used plus unused), or the maximum number of slots, are
148    the same quantity.  */
149
150 size_t
151 hash_get_n_buckets (const Hash_table *table)
152 {
153   return table->n_buckets;
154 }
155
156 /* Return the number of slots in use (non-empty buckets).  */
157
158 size_t
159 hash_get_n_buckets_used (const Hash_table *table)
160 {
161   return table->n_buckets_used;
162 }
163
164 /* Return the number of active entries.  */
165
166 size_t
167 hash_get_n_entries (const Hash_table *table)
168 {
169   return table->n_entries;
170 }
171
172 /* Return the length of the longest chain (bucket).  */
173
174 size_t
175 hash_get_max_bucket_length (const Hash_table *table)
176 {
177   struct hash_entry const *bucket;
178   size_t max_bucket_length = 0;
179
180   for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
181     {
182       if (bucket->data)
183         {
184           struct hash_entry const *cursor = bucket;
185           size_t bucket_length = 1;
186
187           while (cursor = cursor->next, cursor)
188             bucket_length++;
189
190           if (bucket_length > max_bucket_length)
191             max_bucket_length = bucket_length;
192         }
193     }
194
195   return max_bucket_length;
196 }
197
198 /* Do a mild validation of a hash table, by traversing it and checking two
199    statistics.  */
200
201 bool
202 hash_table_ok (const Hash_table *table)
203 {
204   struct hash_entry const *bucket;
205   size_t n_buckets_used = 0;
206   size_t n_entries = 0;
207
208   for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
209     {
210       if (bucket->data)
211         {
212           struct hash_entry const *cursor = bucket;
213
214           /* Count bucket head.  */
215           n_buckets_used++;
216           n_entries++;
217
218           /* Count bucket overflow.  */
219           while (cursor = cursor->next, cursor)
220             n_entries++;
221         }
222     }
223
224   if (n_buckets_used == table->n_buckets_used && n_entries == table->n_entries)
225     return true;
226
227   return false;
228 }
229
230 void
231 hash_print_statistics (const Hash_table *table, FILE *stream)
232 {
233   size_t n_entries = hash_get_n_entries (table);
234   size_t n_buckets = hash_get_n_buckets (table);
235   size_t n_buckets_used = hash_get_n_buckets_used (table);
236   size_t max_bucket_length = hash_get_max_bucket_length (table);
237
238   fprintf (stream, "# entries:         %lu\n", (unsigned long int) n_entries);
239   fprintf (stream, "# buckets:         %lu\n", (unsigned long int) n_buckets);
240   fprintf (stream, "# buckets used:    %lu (%.2f%%)\n",
241            (unsigned long int) n_buckets_used,
242            (100.0 * n_buckets_used) / n_buckets);
243   fprintf (stream, "max bucket length: %lu\n",
244            (unsigned long int) max_bucket_length);
245 }
246
247 /* If ENTRY matches an entry already in the hash table, return the
248    entry from the table.  Otherwise, return NULL.  */
249
250 void *
251 hash_lookup (const Hash_table *table, const void *entry)
252 {
253   struct hash_entry const *bucket
254     = table->bucket + table->hasher (entry, table->n_buckets);
255   struct hash_entry const *cursor;
256
257   if (! (bucket < table->bucket_limit))
258     abort ();
259
260   if (bucket->data == NULL)
261     return NULL;
262
263   for (cursor = bucket; cursor; cursor = cursor->next)
264     if (entry == cursor->data || table->comparator (entry, cursor->data))
265       return cursor->data;
266
267   return NULL;
268 }
269
270 /* Walking.  */
271
272 /* The functions in this page traverse the hash table and process the
273    contained entries.  For the traversal to work properly, the hash table
274    should not be resized nor modified while any particular entry is being
275    processed.  In particular, entries should not be added, and an entry
276    may be removed only if there is no shrink threshold and the entry being
277    removed has already been passed to hash_get_next.  */
278
279 /* Return the first data in the table, or NULL if the table is empty.  */
280
281 void *
282 hash_get_first (const Hash_table *table)
283 {
284   struct hash_entry const *bucket;
285
286   if (table->n_entries == 0)
287     return NULL;
288
289   for (bucket = table->bucket; ; bucket++)
290     if (! (bucket < table->bucket_limit))
291       abort ();
292     else if (bucket->data)
293       return bucket->data;
294 }
295
296 /* Return the user data for the entry following ENTRY, where ENTRY has been
297    returned by a previous call to either `hash_get_first' or `hash_get_next'.
298    Return NULL if there are no more entries.  */
299
300 void *
301 hash_get_next (const Hash_table *table, const void *entry)
302 {
303   struct hash_entry const *bucket
304     = table->bucket + table->hasher (entry, table->n_buckets);
305   struct hash_entry const *cursor;
306
307   if (! (bucket < table->bucket_limit))
308     abort ();
309
310   /* Find next entry in the same bucket.  */
311   for (cursor = bucket; cursor; cursor = cursor->next)
312     if (cursor->data == entry && cursor->next)
313       return cursor->next->data;
314
315   /* Find first entry in any subsequent bucket.  */
316   while (++bucket < table->bucket_limit)
317     if (bucket->data)
318       return bucket->data;
319
320   /* None found.  */
321   return NULL;
322 }
323
324 /* Fill BUFFER with pointers to active user entries in the hash table, then
325    return the number of pointers copied.  Do not copy more than BUFFER_SIZE
326    pointers.  */
327
328 size_t
329 hash_get_entries (const Hash_table *table, void **buffer,
330                   size_t buffer_size)
331 {
332   size_t counter = 0;
333   struct hash_entry const *bucket;
334   struct hash_entry const *cursor;
335
336   for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
337     {
338       if (bucket->data)
339         {
340           for (cursor = bucket; cursor; cursor = cursor->next)
341             {
342               if (counter >= buffer_size)
343                 return counter;
344               buffer[counter++] = cursor->data;
345             }
346         }
347     }
348
349   return counter;
350 }
351
352 /* Call a PROCESSOR function for each entry of a hash table, and return the
353    number of entries for which the processor function returned success.  A
354    pointer to some PROCESSOR_DATA which will be made available to each call to
355    the processor function.  The PROCESSOR accepts two arguments: the first is
356    the user entry being walked into, the second is the value of PROCESSOR_DATA
357    as received.  The walking continue for as long as the PROCESSOR function
358    returns nonzero.  When it returns zero, the walking is interrupted.  */
359
360 size_t
361 hash_do_for_each (const Hash_table *table, Hash_processor processor,
362                   void *processor_data)
363 {
364   size_t counter = 0;
365   struct hash_entry const *bucket;
366   struct hash_entry const *cursor;
367
368   for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
369     {
370       if (bucket->data)
371         {
372           for (cursor = bucket; cursor; cursor = cursor->next)
373             {
374               if (! processor (cursor->data, processor_data))
375                 return counter;
376               counter++;
377             }
378         }
379     }
380
381   return counter;
382 }
383
384 /* Allocation and clean-up.  */
385
386 /* Return a hash index for a NUL-terminated STRING between 0 and N_BUCKETS-1.
387    This is a convenience routine for constructing other hashing functions.  */
388
389 #if USE_DIFF_HASH
390
391 /* About hashings, Paul Eggert writes to me (FP), on 1994-01-01: "Please see
392    B. J. McKenzie, R. Harries & T. Bell, Selecting a hashing algorithm,
393    Software--practice & experience 20, 2 (Feb 1990), 209-224.  Good hash
394    algorithms tend to be domain-specific, so what's good for [diffutils'] io.c
395    may not be good for your application."  */
396
397 size_t
398 hash_string (const char *string, size_t n_buckets)
399 {
400 # define HASH_ONE_CHAR(Value, Byte) \
401   ((Byte) + rotl_sz (Value, 7))
402
403   size_t value = 0;
404   unsigned char ch;
405
406   for (; (ch = *string); string++)
407     value = HASH_ONE_CHAR (value, ch);
408   return value % n_buckets;
409
410 # undef HASH_ONE_CHAR
411 }
412
413 #else /* not USE_DIFF_HASH */
414
415 /* This one comes from `recode', and performs a bit better than the above as
416    per a few experiments.  It is inspired from a hashing routine found in the
417    very old Cyber `snoop', itself written in typical Greg Mansfield style.
418    (By the way, what happened to this excellent man?  Is he still alive?)  */
419
420 size_t
421 hash_string (const char *string, size_t n_buckets)
422 {
423   size_t value = 0;
424   unsigned char ch;
425
426   for (; (ch = *string); string++)
427     value = (value * 31 + ch) % n_buckets;
428   return value;
429 }
430
431 #endif /* not USE_DIFF_HASH */
432
433 /* Return true if CANDIDATE is a prime number.  CANDIDATE should be an odd
434    number at least equal to 11.  */
435
436 static bool
437 is_prime (size_t candidate)
438 {
439   size_t divisor = 3;
440   size_t square = divisor * divisor;
441
442   while (square < candidate && (candidate % divisor))
443     {
444       divisor++;
445       square += 4 * divisor;
446       divisor++;
447     }
448
449   return (candidate % divisor ? true : false);
450 }
451
452 /* Round a given CANDIDATE number up to the nearest prime, and return that
453    prime.  Primes lower than 10 are merely skipped.  */
454
455 static size_t
456 next_prime (size_t candidate)
457 {
458   /* Skip small primes.  */
459   if (candidate < 10)
460     candidate = 10;
461
462   /* Make it definitely odd.  */
463   candidate |= 1;
464
465   while (!is_prime (candidate))
466     candidate += 2;
467
468   return candidate;
469 }
470
471 void
472 hash_reset_tuning (Hash_tuning *tuning)
473 {
474   *tuning = default_tuning;
475 }
476
477 /* If the user passes a NULL hasher, we hash the raw pointer.  */
478 static size_t
479 raw_hasher (const void *data, size_t n)
480 {
481   /* When hashing unique pointers, it is often the case that they were
482      generated by malloc and thus have the property that the low-order
483      bits are 0.  As this tends to give poorer performance with small
484      tables, we rotate the pointer value before performing division,
485      in an attempt to improve hash quality.  */
486   size_t val = rotr_sz ((size_t) data, 3);
487   return val % n;
488 }
489
490 /* If the user passes a NULL comparator, we use pointer comparison.  */
491 static bool
492 raw_comparator (const void *a, const void *b)
493 {
494   return a == b;
495 }
496
497
498 /* For the given hash TABLE, check the user supplied tuning structure for
499    reasonable values, and return true if there is no gross error with it.
500    Otherwise, definitively reset the TUNING field to some acceptable default
501    in the hash table (that is, the user loses the right of further modifying
502    tuning arguments), and return false.  */
503
504 static bool
505 check_tuning (Hash_table *table)
506 {
507   const Hash_tuning *tuning = table->tuning;
508   if (tuning == &default_tuning)
509     return true;
510
511   /* Be a bit stricter than mathematics would require, so that
512      rounding errors in size calculations do not cause allocations to
513      fail to grow or shrink as they should.  The smallest allocation
514      is 11 (due to next_prime's algorithm), so an epsilon of 0.1
515      should be good enough.  */
516   float epsilon = 0.1f;
517
518   if (epsilon < tuning->growth_threshold
519       && tuning->growth_threshold < 1 - epsilon
520       && 1 + epsilon < tuning->growth_factor
521       && 0 <= tuning->shrink_threshold
522       && tuning->shrink_threshold + epsilon < tuning->shrink_factor
523       && tuning->shrink_factor <= 1
524       && tuning->shrink_threshold + epsilon < tuning->growth_threshold)
525     return true;
526
527   table->tuning = &default_tuning;
528   return false;
529 }
530
531 /* Allocate and return a new hash table, or NULL upon failure.  The initial
532    number of buckets is automatically selected so as to _guarantee_ that you
533    may insert at least CANDIDATE different user entries before any growth of
534    the hash table size occurs.  So, if have a reasonably tight a-priori upper
535    bound on the number of entries you intend to insert in the hash table, you
536    may save some table memory and insertion time, by specifying it here.  If
537    the IS_N_BUCKETS field of the TUNING structure is true, the CANDIDATE
538    argument has its meaning changed to the wanted number of buckets.
539
540    TUNING points to a structure of user-supplied values, in case some fine
541    tuning is wanted over the default behavior of the hasher.  If TUNING is
542    NULL, the default tuning parameters are used instead.  If TUNING is
543    provided but the values requested are out of bounds or might cause
544    rounding errors, return NULL.
545
546    The user-supplied HASHER function, when not NULL, accepts two
547    arguments ENTRY and TABLE_SIZE.  It computes, by hashing ENTRY contents, a
548    slot number for that entry which should be in the range 0..TABLE_SIZE-1.
549    This slot number is then returned.
550
551    The user-supplied COMPARATOR function, when not NULL, accepts two
552    arguments pointing to user data, it then returns true for a pair of entries
553    that compare equal, or false otherwise.  This function is internally called
554    on entries which are already known to hash to the same bucket index,
555    but which are distinct pointers.
556
557    The user-supplied DATA_FREER function, when not NULL, may be later called
558    with the user data as an argument, just before the entry containing the
559    data gets freed.  This happens from within `hash_free' or `hash_clear'.
560    You should specify this function only if you want these functions to free
561    all of your `data' data.  This is typically the case when your data is
562    simply an auxiliary struct that you have malloc'd to aggregate several
563    values.  */
564
565 Hash_table *
566 hash_initialize (size_t candidate, const Hash_tuning *tuning,
567                  Hash_hasher hasher, Hash_comparator comparator,
568                  Hash_data_freer data_freer)
569 {
570   Hash_table *table;
571
572   if (hasher == NULL)
573     hasher = raw_hasher;
574   if (comparator == NULL)
575     comparator = raw_comparator;
576
577   table = malloc (sizeof *table);
578   if (table == NULL)
579     return NULL;
580
581   if (!tuning)
582     tuning = &default_tuning;
583   table->tuning = tuning;
584   if (!check_tuning (table))
585     {
586       /* Fail if the tuning options are invalid.  This is the only occasion
587          when the user gets some feedback about it.  Once the table is created,
588          if the user provides invalid tuning options, we silently revert to
589          using the defaults, and ignore further request to change the tuning
590          options.  */
591       goto fail;
592     }
593
594   if (!tuning->is_n_buckets)
595     {
596       float new_candidate = candidate / tuning->growth_threshold;
597       if (SIZE_MAX <= new_candidate)
598         goto fail;
599       candidate = new_candidate;
600     }
601
602   if (xalloc_oversized (candidate, sizeof *table->bucket))
603     goto fail;
604   table->n_buckets = next_prime (candidate);
605   if (xalloc_oversized (table->n_buckets, sizeof *table->bucket))
606     goto fail;
607
608   table->bucket = calloc (table->n_buckets, sizeof *table->bucket);
609   if (table->bucket == NULL)
610     goto fail;
611   table->bucket_limit = table->bucket + table->n_buckets;
612   table->n_buckets_used = 0;
613   table->n_entries = 0;
614
615   table->hasher = hasher;
616   table->comparator = comparator;
617   table->data_freer = data_freer;
618
619   table->free_entry_list = NULL;
620 #if USE_OBSTACK
621   obstack_init (&table->entry_stack);
622 #endif
623   return table;
624
625  fail:
626   free (table);
627   return NULL;
628 }
629
630 /* Make all buckets empty, placing any chained entries on the free list.
631    Apply the user-specified function data_freer (if any) to the datas of any
632    affected entries.  */
633
634 void
635 hash_clear (Hash_table *table)
636 {
637   struct hash_entry *bucket;
638
639   for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
640     {
641       if (bucket->data)
642         {
643           struct hash_entry *cursor;
644           struct hash_entry *next;
645
646           /* Free the bucket overflow.  */
647           for (cursor = bucket->next; cursor; cursor = next)
648             {
649               if (table->data_freer)
650                 table->data_freer (cursor->data);
651               cursor->data = NULL;
652
653               next = cursor->next;
654               /* Relinking is done one entry at a time, as it is to be expected
655                  that overflows are either rare or short.  */
656               cursor->next = table->free_entry_list;
657               table->free_entry_list = cursor;
658             }
659
660           /* Free the bucket head.  */
661           if (table->data_freer)
662             table->data_freer (bucket->data);
663           bucket->data = NULL;
664           bucket->next = NULL;
665         }
666     }
667
668   table->n_buckets_used = 0;
669   table->n_entries = 0;
670 }
671
672 /* Reclaim all storage associated with a hash table.  If a data_freer
673    function has been supplied by the user when the hash table was created,
674    this function applies it to the data of each entry before freeing that
675    entry.  */
676
677 void
678 hash_free (Hash_table *table)
679 {
680   struct hash_entry *bucket;
681   struct hash_entry *cursor;
682   struct hash_entry *next;
683
684   /* Call the user data_freer function.  */
685   if (table->data_freer && table->n_entries)
686     {
687       for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
688         {
689           if (bucket->data)
690             {
691               for (cursor = bucket; cursor; cursor = cursor->next)
692                 table->data_freer (cursor->data);
693             }
694         }
695     }
696
697 #if USE_OBSTACK
698
699   obstack_free (&table->entry_stack, NULL);
700
701 #else
702
703   /* Free all bucket overflowed entries.  */
704   for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
705     {
706       for (cursor = bucket->next; cursor; cursor = next)
707         {
708           next = cursor->next;
709           free (cursor);
710         }
711     }
712
713   /* Also reclaim the internal list of previously freed entries.  */
714   for (cursor = table->free_entry_list; cursor; cursor = next)
715     {
716       next = cursor->next;
717       free (cursor);
718     }
719
720 #endif
721
722   /* Free the remainder of the hash table structure.  */
723   free (table->bucket);
724   free (table);
725 }
726
727 /* Insertion and deletion.  */
728
729 /* Get a new hash entry for a bucket overflow, possibly by recycling a
730    previously freed one.  If this is not possible, allocate a new one.  */
731
732 static struct hash_entry *
733 allocate_entry (Hash_table *table)
734 {
735   struct hash_entry *new;
736
737   if (table->free_entry_list)
738     {
739       new = table->free_entry_list;
740       table->free_entry_list = new->next;
741     }
742   else
743     {
744 #if USE_OBSTACK
745       new = obstack_alloc (&table->entry_stack, sizeof *new);
746 #else
747       new = malloc (sizeof *new);
748 #endif
749     }
750
751   return new;
752 }
753
754 /* Free a hash entry which was part of some bucket overflow,
755    saving it for later recycling.  */
756
757 static void
758 free_entry (Hash_table *table, struct hash_entry *entry)
759 {
760   entry->data = NULL;
761   entry->next = table->free_entry_list;
762   table->free_entry_list = entry;
763 }
764
765 /* This private function is used to help with insertion and deletion.  When
766    ENTRY matches an entry in the table, return a pointer to the corresponding
767    user data and set *BUCKET_HEAD to the head of the selected bucket.
768    Otherwise, return NULL.  When DELETE is true and ENTRY matches an entry in
769    the table, unlink the matching entry.  */
770
771 static void *
772 hash_find_entry (Hash_table *table, const void *entry,
773                  struct hash_entry **bucket_head, bool delete)
774 {
775   struct hash_entry *bucket
776     = table->bucket + table->hasher (entry, table->n_buckets);
777   struct hash_entry *cursor;
778
779   if (! (bucket < table->bucket_limit))
780     abort ();
781
782   *bucket_head = bucket;
783
784   /* Test for empty bucket.  */
785   if (bucket->data == NULL)
786     return NULL;
787
788   /* See if the entry is the first in the bucket.  */
789   if (entry == bucket->data || table->comparator (entry, bucket->data))
790     {
791       void *data = bucket->data;
792
793       if (delete)
794         {
795           if (bucket->next)
796             {
797               struct hash_entry *next = bucket->next;
798
799               /* Bump the first overflow entry into the bucket head, then save
800                  the previous first overflow entry for later recycling.  */
801               *bucket = *next;
802               free_entry (table, next);
803             }
804           else
805             {
806               bucket->data = NULL;
807             }
808         }
809
810       return data;
811     }
812
813   /* Scan the bucket overflow.  */
814   for (cursor = bucket; cursor->next; cursor = cursor->next)
815     {
816       if (entry == cursor->next->data
817           || table->comparator (entry, cursor->next->data))
818         {
819           void *data = cursor->next->data;
820
821           if (delete)
822             {
823               struct hash_entry *next = cursor->next;
824
825               /* Unlink the entry to delete, then save the freed entry for later
826                  recycling.  */
827               cursor->next = next->next;
828               free_entry (table, next);
829             }
830
831           return data;
832         }
833     }
834
835   /* No entry found.  */
836   return NULL;
837 }
838
839 /* For an already existing hash table, change the number of buckets through
840    specifying CANDIDATE.  The contents of the hash table are preserved.  The
841    new number of buckets is automatically selected so as to _guarantee_ that
842    the table may receive at least CANDIDATE different user entries, including
843    those already in the table, before any other growth of the hash table size
844    occurs.  If TUNING->IS_N_BUCKETS is true, then CANDIDATE specifies the
845    exact number of buckets desired.  Return true iff the rehash succeeded.  */
846
847 bool
848 hash_rehash (Hash_table *table, size_t candidate)
849 {
850   Hash_table *new_table;
851   struct hash_entry *bucket;
852   struct hash_entry *cursor;
853   struct hash_entry *next;
854
855   new_table = hash_initialize (candidate, table->tuning, table->hasher,
856                                table->comparator, table->data_freer);
857   if (new_table == NULL)
858     return false;
859   if (new_table->n_buckets == table->n_buckets)
860     {
861       free (new_table->bucket);
862       free (new_table);
863       return true;
864     }
865
866   /* Merely reuse the extra old space into the new table.  */
867 #if USE_OBSTACK
868   obstack_free (&new_table->entry_stack, NULL);
869   new_table->entry_stack = table->entry_stack;
870 #endif
871   new_table->free_entry_list = table->free_entry_list;
872
873   for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
874     if (bucket->data)
875       for (cursor = bucket; cursor; cursor = next)
876         {
877           void *data = cursor->data;
878           struct hash_entry *new_bucket
879             = (new_table->bucket
880                + new_table->hasher (data, new_table->n_buckets));
881
882           if (! (new_bucket < new_table->bucket_limit))
883             abort ();
884
885           next = cursor->next;
886
887           if (new_bucket->data)
888             {
889               if (cursor == bucket)
890                 {
891                   /* Allocate or recycle an entry, when moving from a bucket
892                      header into a bucket overflow.  */
893                   struct hash_entry *new_entry = allocate_entry (new_table);
894
895                   if (new_entry == NULL)
896                     return false;
897
898                   new_entry->data = data;
899                   new_entry->next = new_bucket->next;
900                   new_bucket->next = new_entry;
901                 }
902               else
903                 {
904                   /* Merely relink an existing entry, when moving from a
905                      bucket overflow into a bucket overflow.  */
906                   cursor->next = new_bucket->next;
907                   new_bucket->next = cursor;
908                 }
909             }
910           else
911             {
912               /* Free an existing entry, when moving from a bucket
913                  overflow into a bucket header.  Also take care of the
914                  simple case of moving from a bucket header into a bucket
915                  header.  */
916               new_bucket->data = data;
917               new_table->n_buckets_used++;
918               if (cursor != bucket)
919                 free_entry (new_table, cursor);
920             }
921         }
922
923   free (table->bucket);
924   table->bucket = new_table->bucket;
925   table->bucket_limit = new_table->bucket_limit;
926   table->n_buckets = new_table->n_buckets;
927   table->n_buckets_used = new_table->n_buckets_used;
928   table->free_entry_list = new_table->free_entry_list;
929   /* table->n_entries already holds its value.  */
930 #if USE_OBSTACK
931   table->entry_stack = new_table->entry_stack;
932 #endif
933   free (new_table);
934
935   return true;
936 }
937
938 /* If ENTRY matches an entry already in the hash table, return the pointer
939    to the entry from the table.  Otherwise, insert ENTRY and return ENTRY.
940    Return NULL if the storage required for insertion cannot be allocated.
941    This implementation does not support duplicate entries or insertion of
942    NULL.  */
943
944 void *
945 hash_insert (Hash_table *table, const void *entry)
946 {
947   void *data;
948   struct hash_entry *bucket;
949
950   /* The caller cannot insert a NULL entry.  */
951   if (! entry)
952     abort ();
953
954   /* If there's a matching entry already in the table, return that.  */
955   if ((data = hash_find_entry (table, entry, &bucket, false)) != NULL)
956     return data;
957
958   /* If the growth threshold of the buckets in use has been reached, increase
959      the table size and rehash.  There's no point in checking the number of
960      entries:  if the hashing function is ill-conditioned, rehashing is not
961      likely to improve it.  */
962
963   if (table->n_buckets_used
964       > table->tuning->growth_threshold * table->n_buckets)
965     {
966       /* Check more fully, before starting real work.  If tuning arguments
967          became invalid, the second check will rely on proper defaults.  */
968       check_tuning (table);
969       if (table->n_buckets_used
970           > table->tuning->growth_threshold * table->n_buckets)
971         {
972           const Hash_tuning *tuning = table->tuning;
973           float candidate =
974             (tuning->is_n_buckets
975              ? (table->n_buckets * tuning->growth_factor)
976              : (table->n_buckets * tuning->growth_factor
977                 * tuning->growth_threshold));
978
979           if (SIZE_MAX <= candidate)
980             return NULL;
981
982           /* If the rehash fails, arrange to return NULL.  */
983           if (!hash_rehash (table, candidate))
984             return NULL;
985
986           /* Update the bucket we are interested in.  */
987           if (hash_find_entry (table, entry, &bucket, false) != NULL)
988             abort ();
989         }
990     }
991
992   /* ENTRY is not matched, it should be inserted.  */
993
994   if (bucket->data)
995     {
996       struct hash_entry *new_entry = allocate_entry (table);
997
998       if (new_entry == NULL)
999         return NULL;
1000
1001       /* Add ENTRY in the overflow of the bucket.  */
1002
1003       new_entry->data = (void *) entry;
1004       new_entry->next = bucket->next;
1005       bucket->next = new_entry;
1006       table->n_entries++;
1007       return (void *) entry;
1008     }
1009
1010   /* Add ENTRY right in the bucket head.  */
1011
1012   bucket->data = (void *) entry;
1013   table->n_entries++;
1014   table->n_buckets_used++;
1015
1016   return (void *) entry;
1017 }
1018
1019 /* If ENTRY is already in the table, remove it and return the just-deleted
1020    data (the user may want to deallocate its storage).  If ENTRY is not in the
1021    table, don't modify the table and return NULL.  */
1022
1023 void *
1024 hash_delete (Hash_table *table, const void *entry)
1025 {
1026   void *data;
1027   struct hash_entry *bucket;
1028
1029   data = hash_find_entry (table, entry, &bucket, true);
1030   if (!data)
1031     return NULL;
1032
1033   table->n_entries--;
1034   if (!bucket->data)
1035     {
1036       table->n_buckets_used--;
1037
1038       /* If the shrink threshold of the buckets in use has been reached,
1039          rehash into a smaller table.  */
1040
1041       if (table->n_buckets_used
1042           < table->tuning->shrink_threshold * table->n_buckets)
1043         {
1044           /* Check more fully, before starting real work.  If tuning arguments
1045              became invalid, the second check will rely on proper defaults.  */
1046           check_tuning (table);
1047           if (table->n_buckets_used
1048               < table->tuning->shrink_threshold * table->n_buckets)
1049             {
1050               const Hash_tuning *tuning = table->tuning;
1051               size_t candidate =
1052                 (tuning->is_n_buckets
1053                  ? table->n_buckets * tuning->shrink_factor
1054                  : (table->n_buckets * tuning->shrink_factor
1055                     * tuning->growth_threshold));
1056
1057               hash_rehash (table, candidate);
1058             }
1059         }
1060     }
1061
1062   return data;
1063 }
1064
1065 /* Testing.  */
1066
1067 #if TESTING
1068
1069 void
1070 hash_print (const Hash_table *table)
1071 {
1072   struct hash_entry const *bucket;
1073
1074   for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
1075     {
1076       struct hash_entry *cursor;
1077
1078       if (bucket)
1079         printf ("%lu:\n", (unsigned long int) (bucket - table->bucket));
1080
1081       for (cursor = bucket; cursor; cursor = cursor->next)
1082         {
1083           char const *s = cursor->data;
1084           /* FIXME */
1085           if (s)
1086             printf ("  %s\n", s);
1087         }
1088     }
1089 }
1090
1091 #endif /* TESTING */