Annotation of micropolis/src/tcl/tclhash.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * tclHash.h --
        !             3:  *
        !             4:  *     This header file declares the facilities provided by the
        !             5:  *     Tcl hash table procedures.
        !             6:  *
        !             7:  * Copyright 1991 Regents of the University of California
        !             8:  * Permission to use, copy, modify, and distribute this
        !             9:  * software and its documentation for any purpose and without
        !            10:  * fee is hereby granted, provided that the above copyright
        !            11:  * notice appear in all copies.  The University of California
        !            12:  * makes no representations about the suitability of this
        !            13:  * software for any purpose.  It is provided "as is" without
        !            14:  * express or implied warranty.
        !            15:  *
        !            16:  * $Header: /sprite/src/lib/tcl/RCS/tclHash.h,v 1.3 91/08/27 11:36:04 ouster Exp $ SPRITE (Berkeley)
        !            17:  */
        !            18: 
        !            19: #ifndef _TCLHASH
        !            20: #define _TCLHASH
        !            21: 
        !            22: #ifndef _TCL
        !            23: #include <tcl.h>
        !            24: #endif
        !            25: 
        !            26: /*
        !            27:  * Structure definition for an entry in a hash table.  No-one outside
        !            28:  * Tcl should access any of these fields directly;  use the macros
        !            29:  * defined below.
        !            30:  */
        !            31: 
        !            32: typedef struct Tcl_HashEntry {
        !            33:     struct Tcl_HashEntry *nextPtr;     /* Pointer to next entry in this
        !            34:                                         * hash bucket, or NULL for end of
        !            35:                                         * chain. */
        !            36:     struct Tcl_HashTable *tablePtr;    /* Pointer to table containing entry. */
        !            37:     struct Tcl_HashEntry **bucketPtr;  /* Pointer to bucket that points to
        !            38:                                         * first entry in this entry's chain:
        !            39:                                         * used for deleting the entry. */
        !            40:     ClientData clientData;             /* Application stores something here
        !            41:                                         * with Tcl_SetHashValue. */
        !            42:     union {                            /* Key has one of these forms: */
        !            43:        char *oneWordValue;             /* One-word value for key. */
        !            44:        int words[1];                   /* Multiple integer words for key.
        !            45:                                         * The actual size will be as large
        !            46:                                         * as necessary for this table's
        !            47:                                         * keys. */
        !            48:        char string[4];                 /* String for key.  The actual size
        !            49:                                         * will be as large as needed to hold
        !            50:                                         * the key. */
        !            51:     } key;                             /* MUST BE LAST FIELD IN RECORD!! */
        !            52: } Tcl_HashEntry;
        !            53: 
        !            54: /*
        !            55:  * Structure definition for a hash table.  Must be in tcl.h so clients
        !            56:  * can allocate space for these structures, but clients should never
        !            57:  * access any fields in this structure.
        !            58:  */
        !            59: 
        !            60: #define TCL_SMALL_HASH_TABLE 4
        !            61: typedef struct Tcl_HashTable {
        !            62:     Tcl_HashEntry **buckets;           /* Pointer to bucket array.  Each
        !            63:                                         * element points to first entry in
        !            64:                                         * bucket's hash chain, or NULL. */
        !            65:     Tcl_HashEntry *staticBuckets[TCL_SMALL_HASH_TABLE];
        !            66:                                        /* Bucket array used for small tables
        !            67:                                         * (to avoid mallocs and frees). */
        !            68:     int numBuckets;                    /* Total number of buckets allocated
        !            69:                                         * at **bucketPtr. */
        !            70:     int numEntries;                    /* Total number of entries present
        !            71:                                         * in table. */
        !            72:     int rebuildSize;                   /* Enlarge table when numEntries gets
        !            73:                                         * to be this large. */
        !            74:     int downShift;                     /* Shift count used in hashing
        !            75:                                         * function.  Designed to use high-
        !            76:                                         * order bits of randomized keys. */
        !            77:     int mask;                          /* Mask value used in hashing
        !            78:                                         * function. */
        !            79:     int keyType;                       /* Type of keys used in this table. 
        !            80:                                         * It's either TCL_STRING_KEYS,
        !            81:                                         * TCL_ONE_WORD_KEYS, or an integer
        !            82:                                         * giving the number of ints in a
        !            83:                                         */
        !            84:     Tcl_HashEntry *(*findProc) _ANSI_ARGS_((struct Tcl_HashTable *tablePtr,
        !            85:            char *key));
        !            86:     Tcl_HashEntry *(*createProc) _ANSI_ARGS_((struct Tcl_HashTable *tablePtr,
        !            87:            char *key, int *newPtr));
        !            88: } Tcl_HashTable;
        !            89: 
        !            90: /*
        !            91:  * Structure definition for information used to keep track of searches
        !            92:  * through hash tables:
        !            93:  */
        !            94: 
        !            95: typedef struct Tcl_HashSearch {
        !            96:     Tcl_HashTable *tablePtr;           /* Table being searched. */
        !            97:     int nextIndex;                     /* Index of next bucket to be
        !            98:                                         * enumerated after present one. */
        !            99:     Tcl_HashEntry *nextEntryPtr;       /* Next entry to be enumerated in the
        !           100:                                         * the current bucket. */
        !           101: } Tcl_HashSearch;
        !           102: 
        !           103: /*
        !           104:  * Acceptable key types for hash tables:
        !           105:  */
        !           106: 
        !           107: #define TCL_STRING_KEYS                0
        !           108: #define TCL_ONE_WORD_KEYS      1
        !           109: 
        !           110: /*
        !           111:  * Macros for clients to use to access fields of hash entries:
        !           112:  */
        !           113: 
        !           114: #define Tcl_GetHashValue(h) ((h)->clientData)
        !           115: #define Tcl_SetHashValue(h, value) ((h)->clientData = (ClientData) (value))
        !           116: #define Tcl_GetHashKey(tablePtr, h) \
        !           117:     ((char *) (((tablePtr)->keyType == TCL_ONE_WORD_KEYS) ? (h)->key.oneWordValue \
        !           118:                                                : (h)->key.string))
        !           119: 
        !           120: /*
        !           121:  * Macros to use for clients to use to invoke find and create procedures
        !           122:  * for hash tables:
        !           123:  */
        !           124: 
        !           125: #define Tcl_FindHashEntry(tablePtr, key) \
        !           126:        (*((tablePtr)->findProc))(tablePtr, key)
        !           127: #define Tcl_CreateHashEntry(tablePtr, key, newPtr) \
        !           128:        (*((tablePtr)->createProc))(tablePtr, key, newPtr)
        !           129: 
        !           130: /*
        !           131:  * Exported procedures:
        !           132:  */
        !           133: 
        !           134: extern void            Tcl_DeleteHashEntry _ANSI_ARGS_((
        !           135:                            Tcl_HashEntry *entryPtr));
        !           136: extern void            Tcl_DeleteHashTable _ANSI_ARGS_((
        !           137:                            Tcl_HashTable *tablePtr));
        !           138: extern Tcl_HashEntry * Tcl_FirstHashEntry _ANSI_ARGS_((
        !           139:                            Tcl_HashTable *tablePtr,
        !           140:                            Tcl_HashSearch *searchPtr));
        !           141: extern char *          Tcl_HashStats _ANSI_ARGS_((Tcl_HashTable *tablePtr));
        !           142: extern void            Tcl_InitHashTable _ANSI_ARGS_((Tcl_HashTable *tablePtr,
        !           143:                            int keyType));
        !           144: extern Tcl_HashEntry * Tcl_NextHashEntry _ANSI_ARGS_((
        !           145:                            Tcl_HashSearch *searchPtr));
        !           146: 
        !           147: #endif /* _TCLHASH */

unix.superglobalmegacorp.com

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