74 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*  $Id$
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Part of SWI-Prolog
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Author:        Jan Wielemaker
							 | 
						||
| 
								 | 
							
								    E-mail:        wielemak@science.uva.nl
							 | 
						||
| 
								 | 
							
								    WWW:           http://www.swi-prolog.org
							 | 
						||
| 
								 | 
							
								    Copyright (C): 1985-2007, University of Amsterdam
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    This program is free software; you can redistribute it and/or
							 | 
						||
| 
								 | 
							
								    modify it under the terms of the GNU General Public License
							 | 
						||
| 
								 | 
							
								    as published by the Free Software Foundation; either version 2
							 | 
						||
| 
								 | 
							
								    of the License, or (at your option) any later version.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    This program is distributed in the hope that it will be useful,
							 | 
						||
| 
								 | 
							
								    but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						||
| 
								 | 
							
								    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						||
| 
								 | 
							
								    GNU General Public License for more details.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    You should have received a copy of the GNU General Public
							 | 
						||
| 
								 | 
							
								    License along with this library; if not, write to the Free Software
							 | 
						||
| 
								 | 
							
								    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    As a special exception, if you link this library with other files,
							 | 
						||
| 
								 | 
							
								    compiled with a Free Software compiler, to produce an executable, this
							 | 
						||
| 
								 | 
							
								    library does not by itself cause the resulting executable to be covered
							 | 
						||
| 
								 | 
							
								    by the GNU General Public License. This exception does not however
							 | 
						||
| 
								 | 
							
								    invalidate any other reasons why the executable file might be covered by
							 | 
						||
| 
								 | 
							
								    the GNU General Public License.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef HASH_H_INCLUDED
							 | 
						||
| 
								 | 
							
								#define HASH_H_INCLUDED
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct ptr_hash_node
							 | 
						||
| 
								 | 
							
								{ struct ptr_hash_node *next;		/* next in chain */
							 | 
						||
| 
								 | 
							
								  void *value;				/* hashed value */
							 | 
						||
| 
								 | 
							
								} ptr_hash_node;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct ptr_hash
							 | 
						||
| 
								 | 
							
								{ int entries;				/* # chains  */
							 | 
						||
| 
								 | 
							
								  int shift;				/* shift for pointers */
							 | 
						||
| 
								 | 
							
								  ptr_hash_node **chains;		/* hash chains */
							 | 
						||
| 
								 | 
							
								} ptr_hash;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ptr_hash       *new_ptr_hash(int entries, int shift);
							 | 
						||
| 
								 | 
							
								void		destroy_ptr_hash(ptr_hash *hash);
							 | 
						||
| 
								 | 
							
								int		add_ptr_hash(ptr_hash *hash, void *value);
							 | 
						||
| 
								 | 
							
								int		for_ptr_hash(ptr_hash *hash,
							 | 
						||
| 
								 | 
							
											     int (*func)(ptr_hash_node *node, void *closure),
							 | 
						||
| 
								 | 
							
											     void *closure);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										 /*******************************
							 | 
						||
| 
								 | 
							
										 *	       ATOMS		*
							 | 
						||
| 
								 | 
							
										 *******************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef ptr_hash atom_hash;
							 | 
						||
| 
								 | 
							
								#define new_atom_hash(entries) new_ptr_hash(entries, ATOM_HASH_SHIFT)
							 | 
						||
| 
								 | 
							
								#define destroy_atom_hash(hash) destroy_ptr_hash(hash)
							 | 
						||
| 
								 | 
							
								#define add_atom_hash(hash, atom) add_ptr_hash(hash, (void*)(atom))
							 | 
						||
| 
								 | 
							
								#define for_atom_hash for_ptr_hash
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
							 | 
						||
| 
								 | 
							
								SWI-Prolog note: Atoms are integers shifted by LMASK_BITS (7)
							 | 
						||
| 
								 | 
							
								- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define POINTER_HASH_SHIFT 3
							 | 
						||
| 
								 | 
							
								#define ATOM_HASH_SHIFT 7
							 | 
						||
| 
								 | 
							
								#define atom_hash(a) (((unsigned long)a)>>ATOM_HASH_SHIFT)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /*HASH_H_INCLUDED*/
							 |