59 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			59 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*****
 | ||
|  |       Hash Tables pl-table.h | ||
|  | ****/ | ||
|  | 
 | ||
|  | #define LMASK_BITS	7		/* total # mask bits */
 | ||
|  | 
 | ||
|  | #define TABLE_MASK		0xf0000000UL
 | ||
|  | 
 | ||
|  | #define pointerHashValue(p, size) ((((intptr_t)(p) >> LMASK_BITS) ^ \
 | ||
|  | 				    ((intptr_t)(p) >> (LMASK_BITS+5)) ^ \ | ||
|  | 				    ((intptr_t)(p))) & \ | ||
|  | 				   ((size)-1)) | ||
|  | 
 | ||
|  | typedef struct symbol *		Symbol;		/* symbol of hash table */ | ||
|  | 
 | ||
|  | /* hash Table + lock + scaling + enumerator */ | ||
|  | typedef struct table *Table; | ||
|  | 
 | ||
|  | typedef struct table_enum* TableEnum; | ||
|  | 
 | ||
|  | /* symbol table hash  package */ | ||
|  | 
 | ||
|  | struct table | ||
|  | { int		buckets;	/* size of hash table */ | ||
|  |   int		size;		/* # symbols in the table */ | ||
|  |   TableEnum	enumerators;	/* Handles for enumeration */ | ||
|  | #ifdef O_PLMT
 | ||
|  |   simpleMutex  *mutex;		/* Mutex to guard table */ | ||
|  | #endif
 | ||
|  |   void 		(*copy_symbol)(Symbol s); | ||
|  |   void 		(*free_symbol)(Symbol s); | ||
|  |   Symbol	*entries;	/* array of hash symbols */ | ||
|  | }; | ||
|  | 
 | ||
|  | struct symbol | ||
|  | { Symbol	next;		/* next in chain */ | ||
|  |   void *	name;		/* name entry of symbol */ | ||
|  |   void *	value;		/* associated value with name */ | ||
|  | }; | ||
|  | 
 | ||
|  | struct table_enum | ||
|  | { Table		table;		/* Table we are working on */ | ||
|  |   int		key;		/* Index of current symbol-chain */ | ||
|  |   Symbol	current;	/* The current symbol */ | ||
|  |   TableEnum	next;		/* More choice points */ | ||
|  | }; | ||
|  | 
 | ||
|  | extern void 		initTables(void); | ||
|  | extern Table 		newHTable(int size); | ||
|  | extern void 		destroyHTable(Table ht); | ||
|  | extern Symbol 		lookupHTable(Table ht, void *name); | ||
|  | extern Symbol 		addHTable(Table ht, void *name, void *value); | ||
|  | extern void 		deleteSymbolHTable(Table ht, Symbol s); | ||
|  | extern void 		clearHTable(Table ht); | ||
|  | extern Table 		copyHTable(Table org); | ||
|  | extern TableEnum 	newTableEnum(Table ht); | ||
|  | extern void 		freeTableEnum(TableEnum e); | ||
|  | extern Symbol 		advanceTableEnum(TableEnum e); |