Rewrite to allow omitting initialization of global variables.
[kopensolaris-gnu/glibc.git] / misc / tsearch.c
index c06930d..0cf854b 100644 (file)
@@ -85,6 +85,7 @@
    binary tree.  */
 
 #include <stdlib.h>
+#include <string.h>
 #include <search.h>
 
 typedef struct node_t
@@ -358,8 +359,7 @@ __tdelete (const void *key, void **vrootp, __compar_fn_t compar)
          node **newstack;
          stacksize += 20;
          newstack = alloca (sizeof (node *) * stacksize);
-         memcpy (newstack, nodestack, sp * sizeof (node *));
-         nodestack = newstack;
+         nodestack = memcpy (newstack, nodestack, sp * sizeof (node *));
        }
 
       nodestack[sp++] = rootp;
@@ -397,8 +397,7 @@ __tdelete (const void *key, void **vrootp, __compar_fn_t compar)
              node **newstack;
              stacksize += 20;
              newstack = alloca (sizeof (node *) * stacksize);
-             memcpy (newstack, nodestack, sp * sizeof (node *));
-             nodestack = newstack;
+             nodestack = memcpy (newstack, nodestack, sp * sizeof (node *));
            }
          nodestack[sp++] = parent;
          parent = up;
@@ -592,6 +591,7 @@ weak_alias (__tdelete, tdelete)
    ROOT is the root of the tree to be walked, ACTION the function to be
    called at each node.  LEVEL is the level of ROOT in the whole tree.  */
 static void
+internal_function
 trecurse (const void *vroot, __action_fn_t action, int level)
 {
   node root = (node ) vroot;
@@ -631,18 +631,14 @@ weak_alias (__twalk, twalk)
 /* 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 && root->right == NULL)
-    (*freefct) (root->key);
-  else
-    {
-      if (root->left != NULL)
-       tdestroy_recurse (root->left, freefct);
-      if (root->right != NULL)
-       tdestroy_recurse (root->right, freefct);
-      (*freefct) (root->key);
-    }
+  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);
 }