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