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);
							 |