From a1380a837e87b38c06256fac373b035478a7b4a2 Mon Sep 17 00:00:00 2001
From: Eric Andersen <andersen@codepoet.org>
Date: Sat, 6 Sep 2003 00:32:05 +0000
Subject: Fix the bugs I stupidly added

---
 libc/misc/ftw/ftw.c        |  2 +-
 libc/misc/search/Makefile  |  2 +-
 libc/misc/search/tsearch.c | 27 +++++++++++++++++++++++++++
 3 files changed, 29 insertions(+), 2 deletions(-)

(limited to 'libc/misc')

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 */
+
-- 
cgit v1.2.3