| 
									
										
										
										
											2000-06-12 17:30:46 +00:00
										 |  |  | /* Declarations for System V style searching functions.
 | 
					
						
							|  |  |  |    Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc. | 
					
						
							|  |  |  |    This file is part of the GNU C Library. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The GNU C Library is free software; you can redistribute it and/or | 
					
						
							| 
									
										
										
										
											2001-12-30 09:22:54 +00:00
										 |  |  |    modify it under the terms of the GNU Lesser General Public License as | 
					
						
							|  |  |  |    published by the Free Software Foundation; either version 2.1 of the | 
					
						
							| 
									
										
										
										
											2000-06-12 17:30:46 +00:00
										 |  |  |    License, or (at your option) any later version. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The GNU C Library 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 | 
					
						
							| 
									
										
										
										
											2001-12-30 09:22:54 +00:00
										 |  |  |    Lesser General Public License for more details. | 
					
						
							| 
									
										
										
										
											2000-06-12 17:30:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-12-30 09:22:54 +00:00
										 |  |  |    You should have received a copy of the GNU Lesser General Public | 
					
						
							| 
									
										
										
										
											2000-06-12 17:30:46 +00:00
										 |  |  |    License along with the GNU C Library; see the file COPYING.LIB.  If not, | 
					
						
							|  |  |  |    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 
					
						
							|  |  |  |    Boston, MA 02111-1307, USA.  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef _SEARCH_H
 | 
					
						
							|  |  |  | #define	_SEARCH_H 1
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <features.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define __need_size_t
 | 
					
						
							|  |  |  | #include <stddef.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __BEGIN_DECLS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined __USE_SVID || defined __USE_XOPEN_EXTENDED
 | 
					
						
							|  |  |  | /* Prototype structure for a linked-list data structure.
 | 
					
						
							|  |  |  |    This is the type used by the `insque' and `remque' functions.  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # ifdef __USE_GNU
 | 
					
						
							|  |  |  | struct qelem | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     struct qelem *q_forw; | 
					
						
							|  |  |  |     struct qelem *q_back; | 
					
						
							|  |  |  |     char q_data[1]; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Insert ELEM into a doubly-linked list, after PREV.  */ | 
					
						
							|  |  |  | extern void insque __P ((void *__elem, void *__prev)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Unlink ELEM from the doubly-linked list that it is in.  */ | 
					
						
							|  |  |  | extern void remque __P ((void *__elem)); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* For use with hsearch(3).  */ | 
					
						
							|  |  |  | #ifndef __COMPAR_FN_T
 | 
					
						
							|  |  |  | # define __COMPAR_FN_T
 | 
					
						
							|  |  |  | typedef int (*__compar_fn_t) __PMT ((__const __ptr_t, __const __ptr_t)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # ifdef	__USE_GNU
 | 
					
						
							|  |  |  | typedef __compar_fn_t comparison_fn_t; | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Action which shall be performed in the call the hsearch.  */ | 
					
						
							|  |  |  | typedef enum | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     FIND, | 
					
						
							|  |  |  |     ENTER | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | ACTION; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct entry | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     char *key; | 
					
						
							|  |  |  |     void *data; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | ENTRY; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Opaque type for internal use.  */ | 
					
						
							|  |  |  | struct _ENTRY; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Family of hash table handling functions.  The functions also
 | 
					
						
							|  |  |  |    have reentrant counterparts ending with _r.  The non-reentrant | 
					
						
							| 
									
										
										
										
											2002-03-12 20:14:33 +00:00
										 |  |  |    functions all work on a single internal hashing table.  */ | 
					
						
							| 
									
										
										
										
											2000-06-12 17:30:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Search for entry matching ITEM.key in internal hash table.  If
 | 
					
						
							|  |  |  |    ACTION is `FIND' return found entry or signal error by returning | 
					
						
							|  |  |  |    NULL.  If ACTION is `ENTER' replace existing data (if any) with | 
					
						
							|  |  |  |    ITEM.data.  */ | 
					
						
							|  |  |  | extern ENTRY *hsearch __P ((ENTRY __item, ACTION __action)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Create a new hashing table which will at most contain NEL elements.  */ | 
					
						
							|  |  |  | extern int hcreate __P ((size_t __nel)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Destroy current internal hashing table.  */ | 
					
						
							|  |  |  | extern void hdestroy __P ((void)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __USE_GNU
 | 
					
						
							|  |  |  | /* Data type for reentrant functions.  */ | 
					
						
							|  |  |  | struct hsearch_data | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     struct _ENTRY *table; | 
					
						
							|  |  |  |     unsigned int size; | 
					
						
							|  |  |  |     unsigned int filled; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Reentrant versions which can handle multiple hashing tables at the
 | 
					
						
							|  |  |  |    same time.  */ | 
					
						
							|  |  |  | extern int hsearch_r __P ((ENTRY __item, ACTION __action, ENTRY **__retval, | 
					
						
							|  |  |  | 			   struct hsearch_data *__htab)); | 
					
						
							|  |  |  | extern int hcreate_r __P ((size_t __nel, struct hsearch_data *__htab)); | 
					
						
							|  |  |  | extern void hdestroy_r __P ((struct hsearch_data *__htab)); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* The tsearch routines are very interesting. They make many
 | 
					
						
							|  |  |  |    assumptions about the compiler.  It assumes that the first field | 
					
						
							|  |  |  |    in node must be the "key" field, which points to the datum. | 
					
						
							|  |  |  |    Everything depends on that.  */ | 
					
						
							|  |  |  | /* For tsearch */ | 
					
						
							|  |  |  | typedef enum | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   preorder, | 
					
						
							|  |  |  |   postorder, | 
					
						
							|  |  |  |   endorder, | 
					
						
							|  |  |  |   leaf | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | VISIT; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Search for an entry matching the given KEY in the tree pointed to
 | 
					
						
							|  |  |  |    by *ROOTP and insert a new element if not found.  */ | 
					
						
							|  |  |  | extern void *tsearch __PMT ((__const void *__key, void **__rootp, | 
					
						
							|  |  |  | 			     __compar_fn_t __compar)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Search for an entry matching the given KEY in the tree pointed to
 | 
					
						
							|  |  |  |    by *ROOTP.  If no matching entry is available return NULL.  */ | 
					
						
							|  |  |  | extern void *tfind __PMT ((__const void *__key, void *__const *__rootp, | 
					
						
							|  |  |  | 			   __compar_fn_t __compar)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Remove the element matching KEY from the tree pointed to by *ROOTP.  */ | 
					
						
							|  |  |  | extern void *tdelete __PMT ((__const void *__key, void **__rootp, | 
					
						
							|  |  |  | 			     __compar_fn_t __compar)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef __ACTION_FN_T
 | 
					
						
							|  |  |  | # define __ACTION_FN_T
 | 
					
						
							|  |  |  | typedef void (*__action_fn_t) __PMT ((__const void *__nodep, | 
					
						
							|  |  |  | 				      VISIT __value, | 
					
						
							|  |  |  | 				      int __level)); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Walk through the whole tree and call the ACTION callback for every node
 | 
					
						
							|  |  |  |    or leaf.  */ | 
					
						
							|  |  |  | extern void twalk __PMT ((__const void *__root, __action_fn_t __action)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __USE_GNU
 | 
					
						
							|  |  |  | /* Callback type for function to free a tree node.  If the keys are atomic
 | 
					
						
							|  |  |  |    data this function should do nothing.  */ | 
					
						
							|  |  |  | typedef void (*__free_fn_t) __PMT ((void *__nodep)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Destroy the whole tree, call FREEFCT for each node or leaf.  */ | 
					
						
							|  |  |  | extern void tdestroy __PMT ((void *__root, __free_fn_t __freefct)); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Perform linear search for KEY by comparing by COMPAR in an array
 | 
					
						
							|  |  |  |    [BASE,BASE+NMEMB*SIZE).  */ | 
					
						
							|  |  |  | extern void *lfind __PMT ((__const void *__key, __const void *__base, | 
					
						
							|  |  |  | 			   size_t *__nmemb, size_t __size, | 
					
						
							|  |  |  | 			   __compar_fn_t __compar)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Perform linear search for KEY by comparing by COMPAR function in
 | 
					
						
							|  |  |  |    array [BASE,BASE+NMEMB*SIZE) and insert entry if not found.  */ | 
					
						
							|  |  |  | extern void *lsearch __PMT ((__const void *__key, void *__base, | 
					
						
							|  |  |  | 			     size_t *__nmemb, size_t __size, | 
					
						
							|  |  |  | 			     __compar_fn_t __compar)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __END_DECLS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* search.h */
 |