| /* 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 | |
| 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; 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 | |
| functions all work on a single 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 __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 */ |