|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.