Annotation of researchv10no/cmd/odist/pax/include/hash.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * G. S. Fowler
        !             3:  * AT&T Bell Laboratories
        !             4:  *
        !             5:  * hash table library interface definitions
        !             6:  */
        !             7: 
        !             8: #ifndef HASH_ALLOCATE
        !             9: 
        !            10: #define hash_info              _hash_info_
        !            11: #define vhashalloc             hashvalloc
        !            12: 
        !            13: #ifndef VOID
        !            14: #define VOID   char
        !            15: #endif
        !            16: 
        !            17: #define HASH_ALLOCATE  (1<<0)          /* allocate new key names       */
        !            18: #define HASH_FIXED     (1<<1)          /* fixed bucket/table size      */
        !            19: #define HASH_HASHED    (1<<6)          /* key names already hashed     */
        !            20: #define HASH_RESIZE    (1<<2)          /* table has been resized       */
        !            21: #define HASH_SCANNING  (1<<3)          /* currently scanning scope     */
        !            22: #define HASH_SCOPE     (1<<4)          /* push scope / create in bot   */
        !            23: #define HASH_STATIC    (1<<5)          /* static table allocation      */
        !            24: 
        !            25: #define HASH_CREATE    (1<<8)          /* create bucket if not found   */
        !            26: #define HASH_DELETE    (1<<9)          /* delete bucket if found       */
        !            27: #define HASH_LOOKUP    0               /* default op                   */
        !            28: 
        !            29: #define HASH_BUCKET    (1<<11)         /* name is installed bucket     */
        !            30: #define HASH_INSTALL   (1<<12)         /* install allocated bucket     */
        !            31: #define HASH_NOSCOPE   (1<<13)         /* top scope only               */
        !            32: #define HASH_OPAQUE    (1<<14)         /* opaque bucket                */
        !            33: #define HASH_VALUE     (1<<15)         /* value bucket field used      */
        !            34: 
        !            35: #define HASH_GET       (HASH_LOOKUP|HASH_VALUE)
        !            36: #define HASH_NEW       (HASH_CREATE|HASH_FIXED)
        !            37: #define HASH_PUT       (HASH_CREATE|HASH_VALUE)
        !            38: 
        !            39: #define HASH_DELETED   (1<<(8*sizeof(int)-1))  /* deleted placeholder  */
        !            40: #define HASH_KEEP      (1<<(8*sizeof(int)-2))  /* no free on bucket    */
        !            41: #define HASH_HIDDEN    (1<<(8*sizeof(int)-3))  /* hidden by scope      */
        !            42: #define HASH_HIDES     (1<<(8*sizeof(int)-4))  /* hides lower scope    */
        !            43: #define HASH_OPAQUED   (1<<(8*sizeof(int)-5))  /* opaqued placeholder  */
        !            44: 
        !            45: #define HASH_RESET     (HASH_RESIZE|HASH_SCOPE|HASH_STATIC)
        !            46: #define HASH_INTERNAL  (HASH_BUCKET|HASH_RESIZE|HASH_SCANNING|HASH_STATIC)
        !            47: #define HASH_FLAGS     (HASH_DELETED|HASH_HIDDEN|HASH_HIDES|HASH_KEEP|HASH_OPAQUED)
        !            48: 
        !            49: #define HASH_alloc             1
        !            50: #define HASH_clear             2
        !            51: #define HASH_compare           3
        !            52: #define HASH_free              4
        !            53: #define HASH_hash              5
        !            54: #define HASH_meanchain         6
        !            55: #define HASH_name              7
        !            56: #define HASH_namesize          8
        !            57: #define HASH_set               9
        !            58: #define HASH_size              10
        !            59: #define HASH_table             11
        !            60: 
        !            61: #include <hashpart.h>
        !            62: 
        !            63: #define hashclear(t,f)         ((t)->flags &= ~((f) & ~HASH_INTERNAL))
        !            64: #define hashdel(t,n)           hashlook(t, (char*)(n), HASH_DELETE, (char*)0)
        !            65: #define hashget(t,n)           hashlook(t, (char*)(n), HASH_LOOKUP|HASH_VALUE, (char*)0)
        !            66: #define hashlast(t)            (hash_info.last)
        !            67: #define hashname(b)            ((((b)->hash&HASH_HIDES)?((HASHBUCKET*)((b)->name)):(b))->name)
        !            68: #define hashput(t,n,v)         (char*)hashlook(t, (char*)(n), HASH_CREATE|HASH_VALUE, (char*)(v))
        !            69: #define hashscope(t)           ((t)->scope)
        !            70: #define hashset(t,f)           ((t)->flags |= ((f) & ~HASH_INTERNAL))
        !            71: 
        !            72: #define Hashbin_t              HASHBUCKET
        !            73: #define Hashhdr_t              HASHHEADER
        !            74: #define Hashpos_t              HASHPOSITION
        !            75: #define Hashtab_t              HASHTABLE
        !            76: 
        !            77: typedef struct hashbucket      HASHBUCKET;
        !            78: typedef struct hashheader      HASHHEADER;
        !            79: typedef struct hashposition    HASHPOSITION;
        !            80: typedef struct hashroot                HASHROOT;
        !            81: typedef struct hashtable       HASHTABLE;
        !            82: typedef unsigned int           (*HASHFUN)();
        !            83: typedef int                    (*HASHINT)();
        !            84: typedef char*                  (*HASHPTR)();
        !            85: 
        !            86: /*
        !            87:  * the #define's avoid union tags
        !            88:  */
        !            89: 
        !            90: #define HASH_HEADER                    /* common bucket header         */ \
        !            91:        HASHBUCKET*     next;           /* next in collision chain      */ \
        !            92:        unsigned int    hash;           /* hash flags and value         */ \
        !            93:        char*           name            /* key name                     */
        !            94: 
        !            95: #define HASH_DEFAULT                   /* HASH_VALUE bucket elements   */ \
        !            96:        char*           value           /* key value                    */
        !            97: 
        !            98: struct hashheader                      /* bucket header                */
        !            99: {
        !           100:        HASH_HEADER;
        !           101: };
        !           102: 
        !           103: struct hashbucket                      /* prototype bucket             */
        !           104: {
        !           105:        HASH_HEADER;
        !           106:        HASH_DEFAULT;
        !           107: };
        !           108: 
        !           109: struct hashposition                    /* hash scan bucket position    */
        !           110: {
        !           111:        HASHTABLE*      tab;            /* table pointer                */
        !           112:        HASHTABLE*      top;            /* top scope table pointer      */
        !           113:        int             flags;          /* scan flags                   */
        !           114:        HASHBUCKET*     bucket;         /* bucket                       */
        !           115:        HASHBUCKET**    slot;           /* table slot                   */
        !           116:        HASHBUCKET**    limit;          /* slot limit                   */
        !           117: };
        !           118: 
        !           119: struct hashroot                                /* root hash table information  */
        !           120: {
        !           121:        int             flags;          /* flags: see HASH_[A-Z]*       */
        !           122:        int             namesize;       /* fixed name size: 0 => string */
        !           123:        int             meanchain;      /* resize mean chain length     */
        !           124:        HASHFUN         hash;           /* name hash routine            */
        !           125:        HASHINT         compare;        /* name comparision routine     */
        !           126:        HASHPTR         alloc;          /* value allocation routine     */
        !           127:        HASHINT         free;           /* value free routine           */
        !           128:        int             accesses;       /* number of accesses           */
        !           129:        int             collisions;     /* number of collisions         */
        !           130:        HASHROOT*       next;           /* next in list of all roots    */
        !           131:        HASHTABLE*      references;     /* referencing table list       */
        !           132: };
        !           133: 
        !           134: struct hashtable                       /* hash table information       */
        !           135: {
        !           136:        HASHROOT*       root;           /* root hash table information  */
        !           137:        HASHTABLE*      scope;          /* scope covered table          */
        !           138:        short           flags;          /* flags: see HASH_[A-Z]*       */
        !           139:        short           frozen;         /* table freeze nesting         */
        !           140:        HASHBUCKET**    table;          /* hash slot table              */
        !           141:        int             size;           /* table size                   */
        !           142:        int             buckets;        /* active bucket count          */
        !           143:        char*           name;           /* table name                   */
        !           144:        HASHTABLE*      next;           /* root reference list link     */
        !           145: };
        !           146: 
        !           147: struct hashinfo                                /* library hash info            */
        !           148: {
        !           149:        HASHBUCKET*     last;           /* most recent lookup bucket    */
        !           150:        HASHTABLE*      table;          /* most recent lookup table     */
        !           151:        HASHROOT*       list;           /* root table list              */
        !           152: };
        !           153: 
        !           154: #if __cplusplus
        !           155: extern "C" {
        !           156: #endif
        !           157: 
        !           158: extern struct hashinfo hash_info;
        !           159: 
        !           160: #if __cplusplus
        !           161: }
        !           162: #endif
        !           163: 
        !           164: #if __STDC__ || __cplusplus || c_plusplus
        !           165: 
        !           166: #include <stdarg.h>
        !           167: #include <stdio.h>
        !           168: 
        !           169: #if __cplusplus
        !           170: extern "C" {
        !           171: #endif
        !           172: extern HASHTABLE*      hashalloc(HASHTABLE*, ...);
        !           173: extern HASHTABLE*      hashvalloc(HASHTABLE*, va_list);
        !           174: extern void            hashdone(HASHPOSITION*);
        !           175: extern void            hashdump(FILE*, HASHTABLE*, int);
        !           176: extern HASHTABLE*      hashfree(HASHTABLE*);
        !           177: extern char*           hashlook(HASHTABLE*, const char*, int, const char*);
        !           178: extern HASHBUCKET*     hashnext(HASHPOSITION*);
        !           179: extern void            hashscan(HASHTABLE*, int, HASHPOSITION*);
        !           180: extern void            hashsize(HASHTABLE*, int);
        !           181: extern int             hashwalk(HASHTABLE*, int, HASHINT);
        !           182: 
        !           183: extern unsigned int    memhash(const char*, int);
        !           184: extern unsigned long   memsum(const char*, int, unsigned long);
        !           185: extern unsigned int    strhash(const char*);
        !           186: extern unsigned long   strsum(const char*, unsigned long);
        !           187: #if __cplusplus
        !           188: }
        !           189: #endif
        !           190: #else
        !           191: extern HASHTABLE*      hashalloc();
        !           192: extern HASHTABLE*      hashvalloc();
        !           193: extern void                    hashdone();
        !           194: extern void            hashdump();
        !           195: extern HASHTABLE*      hashfree();
        !           196: extern char*           hashlook();
        !           197: extern HASHBUCKET*     hashnext();
        !           198: extern void            hashscan();
        !           199: extern void            hashsize();
        !           200: extern int             hashwalk();
        !           201: 
        !           202: extern unsigned int    memhash();
        !           203: extern unsigned long   memsum();
        !           204: extern unsigned int    strhash();
        !           205: extern unsigned long   strsum();
        !           206: #endif
        !           207: 
        !           208: #endif

unix.superglobalmegacorp.com

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