1*4d9fdb46SRobert Mustacchi #ifndef DWARF_TSEARCH_H
2*4d9fdb46SRobert Mustacchi #define DWARF_TSEARCH_H
3*4d9fdb46SRobert Mustacchi /* Copyright (c) 2013-2019, David Anderson
4*4d9fdb46SRobert Mustacchi All rights reserved.
5*4d9fdb46SRobert Mustacchi 
6*4d9fdb46SRobert Mustacchi Redistribution and use in source and binary forms, with
7*4d9fdb46SRobert Mustacchi or without modification, are permitted provided that the
8*4d9fdb46SRobert Mustacchi following conditions are met:
9*4d9fdb46SRobert Mustacchi 
10*4d9fdb46SRobert Mustacchi     Redistributions of source code must retain the above
11*4d9fdb46SRobert Mustacchi     copyright notice, this list of conditions and the following
12*4d9fdb46SRobert Mustacchi     disclaimer.
13*4d9fdb46SRobert Mustacchi 
14*4d9fdb46SRobert Mustacchi     Redistributions in binary form must reproduce the above
15*4d9fdb46SRobert Mustacchi     copyright notice, this list of conditions and the following
16*4d9fdb46SRobert Mustacchi     disclaimer in the documentation and/or other materials
17*4d9fdb46SRobert Mustacchi     provided with the distribution.
18*4d9fdb46SRobert Mustacchi 
19*4d9fdb46SRobert Mustacchi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
20*4d9fdb46SRobert Mustacchi CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
21*4d9fdb46SRobert Mustacchi INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22*4d9fdb46SRobert Mustacchi OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23*4d9fdb46SRobert Mustacchi ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
24*4d9fdb46SRobert Mustacchi CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25*4d9fdb46SRobert Mustacchi SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26*4d9fdb46SRobert Mustacchi NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27*4d9fdb46SRobert Mustacchi LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28*4d9fdb46SRobert Mustacchi HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29*4d9fdb46SRobert Mustacchi CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30*4d9fdb46SRobert Mustacchi OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
31*4d9fdb46SRobert Mustacchi EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32*4d9fdb46SRobert Mustacchi 
33*4d9fdb46SRobert Mustacchi */
34*4d9fdb46SRobert Mustacchi 
35*4d9fdb46SRobert Mustacchi /*  The following interfaces follow tsearch (See the Single
36*4d9fdb46SRobert Mustacchi     Unix Specification) but the implementation is
37*4d9fdb46SRobert Mustacchi     written without reference to the source  code
38*4d9fdb46SRobert Mustacchi     of any version of tsearch. Only uses
39*4d9fdb46SRobert Mustacchi     of tsearch were examined, not tsearch source code.
40*4d9fdb46SRobert Mustacchi 
41*4d9fdb46SRobert Mustacchi     See https://www.prevanders.net/tsearch.html
42*4d9fdb46SRobert Mustacchi     and https://www.prevanders.net/dwarf.html#tsearch
43*4d9fdb46SRobert Mustacchi     for information about tsearch.
44*4d9fdb46SRobert Mustacchi 
45*4d9fdb46SRobert Mustacchi     We are matching the standard functional
46*4d9fdb46SRobert Mustacchi     interface here, but to avoid interfering with
47*4d9fdb46SRobert Mustacchi     libc implementations or code using libc
48*4d9fdb46SRobert Mustacchi     implementations, we change all the names.
49*4d9fdb46SRobert Mustacchi 
50*4d9fdb46SRobert Mustacchi */
51*4d9fdb46SRobert Mustacchi 
52*4d9fdb46SRobert Mustacchi /*  configure/cmake ensure uintptr_t defined, but if not,
53*4d9fdb46SRobert Mustacchi     possibly  "-Duintptr_t=unsigned long" might help  */
54*4d9fdb46SRobert Mustacchi #ifndef DW_TSHASHTYPE
55*4d9fdb46SRobert Mustacchi #define DW_TSHASHTYPE uintptr_t
56*4d9fdb46SRobert Mustacchi #endif
57*4d9fdb46SRobert Mustacchi 
58*4d9fdb46SRobert Mustacchi /*  The DW_VISIT values passed back to you through
59*4d9fdb46SRobert Mustacchi     the callback function in dwarf_twalk();
60*4d9fdb46SRobert Mustacchi */
61*4d9fdb46SRobert Mustacchi typedef enum
62*4d9fdb46SRobert Mustacchi {
63*4d9fdb46SRobert Mustacchi   dwarf_preorder,
64*4d9fdb46SRobert Mustacchi   dwarf_postorder,
65*4d9fdb46SRobert Mustacchi   dwarf_endorder,
66*4d9fdb46SRobert Mustacchi   dwarf_leaf
67*4d9fdb46SRobert Mustacchi }
68*4d9fdb46SRobert Mustacchi DW_VISIT;
69*4d9fdb46SRobert Mustacchi 
70*4d9fdb46SRobert Mustacchi /* void * return values are actually
71*4d9fdb46SRobert Mustacchi    void **key so you must dereference these
72*4d9fdb46SRobert Mustacchi    once to get a key you passed in.
73*4d9fdb46SRobert Mustacchi */
74*4d9fdb46SRobert Mustacchi 
75*4d9fdb46SRobert Mustacchi /*  We rename these so there is no conflict with another version
76*4d9fdb46SRobert Mustacchi     of the tsearch sources, such as is used in dwarfdump. */
77*4d9fdb46SRobert Mustacchi #define dwarf_tsearch  _dwarf_tsearch
78*4d9fdb46SRobert Mustacchi #define dwarf_tfind    _dwarf_tfind
79*4d9fdb46SRobert Mustacchi #define dwarf_tdelete  _dwarf_tdelete
80*4d9fdb46SRobert Mustacchi #define dwarf_twalk    _dwarf_twalk
81*4d9fdb46SRobert Mustacchi #define dwarf_tdestroy _dwarf_tdestroy
82*4d9fdb46SRobert Mustacchi #define dwarf_tdump    _dwarf_tdump
83*4d9fdb46SRobert Mustacchi #define dwarf_initialize_search_hash _dwarf_initialize_search_hash
84*4d9fdb46SRobert Mustacchi 
85*4d9fdb46SRobert Mustacchi void *dwarf_tsearch(const void * /*key*/, void ** /*rootp*/,
86*4d9fdb46SRobert Mustacchi     int (* /*compar*/)(const void *, const void *));
87*4d9fdb46SRobert Mustacchi 
88*4d9fdb46SRobert Mustacchi void *dwarf_tfind(const void * /*key*/, void *const * /*rootp*/,
89*4d9fdb46SRobert Mustacchi     int (* /*compar*/)(const void *, const void *));
90*4d9fdb46SRobert Mustacchi 
91*4d9fdb46SRobert Mustacchi /*
92*4d9fdb46SRobert Mustacchi     dwarf_tdelete() returns NULL if it cannot delete anything
93*4d9fdb46SRobert Mustacchi         or if the tree is now empty (if empty, *rootp
94*4d9fdb46SRobert Mustacchi         is set NULL by dwarf_tdelete()).
95*4d9fdb46SRobert Mustacchi     If the delete succeeds and the tree is non-empty returns
96*4d9fdb46SRobert Mustacchi         a pointer to the parent node of the deleted item,
97*4d9fdb46SRobert Mustacchi         unless the deleted item was at the root, in which
98*4d9fdb46SRobert Mustacchi         case the returned pointer relates to the new root.
99*4d9fdb46SRobert Mustacchi */
100*4d9fdb46SRobert Mustacchi void *dwarf_tdelete(const void * /*key*/, void ** /*rootp*/,
101*4d9fdb46SRobert Mustacchi     int (* /*compar*/)(const void *, const void *));
102*4d9fdb46SRobert Mustacchi 
103*4d9fdb46SRobert Mustacchi void dwarf_twalk(const void * /*root*/,
104*4d9fdb46SRobert Mustacchi     void (* /*action*/)(const void * /*nodep*/,
105*4d9fdb46SRobert Mustacchi     const DW_VISIT  /*which*/,
106*4d9fdb46SRobert Mustacchi     const int  /*depth*/));
107*4d9fdb46SRobert Mustacchi 
108*4d9fdb46SRobert Mustacchi /* dwarf_tdestroy() cannot set the root pointer NULL, you must do
109*4d9fdb46SRobert Mustacchi    so on return from dwarf_tdestroy(). */
110*4d9fdb46SRobert Mustacchi void dwarf_tdestroy(void * /*root*/,
111*4d9fdb46SRobert Mustacchi     void (* /*free_node*/)(void * /*nodep*/));
112*4d9fdb46SRobert Mustacchi 
113*4d9fdb46SRobert Mustacchi /*  Prints  a simple tree representation to stdout. For debugging.
114*4d9fdb46SRobert Mustacchi */
115*4d9fdb46SRobert Mustacchi void dwarf_tdump(const void*root,
116*4d9fdb46SRobert Mustacchi     char *(* /*keyprint*/)(const void *),
117*4d9fdb46SRobert Mustacchi     const char *msg);
118*4d9fdb46SRobert Mustacchi 
119*4d9fdb46SRobert Mustacchi /* Returns NULL  and does nothing
120*4d9fdb46SRobert Mustacchi    unless the implemenation used uses a hash tree. */
121*4d9fdb46SRobert Mustacchi void * dwarf_initialize_search_hash( void **treeptr,
122*4d9fdb46SRobert Mustacchi     DW_TSHASHTYPE (*hashfunc)(const void *key),
123*4d9fdb46SRobert Mustacchi     unsigned long size_estimate);
124*4d9fdb46SRobert Mustacchi #endif /* DWARF_TSEARCH_H */
125