1*8d67ca89SAndroid Build Coastguard Worker /*- 2*8d67ca89SAndroid Build Coastguard Worker * Written by J.T. Conklin <[email protected]> 3*8d67ca89SAndroid Build Coastguard Worker * Public domain. 4*8d67ca89SAndroid Build Coastguard Worker * 5*8d67ca89SAndroid Build Coastguard Worker * $NetBSD: search.h,v 1.12 1999/02/22 10:34:28 christos Exp $ 6*8d67ca89SAndroid Build Coastguard Worker * $FreeBSD: release/9.0.0/include/search.h 105250 2002-10-16 14:29:23Z robert $ 7*8d67ca89SAndroid Build Coastguard Worker */ 8*8d67ca89SAndroid Build Coastguard Worker 9*8d67ca89SAndroid Build Coastguard Worker #pragma once 10*8d67ca89SAndroid Build Coastguard Worker 11*8d67ca89SAndroid Build Coastguard Worker /** 12*8d67ca89SAndroid Build Coastguard Worker * @file search.h 13*8d67ca89SAndroid Build Coastguard Worker * @brief Queues, hash tables, trees, and linear array searches. 14*8d67ca89SAndroid Build Coastguard Worker */ 15*8d67ca89SAndroid Build Coastguard Worker 16*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h> 17*8d67ca89SAndroid Build Coastguard Worker #include <sys/types.h> 18*8d67ca89SAndroid Build Coastguard Worker 19*8d67ca89SAndroid Build Coastguard Worker /** See hsearch()/hsearch_r(). */ 20*8d67ca89SAndroid Build Coastguard Worker typedef enum { 21*8d67ca89SAndroid Build Coastguard Worker FIND, 22*8d67ca89SAndroid Build Coastguard Worker ENTER 23*8d67ca89SAndroid Build Coastguard Worker } ACTION; 24*8d67ca89SAndroid Build Coastguard Worker 25*8d67ca89SAndroid Build Coastguard Worker /** See hsearch()/hsearch_r(). */ 26*8d67ca89SAndroid Build Coastguard Worker typedef struct entry { 27*8d67ca89SAndroid Build Coastguard Worker /** The string key. */ 28*8d67ca89SAndroid Build Coastguard Worker char* _Nullable key; 29*8d67ca89SAndroid Build Coastguard Worker /** The associated data. */ 30*8d67ca89SAndroid Build Coastguard Worker void* _Nullable data; 31*8d67ca89SAndroid Build Coastguard Worker } ENTRY; 32*8d67ca89SAndroid Build Coastguard Worker 33*8d67ca89SAndroid Build Coastguard Worker /** 34*8d67ca89SAndroid Build Coastguard Worker * Constants given to the twalk() visitor. 35*8d67ca89SAndroid Build Coastguard Worker * Note that the constant names are misleading. 36*8d67ca89SAndroid Build Coastguard Worker */ 37*8d67ca89SAndroid Build Coastguard Worker typedef enum { 38*8d67ca89SAndroid Build Coastguard Worker /** 39*8d67ca89SAndroid Build Coastguard Worker * If this is the first visit to a non-leaf node. 40*8d67ca89SAndroid Build Coastguard Worker * Use this for *preorder* traversal. 41*8d67ca89SAndroid Build Coastguard Worker */ 42*8d67ca89SAndroid Build Coastguard Worker preorder, 43*8d67ca89SAndroid Build Coastguard Worker /** 44*8d67ca89SAndroid Build Coastguard Worker * If this is the second visit to a non-leaf node. 45*8d67ca89SAndroid Build Coastguard Worker * Use this for *inorder* traversal. 46*8d67ca89SAndroid Build Coastguard Worker */ 47*8d67ca89SAndroid Build Coastguard Worker postorder, 48*8d67ca89SAndroid Build Coastguard Worker /** 49*8d67ca89SAndroid Build Coastguard Worker * If this is the third visit to a non-leaf node. 50*8d67ca89SAndroid Build Coastguard Worker * Use this for *postorder* traversal. 51*8d67ca89SAndroid Build Coastguard Worker */ 52*8d67ca89SAndroid Build Coastguard Worker endorder, 53*8d67ca89SAndroid Build Coastguard Worker /** If this is the first and only visit to a leaf node. */ 54*8d67ca89SAndroid Build Coastguard Worker leaf 55*8d67ca89SAndroid Build Coastguard Worker } VISIT; 56*8d67ca89SAndroid Build Coastguard Worker 57*8d67ca89SAndroid Build Coastguard Worker #if defined(__USE_BSD) || defined(__USE_GNU) 58*8d67ca89SAndroid Build Coastguard Worker /** The hash table type for hcreate_r()/hdestroy_r()/hsearch_r(). */ 59*8d67ca89SAndroid Build Coastguard Worker struct hsearch_data { 60*8d67ca89SAndroid Build Coastguard Worker struct __hsearch* _Nullable __hsearch; 61*8d67ca89SAndroid Build Coastguard Worker }; 62*8d67ca89SAndroid Build Coastguard Worker #endif 63*8d67ca89SAndroid Build Coastguard Worker 64*8d67ca89SAndroid Build Coastguard Worker __BEGIN_DECLS 65*8d67ca89SAndroid Build Coastguard Worker 66*8d67ca89SAndroid Build Coastguard Worker /** 67*8d67ca89SAndroid Build Coastguard Worker * [insque(3)](https://man7.org/linux/man-pages/man3/insque.3.html) inserts 68*8d67ca89SAndroid Build Coastguard Worker * an item in a queue (an intrusive doubly-linked list). 69*8d67ca89SAndroid Build Coastguard Worker */ 70*8d67ca89SAndroid Build Coastguard Worker void insque(void* _Nonnull __element, void* _Nullable __previous); 71*8d67ca89SAndroid Build Coastguard Worker 72*8d67ca89SAndroid Build Coastguard Worker /** 73*8d67ca89SAndroid Build Coastguard Worker * [remque(3)](https://man7.org/linux/man-pages/man3/remque.3.html) removes 74*8d67ca89SAndroid Build Coastguard Worker * an item from a queue (an intrusive doubly-linked list). 75*8d67ca89SAndroid Build Coastguard Worker */ 76*8d67ca89SAndroid Build Coastguard Worker void remque(void* _Nonnull __element); 77*8d67ca89SAndroid Build Coastguard Worker 78*8d67ca89SAndroid Build Coastguard Worker /** 79*8d67ca89SAndroid Build Coastguard Worker * [hcreate(3)](https://man7.org/linux/man-pages/man3/hcreate.3.html) 80*8d67ca89SAndroid Build Coastguard Worker * initializes the global hash table, with space for at least `__n` elements. 81*8d67ca89SAndroid Build Coastguard Worker * 82*8d67ca89SAndroid Build Coastguard Worker * See hcreate_r() if you need more than one hash table. 83*8d67ca89SAndroid Build Coastguard Worker * 84*8d67ca89SAndroid Build Coastguard Worker * Returns *non-zero* on success and returns 0 and sets `errno` on failure. 85*8d67ca89SAndroid Build Coastguard Worker * 86*8d67ca89SAndroid Build Coastguard Worker * Available since API level 28. 87*8d67ca89SAndroid Build Coastguard Worker */ 88*8d67ca89SAndroid Build Coastguard Worker 89*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(28) 90*8d67ca89SAndroid Build Coastguard Worker int hcreate(size_t __n) __INTRODUCED_IN(28); 91*8d67ca89SAndroid Build Coastguard Worker 92*8d67ca89SAndroid Build Coastguard Worker /** 93*8d67ca89SAndroid Build Coastguard Worker * [hdestroy(3)](https://man7.org/linux/man-pages/man3/hdestroy.3.html) destroys 94*8d67ca89SAndroid Build Coastguard Worker * the global hash table. 95*8d67ca89SAndroid Build Coastguard Worker * 96*8d67ca89SAndroid Build Coastguard Worker * See hdestroy_r() if you need more than one hash table. 97*8d67ca89SAndroid Build Coastguard Worker * 98*8d67ca89SAndroid Build Coastguard Worker * Available since API level 28. 99*8d67ca89SAndroid Build Coastguard Worker */ 100*8d67ca89SAndroid Build Coastguard Worker void hdestroy(void) __INTRODUCED_IN(28); 101*8d67ca89SAndroid Build Coastguard Worker 102*8d67ca89SAndroid Build Coastguard Worker /** 103*8d67ca89SAndroid Build Coastguard Worker * [hsearch(3)](https://man7.org/linux/man-pages/man3/hsearch.3.html) finds or 104*8d67ca89SAndroid Build Coastguard Worker * inserts `__entry` in the global hash table, based on `__action`. 105*8d67ca89SAndroid Build Coastguard Worker * 106*8d67ca89SAndroid Build Coastguard Worker * See hsearch_r() if you need more than one hash table. 107*8d67ca89SAndroid Build Coastguard Worker * 108*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to the entry on success, and returns NULL and sets 109*8d67ca89SAndroid Build Coastguard Worker * `errno` on failure. 110*8d67ca89SAndroid Build Coastguard Worker * 111*8d67ca89SAndroid Build Coastguard Worker * Available since API level 28. 112*8d67ca89SAndroid Build Coastguard Worker */ 113*8d67ca89SAndroid Build Coastguard Worker ENTRY* _Nullable hsearch(ENTRY __entry, ACTION __action) __INTRODUCED_IN(28); 114*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(28) */ 115*8d67ca89SAndroid Build Coastguard Worker 116*8d67ca89SAndroid Build Coastguard Worker 117*8d67ca89SAndroid Build Coastguard Worker #if defined(__USE_BSD) || defined(__USE_GNU) 118*8d67ca89SAndroid Build Coastguard Worker 119*8d67ca89SAndroid Build Coastguard Worker /** 120*8d67ca89SAndroid Build Coastguard Worker * [hcreate_r(3)](https://man7.org/linux/man-pages/man3/hcreate_r.3.html) 121*8d67ca89SAndroid Build Coastguard Worker * initializes a hash table `__table` with space for at least `__n` elements. 122*8d67ca89SAndroid Build Coastguard Worker * 123*8d67ca89SAndroid Build Coastguard Worker * Returns *non-zero* on success and returns 0 and sets `errno` on failure. 124*8d67ca89SAndroid Build Coastguard Worker * 125*8d67ca89SAndroid Build Coastguard Worker * Available since API level 28. 126*8d67ca89SAndroid Build Coastguard Worker */ 127*8d67ca89SAndroid Build Coastguard Worker 128*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(28) 129*8d67ca89SAndroid Build Coastguard Worker int hcreate_r(size_t __n, struct hsearch_data* _Nonnull __table) __INTRODUCED_IN(28); 130*8d67ca89SAndroid Build Coastguard Worker 131*8d67ca89SAndroid Build Coastguard Worker /** 132*8d67ca89SAndroid Build Coastguard Worker * [hdestroy_r(3)](https://man7.org/linux/man-pages/man3/hdestroy_r.3.html) destroys 133*8d67ca89SAndroid Build Coastguard Worker * the hash table `__table`. 134*8d67ca89SAndroid Build Coastguard Worker * 135*8d67ca89SAndroid Build Coastguard Worker * Available since API level 28. 136*8d67ca89SAndroid Build Coastguard Worker */ 137*8d67ca89SAndroid Build Coastguard Worker void hdestroy_r(struct hsearch_data* _Nonnull __table) __INTRODUCED_IN(28); 138*8d67ca89SAndroid Build Coastguard Worker 139*8d67ca89SAndroid Build Coastguard Worker /** 140*8d67ca89SAndroid Build Coastguard Worker * [hsearch_r(3)](https://man7.org/linux/man-pages/man3/hsearch_r.3.html) finds or 141*8d67ca89SAndroid Build Coastguard Worker * inserts `__entry` in the hash table `__table`, based on `__action`. 142*8d67ca89SAndroid Build Coastguard Worker * 143*8d67ca89SAndroid Build Coastguard Worker * Returns *non-zero* on success and returns 0 and sets `errno` on failure. 144*8d67ca89SAndroid Build Coastguard Worker * A pointer to the entry is returned in `*__result`. 145*8d67ca89SAndroid Build Coastguard Worker * 146*8d67ca89SAndroid Build Coastguard Worker * Available since API level 28. 147*8d67ca89SAndroid Build Coastguard Worker */ 148*8d67ca89SAndroid Build Coastguard Worker int hsearch_r(ENTRY __entry, ACTION __action, ENTRY* _Nullable * _Nonnull __result, struct hsearch_data* _Nonnull __table) __INTRODUCED_IN(28); 149*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(28) */ 150*8d67ca89SAndroid Build Coastguard Worker 151*8d67ca89SAndroid Build Coastguard Worker 152*8d67ca89SAndroid Build Coastguard Worker #endif 153*8d67ca89SAndroid Build Coastguard Worker 154*8d67ca89SAndroid Build Coastguard Worker /** 155*8d67ca89SAndroid Build Coastguard Worker * [lfind(3)](https://man7.org/linux/man-pages/man3/lfind.3.html) brute-force 156*8d67ca89SAndroid Build Coastguard Worker * searches the unsorted array `__array` (of `__count` items each of size `__size`) 157*8d67ca89SAndroid Build Coastguard Worker * for `__key`, using `__comparator`. 158*8d67ca89SAndroid Build Coastguard Worker * 159*8d67ca89SAndroid Build Coastguard Worker * See bsearch() if you have a sorted array. 160*8d67ca89SAndroid Build Coastguard Worker * 161*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to the matching element on success, or NULL on failure. 162*8d67ca89SAndroid Build Coastguard Worker */ 163*8d67ca89SAndroid Build Coastguard Worker void* _Nullable lfind(const void* _Nonnull __key, const void* _Nonnull __array, size_t* _Nonnull __count, size_t __size, int (* _Nonnull __comparator)(const void* _Nonnull, const void* _Nonnull)); 164*8d67ca89SAndroid Build Coastguard Worker 165*8d67ca89SAndroid Build Coastguard Worker /** 166*8d67ca89SAndroid Build Coastguard Worker * [lsearch(3)](https://man7.org/linux/man-pages/man3/lsearch.3.html) brute-force 167*8d67ca89SAndroid Build Coastguard Worker * searches the unsorted array `__array` (of `__count` items each of size `__size`) 168*8d67ca89SAndroid Build Coastguard Worker * for `__key`, using `__comparator`. 169*8d67ca89SAndroid Build Coastguard Worker * 170*8d67ca89SAndroid Build Coastguard Worker * Unlike lfind(), on failure lsearch() will *insert* `__key` at the end of 171*8d67ca89SAndroid Build Coastguard Worker * `__array` and increment `*__count`. 172*8d67ca89SAndroid Build Coastguard Worker * 173*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to the matching element on success, or to the newly-added 174*8d67ca89SAndroid Build Coastguard Worker * element on failure. 175*8d67ca89SAndroid Build Coastguard Worker */ 176*8d67ca89SAndroid Build Coastguard Worker void* _Nonnull lsearch(const void* _Nonnull __key, void* _Nonnull __array, size_t* _Nonnull __count, size_t __size, int (* _Nonnull __comparator)(const void* _Nonnull, const void* _Nonnull)); 177*8d67ca89SAndroid Build Coastguard Worker 178*8d67ca89SAndroid Build Coastguard Worker /** 179*8d67ca89SAndroid Build Coastguard Worker * [tdelete(3)](https://man7.org/linux/man-pages/man3/tdelete.3.html) searches 180*8d67ca89SAndroid Build Coastguard Worker * for and removes an element in the tree `*__root_ptr`. The search is performed 181*8d67ca89SAndroid Build Coastguard Worker * using `__comparator`. 182*8d67ca89SAndroid Build Coastguard Worker * 183*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to the parent of the deleted node, or NULL on failure. 184*8d67ca89SAndroid Build Coastguard Worker */ 185*8d67ca89SAndroid Build Coastguard Worker void* _Nullable tdelete(const void* _Nonnull __key, void* _Nullable * _Nullable __root_ptr, int (* _Nonnull __comparator)(const void* _Nonnull, const void* _Nonnull)); 186*8d67ca89SAndroid Build Coastguard Worker 187*8d67ca89SAndroid Build Coastguard Worker /** 188*8d67ca89SAndroid Build Coastguard Worker * [tdestroy(3)](https://man7.org/linux/man-pages/man3/tdestroy.3.html) destroys 189*8d67ca89SAndroid Build Coastguard Worker * the hash table `__root` using `__free_fn` on each node. 190*8d67ca89SAndroid Build Coastguard Worker */ 191*8d67ca89SAndroid Build Coastguard Worker void tdestroy(void* _Nullable __root, void (* _Nullable __free_fn)(void* _Nullable)); 192*8d67ca89SAndroid Build Coastguard Worker 193*8d67ca89SAndroid Build Coastguard Worker /** 194*8d67ca89SAndroid Build Coastguard Worker * [tfind(3)](https://man7.org/linux/man-pages/man3/tfind.3.html) searches 195*8d67ca89SAndroid Build Coastguard Worker * for an element in the tree `*__root_ptr`. The search is performed using 196*8d67ca89SAndroid Build Coastguard Worker * `__comparator`. 197*8d67ca89SAndroid Build Coastguard Worker * 198*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to the matching node, or NULL on failure. 199*8d67ca89SAndroid Build Coastguard Worker */ 200*8d67ca89SAndroid Build Coastguard Worker void* _Nullable tfind(const void* _Nonnull __key, void* _Nullable const* _Nullable __root_ptr, int (* _Nonnull __comparator)(const void* _Nonnull, const void* _Nonnull)); 201*8d67ca89SAndroid Build Coastguard Worker 202*8d67ca89SAndroid Build Coastguard Worker /** 203*8d67ca89SAndroid Build Coastguard Worker * [tsearch(3)](https://man7.org/linux/man-pages/man3/tsearch.3.html) searches 204*8d67ca89SAndroid Build Coastguard Worker * for an element in the tree `*__root_ptr`. The search is performed using 205*8d67ca89SAndroid Build Coastguard Worker * `__comparator`. 206*8d67ca89SAndroid Build Coastguard Worker * 207*8d67ca89SAndroid Build Coastguard Worker * Unlike tfind(), on failure tsearch() will *insert* `__key` into the tree. 208*8d67ca89SAndroid Build Coastguard Worker * 209*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to the matching node, or to the newly-added node. 210*8d67ca89SAndroid Build Coastguard Worker */ 211*8d67ca89SAndroid Build Coastguard Worker void* _Nullable tsearch(const void* _Nonnull __key, void* _Nullable * _Nullable __root_ptr, int (* _Nonnull __comparator)(const void* _Nonnull, const void* _Nonnull)); 212*8d67ca89SAndroid Build Coastguard Worker 213*8d67ca89SAndroid Build Coastguard Worker /** 214*8d67ca89SAndroid Build Coastguard Worker * [twalk(3)](https://man7.org/linux/man-pages/man3/twalk.3.html) calls 215*8d67ca89SAndroid Build Coastguard Worker * `__visitor` on every node in the tree. 216*8d67ca89SAndroid Build Coastguard Worker */ 217*8d67ca89SAndroid Build Coastguard Worker void twalk(const void* _Nullable __root, void (* _Nullable __visitor)(const void* _Nullable, VISIT, int)); 218*8d67ca89SAndroid Build Coastguard Worker 219*8d67ca89SAndroid Build Coastguard Worker __END_DECLS 220