1d5ac70f0Sopenharmony_ci/* Declarations for System V style searching functions. 2d5ac70f0Sopenharmony_ci Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc. 3d5ac70f0Sopenharmony_ci This file is part of the GNU C Library. 4d5ac70f0Sopenharmony_ci 5d5ac70f0Sopenharmony_ci The GNU C Library is free software; you can redistribute it and/or 6d5ac70f0Sopenharmony_ci modify it under the terms of the GNU Lesser General Public License as 7d5ac70f0Sopenharmony_ci published by the Free Software Foundation; either version 2.1 of the 8d5ac70f0Sopenharmony_ci License, or (at your option) any later version. 9d5ac70f0Sopenharmony_ci 10d5ac70f0Sopenharmony_ci The GNU C Library is distributed in the hope that it will be useful, 11d5ac70f0Sopenharmony_ci but WITHOUT ANY WARRANTY; without even the implied warranty of 12d5ac70f0Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13d5ac70f0Sopenharmony_ci Lesser General Public License for more details. 14d5ac70f0Sopenharmony_ci 15d5ac70f0Sopenharmony_ci You should have received a copy of the GNU Lesser General Public 16d5ac70f0Sopenharmony_ci License along with the GNU C Library; see the file COPYING.LIB. If not, 17d5ac70f0Sopenharmony_ci write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18d5ac70f0Sopenharmony_ci Boston, MA 02111-1307, USA. */ 19d5ac70f0Sopenharmony_ci 20d5ac70f0Sopenharmony_ci#ifndef _SEARCH_H 21d5ac70f0Sopenharmony_ci#define _SEARCH_H 1 22d5ac70f0Sopenharmony_ci 23d5ac70f0Sopenharmony_ci#include <features.h> 24d5ac70f0Sopenharmony_ci 25d5ac70f0Sopenharmony_ci#define __need_size_t 26d5ac70f0Sopenharmony_ci#include <stddef.h> 27d5ac70f0Sopenharmony_ci 28d5ac70f0Sopenharmony_ci__BEGIN_DECLS 29d5ac70f0Sopenharmony_ci 30d5ac70f0Sopenharmony_ci#if defined __USE_SVID || defined __USE_XOPEN_EXTENDED 31d5ac70f0Sopenharmony_ci/* Prototype structure for a linked-list data structure. 32d5ac70f0Sopenharmony_ci This is the type used by the `insque' and `remque' functions. */ 33d5ac70f0Sopenharmony_ci 34d5ac70f0Sopenharmony_ci# ifdef __USE_GNU 35d5ac70f0Sopenharmony_cistruct qelem 36d5ac70f0Sopenharmony_ci { 37d5ac70f0Sopenharmony_ci struct qelem *q_forw; 38d5ac70f0Sopenharmony_ci struct qelem *q_back; 39d5ac70f0Sopenharmony_ci char q_data[1]; 40d5ac70f0Sopenharmony_ci }; 41d5ac70f0Sopenharmony_ci# endif 42d5ac70f0Sopenharmony_ci 43d5ac70f0Sopenharmony_ci 44d5ac70f0Sopenharmony_ci/* Insert ELEM into a doubly-linked list, after PREV. */ 45d5ac70f0Sopenharmony_ciextern void insque __P ((void *__elem, void *__prev)); 46d5ac70f0Sopenharmony_ci 47d5ac70f0Sopenharmony_ci/* Unlink ELEM from the doubly-linked list that it is in. */ 48d5ac70f0Sopenharmony_ciextern void remque __P ((void *__elem)); 49d5ac70f0Sopenharmony_ci#endif 50d5ac70f0Sopenharmony_ci 51d5ac70f0Sopenharmony_ci 52d5ac70f0Sopenharmony_ci/* For use with hsearch(3). */ 53d5ac70f0Sopenharmony_ci#ifndef __COMPAR_FN_T 54d5ac70f0Sopenharmony_ci# define __COMPAR_FN_T 55d5ac70f0Sopenharmony_citypedef int (*__compar_fn_t) __PMT ((__const __ptr_t, __const __ptr_t)); 56d5ac70f0Sopenharmony_ci 57d5ac70f0Sopenharmony_ci# ifdef __USE_GNU 58d5ac70f0Sopenharmony_citypedef __compar_fn_t comparison_fn_t; 59d5ac70f0Sopenharmony_ci# endif 60d5ac70f0Sopenharmony_ci#endif 61d5ac70f0Sopenharmony_ci 62d5ac70f0Sopenharmony_ci/* Action which shall be performed in the call the hsearch. */ 63d5ac70f0Sopenharmony_citypedef enum 64d5ac70f0Sopenharmony_ci { 65d5ac70f0Sopenharmony_ci FIND, 66d5ac70f0Sopenharmony_ci ENTER 67d5ac70f0Sopenharmony_ci } 68d5ac70f0Sopenharmony_ciACTION; 69d5ac70f0Sopenharmony_ci 70d5ac70f0Sopenharmony_citypedef struct entry 71d5ac70f0Sopenharmony_ci { 72d5ac70f0Sopenharmony_ci char *key; 73d5ac70f0Sopenharmony_ci void *data; 74d5ac70f0Sopenharmony_ci } 75d5ac70f0Sopenharmony_ciENTRY; 76d5ac70f0Sopenharmony_ci 77d5ac70f0Sopenharmony_ci/* Opaque type for internal use. */ 78d5ac70f0Sopenharmony_cistruct _ENTRY; 79d5ac70f0Sopenharmony_ci 80d5ac70f0Sopenharmony_ci/* Family of hash table handling functions. The functions also 81d5ac70f0Sopenharmony_ci have reentrant counterparts ending with _r. The non-reentrant 82d5ac70f0Sopenharmony_ci functions all work on a single internal hashing table. */ 83d5ac70f0Sopenharmony_ci 84d5ac70f0Sopenharmony_ci/* Search for entry matching ITEM.key in internal hash table. If 85d5ac70f0Sopenharmony_ci ACTION is `FIND' return found entry or signal error by returning 86d5ac70f0Sopenharmony_ci NULL. If ACTION is `ENTER' replace existing data (if any) with 87d5ac70f0Sopenharmony_ci ITEM.data. */ 88d5ac70f0Sopenharmony_ciextern ENTRY *hsearch __P ((ENTRY __item, ACTION __action)); 89d5ac70f0Sopenharmony_ci 90d5ac70f0Sopenharmony_ci/* Create a new hashing table which will at most contain NEL elements. */ 91d5ac70f0Sopenharmony_ciextern int hcreate __P ((size_t __nel)); 92d5ac70f0Sopenharmony_ci 93d5ac70f0Sopenharmony_ci/* Destroy current internal hashing table. */ 94d5ac70f0Sopenharmony_ciextern void hdestroy __P ((void)); 95d5ac70f0Sopenharmony_ci 96d5ac70f0Sopenharmony_ci#ifdef __USE_GNU 97d5ac70f0Sopenharmony_ci/* Data type for reentrant functions. */ 98d5ac70f0Sopenharmony_cistruct hsearch_data 99d5ac70f0Sopenharmony_ci { 100d5ac70f0Sopenharmony_ci struct _ENTRY *table; 101d5ac70f0Sopenharmony_ci unsigned int size; 102d5ac70f0Sopenharmony_ci unsigned int filled; 103d5ac70f0Sopenharmony_ci }; 104d5ac70f0Sopenharmony_ci 105d5ac70f0Sopenharmony_ci/* Reentrant versions which can handle multiple hashing tables at the 106d5ac70f0Sopenharmony_ci same time. */ 107d5ac70f0Sopenharmony_ciextern int hsearch_r __P ((ENTRY __item, ACTION __action, ENTRY **__retval, 108d5ac70f0Sopenharmony_ci struct hsearch_data *__htab)); 109d5ac70f0Sopenharmony_ciextern int hcreate_r __P ((size_t __nel, struct hsearch_data *__htab)); 110d5ac70f0Sopenharmony_ciextern void hdestroy_r __P ((struct hsearch_data *__htab)); 111d5ac70f0Sopenharmony_ci#endif 112d5ac70f0Sopenharmony_ci 113d5ac70f0Sopenharmony_ci 114d5ac70f0Sopenharmony_ci/* The tsearch routines are very interesting. They make many 115d5ac70f0Sopenharmony_ci assumptions about the compiler. It assumes that the first field 116d5ac70f0Sopenharmony_ci in node must be the "key" field, which points to the datum. 117d5ac70f0Sopenharmony_ci Everything depends on that. */ 118d5ac70f0Sopenharmony_ci/* For tsearch */ 119d5ac70f0Sopenharmony_citypedef enum 120d5ac70f0Sopenharmony_ci{ 121d5ac70f0Sopenharmony_ci preorder, 122d5ac70f0Sopenharmony_ci postorder, 123d5ac70f0Sopenharmony_ci endorder, 124d5ac70f0Sopenharmony_ci leaf 125d5ac70f0Sopenharmony_ci} 126d5ac70f0Sopenharmony_ciVISIT; 127d5ac70f0Sopenharmony_ci 128d5ac70f0Sopenharmony_ci/* Search for an entry matching the given KEY in the tree pointed to 129d5ac70f0Sopenharmony_ci by *ROOTP and insert a new element if not found. */ 130d5ac70f0Sopenharmony_ciextern void *tsearch __PMT ((__const void *__key, void **__rootp, 131d5ac70f0Sopenharmony_ci __compar_fn_t __compar)); 132d5ac70f0Sopenharmony_ci 133d5ac70f0Sopenharmony_ci/* Search for an entry matching the given KEY in the tree pointed to 134d5ac70f0Sopenharmony_ci by *ROOTP. If no matching entry is available return NULL. */ 135d5ac70f0Sopenharmony_ciextern void *tfind __PMT ((__const void *__key, void *__const *__rootp, 136d5ac70f0Sopenharmony_ci __compar_fn_t __compar)); 137d5ac70f0Sopenharmony_ci 138d5ac70f0Sopenharmony_ci/* Remove the element matching KEY from the tree pointed to by *ROOTP. */ 139d5ac70f0Sopenharmony_ciextern void *tdelete __PMT ((__const void *__key, void **__rootp, 140d5ac70f0Sopenharmony_ci __compar_fn_t __compar)); 141d5ac70f0Sopenharmony_ci 142d5ac70f0Sopenharmony_ci#ifndef __ACTION_FN_T 143d5ac70f0Sopenharmony_ci# define __ACTION_FN_T 144d5ac70f0Sopenharmony_citypedef void (*__action_fn_t) __PMT ((__const void *__nodep, 145d5ac70f0Sopenharmony_ci VISIT __value, 146d5ac70f0Sopenharmony_ci int __level)); 147d5ac70f0Sopenharmony_ci#endif 148d5ac70f0Sopenharmony_ci 149d5ac70f0Sopenharmony_ci/* Walk through the whole tree and call the ACTION callback for every node 150d5ac70f0Sopenharmony_ci or leaf. */ 151d5ac70f0Sopenharmony_ciextern void twalk __PMT ((__const void *__root, __action_fn_t __action)); 152d5ac70f0Sopenharmony_ci 153d5ac70f0Sopenharmony_ci#ifdef __USE_GNU 154d5ac70f0Sopenharmony_ci/* Callback type for function to free a tree node. If the keys are atomic 155d5ac70f0Sopenharmony_ci data this function should do nothing. */ 156d5ac70f0Sopenharmony_citypedef void (*__free_fn_t) __PMT ((void *__nodep)); 157d5ac70f0Sopenharmony_ci 158d5ac70f0Sopenharmony_ci/* Destroy the whole tree, call FREEFCT for each node or leaf. */ 159d5ac70f0Sopenharmony_ciextern void tdestroy __PMT ((void *__root, __free_fn_t __freefct)); 160d5ac70f0Sopenharmony_ci#endif 161d5ac70f0Sopenharmony_ci 162d5ac70f0Sopenharmony_ci 163d5ac70f0Sopenharmony_ci/* Perform linear search for KEY by comparing by COMPAR in an array 164d5ac70f0Sopenharmony_ci [BASE,BASE+NMEMB*SIZE). */ 165d5ac70f0Sopenharmony_ciextern void *lfind __PMT ((__const void *__key, __const void *__base, 166d5ac70f0Sopenharmony_ci size_t *__nmemb, size_t __size, 167d5ac70f0Sopenharmony_ci __compar_fn_t __compar)); 168d5ac70f0Sopenharmony_ci 169d5ac70f0Sopenharmony_ci/* Perform linear search for KEY by comparing by COMPAR function in 170d5ac70f0Sopenharmony_ci array [BASE,BASE+NMEMB*SIZE) and insert entry if not found. */ 171d5ac70f0Sopenharmony_ciextern void *lsearch __PMT ((__const void *__key, void *__base, 172d5ac70f0Sopenharmony_ci size_t *__nmemb, size_t __size, 173d5ac70f0Sopenharmony_ci __compar_fn_t __compar)); 174d5ac70f0Sopenharmony_ci 175d5ac70f0Sopenharmony_ci__END_DECLS 176d5ac70f0Sopenharmony_ci 177d5ac70f0Sopenharmony_ci#endif /* search.h */ 178