Annotation of 43BSDReno/usr.bin/make/hash.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
                      3:  * Copyright (c) 1988, 1989 by Adam de Boor
                      4:  * Copyright (c) 1989 by Berkeley Softworks
                      5:  * All rights reserved.
                      6:  *
                      7:  * This code is derived from software contributed to Berkeley by
                      8:  * Adam de Boor.
                      9:  *
                     10:  * Redistribution and use in source and binary forms are permitted
                     11:  * provided that: (1) source distributions retain this entire copyright
                     12:  * notice and comment, and (2) distributions including binaries display
                     13:  * the following acknowledgement:  ``This product includes software
                     14:  * developed by the University of California, Berkeley and its contributors''
                     15:  * in the documentation or other materials provided with the distribution
                     16:  * and in all advertising materials mentioning features or use of this
                     17:  * software. Neither the name of the University nor the names of its
                     18:  * contributors may be used to endorse or promote products derived
                     19:  * from this software without specific prior written permission.
                     20:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     21:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     22:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     23:  *
                     24:  *     @(#)hash.h      5.3 (Berkeley) 6/1/90
                     25:  */
                     26: 
                     27: /* hash.h --
                     28:  *
                     29:  *     This file contains definitions used by the hash module,
                     30:  *     which maintains hash tables.
                     31:  */
                     32: 
                     33: #ifndef        _HASH
                     34: #define        _HASH
                     35: 
                     36: #include "list.h"
                     37: /* 
                     38:  * The following defines one entry in the hash table.
                     39:  */
                     40: 
                     41: typedef struct Hash_Entry {
                     42:     List_Links       links;            /* Used to link together all the
                     43:                                         * entries associated with the same
                     44:                                         * bucket. */
                     45:     ClientData       clientData;       /* Arbitrary piece of data associated
                     46:                                         * with key. */
                     47:     union {
                     48:        Address  ptr;                   /* One-word key value to identify
                     49:                                         * entry. */
                     50:        int words[1];                   /* N-word key value.  Note: the actual
                     51:                                         * size may be longer if necessary to
                     52:                                         * hold the entire key. */
                     53:        char     name[4];               /* Text name of this entry.  Note: the
                     54:                                         * actual size may be longer if
                     55:                                         * necessary to hold the whole string.
                     56:                                         * This MUST be the last entry in the
                     57:                                         * structure!!! */
                     58:     } key;
                     59: } Hash_Entry;
                     60: 
                     61: /* 
                     62:  * A hash table consists of an array of pointers to hash
                     63:  * lists.  Tables can be organized in either of three ways, depending
                     64:  * on the type of comparison keys:
                     65:  *
                     66:  *     Strings:          these are NULL-terminated; their address
                     67:  *                       is passed to HashFind as a (char *).
                     68:  *     Single-word keys: these may be anything, but must be passed
                     69:  *                       to Hash_Find as an Address.
                     70:  *     Multi-word keys:  these may also be anything; their address
                     71:  *                       is passed to HashFind as an Address.
                     72:  *
                     73:  *     Single-word keys are fastest, but most restrictive.
                     74:  */
                     75:  
                     76: #define HASH_STRING_KEYS       0
                     77: #define HASH_ONE_WORD_KEYS     1
                     78: 
                     79: typedef struct Hash_Table {
                     80:     List_Links         *bucketPtr;     /* Pointer to array of List_Links, one
                     81:                                 * for each bucket in the table. */
                     82:     int        size;           /* Actual size of array. */
                     83:     int        numEntries;     /* Number of entries in the table. */
                     84:     int        downShift;      /* Shift count, used in hashing function. */
                     85:     int        mask;           /* Used to select bits for hashing. */
                     86:     int        keyType;        /* Type of keys used in table:
                     87:                                 * HASH_STRING_KEYS, HASH_ONE-WORD_KEYS,
                     88:                                 * or >1 menas keyType gives number of words
                     89:                                 * in keys.
                     90:                                 */
                     91: } Hash_Table;
                     92: 
                     93: /* 
                     94:  * The following structure is used by the searching routines
                     95:  * to record where we are in the search.
                     96:  */
                     97: 
                     98: typedef struct Hash_Search {
                     99:     Hash_Table  *tablePtr;     /* Table being searched. */
                    100:     int        nextIndex;      /* Next bucket to check (after current). */
                    101:     Hash_Entry         *hashEntryPtr;  /* Next entry to check in current bucket. */
                    102:     List_Links *hashList;      /* Hash chain currently being checked. */
                    103: } Hash_Search;
                    104: 
                    105: /*
                    106:  * Macros.
                    107:  */
                    108: 
                    109: /*
                    110:  * ClientData Hash_GetValue(h) 
                    111:  *     Hash_Entry *h; 
                    112:  */
                    113: 
                    114: #define Hash_GetValue(h) ((h)->clientData)
                    115: 
                    116: /* 
                    117:  * Hash_SetValue(h, val); 
                    118:  *     HashEntry *h; 
                    119:  *     char *val; 
                    120:  */
                    121: 
                    122: #define Hash_SetValue(h, val) ((h)->clientData = (ClientData) (val))
                    123: 
                    124: /* 
                    125:  * Hash_Size(n) returns the number of words in an object of n bytes 
                    126:  */
                    127: 
                    128: #define        Hash_Size(n)    (((n) + sizeof (int) - 1) / sizeof (int))
                    129: 
                    130: /*
                    131:  * The following procedure declarations and macros
                    132:  * are the only things that should be needed outside
                    133:  * the implementation code.
                    134:  */
                    135: 
                    136: extern Hash_Entry *    Hash_CreateEntry();
                    137: extern void            Hash_DeleteTable();
                    138: extern void            Hash_DeleteEntry();
                    139: extern void            Hash_DeleteTable();
                    140: extern Hash_Entry *    Hash_EnumFirst();
                    141: extern Hash_Entry *    Hash_EnumNext();
                    142: extern Hash_Entry *    Hash_FindEntry();
                    143: extern void            Hash_InitTable();
                    144: extern void            Hash_PrintStats();
                    145: 
                    146: #endif _HASH

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.