summaryrefslogtreecommitdiff
path: root/libc/misc
diff options
context:
space:
mode:
Diffstat (limited to 'libc/misc')
-rw-r--r--libc/misc/ftw/ftw.c2
-rw-r--r--libc/misc/search/Makefile2
-rw-r--r--libc/misc/search/tsearch.c27
3 files changed, 29 insertions, 2 deletions
diff --git a/libc/misc/ftw/ftw.c b/libc/misc/ftw/ftw.c
index e756c41ab..ff3920fe9 100644
--- a/libc/misc/ftw/ftw.c
+++ b/libc/misc/ftw/ftw.c
@@ -486,7 +486,7 @@ ftw_startup (const char *dir, int is_nftw, void *func, int descriptors, int flag
data.dirbuf = (char *) malloc (data.dirbufsize);
if (data.dirbuf == NULL)
return -1;
- cp = __stpcpy (data.dirbuf, dir);
+ cp = stpcpy (data.dirbuf, dir);
/* Strip trailing slashes. */
while (cp > data.dirbuf + 1 && cp[-1] == '/')
--cp;
diff --git a/libc/misc/search/Makefile b/libc/misc/search/Makefile
index 77175aca1..fa28f21d6 100644
--- a/libc/misc/search/Makefile
+++ b/libc/misc/search/Makefile
@@ -25,7 +25,7 @@ TOPDIR=../../../
include $(TOPDIR)Rules.mak
MSRC1=tsearch.c
-MOBJ1=tsearch.o tfind.o tdelete.o twalk.o
+MOBJ1=tsearch.o tfind.o tdelete.o twalk.o tdestroy.o
MSRC2=lsearch.c
MOBJ2=lfind.o lsearch.o
diff --git a/libc/misc/search/tsearch.c b/libc/misc/search/tsearch.c
index b584e2f15..72abcee7b 100644
--- a/libc/misc/search/tsearch.c
+++ b/libc/misc/search/tsearch.c
@@ -28,6 +28,7 @@ Cambridge, MA 02139, USA. */
*/
/*LINTLIBRARY*/
+#define _GNU_SOURCE
#include <search.h>
#include <stdlib.h>
@@ -187,4 +188,30 @@ void twalk(__const void *vroot, __action_fn_t action)
}
#endif
+#ifdef L_tdestroy
+/* The standardized functions miss an important functionality: the
+ tree cannot be removed easily. We provide a function to do this. */
+static void
+internal_function
+tdestroy_recurse (node *root, __free_fn_t freefct)
+{
+ if (root->left != NULL)
+ tdestroy_recurse (root->left, freefct);
+ if (root->right != NULL)
+ tdestroy_recurse (root->right, freefct);
+ (*freefct) ((void *) root->key);
+ /* Free the node itself. */
+ free (root);
+}
+
+void tdestroy (void *vroot, __free_fn_t freefct)
+{
+ node *root = (node *) vroot;
+ if (root != NULL) {
+ tdestroy_recurse (root, freefct);
+ }
+}
+#endif
+
/* tsearch.c ends here */
+