* config/tc-arm.c (arm_elf_change_section): Not static.
[binutils.git] / libiberty / hashtab.c
blob231fbc0dd7ad1a589d479188afe3a965cacb7c0e
1 /* An expandable hash tables datatype.
2 Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
3 Contributed by Vladimir Makarov (vmakarov@cygnus.com).
5 This file is part of the libiberty library.
6 Libiberty is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
11 Libiberty 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 GNU
14 Library General Public License for more details.
16 You should have received a copy of the GNU Library General Public
17 License along with libiberty; see the file COPYING.LIB. If
18 not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
21 /* This package implements basic hash table functionality. It is possible
22 to search for an entry, create an entry and destroy an entry.
24 Elements in the table are generic pointers.
26 The size of the table is not fixed; if the occupancy of the table
27 grows too high the hash table will be expanded.
29 The abstract data implementation is based on generalized Algorithm D
30 from Knuth's book "The art of computer programming". Hash table is
31 expanded by creation of new hash table and transferring elements from
32 the old table to the new table. */
34 #ifdef HAVE_CONFIG_H
35 #include "config.h"
36 #endif
38 #include <sys/types.h>
40 #ifdef HAVE_STDLIB_H
41 #include <stdlib.h>
42 #endif
44 #ifdef HAVE_STRING_H
45 #include <string.h>
46 #endif
48 #ifdef HAVE_MALLOC_H
49 #include <malloc.h>
50 #endif
52 #include <stdio.h>
54 #include "libiberty.h"
55 #include "hashtab.h"
57 /* This macro defines reserved value for empty table entry. */
59 #define EMPTY_ENTRY ((PTR) 0)
61 /* This macro defines reserved value for table entry which contained
62 a deleted element. */
64 #define DELETED_ENTRY ((PTR) 1)
66 static unsigned long higher_prime_number PARAMS ((unsigned long));
67 static hashval_t hash_pointer PARAMS ((const void *));
68 static int eq_pointer PARAMS ((const void *, const void *));
69 static int htab_expand PARAMS ((htab_t));
70 static PTR *find_empty_slot_for_expand PARAMS ((htab_t, hashval_t));
72 /* At some point, we could make these be NULL, and modify the
73 hash-table routines to handle NULL specially; that would avoid
74 function-call overhead for the common case of hashing pointers. */
75 htab_hash htab_hash_pointer = hash_pointer;
76 htab_eq htab_eq_pointer = eq_pointer;
78 /* The following function returns a nearest prime number which is
79 greater than N, and near a power of two. */
81 static unsigned long
82 higher_prime_number (n)
83 unsigned long n;
85 /* These are primes that are near, but slightly smaller than, a
86 power of two. */
87 static const unsigned long primes[] = {
88 (unsigned long) 7,
89 (unsigned long) 13,
90 (unsigned long) 31,
91 (unsigned long) 61,
92 (unsigned long) 127,
93 (unsigned long) 251,
94 (unsigned long) 509,
95 (unsigned long) 1021,
96 (unsigned long) 2039,
97 (unsigned long) 4093,
98 (unsigned long) 8191,
99 (unsigned long) 16381,
100 (unsigned long) 32749,
101 (unsigned long) 65521,
102 (unsigned long) 131071,
103 (unsigned long) 262139,
104 (unsigned long) 524287,
105 (unsigned long) 1048573,
106 (unsigned long) 2097143,
107 (unsigned long) 4194301,
108 (unsigned long) 8388593,
109 (unsigned long) 16777213,
110 (unsigned long) 33554393,
111 (unsigned long) 67108859,
112 (unsigned long) 134217689,
113 (unsigned long) 268435399,
114 (unsigned long) 536870909,
115 (unsigned long) 1073741789,
116 (unsigned long) 2147483647,
117 /* 4294967291L */
118 ((unsigned long) 2147483647) + ((unsigned long) 2147483644),
121 const unsigned long *low = &primes[0];
122 const unsigned long *high = &primes[sizeof(primes) / sizeof(primes[0])];
124 while (low != high)
126 const unsigned long *mid = low + (high - low) / 2;
127 if (n > *mid)
128 low = mid + 1;
129 else
130 high = mid;
133 /* If we've run out of primes, abort. */
134 if (n > *low)
136 fprintf (stderr, "Cannot find prime bigger than %lu\n", n);
137 abort ();
140 return *low;
143 /* Returns a hash code for P. */
145 static hashval_t
146 hash_pointer (p)
147 const PTR p;
149 return (hashval_t) ((long)p >> 3);
152 /* Returns non-zero if P1 and P2 are equal. */
154 static int
155 eq_pointer (p1, p2)
156 const PTR p1;
157 const PTR p2;
159 return p1 == p2;
162 /* This function creates table with length slightly longer than given
163 source length. Created hash table is initiated as empty (all the
164 hash table entries are EMPTY_ENTRY). The function returns the
165 created hash table, or NULL if memory allocation fails. */
167 htab_t
168 htab_create_alloc (size, hash_f, eq_f, del_f, alloc_f, free_f)
169 size_t size;
170 htab_hash hash_f;
171 htab_eq eq_f;
172 htab_del del_f;
173 htab_alloc alloc_f;
174 htab_free free_f;
176 htab_t result;
178 size = higher_prime_number (size);
179 result = (htab_t) (*alloc_f) (1, sizeof (struct htab));
180 if (result == NULL)
181 return NULL;
182 result->entries = (PTR *) (*alloc_f) (size, sizeof (PTR));
183 if (result->entries == NULL)
185 if (free_f != NULL)
186 (*free_f) (result);
187 return NULL;
189 result->size = size;
190 result->hash_f = hash_f;
191 result->eq_f = eq_f;
192 result->del_f = del_f;
193 result->alloc_f = alloc_f;
194 result->free_f = free_f;
195 return result;
198 /* As above, but use the variants of alloc_f and free_f which accept
199 an extra argument. */
201 htab_t
202 htab_create_alloc_ex (size, hash_f, eq_f, del_f, alloc_arg, alloc_f,
203 free_f)
204 size_t size;
205 htab_hash hash_f;
206 htab_eq eq_f;
207 htab_del del_f;
208 PTR alloc_arg;
209 htab_alloc_with_arg alloc_f;
210 htab_free_with_arg free_f;
212 htab_t result;
214 size = higher_prime_number (size);
215 result = (htab_t) (*alloc_f) (alloc_arg, 1, sizeof (struct htab));
216 if (result == NULL)
217 return NULL;
218 result->entries = (PTR *) (*alloc_f) (alloc_arg, size, sizeof (PTR));
219 if (result->entries == NULL)
221 if (free_f != NULL)
222 (*free_f) (alloc_arg, result);
223 return NULL;
225 result->size = size;
226 result->hash_f = hash_f;
227 result->eq_f = eq_f;
228 result->del_f = del_f;
229 result->alloc_arg = alloc_arg;
230 result->alloc_with_arg_f = alloc_f;
231 result->free_with_arg_f = free_f;
232 return result;
235 /* Update the function pointers and allocation parameter in the htab_t. */
237 void
238 htab_set_functions_ex (htab, hash_f, eq_f, del_f, alloc_arg, alloc_f, free_f)
239 htab_t htab;
240 htab_hash hash_f;
241 htab_eq eq_f;
242 htab_del del_f;
243 PTR alloc_arg;
244 htab_alloc_with_arg alloc_f;
245 htab_free_with_arg free_f;
247 htab->hash_f = hash_f;
248 htab->eq_f = eq_f;
249 htab->del_f = del_f;
250 htab->alloc_arg = alloc_arg;
251 htab->alloc_with_arg_f = alloc_f;
252 htab->free_with_arg_f = free_f;
255 /* These functions exist solely for backward compatibility. */
257 #undef htab_create
258 htab_t
259 htab_create (size, hash_f, eq_f, del_f)
260 size_t size;
261 htab_hash hash_f;
262 htab_eq eq_f;
263 htab_del del_f;
265 return htab_create_alloc (size, hash_f, eq_f, del_f, xcalloc, free);
268 htab_t
269 htab_try_create (size, hash_f, eq_f, del_f)
270 size_t size;
271 htab_hash hash_f;
272 htab_eq eq_f;
273 htab_del del_f;
275 return htab_create_alloc (size, hash_f, eq_f, del_f, calloc, free);
278 /* This function frees all memory allocated for given hash table.
279 Naturally the hash table must already exist. */
281 void
282 htab_delete (htab)
283 htab_t htab;
285 int i;
287 if (htab->del_f)
288 for (i = htab->size - 1; i >= 0; i--)
289 if (htab->entries[i] != EMPTY_ENTRY
290 && htab->entries[i] != DELETED_ENTRY)
291 (*htab->del_f) (htab->entries[i]);
293 if (htab->free_f != NULL)
295 (*htab->free_f) (htab->entries);
296 (*htab->free_f) (htab);
298 else if (htab->free_with_arg_f != NULL)
300 (*htab->free_with_arg_f) (htab->alloc_arg, htab->entries);
301 (*htab->free_with_arg_f) (htab->alloc_arg, htab);
305 /* This function clears all entries in the given hash table. */
307 void
308 htab_empty (htab)
309 htab_t htab;
311 int i;
313 if (htab->del_f)
314 for (i = htab->size - 1; i >= 0; i--)
315 if (htab->entries[i] != EMPTY_ENTRY
316 && htab->entries[i] != DELETED_ENTRY)
317 (*htab->del_f) (htab->entries[i]);
319 memset (htab->entries, 0, htab->size * sizeof (PTR));
322 /* Similar to htab_find_slot, but without several unwanted side effects:
323 - Does not call htab->eq_f when it finds an existing entry.
324 - Does not change the count of elements/searches/collisions in the
325 hash table.
326 This function also assumes there are no deleted entries in the table.
327 HASH is the hash value for the element to be inserted. */
329 static PTR *
330 find_empty_slot_for_expand (htab, hash)
331 htab_t htab;
332 hashval_t hash;
334 size_t size = htab->size;
335 unsigned int index = hash % size;
336 PTR *slot = htab->entries + index;
337 hashval_t hash2;
339 if (*slot == EMPTY_ENTRY)
340 return slot;
341 else if (*slot == DELETED_ENTRY)
342 abort ();
344 hash2 = 1 + hash % (size - 2);
345 for (;;)
347 index += hash2;
348 if (index >= size)
349 index -= size;
351 slot = htab->entries + index;
352 if (*slot == EMPTY_ENTRY)
353 return slot;
354 else if (*slot == DELETED_ENTRY)
355 abort ();
359 /* The following function changes size of memory allocated for the
360 entries and repeatedly inserts the table elements. The occupancy
361 of the table after the call will be about 50%. Naturally the hash
362 table must already exist. Remember also that the place of the
363 table entries is changed. If memory allocation failures are allowed,
364 this function will return zero, indicating that the table could not be
365 expanded. If all goes well, it will return a non-zero value. */
367 static int
368 htab_expand (htab)
369 htab_t htab;
371 PTR *oentries;
372 PTR *olimit;
373 PTR *p;
374 PTR *nentries;
375 size_t nsize;
377 oentries = htab->entries;
378 olimit = oentries + htab->size;
380 /* Resize only when table after removal of unused elements is either
381 too full or too empty. */
382 if ((htab->n_elements - htab->n_deleted) * 2 > htab->size
383 || ((htab->n_elements - htab->n_deleted) * 8 < htab->size
384 && htab->size > 32))
385 nsize = higher_prime_number ((htab->n_elements - htab->n_deleted) * 2);
386 else
387 nsize = htab->size;
389 if (htab->alloc_with_arg_f != NULL)
390 nentries = (PTR *) (*htab->alloc_with_arg_f) (htab->alloc_arg, nsize,
391 sizeof (PTR *));
392 else
393 nentries = (PTR *) (*htab->alloc_f) (nsize, sizeof (PTR *));
394 if (nentries == NULL)
395 return 0;
396 htab->entries = nentries;
397 htab->size = nsize;
399 htab->n_elements -= htab->n_deleted;
400 htab->n_deleted = 0;
402 p = oentries;
405 PTR x = *p;
407 if (x != EMPTY_ENTRY && x != DELETED_ENTRY)
409 PTR *q = find_empty_slot_for_expand (htab, (*htab->hash_f) (x));
411 *q = x;
414 p++;
416 while (p < olimit);
418 if (htab->free_f != NULL)
419 (*htab->free_f) (oentries);
420 else if (htab->free_with_arg_f != NULL)
421 (*htab->free_with_arg_f) (htab->alloc_arg, oentries);
422 return 1;
425 /* This function searches for a hash table entry equal to the given
426 element. It cannot be used to insert or delete an element. */
429 htab_find_with_hash (htab, element, hash)
430 htab_t htab;
431 const PTR element;
432 hashval_t hash;
434 unsigned int index;
435 hashval_t hash2;
436 size_t size;
437 PTR entry;
439 htab->searches++;
440 size = htab->size;
441 index = hash % size;
443 entry = htab->entries[index];
444 if (entry == EMPTY_ENTRY
445 || (entry != DELETED_ENTRY && (*htab->eq_f) (entry, element)))
446 return entry;
448 hash2 = 1 + hash % (size - 2);
450 for (;;)
452 htab->collisions++;
453 index += hash2;
454 if (index >= size)
455 index -= size;
457 entry = htab->entries[index];
458 if (entry == EMPTY_ENTRY
459 || (entry != DELETED_ENTRY && (*htab->eq_f) (entry, element)))
460 return entry;
464 /* Like htab_find_slot_with_hash, but compute the hash value from the
465 element. */
468 htab_find (htab, element)
469 htab_t htab;
470 const PTR element;
472 return htab_find_with_hash (htab, element, (*htab->hash_f) (element));
475 /* This function searches for a hash table slot containing an entry
476 equal to the given element. To delete an entry, call this with
477 INSERT = 0, then call htab_clear_slot on the slot returned (possibly
478 after doing some checks). To insert an entry, call this with
479 INSERT = 1, then write the value you want into the returned slot.
480 When inserting an entry, NULL may be returned if memory allocation
481 fails. */
483 PTR *
484 htab_find_slot_with_hash (htab, element, hash, insert)
485 htab_t htab;
486 const PTR element;
487 hashval_t hash;
488 enum insert_option insert;
490 PTR *first_deleted_slot;
491 unsigned int index;
492 hashval_t hash2;
493 size_t size;
494 PTR entry;
496 if (insert == INSERT && htab->size * 3 <= htab->n_elements * 4
497 && htab_expand (htab) == 0)
498 return NULL;
500 size = htab->size;
501 index = hash % size;
503 htab->searches++;
504 first_deleted_slot = NULL;
506 entry = htab->entries[index];
507 if (entry == EMPTY_ENTRY)
508 goto empty_entry;
509 else if (entry == DELETED_ENTRY)
510 first_deleted_slot = &htab->entries[index];
511 else if ((*htab->eq_f) (entry, element))
512 return &htab->entries[index];
514 hash2 = 1 + hash % (size - 2);
515 for (;;)
517 htab->collisions++;
518 index += hash2;
519 if (index >= size)
520 index -= size;
522 entry = htab->entries[index];
523 if (entry == EMPTY_ENTRY)
524 goto empty_entry;
525 else if (entry == DELETED_ENTRY)
527 if (!first_deleted_slot)
528 first_deleted_slot = &htab->entries[index];
530 else if ((*htab->eq_f) (entry, element))
531 return &htab->entries[index];
534 empty_entry:
535 if (insert == NO_INSERT)
536 return NULL;
538 if (first_deleted_slot)
540 htab->n_deleted--;
541 *first_deleted_slot = EMPTY_ENTRY;
542 return first_deleted_slot;
545 htab->n_elements++;
546 return &htab->entries[index];
549 /* Like htab_find_slot_with_hash, but compute the hash value from the
550 element. */
552 PTR *
553 htab_find_slot (htab, element, insert)
554 htab_t htab;
555 const PTR element;
556 enum insert_option insert;
558 return htab_find_slot_with_hash (htab, element, (*htab->hash_f) (element),
559 insert);
562 /* This function deletes an element with the given value from hash
563 table. If there is no matching element in the hash table, this
564 function does nothing. */
566 void
567 htab_remove_elt (htab, element)
568 htab_t htab;
569 PTR element;
571 PTR *slot;
573 slot = htab_find_slot (htab, element, NO_INSERT);
574 if (*slot == EMPTY_ENTRY)
575 return;
577 if (htab->del_f)
578 (*htab->del_f) (*slot);
580 *slot = DELETED_ENTRY;
581 htab->n_deleted++;
584 /* This function clears a specified slot in a hash table. It is
585 useful when you've already done the lookup and don't want to do it
586 again. */
588 void
589 htab_clear_slot (htab, slot)
590 htab_t htab;
591 PTR *slot;
593 if (slot < htab->entries || slot >= htab->entries + htab->size
594 || *slot == EMPTY_ENTRY || *slot == DELETED_ENTRY)
595 abort ();
597 if (htab->del_f)
598 (*htab->del_f) (*slot);
600 *slot = DELETED_ENTRY;
601 htab->n_deleted++;
604 /* This function scans over the entire hash table calling
605 CALLBACK for each live entry. If CALLBACK returns false,
606 the iteration stops. INFO is passed as CALLBACK's second
607 argument. */
609 void
610 htab_traverse_noresize (htab, callback, info)
611 htab_t htab;
612 htab_trav callback;
613 PTR info;
615 PTR *slot;
616 PTR *limit;
618 slot = htab->entries;
619 limit = slot + htab->size;
623 PTR x = *slot;
625 if (x != EMPTY_ENTRY && x != DELETED_ENTRY)
626 if (!(*callback) (slot, info))
627 break;
629 while (++slot < limit);
632 /* Like htab_traverse_noresize, but does resize the table when it is
633 too empty to improve effectivity of subsequent calls. */
635 void
636 htab_traverse (htab, callback, info)
637 htab_t htab;
638 htab_trav callback;
639 PTR info;
641 if ((htab->n_elements - htab->n_deleted) * 8 < htab->size)
642 htab_expand (htab);
644 htab_traverse_noresize (htab, callback, info);
647 /* Return the current size of given hash table. */
649 size_t
650 htab_size (htab)
651 htab_t htab;
653 return htab->size;
656 /* Return the current number of elements in given hash table. */
658 size_t
659 htab_elements (htab)
660 htab_t htab;
662 return htab->n_elements - htab->n_deleted;
665 /* Return the fraction of fixed collisions during all work with given
666 hash table. */
668 double
669 htab_collisions (htab)
670 htab_t htab;
672 if (htab->searches == 0)
673 return 0.0;
675 return (double) htab->collisions / (double) htab->searches;
678 /* Hash P as a null-terminated string.
680 Copied from gcc/hashtable.c. Zack had the following to say with respect
681 to applicability, though note that unlike hashtable.c, this hash table
682 implementation re-hashes rather than chain buckets.
684 http://gcc.gnu.org/ml/gcc-patches/2001-08/msg01021.html
685 From: Zack Weinberg <zackw@panix.com>
686 Date: Fri, 17 Aug 2001 02:15:56 -0400
688 I got it by extracting all the identifiers from all the source code
689 I had lying around in mid-1999, and testing many recurrences of
690 the form "H_n = H_{n-1} * K + c_n * L + M" where K, L, M were either
691 prime numbers or the appropriate identity. This was the best one.
692 I don't remember exactly what constituted "best", except I was
693 looking at bucket-length distributions mostly.
695 So it should be very good at hashing identifiers, but might not be
696 as good at arbitrary strings.
698 I'll add that it thoroughly trounces the hash functions recommended
699 for this use at http://burtleburtle.net/bob/hash/index.html, both
700 on speed and bucket distribution. I haven't tried it against the
701 function they just started using for Perl's hashes. */
703 hashval_t
704 htab_hash_string (p)
705 const PTR p;
707 const unsigned char *str = (const unsigned char *) p;
708 hashval_t r = 0;
709 unsigned char c;
711 while ((c = *str++) != 0)
712 r = r * 67 + c - 113;
714 return r;
717 /* DERIVED FROM:
718 --------------------------------------------------------------------
719 lookup2.c, by Bob Jenkins, December 1996, Public Domain.
720 hash(), hash2(), hash3, and mix() are externally useful functions.
721 Routines to test the hash are included if SELF_TEST is defined.
722 You can use this free for any purpose. It has no warranty.
723 --------------------------------------------------------------------
727 --------------------------------------------------------------------
728 mix -- mix 3 32-bit values reversibly.
729 For every delta with one or two bit set, and the deltas of all three
730 high bits or all three low bits, whether the original value of a,b,c
731 is almost all zero or is uniformly distributed,
732 * If mix() is run forward or backward, at least 32 bits in a,b,c
733 have at least 1/4 probability of changing.
734 * If mix() is run forward, every bit of c will change between 1/3 and
735 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.)
736 mix() was built out of 36 single-cycle latency instructions in a
737 structure that could supported 2x parallelism, like so:
738 a -= b;
739 a -= c; x = (c>>13);
740 b -= c; a ^= x;
741 b -= a; x = (a<<8);
742 c -= a; b ^= x;
743 c -= b; x = (b>>13);
745 Unfortunately, superscalar Pentiums and Sparcs can't take advantage
746 of that parallelism. They've also turned some of those single-cycle
747 latency instructions into multi-cycle latency instructions. Still,
748 this is the fastest good hash I could find. There were about 2^^68
749 to choose from. I only looked at a billion or so.
750 --------------------------------------------------------------------
752 /* same, but slower, works on systems that might have 8 byte hashval_t's */
753 #define mix(a,b,c) \
755 a -= b; a -= c; a ^= (c>>13); \
756 b -= c; b -= a; b ^= (a<< 8); \
757 c -= a; c -= b; c ^= ((b&0xffffffff)>>13); \
758 a -= b; a -= c; a ^= ((c&0xffffffff)>>12); \
759 b -= c; b -= a; b = (b ^ (a<<16)) & 0xffffffff; \
760 c -= a; c -= b; c = (c ^ (b>> 5)) & 0xffffffff; \
761 a -= b; a -= c; a = (a ^ (c>> 3)) & 0xffffffff; \
762 b -= c; b -= a; b = (b ^ (a<<10)) & 0xffffffff; \
763 c -= a; c -= b; c = (c ^ (b>>15)) & 0xffffffff; \
767 --------------------------------------------------------------------
768 hash() -- hash a variable-length key into a 32-bit value
769 k : the key (the unaligned variable-length array of bytes)
770 len : the length of the key, counting by bytes
771 level : can be any 4-byte value
772 Returns a 32-bit value. Every bit of the key affects every bit of
773 the return value. Every 1-bit and 2-bit delta achieves avalanche.
774 About 36+6len instructions.
776 The best hash table sizes are powers of 2. There is no need to do
777 mod a prime (mod is sooo slow!). If you need less than 32 bits,
778 use a bitmask. For example, if you need only 10 bits, do
779 h = (h & hashmask(10));
780 In which case, the hash table should have hashsize(10) elements.
782 If you are hashing n strings (ub1 **)k, do it like this:
783 for (i=0, h=0; i<n; ++i) h = hash( k[i], len[i], h);
785 By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
786 code any way you wish, private, educational, or commercial. It's free.
788 See http://burtleburtle.net/bob/hash/evahash.html
789 Use for hash table lookup, or anything where one collision in 2^32 is
790 acceptable. Do NOT use for cryptographic purposes.
791 --------------------------------------------------------------------
794 hashval_t iterative_hash (k_in, length, initval)
795 const PTR k_in; /* the key */
796 register size_t length; /* the length of the key */
797 register hashval_t initval; /* the previous hash, or an arbitrary value */
799 register const unsigned char *k = (const unsigned char *)k_in;
800 register hashval_t a,b,c,len;
802 /* Set up the internal state */
803 len = length;
804 a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */
805 c = initval; /* the previous hash value */
807 /*---------------------------------------- handle most of the key */
808 #ifndef WORDS_BIGENDIAN
809 /* On a little-endian machine, if the data is 4-byte aligned we can hash
810 by word for better speed. This gives nondeterministic results on
811 big-endian machines. */
812 if (sizeof (hashval_t) == 4 && (((size_t)k)&3) == 0)
813 while (len >= 12) /* aligned */
815 a += *(hashval_t *)(k+0);
816 b += *(hashval_t *)(k+4);
817 c += *(hashval_t *)(k+8);
818 mix(a,b,c);
819 k += 12; len -= 12;
821 else /* unaligned */
822 #endif
823 while (len >= 12)
825 a += (k[0] +((hashval_t)k[1]<<8) +((hashval_t)k[2]<<16) +((hashval_t)k[3]<<24));
826 b += (k[4] +((hashval_t)k[5]<<8) +((hashval_t)k[6]<<16) +((hashval_t)k[7]<<24));
827 c += (k[8] +((hashval_t)k[9]<<8) +((hashval_t)k[10]<<16)+((hashval_t)k[11]<<24));
828 mix(a,b,c);
829 k += 12; len -= 12;
832 /*------------------------------------- handle the last 11 bytes */
833 c += length;
834 switch(len) /* all the case statements fall through */
836 case 11: c+=((hashval_t)k[10]<<24);
837 case 10: c+=((hashval_t)k[9]<<16);
838 case 9 : c+=((hashval_t)k[8]<<8);
839 /* the first byte of c is reserved for the length */
840 case 8 : b+=((hashval_t)k[7]<<24);
841 case 7 : b+=((hashval_t)k[6]<<16);
842 case 6 : b+=((hashval_t)k[5]<<8);
843 case 5 : b+=k[4];
844 case 4 : a+=((hashval_t)k[3]<<24);
845 case 3 : a+=((hashval_t)k[2]<<16);
846 case 2 : a+=((hashval_t)k[1]<<8);
847 case 1 : a+=k[0];
848 /* case 0: nothing left to add */
850 mix(a,b,c);
851 /*-------------------------------------------- report the result */
852 return c;