|  | /* Declarations for System V style searching functions. | 
|  | Copyright (C) 1995-2016 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 | 
|  | 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 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 | 
|  | Lesser General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU Lesser General Public | 
|  | License along with the GNU C Library; if not, see | 
|  | <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  | #ifndef _SEARCH_H | 
|  | #define	_SEARCH_H 1 | 
|  |  | 
|  | #include <features.h> | 
|  |  | 
|  | #define __need_size_t | 
|  | #include <stddef.h> | 
|  |  | 
|  | __BEGIN_DECLS | 
|  |  | 
|  | #if defined __USE_MISC || 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 (void *__elem, void *__prev) __THROW; | 
|  |  | 
|  | /* Unlink ELEM from the doubly-linked list that it is in.  */ | 
|  | extern void remque (void *__elem) __THROW; | 
|  | #endif | 
|  |  | 
|  |  | 
|  | /* For use with hsearch(3).  */ | 
|  | #ifndef __COMPAR_FN_T | 
|  | # define __COMPAR_FN_T | 
|  | typedef int (*__compar_fn_t) (const void *, const void *); | 
|  |  | 
|  | # 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 | 
|  | functions all work on a signle internal hashing table.  */ | 
|  |  | 
|  | /* 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 (ENTRY __item, ACTION __action) __THROW; | 
|  |  | 
|  | /* Create a new hashing table which will at most contain NEL elements.  */ | 
|  | extern int hcreate (size_t __nel) __THROW; | 
|  |  | 
|  | /* Destroy current internal hashing table.  */ | 
|  | extern void hdestroy (void) __THROW; | 
|  |  | 
|  | #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 (ENTRY __item, ACTION __action, ENTRY **__retval, | 
|  | struct hsearch_data *__htab) __THROW; | 
|  | extern int hcreate_r (size_t __nel, struct hsearch_data *__htab) __THROW; | 
|  | extern void hdestroy_r (struct hsearch_data *__htab) __THROW; | 
|  | #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 (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 (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 (const void *__restrict __key, | 
|  | void **__restrict __rootp, | 
|  | __compar_fn_t __compar); | 
|  |  | 
|  | #ifndef __ACTION_FN_T | 
|  | # define __ACTION_FN_T | 
|  | typedef void (*__action_fn_t) (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 (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) (void *__nodep); | 
|  |  | 
|  | /* Destroy the whole tree, call FREEFCT for each node or leaf.  */ | 
|  | extern void tdestroy (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 (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 (const void *__key, void *__base, | 
|  | size_t *__nmemb, size_t __size, __compar_fn_t __compar); | 
|  |  | 
|  | __END_DECLS | 
|  |  | 
|  | #endif /* search.h */ |