1 /* $NetBSD: hash.c,v 1.1.1.2 2014/04/24 12:45:28 pettai Exp $ */
4 * Copyright (c) 1997 Kungliga Tekniska Högskolan
5 * (Royal Institute of Technology, Stockholm, Sweden).
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the Institute nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 * Hash table functions
44 static Hashentry
*_search(Hashtab
* htab
, /* The hash table */
45 void *ptr
); /* And key */
49 int (*cmp
) (void *, void *),
50 unsigned (*hash
) (void *))
57 htab
= (Hashtab
*) malloc(sizeof(Hashtab
) + (sz
- 1) * sizeof(Hashentry
*));
61 for (i
= 0; i
< sz
; ++i
)
70 /* Intern search function */
73 _search(Hashtab
* htab
, void *ptr
)
79 for (hptr
= htab
->tab
[(*htab
->hash
) (ptr
) % htab
->sz
];
82 if ((*htab
->cmp
) (ptr
, hptr
->ptr
) == 0)
87 /* Search for element in hash table */
90 hashtabsearch(Hashtab
* htab
, void *ptr
)
94 tmp
= _search(htab
, ptr
);
95 return tmp
? tmp
->ptr
: tmp
;
98 /* add element to hash table */
99 /* if already there, set new value */
100 /* !NULL if succesful */
103 hashtabadd(Hashtab
* htab
, void *ptr
)
105 Hashentry
*h
= _search(htab
, ptr
);
111 free((void *) h
->ptr
);
113 h
= (Hashentry
*) malloc(sizeof(Hashentry
));
117 tabptr
= &htab
->tab
[(*htab
->hash
) (ptr
) % htab
->sz
];
122 h
->next
->prev
= &h
->next
;
128 /* delete element with key key. Iff freep, free Hashentry->ptr */
131 _hashtabdel(Hashtab
* htab
, void *ptr
, int freep
)
137 h
= _search(htab
, ptr
);
141 if ((*(h
->prev
) = h
->next
))
142 h
->next
->prev
= h
->prev
;
149 /* Do something for each element */
152 hashtabforeach(Hashtab
* htab
, int (*func
) (void *ptr
, void *arg
),
159 for (h
= htab
->tab
; h
< &htab
->tab
[htab
->sz
]; ++h
)
160 for (g
= *h
; g
; g
= g
->next
)
161 if ((*func
) (g
->ptr
, arg
))
165 /* standard hash-functions for strings */
168 hashadd(const char *s
)
169 { /* Standard hash function */
180 hashcaseadd(const char *s
)
181 { /* Standard hash function */
187 i
+= toupper((unsigned char)*s
);
191 #define TWELVE (sizeof(unsigned))
192 #define SEVENTYFIVE (6*sizeof(unsigned))
193 #define HIGH_BITS (~((unsigned)(~0) >> TWELVE))
196 hashjpw(const char *ss
)
197 { /* another hash function */
200 const unsigned char *s
= (const unsigned char *)ss
;
203 h
= (h
<< TWELVE
) + *s
;
204 if ((g
= h
& HIGH_BITS
))
205 h
= (h
^ (g
>> SEVENTYFIVE
)) & ~HIGH_BITS
;