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