diff --git a/headers/posix/search.h b/headers/posix/search.h index 459d558fab..1583b21023 100644 --- a/headers/posix/search.h +++ b/headers/posix/search.h @@ -49,6 +49,10 @@ extern void *tsearch(const void *key, void **_root, extern void twalk(const void *root, void (*action)(const void *, VISIT, int )); +#ifdef _GNU_SOURCE +extern void tdestroy(void *root, void (*free_key)(void *)) +#endif + #ifdef __cplusplus } #endif diff --git a/src/system/libroot/posix/musl/search/Jamfile b/src/system/libroot/posix/musl/search/Jamfile index a70172d45f..42a1e95841 100644 --- a/src/system/libroot/posix/musl/search/Jamfile +++ b/src/system/libroot/posix/musl/search/Jamfile @@ -13,6 +13,7 @@ for architectureObject in [ MultiArchSubDirSetup ] { insque.c lsearch.c tdelete.c + tdestroy.c tfind.c tsearch.c twalk.c diff --git a/src/system/libroot/posix/musl/search/tdestroy.c b/src/system/libroot/posix/musl/search/tdestroy.c new file mode 100644 index 0000000000..699a901c6a --- /dev/null +++ b/src/system/libroot/posix/musl/search/tdestroy.c @@ -0,0 +1,16 @@ +#define _GNU_SOURCE +#include +#include +#include "tsearch.h" + +void tdestroy(void *root, void (*freekey)(void *)) +{ + struct node *r = root; + + if (r == 0) + return; + tdestroy(r->a[0], freekey); + tdestroy(r->a[1], freekey); + if (freekey) freekey((void *)r->key); + free(r); +}