4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
30 #pragma ident "%Z%%M% %I% %E% SMI"
38 #define CHARWIDTH (LOCHWIDTH+HICHWIDTH)
39 #define LOCHMASK ((1<<LOCHWIDTH)-1)
42 * if HASHWIDTH + CHARWIDTH < bitsizeof(long)
43 * one could make LOCHWIDTH=6 and HICHWIDTH=0
44 * and simplify accordingly; the hanky-panky
45 * is to avoid overflow in long multiplication
49 static long hashsize
= HASHSIZE
;
50 static long pow2
[NC
*2];
52 static signed char hashtab
[] = {
53 -1, -1, -1, -1, -1, -1, 0, 31, /* &' */
54 -1, -1, -1, -1, 68, -1, 65, -1,
55 2, 25, 20, 35, 54, 61, 40, 39, /* 0-7 */
56 42, 33, 64, 67, -1, -1, -1, 66,
57 -1, 60, 43, 30, 5, 16, 47, 18, /* A-G */
58 41, 36, 51, 6, 13, 56, 55, 58,
59 49, 12, 59, 46, 21, 32, 63, 34,
60 57, 52, 3, -1, -1, -1, -1, -1,
61 -1, 22, 29, 8, 7, 10, 1, 28, /* a-g */
62 11, 62, 37, 48, 15, 50, 9, 4,
63 19, 38, 45, 24, 23, 26, 17, 44,
64 27, 14, 53, -1, -1, -1, -1, -1
74 for (lp
= pow2
; (c
= *s
++) != 0; ) {
76 h
+= (c
&LOCHMASK
) * *lp
++;
77 h
+= (c
>>LOCHWIDTH
) * *lp
++;
86 #if ((1L << (HASHWIDTH+LOCHWIDTH) == 0) || (1L << (HASHWIDTH+HICHWIDTH) == 0))
87 abort(); /* overflow is imminent */
91 pow2
[0] = 1L<<(HASHWIDTH
-CHARWIDTH
-2);
92 for (i
= 0; i
< 2*NC
-3; i
+= 2) {
93 pow2
[i
+1] = (pow2
[i
]<<LOCHWIDTH
) % hashsize
;
94 pow2
[i
+2] = (pow2
[i
+1]<<HICHWIDTH
) % hashsize
;