00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifdef HAVE_CONFIG_H
00040 #include "config.h"
00041 #endif
00042
00043 #include <sys/types.h>
00044
00045 #ifdef HAVE_STDLIB_H
00046 #include <stdlib.h>
00047 #endif
00048 #ifdef HAVE_STRING_H
00049 #include <string.h>
00050 #endif
00051 #ifdef HAVE_MALLOC_H
00052 #include <malloc.h>
00053 #endif
00054 #ifdef HAVE_LIMITS_H
00055 #include <limits.h>
00056 #endif
00057 #ifdef HAVE_STDINT_H
00058 #include <stdint.h>
00059 #endif
00060
00061 #include <stdio.h>
00062
00063 #include "libiberty.h"
00064 #include "ansidecl.h"
00065 #include "hashtab.h"
00066
00067 #ifndef CHAR_BIT
00068 #define CHAR_BIT 8
00069 #endif
00070
00071
00072
00073 #define EMPTY_ENTRY ((PTR) 0)
00074
00075
00076
00077
00078 #define DELETED_ENTRY ((PTR) 1)
00079
00080 static unsigned int higher_prime_index PARAMS ((unsigned long));
00081 static hashval_t htab_mod_1 PARAMS ((hashval_t, hashval_t, hashval_t, int));
00082 static hashval_t htab_mod PARAMS ((hashval_t, htab_t));
00083 static hashval_t htab_mod_m2 PARAMS ((hashval_t, htab_t));
00084 static hashval_t hash_pointer PARAMS ((const void *));
00085 static int eq_pointer PARAMS ((const void *, const void *));
00086 static int htab_expand PARAMS ((htab_t));
00087 static PTR *find_empty_slot_for_expand PARAMS ((htab_t, hashval_t));
00088
00089
00090
00091
00092 htab_hash htab_hash_pointer = hash_pointer;
00093 htab_eq htab_eq_pointer = eq_pointer;
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 #if 0
00105 unsigned int
00106 ceil_log2 (unsigned int x)
00107 {
00108 int i;
00109 for (i = 31; i >= 0 ; --i)
00110 if (x > (1u << i))
00111 return i+1;
00112 abort ();
00113 }
00114
00115 unsigned int
00116 choose_multiplier (unsigned int d, unsigned int *mlp, unsigned char *shiftp)
00117 {
00118 unsigned long long mhigh;
00119 double nx;
00120 int lgup, post_shift;
00121 int pow, pow2;
00122 int n = 32, precision = 32;
00123
00124 lgup = ceil_log2 (d);
00125 pow = n + lgup;
00126 pow2 = n + lgup - precision;
00127
00128 nx = ldexp (1.0, pow) + ldexp (1.0, pow2);
00129 mhigh = nx / d;
00130
00131 *shiftp = lgup - 1;
00132 *mlp = mhigh;
00133 return mhigh >> 32;
00134 }
00135 #endif
00136
00137 struct prime_ent
00138 {
00139 hashval_t prime;
00140 hashval_t inv;
00141 hashval_t inv_m2;
00142 hashval_t shift;
00143 };
00144
00145 static struct prime_ent const prime_tab[] = {
00146 { 7, 0x24924925, 0x9999999b, 2 },
00147 { 13, 0x3b13b13c, 0x745d1747, 3 },
00148 { 31, 0x08421085, 0x1a7b9612, 4 },
00149 { 61, 0x0c9714fc, 0x15b1e5f8, 5 },
00150 { 127, 0x02040811, 0x0624dd30, 6 },
00151 { 251, 0x05197f7e, 0x073260a5, 7 },
00152 { 509, 0x01824366, 0x02864fc8, 8 },
00153 { 1021, 0x00c0906d, 0x014191f7, 9 },
00154 { 2039, 0x0121456f, 0x0161e69e, 10 },
00155 { 4093, 0x00300902, 0x00501908, 11 },
00156 { 8191, 0x00080041, 0x00180241, 12 },
00157 { 16381, 0x000c0091, 0x00140191, 13 },
00158 { 32749, 0x002605a5, 0x002a06e6, 14 },
00159 { 65521, 0x000f00e2, 0x00110122, 15 },
00160 { 131071, 0x00008001, 0x00018003, 16 },
00161 { 262139, 0x00014002, 0x0001c004, 17 },
00162 { 524287, 0x00002001, 0x00006001, 18 },
00163 { 1048573, 0x00003001, 0x00005001, 19 },
00164 { 2097143, 0x00004801, 0x00005801, 20 },
00165 { 4194301, 0x00000c01, 0x00001401, 21 },
00166 { 8388593, 0x00001e01, 0x00002201, 22 },
00167 { 16777213, 0x00000301, 0x00000501, 23 },
00168 { 33554393, 0x00001381, 0x00001481, 24 },
00169 { 67108859, 0x00000141, 0x000001c1, 25 },
00170 { 134217689, 0x000004e1, 0x00000521, 26 },
00171 { 268435399, 0x00000391, 0x000003b1, 27 },
00172 { 536870909, 0x00000019, 0x00000029, 28 },
00173 { 1073741789, 0x0000008d, 0x00000095, 29 },
00174 { 2147483647, 0x00000003, 0x00000007, 30 },
00175
00176 { 0xfffffffb, 0x00000006, 0x00000008, 31 }
00177 };
00178
00179
00180
00181
00182 static unsigned int
00183 higher_prime_index (n)
00184 unsigned long n;
00185 {
00186 unsigned int low = 0;
00187 unsigned int high = sizeof(prime_tab) / sizeof(prime_tab[0]);
00188
00189 while (low != high)
00190 {
00191 unsigned int mid = low + (high - low) / 2;
00192 if (n > prime_tab[mid].prime)
00193 low = mid + 1;
00194 else
00195 high = mid;
00196 }
00197
00198
00199 if (n > prime_tab[low].prime)
00200 {
00201 fprintf (stderr, "Cannot find prime bigger than %lu\n", n);
00202 abort ();
00203 }
00204
00205 return low;
00206 }
00207
00208
00209
00210 static hashval_t
00211 hash_pointer (p)
00212 const PTR p;
00213 {
00214 return (hashval_t) ((long)p >> 3);
00215 }
00216
00217
00218
00219 static int
00220 eq_pointer (p1, p2)
00221 const PTR p1;
00222 const PTR p2;
00223 {
00224 return p1 == p2;
00225 }
00226
00227
00228
00229 inline size_t
00230 htab_size (htab)
00231 htab_t htab;
00232 {
00233 return htab->size;
00234 }
00235
00236
00237
00238 inline size_t
00239 htab_elements (htab)
00240 htab_t htab;
00241 {
00242 return htab->n_elements - htab->n_deleted;
00243 }
00244
00245
00246
00247 static inline hashval_t
00248 htab_mod_1 (x, y, inv, shift)
00249 hashval_t x, y, inv;
00250 int shift;
00251 {
00252
00253
00254 #ifdef UNSIGNED_64BIT_TYPE
00255 __extension__ typedef UNSIGNED_64BIT_TYPE ull;
00256 if (sizeof (hashval_t) * CHAR_BIT <= 32)
00257 {
00258 hashval_t t1, t2, t3, t4, q, r;
00259
00260 t1 = ((ull)x * inv) >> 32;
00261 t2 = x - t1;
00262 t3 = t2 >> 1;
00263 t4 = t1 + t3;
00264 q = t4 >> shift;
00265 r = x - (q * y);
00266
00267 return r;
00268 }
00269 #endif
00270
00271
00272 return x % y;
00273 }
00274
00275
00276
00277 static inline hashval_t
00278 htab_mod (hash, htab)
00279 hashval_t hash;
00280 htab_t htab;
00281 {
00282 const struct prime_ent *p = &prime_tab[htab->size_prime_index];
00283 return htab_mod_1 (hash, p->prime, p->inv, p->shift);
00284 }
00285
00286
00287
00288 static inline hashval_t
00289 htab_mod_m2 (hash, htab)
00290 hashval_t hash;
00291 htab_t htab;
00292 {
00293 const struct prime_ent *p = &prime_tab[htab->size_prime_index];
00294 return 1 + htab_mod_1 (hash, p->prime - 2, p->inv_m2, p->shift);
00295 }
00296
00297
00298
00299
00300
00301
00302 htab_t
00303 htab_create_alloc (size, hash_f, eq_f, del_f, alloc_f, free_f)
00304 size_t size;
00305 htab_hash hash_f;
00306 htab_eq eq_f;
00307 htab_del del_f;
00308 htab_alloc alloc_f;
00309 htab_free free_f;
00310 {
00311 htab_t result;
00312 unsigned int size_prime_index;
00313
00314 size_prime_index = higher_prime_index (size);
00315 size = prime_tab[size_prime_index].prime;
00316
00317 result = (htab_t) (*alloc_f) (1, sizeof (struct htab));
00318 if (result == NULL)
00319 return NULL;
00320 result->entries = (PTR *) (*alloc_f) (size, sizeof (PTR));
00321 if (result->entries == NULL)
00322 {
00323 if (free_f != NULL)
00324 (*free_f) (result);
00325 return NULL;
00326 }
00327 result->size = size;
00328 result->size_prime_index = size_prime_index;
00329 result->hash_f = hash_f;
00330 result->eq_f = eq_f;
00331 result->del_f = del_f;
00332 result->alloc_f = alloc_f;
00333 result->free_f = free_f;
00334 return result;
00335 }
00336
00337
00338
00339
00340 htab_t
00341 htab_create_alloc_ex (size, hash_f, eq_f, del_f, alloc_arg, alloc_f,
00342 free_f)
00343 size_t size;
00344 htab_hash hash_f;
00345 htab_eq eq_f;
00346 htab_del del_f;
00347 PTR alloc_arg;
00348 htab_alloc_with_arg alloc_f;
00349 htab_free_with_arg free_f;
00350 {
00351 htab_t result;
00352 unsigned int size_prime_index;
00353
00354 size_prime_index = higher_prime_index (size);
00355 size = prime_tab[size_prime_index].prime;
00356
00357 result = (htab_t) (*alloc_f) (alloc_arg, 1, sizeof (struct htab));
00358 if (result == NULL)
00359 return NULL;
00360 result->entries = (PTR *) (*alloc_f) (alloc_arg, size, sizeof (PTR));
00361 if (result->entries == NULL)
00362 {
00363 if (free_f != NULL)
00364 (*free_f) (alloc_arg, result);
00365 return NULL;
00366 }
00367 result->size = size;
00368 result->size_prime_index = size_prime_index;
00369 result->hash_f = hash_f;
00370 result->eq_f = eq_f;
00371 result->del_f = del_f;
00372 result->alloc_arg = alloc_arg;
00373 result->alloc_with_arg_f = alloc_f;
00374 result->free_with_arg_f = free_f;
00375 return result;
00376 }
00377
00378
00379
00380 void
00381 htab_set_functions_ex (htab, hash_f, eq_f, del_f, alloc_arg, alloc_f, free_f)
00382 htab_t htab;
00383 htab_hash hash_f;
00384 htab_eq eq_f;
00385 htab_del del_f;
00386 PTR alloc_arg;
00387 htab_alloc_with_arg alloc_f;
00388 htab_free_with_arg free_f;
00389 {
00390 htab->hash_f = hash_f;
00391 htab->eq_f = eq_f;
00392 htab->del_f = del_f;
00393 htab->alloc_arg = alloc_arg;
00394 htab->alloc_with_arg_f = alloc_f;
00395 htab->free_with_arg_f = free_f;
00396 }
00397
00398
00399
00400 #undef htab_create
00401 htab_t
00402 htab_create (size, hash_f, eq_f, del_f)
00403 size_t size;
00404 htab_hash hash_f;
00405 htab_eq eq_f;
00406 htab_del del_f;
00407 {
00408 return htab_create_alloc (size, hash_f, eq_f, del_f, xcalloc, free);
00409 }
00410
00411 htab_t
00412 htab_try_create (size, hash_f, eq_f, del_f)
00413 size_t size;
00414 htab_hash hash_f;
00415 htab_eq eq_f;
00416 htab_del del_f;
00417 {
00418 return htab_create_alloc (size, hash_f, eq_f, del_f, calloc, free);
00419 }
00420
00421
00422
00423
00424 void
00425 htab_delete (htab)
00426 htab_t htab;
00427 {
00428 size_t size = htab_size (htab);
00429 PTR *entries = htab->entries;
00430 int i;
00431
00432 if (htab->del_f)
00433 for (i = size - 1; i >= 0; i--)
00434 if (entries[i] != EMPTY_ENTRY && entries[i] != DELETED_ENTRY)
00435 (*htab->del_f) (entries[i]);
00436
00437 if (htab->free_f != NULL)
00438 {
00439 (*htab->free_f) (entries);
00440 (*htab->free_f) (htab);
00441 }
00442 else if (htab->free_with_arg_f != NULL)
00443 {
00444 (*htab->free_with_arg_f) (htab->alloc_arg, entries);
00445 (*htab->free_with_arg_f) (htab->alloc_arg, htab);
00446 }
00447 }
00448
00449
00450
00451 void
00452 htab_empty (htab)
00453 htab_t htab;
00454 {
00455 size_t size = htab_size (htab);
00456 PTR *entries = htab->entries;
00457 int i;
00458
00459 if (htab->del_f)
00460 for (i = size - 1; i >= 0; i--)
00461 if (entries[i] != EMPTY_ENTRY && entries[i] != DELETED_ENTRY)
00462 (*htab->del_f) (entries[i]);
00463
00464 memset (entries, 0, size * sizeof (PTR));
00465 }
00466
00467
00468
00469
00470
00471
00472
00473
00474 static PTR *
00475 find_empty_slot_for_expand (htab, hash)
00476 htab_t htab;
00477 hashval_t hash;
00478 {
00479 hashval_t index = htab_mod (hash, htab);
00480 size_t size = htab_size (htab);
00481 PTR *slot = htab->entries + index;
00482 hashval_t hash2;
00483
00484 if (*slot == EMPTY_ENTRY)
00485 return slot;
00486 else if (*slot == DELETED_ENTRY)
00487 abort ();
00488
00489 hash2 = htab_mod_m2 (hash, htab);
00490 for (;;)
00491 {
00492 index += hash2;
00493 if (index >= size)
00494 index -= size;
00495
00496 slot = htab->entries + index;
00497 if (*slot == EMPTY_ENTRY)
00498 return slot;
00499 else if (*slot == DELETED_ENTRY)
00500 abort ();
00501 }
00502 }
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512 static int
00513 htab_expand (htab)
00514 htab_t htab;
00515 {
00516 PTR *oentries;
00517 PTR *olimit;
00518 PTR *p;
00519 PTR *nentries;
00520 size_t nsize, osize, elts;
00521 unsigned int oindex, nindex;
00522
00523 oentries = htab->entries;
00524 oindex = htab->size_prime_index;
00525 osize = htab->size;
00526 olimit = oentries + osize;
00527 elts = htab_elements (htab);
00528
00529
00530
00531 if (elts * 2 > osize || (elts * 8 < osize && osize > 32))
00532 {
00533 nindex = higher_prime_index (elts * 2);
00534 nsize = prime_tab[nindex].prime;
00535 }
00536 else
00537 {
00538 nindex = oindex;
00539 nsize = osize;
00540 }
00541
00542 if (htab->alloc_with_arg_f != NULL)
00543 nentries = (PTR *) (*htab->alloc_with_arg_f) (htab->alloc_arg, nsize,
00544 sizeof (PTR *));
00545 else
00546 nentries = (PTR *) (*htab->alloc_f) (nsize, sizeof (PTR *));
00547 if (nentries == NULL)
00548 return 0;
00549 htab->entries = nentries;
00550 htab->size = nsize;
00551 htab->size_prime_index = nindex;
00552 htab->n_elements -= htab->n_deleted;
00553 htab->n_deleted = 0;
00554
00555 p = oentries;
00556 do
00557 {
00558 PTR x = *p;
00559
00560 if (x != EMPTY_ENTRY && x != DELETED_ENTRY)
00561 {
00562 PTR *q = find_empty_slot_for_expand (htab, (*htab->hash_f) (x));
00563
00564 *q = x;
00565 }
00566
00567 p++;
00568 }
00569 while (p < olimit);
00570
00571 if (htab->free_f != NULL)
00572 (*htab->free_f) (oentries);
00573 else if (htab->free_with_arg_f != NULL)
00574 (*htab->free_with_arg_f) (htab->alloc_arg, oentries);
00575 return 1;
00576 }
00577
00578
00579
00580
00581 PTR
00582 htab_find_with_hash (htab, element, hash)
00583 htab_t htab;
00584 const PTR element;
00585 hashval_t hash;
00586 {
00587 hashval_t index, hash2;
00588 size_t size;
00589 PTR entry;
00590
00591 htab->searches++;
00592 size = htab_size (htab);
00593 index = htab_mod (hash, htab);
00594
00595 entry = htab->entries[index];
00596 if (entry == EMPTY_ENTRY
00597 || (entry != DELETED_ENTRY && (*htab->eq_f) (entry, element)))
00598 return entry;
00599
00600 hash2 = htab_mod_m2 (hash, htab);
00601 for (;;)
00602 {
00603 htab->collisions++;
00604 index += hash2;
00605 if (index >= size)
00606 index -= size;
00607
00608 entry = htab->entries[index];
00609 if (entry == EMPTY_ENTRY
00610 || (entry != DELETED_ENTRY && (*htab->eq_f) (entry, element)))
00611 return entry;
00612 }
00613 }
00614
00615
00616
00617
00618 PTR
00619 htab_find (htab, element)
00620 htab_t htab;
00621 const PTR element;
00622 {
00623 return htab_find_with_hash (htab, element, (*htab->hash_f) (element));
00624 }
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634 PTR *
00635 htab_find_slot_with_hash (htab, element, hash, insert)
00636 htab_t htab;
00637 const PTR element;
00638 hashval_t hash;
00639 enum insert_option insert;
00640 {
00641 PTR *first_deleted_slot;
00642 hashval_t index, hash2;
00643 size_t size;
00644 PTR entry;
00645
00646 size = htab_size (htab);
00647 if (insert == INSERT && size * 3 <= htab->n_elements * 4)
00648 {
00649 if (htab_expand (htab) == 0)
00650 return NULL;
00651 size = htab_size (htab);
00652 }
00653
00654 index = htab_mod (hash, htab);
00655
00656 htab->searches++;
00657 first_deleted_slot = NULL;
00658
00659 entry = htab->entries[index];
00660 if (entry == EMPTY_ENTRY)
00661 goto empty_entry;
00662 else if (entry == DELETED_ENTRY)
00663 first_deleted_slot = &htab->entries[index];
00664 else if ((*htab->eq_f) (entry, element))
00665 return &htab->entries[index];
00666
00667 hash2 = htab_mod_m2 (hash, htab);
00668 for (;;)
00669 {
00670 htab->collisions++;
00671 index += hash2;
00672 if (index >= size)
00673 index -= size;
00674
00675 entry = htab->entries[index];
00676 if (entry == EMPTY_ENTRY)
00677 goto empty_entry;
00678 else if (entry == DELETED_ENTRY)
00679 {
00680 if (!first_deleted_slot)
00681 first_deleted_slot = &htab->entries[index];
00682 }
00683 else if ((*htab->eq_f) (entry, element))
00684 return &htab->entries[index];
00685 }
00686
00687 empty_entry:
00688 if (insert == NO_INSERT)
00689 return NULL;
00690
00691 if (first_deleted_slot)
00692 {
00693 htab->n_deleted--;
00694 *first_deleted_slot = EMPTY_ENTRY;
00695 return first_deleted_slot;
00696 }
00697
00698 htab->n_elements++;
00699 return &htab->entries[index];
00700 }
00701
00702
00703
00704
00705 PTR *
00706 htab_find_slot (htab, element, insert)
00707 htab_t htab;
00708 const PTR element;
00709 enum insert_option insert;
00710 {
00711 return htab_find_slot_with_hash (htab, element, (*htab->hash_f) (element),
00712 insert);
00713 }
00714
00715
00716
00717
00718
00719 void
00720 htab_remove_elt (htab, element)
00721 htab_t htab;
00722 PTR element;
00723 {
00724 htab_remove_elt_with_hash (htab, element, (*htab->hash_f) (element));
00725 }
00726
00727
00728
00729
00730
00731
00732 void
00733 htab_remove_elt_with_hash (htab, element, hash)
00734 htab_t htab;
00735 PTR element;
00736 hashval_t hash;
00737 {
00738 PTR *slot;
00739
00740 slot = htab_find_slot_with_hash (htab, element, hash, NO_INSERT);
00741 if (*slot == EMPTY_ENTRY)
00742 return;
00743
00744 if (htab->del_f)
00745 (*htab->del_f) (*slot);
00746
00747 *slot = DELETED_ENTRY;
00748 htab->n_deleted++;
00749 }
00750
00751
00752
00753
00754
00755 void
00756 htab_clear_slot (htab, slot)
00757 htab_t htab;
00758 PTR *slot;
00759 {
00760 if (slot < htab->entries || slot >= htab->entries + htab_size (htab)
00761 || *slot == EMPTY_ENTRY || *slot == DELETED_ENTRY)
00762 abort ();
00763
00764 if (htab->del_f)
00765 (*htab->del_f) (*slot);
00766
00767 *slot = DELETED_ENTRY;
00768 htab->n_deleted++;
00769 }
00770
00771
00772
00773
00774
00775
00776 void
00777 htab_traverse_noresize (htab, callback, info)
00778 htab_t htab;
00779 htab_trav callback;
00780 PTR info;
00781 {
00782 PTR *slot;
00783 PTR *limit;
00784
00785 slot = htab->entries;
00786 limit = slot + htab_size (htab);
00787
00788 do
00789 {
00790 PTR x = *slot;
00791
00792 if (x != EMPTY_ENTRY && x != DELETED_ENTRY)
00793 if (!(*callback) (slot, info))
00794 break;
00795 }
00796 while (++slot < limit);
00797 }
00798
00799
00800
00801
00802 void
00803 htab_traverse (htab, callback, info)
00804 htab_t htab;
00805 htab_trav callback;
00806 PTR info;
00807 {
00808 if (htab_elements (htab) * 8 < htab_size (htab))
00809 htab_expand (htab);
00810
00811 htab_traverse_noresize (htab, callback, info);
00812 }
00813
00814
00815
00816
00817 double
00818 htab_collisions (htab)
00819 htab_t htab;
00820 {
00821 if (htab->searches == 0)
00822 return 0.0;
00823
00824 return (double) htab->collisions / (double) htab->searches;
00825 }
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852 hashval_t
00853 htab_hash_string (p)
00854 const PTR p;
00855 {
00856 const unsigned char *str = (const unsigned char *) p;
00857 hashval_t r = 0;
00858 unsigned char c;
00859
00860 while ((c = *str++) != 0)
00861 r = r * 67 + c - 113;
00862
00863 return r;
00864 }
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902 #define mix(a,b,c) \
00903 { \
00904 a -= b; a -= c; a ^= (c>>13); \
00905 b -= c; b -= a; b ^= (a<< 8); \
00906 c -= a; c -= b; c ^= ((b&0xffffffff)>>13); \
00907 a -= b; a -= c; a ^= ((c&0xffffffff)>>12); \
00908 b -= c; b -= a; b = (b ^ (a<<16)) & 0xffffffff; \
00909 c -= a; c -= b; c = (c ^ (b>> 5)) & 0xffffffff; \
00910 a -= b; a -= c; a = (a ^ (c>> 3)) & 0xffffffff; \
00911 b -= c; b -= a; b = (b ^ (a<<10)) & 0xffffffff; \
00912 c -= a; c -= b; c = (c ^ (b>>15)) & 0xffffffff; \
00913 }
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943 hashval_t iterative_hash (k_in, length, initval)
00944 const PTR k_in;
00945 register size_t length;
00946 register hashval_t initval;
00947 {
00948 register const unsigned char *k = (const unsigned char *)k_in;
00949 register hashval_t a,b,c,len;
00950
00951
00952 len = length;
00953 a = b = 0x9e3779b9;
00954 c = initval;
00955
00956
00957 #ifndef WORDS_BIGENDIAN
00958
00959
00960
00961 if (sizeof (hashval_t) == 4 && (((size_t)k)&3) == 0)
00962 while (len >= 12)
00963 {
00964 a += *(hashval_t *)(k+0);
00965 b += *(hashval_t *)(k+4);
00966 c += *(hashval_t *)(k+8);
00967 mix(a,b,c);
00968 k += 12; len -= 12;
00969 }
00970 else
00971 #endif
00972 while (len >= 12)
00973 {
00974 a += (k[0] +((hashval_t)k[1]<<8) +((hashval_t)k[2]<<16) +((hashval_t)k[3]<<24));
00975 b += (k[4] +((hashval_t)k[5]<<8) +((hashval_t)k[6]<<16) +((hashval_t)k[7]<<24));
00976 c += (k[8] +((hashval_t)k[9]<<8) +((hashval_t)k[10]<<16)+((hashval_t)k[11]<<24));
00977 mix(a,b,c);
00978 k += 12; len -= 12;
00979 }
00980
00981
00982 c += length;
00983 switch(len)
00984 {
00985 case 11: c+=((hashval_t)k[10]<<24);
00986 case 10: c+=((hashval_t)k[9]<<16);
00987 case 9 : c+=((hashval_t)k[8]<<8);
00988
00989 case 8 : b+=((hashval_t)k[7]<<24);
00990 case 7 : b+=((hashval_t)k[6]<<16);
00991 case 6 : b+=((hashval_t)k[5]<<8);
00992 case 5 : b+=k[4];
00993 case 4 : a+=((hashval_t)k[3]<<24);
00994 case 3 : a+=((hashval_t)k[2]<<16);
00995 case 2 : a+=((hashval_t)k[1]<<8);
00996 case 1 : a+=k[0];
00997
00998 }
00999 mix(a,b,c);
01000
01001 return c;
01002 }