diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am index fc49e3286..4bc09516d 100644 --- a/mingw-w64-crt/Makefile.am +++ b/mingw-w64-crt/Makefile.am @@ -557,7 +557,7 @@ src_libmingwex=\ misc/mingw_wcstold.c \ misc/mkstemp.c misc/sleep.c \ misc/strnlen.c misc/strsafe.c \ - misc/strtoimax.c misc/strtoumax.c misc/tdelete.c misc/tfind.c \ + misc/strtoimax.c misc/strtoumax.c misc/tdelete.c misc/tdestroy.c misc/tfind.c \ misc/tsearch.c misc/twalk.c \ misc/wcsnlen.c misc/wcstof.c \ misc/wcstoimax.c misc/wcstold.c misc/wcstoumax.c misc/wctob.c misc/wctrans.c \ diff --git a/mingw-w64-crt/misc/tdestroy.c b/mingw-w64-crt/misc/tdestroy.c new file mode 100644 index 000000000..053f18c02 --- /dev/null +++ b/mingw-w64-crt/misc/tdestroy.c @@ -0,0 +1,24 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ + +#include +#define _SEARCH_PRIVATE +#include +#include + + +/* destroy tree recursively and call free_node on each node key */ +void tdestroy(void *root, void (*free_node)(void *)) +{ + node_t *p = (node_t *)root; + if (!p) + return; + + tdestroy(p->llink , free_node); + tdestroy(p->rlink, free_node); + free_node((void*)p->key); + free(p); +} diff --git a/mingw-w64-crt/testcases/t_tsearch.c b/mingw-w64-crt/testcases/t_tsearch.c index c4d8258e9..d9f692243 100644 --- a/mingw-w64-crt/testcases/t_tsearch.c +++ b/mingw-w64-crt/testcases/t_tsearch.c @@ -31,6 +31,11 @@ static int node_any (const void *a, const void *b) return 0; } +static void +noop_free (void *arg) +{ +} + void print_node (const void *ptr, VISIT order, int level) { const char *s = *(const char **) ptr; @@ -71,6 +76,17 @@ int main (int argc, char **argv) printf("---------- tree after deletion of all nodes using tdelete() only:\n"); twalk(root, print_node); printf("----------\n"); + + tsearch("ggg", &root, node_cmp); + tsearch("hhh", &root, node_cmp); + tsearch("iii", &root, node_cmp); + printf("---------- tree after insertion of 3 new nodes:\n"); + twalk(root, print_node); + printf("----------\n"); + tdestroy(root, noop_free); + printf("---------- tree after deletion of all nodes using tdeosty() only:\n"); + twalk(root, print_node); + printf("----------\n"); printf("Passed\n"); return 0; } diff --git a/mingw-w64-headers/crt/search.h b/mingw-w64-headers/crt/search.h index 144b0f4ec..90af34889 100644 --- a/mingw-w64-headers/crt/search.h +++ b/mingw-w64-headers/crt/search.h @@ -62,6 +62,10 @@ void * __cdecl tfind (const void *, void * const *, int (*)(const void *, const void * __cdecl tsearch (const void *, void **, int (*)(const void *, const void *)) __MINGW_ATTRIB_NONNULL (2) __MINGW_ATTRIB_NONNULL (3); void __cdecl twalk (const void *, void (*)(const void *, VISIT, int)); +#ifdef _GNU_SOURCE +void __cdecl tdestroy(void *, void (*)(void *)) __MINGW_ATTRIB_NONNULL (2); +#endif + #ifdef __cplusplus } #endif