1*045e0ed3SDavid van Moolenbroek /* $NetBSD: hash.h,v 1.3 2003/08/07 10:04:37 agc Exp $ */ 2*045e0ed3SDavid van Moolenbroek 3*045e0ed3SDavid van Moolenbroek /* 4*045e0ed3SDavid van Moolenbroek * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. 5*045e0ed3SDavid van Moolenbroek * All rights reserved. 6*045e0ed3SDavid van Moolenbroek * 7*045e0ed3SDavid van Moolenbroek * This code is derived from software contributed to Berkeley by 8*045e0ed3SDavid van Moolenbroek * Adam de Boor. 9*045e0ed3SDavid van Moolenbroek * 10*045e0ed3SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without 11*045e0ed3SDavid van Moolenbroek * modification, are permitted provided that the following conditions 12*045e0ed3SDavid van Moolenbroek * are met: 13*045e0ed3SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright 14*045e0ed3SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer. 15*045e0ed3SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright 16*045e0ed3SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the 17*045e0ed3SDavid van Moolenbroek * documentation and/or other materials provided with the distribution. 18*045e0ed3SDavid van Moolenbroek * 3. Neither the name of the University nor the names of its contributors 19*045e0ed3SDavid van Moolenbroek * may be used to endorse or promote products derived from this software 20*045e0ed3SDavid van Moolenbroek * without specific prior written permission. 21*045e0ed3SDavid van Moolenbroek * 22*045e0ed3SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23*045e0ed3SDavid van Moolenbroek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24*045e0ed3SDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25*045e0ed3SDavid van Moolenbroek * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26*045e0ed3SDavid van Moolenbroek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27*045e0ed3SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28*045e0ed3SDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29*045e0ed3SDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30*045e0ed3SDavid van Moolenbroek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31*045e0ed3SDavid van Moolenbroek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32*045e0ed3SDavid van Moolenbroek * SUCH DAMAGE. 33*045e0ed3SDavid van Moolenbroek * 34*045e0ed3SDavid van Moolenbroek * from: @(#)hash.h 8.1 (Berkeley) 6/6/93 35*045e0ed3SDavid van Moolenbroek */ 36*045e0ed3SDavid van Moolenbroek 37*045e0ed3SDavid van Moolenbroek /* 38*045e0ed3SDavid van Moolenbroek * Copyright (c) 1988, 1989 by Adam de Boor 39*045e0ed3SDavid van Moolenbroek * Copyright (c) 1989 by Berkeley Softworks 40*045e0ed3SDavid van Moolenbroek * All rights reserved. 41*045e0ed3SDavid van Moolenbroek * 42*045e0ed3SDavid van Moolenbroek * This code is derived from software contributed to Berkeley by 43*045e0ed3SDavid van Moolenbroek * Adam de Boor. 44*045e0ed3SDavid van Moolenbroek * 45*045e0ed3SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without 46*045e0ed3SDavid van Moolenbroek * modification, are permitted provided that the following conditions 47*045e0ed3SDavid van Moolenbroek * are met: 48*045e0ed3SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright 49*045e0ed3SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer. 50*045e0ed3SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright 51*045e0ed3SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the 52*045e0ed3SDavid van Moolenbroek * documentation and/or other materials provided with the distribution. 53*045e0ed3SDavid van Moolenbroek * 3. All advertising materials mentioning features or use of this software 54*045e0ed3SDavid van Moolenbroek * must display the following acknowledgement: 55*045e0ed3SDavid van Moolenbroek * This product includes software developed by the University of 56*045e0ed3SDavid van Moolenbroek * California, Berkeley and its contributors. 57*045e0ed3SDavid van Moolenbroek * 4. Neither the name of the University nor the names of its contributors 58*045e0ed3SDavid van Moolenbroek * may be used to endorse or promote products derived from this software 59*045e0ed3SDavid van Moolenbroek * without specific prior written permission. 60*045e0ed3SDavid van Moolenbroek * 61*045e0ed3SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 62*045e0ed3SDavid van Moolenbroek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 63*045e0ed3SDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 64*045e0ed3SDavid van Moolenbroek * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 65*045e0ed3SDavid van Moolenbroek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 66*045e0ed3SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 67*045e0ed3SDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 68*045e0ed3SDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 69*045e0ed3SDavid van Moolenbroek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 70*045e0ed3SDavid van Moolenbroek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 71*045e0ed3SDavid van Moolenbroek * SUCH DAMAGE. 72*045e0ed3SDavid van Moolenbroek * 73*045e0ed3SDavid van Moolenbroek * from: @(#)hash.h 8.1 (Berkeley) 6/6/93 74*045e0ed3SDavid van Moolenbroek */ 75*045e0ed3SDavid van Moolenbroek 76*045e0ed3SDavid van Moolenbroek /* hash.h -- 77*045e0ed3SDavid van Moolenbroek * 78*045e0ed3SDavid van Moolenbroek * This file contains definitions used by the hash module, 79*045e0ed3SDavid van Moolenbroek * which maintains hash tables. 80*045e0ed3SDavid van Moolenbroek */ 81*045e0ed3SDavid van Moolenbroek 82*045e0ed3SDavid van Moolenbroek #ifndef _HASH 83*045e0ed3SDavid van Moolenbroek #define _HASH 84*045e0ed3SDavid van Moolenbroek 85*045e0ed3SDavid van Moolenbroek /* 86*045e0ed3SDavid van Moolenbroek * The following defines one entry in the hash table. 87*045e0ed3SDavid van Moolenbroek */ 88*045e0ed3SDavid van Moolenbroek 89*045e0ed3SDavid van Moolenbroek typedef struct Hash_Entry { 90*045e0ed3SDavid van Moolenbroek struct Hash_Entry *next; /* Used to link together all the 91*045e0ed3SDavid van Moolenbroek * entries associated with the same 92*045e0ed3SDavid van Moolenbroek * bucket. */ 93*045e0ed3SDavid van Moolenbroek void *clientData; /* Arbitrary piece of data associated 94*045e0ed3SDavid van Moolenbroek * with key. */ 95*045e0ed3SDavid van Moolenbroek unsigned namehash; /* hash value of key */ 96*045e0ed3SDavid van Moolenbroek char name[1]; /* key string */ 97*045e0ed3SDavid van Moolenbroek } Hash_Entry; 98*045e0ed3SDavid van Moolenbroek 99*045e0ed3SDavid van Moolenbroek typedef struct Hash_Table { 100*045e0ed3SDavid van Moolenbroek struct Hash_Entry **bucketPtr; 101*045e0ed3SDavid van Moolenbroek /* Pointers to Hash_Entry, one 102*045e0ed3SDavid van Moolenbroek * for each bucket in the table. */ 103*045e0ed3SDavid van Moolenbroek int size; /* Actual size of array. */ 104*045e0ed3SDavid van Moolenbroek int numEntries; /* Number of entries in the table. */ 105*045e0ed3SDavid van Moolenbroek int mask; /* Used to select bits for hashing. */ 106*045e0ed3SDavid van Moolenbroek } Hash_Table; 107*045e0ed3SDavid van Moolenbroek 108*045e0ed3SDavid van Moolenbroek /* 109*045e0ed3SDavid van Moolenbroek * The following structure is used by the searching routines 110*045e0ed3SDavid van Moolenbroek * to record where we are in the search. 111*045e0ed3SDavid van Moolenbroek */ 112*045e0ed3SDavid van Moolenbroek 113*045e0ed3SDavid van Moolenbroek typedef struct Hash_Search { 114*045e0ed3SDavid van Moolenbroek Hash_Table *tablePtr; /* Table being searched. */ 115*045e0ed3SDavid van Moolenbroek int nextIndex; /* Next bucket to check (after 116*045e0ed3SDavid van Moolenbroek * current). */ 117*045e0ed3SDavid van Moolenbroek Hash_Entry *hashEntryPtr; /* Next entry to check in current 118*045e0ed3SDavid van Moolenbroek * bucket. */ 119*045e0ed3SDavid van Moolenbroek } Hash_Search; 120*045e0ed3SDavid van Moolenbroek 121*045e0ed3SDavid van Moolenbroek /* 122*045e0ed3SDavid van Moolenbroek * Macros. 123*045e0ed3SDavid van Moolenbroek */ 124*045e0ed3SDavid van Moolenbroek 125*045e0ed3SDavid van Moolenbroek /* 126*045e0ed3SDavid van Moolenbroek * void *Hash_GetValue(h) 127*045e0ed3SDavid van Moolenbroek * Hash_Entry *h; 128*045e0ed3SDavid van Moolenbroek */ 129*045e0ed3SDavid van Moolenbroek 130*045e0ed3SDavid van Moolenbroek #define Hash_GetValue(h) ((h)->clientData) 131*045e0ed3SDavid van Moolenbroek 132*045e0ed3SDavid van Moolenbroek /* 133*045e0ed3SDavid van Moolenbroek * Hash_SetValue(h, val); 134*045e0ed3SDavid van Moolenbroek * Hash_Entry *h; 135*045e0ed3SDavid van Moolenbroek * char *val; 136*045e0ed3SDavid van Moolenbroek */ 137*045e0ed3SDavid van Moolenbroek 138*045e0ed3SDavid van Moolenbroek #define Hash_SetValue(h, val) ((h)->clientData = (void *) (val)) 139*045e0ed3SDavid van Moolenbroek 140*045e0ed3SDavid van Moolenbroek /* 141*045e0ed3SDavid van Moolenbroek * Hash_GetKey(h); 142*045e0ed3SDavid van Moolenbroek * Hash_Entry *h; 143*045e0ed3SDavid van Moolenbroek */ 144*045e0ed3SDavid van Moolenbroek 145*045e0ed3SDavid van Moolenbroek #define Hash_GetKey(h) ((h)->name) 146*045e0ed3SDavid van Moolenbroek 147*045e0ed3SDavid van Moolenbroek /* 148*045e0ed3SDavid van Moolenbroek * Hash_Size(n) returns the number of words in an object of n bytes 149*045e0ed3SDavid van Moolenbroek */ 150*045e0ed3SDavid van Moolenbroek 151*045e0ed3SDavid van Moolenbroek #define Hash_Size(n) (((n) + sizeof (int) - 1) / sizeof (int)) 152*045e0ed3SDavid van Moolenbroek 153*045e0ed3SDavid van Moolenbroek void Hash_InitTable(Hash_Table *, int); 154*045e0ed3SDavid van Moolenbroek void Hash_DeleteTable(Hash_Table *); 155*045e0ed3SDavid van Moolenbroek Hash_Entry *Hash_FindEntry(Hash_Table *, char *); 156*045e0ed3SDavid van Moolenbroek Hash_Entry *Hash_CreateEntry(Hash_Table *, char *, int *); 157*045e0ed3SDavid van Moolenbroek void Hash_DeleteEntry(Hash_Table *, Hash_Entry *); 158*045e0ed3SDavid van Moolenbroek Hash_Entry *Hash_EnumFirst(Hash_Table *, Hash_Search *); 159*045e0ed3SDavid van Moolenbroek Hash_Entry *Hash_EnumNext(Hash_Search *); 160*045e0ed3SDavid van Moolenbroek 161*045e0ed3SDavid van Moolenbroek #endif /* _HASH */ 162