1/*	$NetBSD: search.h,v 1.21 2014/07/20 13:34:17 christos Exp $	*/
2
3/*
4 * Written by J.T. Conklin <jtc@NetBSD.org>
5 * Public domain.
6 */
7
8#ifndef _SEARCH_H_
9#define _SEARCH_H_
10
11#include <sys/cdefs.h>
12#include <sys/featuretest.h>
13#include <machine/ansi.h>
14
15#ifdef	_BSD_SIZE_T_
16typedef	_BSD_SIZE_T_	size_t;
17#undef	_BSD_SIZE_T_
18#endif
19
20typedef struct entry {
21	char *key;
22	void *data;
23} ENTRY;
24
25#ifdef _NETBSD_SOURCE
26struct _ENTRY;
27struct hsearch_data {
28	struct _ENTRY *table;
29	size_t size;
30	size_t filled;
31};
32#endif
33
34typedef enum {
35	FIND, ENTER
36} ACTION;
37
38typedef enum {
39	preorder,
40	postorder,
41	endorder,
42	leaf
43} VISIT;
44
45#ifdef _SEARCH_PRIVATE
46typedef struct node {
47	char         *key;
48	struct node  *llink, *rlink;
49} node_t;
50#endif
51
52__BEGIN_DECLS
53#ifndef __BSEARCH_DECLARED
54#define __BSEARCH_DECLARED
55/* also in stdlib.h */
56void	*bsearch(const void *, const void *, size_t, size_t,
57		      int (*)(const void *, const void *));
58#endif /* __BSEARCH_DECLARED */
59
60int	 hcreate(size_t);
61void	 hdestroy(void);
62ENTRY	*hsearch(ENTRY, ACTION);
63
64#ifdef _NETBSD_SOURCE
65void	 hdestroy1(void (*)(void *), void (*)(void *));
66int	 hcreate_r(size_t, struct hsearch_data *);
67void	 hdestroy_r(struct hsearch_data *);
68void	 hdestroy1_r(struct hsearch_data *, void (*)(void *), void (*)(void *));
69int	 hsearch_r(ENTRY, ACTION, ENTRY **, struct hsearch_data *);
70#endif /* _NETBSD_SOURCE */
71
72void	*lfind(const void *, const void *, size_t *, size_t,
73		      int (*)(const void *, const void *));
74void	*lsearch(const void *, void *, size_t *, size_t,
75		      int (*)(const void *, const void *));
76void	 insque(void *, void *);
77void	 remque(void *);
78
79void	*tdelete(const void * __restrict, void ** __restrict,
80		      int (*)(const void *, const void *));
81void	*tfind(const void *, void * const *,
82		      int (*)(const void *, const void *));
83void	*tsearch(const void *, void **,
84		      int (*)(const void *, const void *));
85void	 twalk(const void *, void (*)(const void *, VISIT, int));
86__END_DECLS
87
88#endif /* !_SEARCH_H_ */
89