Generic getdtsz.c.
[kopensolaris-gnu/glibc.git] / misc / tsearch.c
index c06930d..7c3a0aa 100644 (file)
@@ -1,21 +1,21 @@
-/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>, 1997.
 
    The GNU C Library is free software; you can redistribute it and/or
    This file is part of the GNU C Library.
    Contributed by Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>, 1997.
 
    The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
+   Lesser General Public License for more details.
 
 
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
 
 /* Tree search for red/black trees.
    The algorithm for adding nodes is taken from one of the many "Algorithms"
 
 /* Tree search for red/black trees.
    The algorithm for adding nodes is taken from one of the many "Algorithms"
@@ -85,6 +85,7 @@
    binary tree.  */
 
 #include <stdlib.h>
    binary tree.  */
 
 #include <stdlib.h>
+#include <string.h>
 #include <search.h>
 
 typedef struct node_t
 #include <search.h>
 
 typedef struct node_t
@@ -96,6 +97,7 @@ typedef struct node_t
   struct node_t *right;
   unsigned int red:1;
 } *node;
   struct node_t *right;
   unsigned int red:1;
 } *node;
+typedef const struct node_t *const_node;
 
 #undef DEBUGGING
 
 
 #undef DEBUGGING
 
@@ -358,8 +360,7 @@ __tdelete (const void *key, void **vrootp, __compar_fn_t compar)
          node **newstack;
          stacksize += 20;
          newstack = alloca (sizeof (node *) * stacksize);
          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;
        }
 
       nodestack[sp++] = rootp;
@@ -397,8 +398,7 @@ __tdelete (const void *key, void **vrootp, __compar_fn_t compar)
              node **newstack;
              stacksize += 20;
              newstack = alloca (sizeof (node *) * stacksize);
              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;
            }
          nodestack[sp++] = parent;
          parent = up;
@@ -592,9 +592,10 @@ 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
    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)
 {
 trecurse (const void *vroot, __action_fn_t action, int level)
 {
-  node root = (node ) vroot;
+  const_node root = (const_node) vroot;
 
   if (root->left == NULL && root->right == NULL)
     (*action) (root, leaf, level);
 
   if (root->left == NULL && root->right == NULL)
     (*action) (root, leaf, level);
@@ -617,7 +618,7 @@ trecurse (const void *vroot, __action_fn_t action, int level)
 void
 __twalk (const void *vroot, __action_fn_t action)
 {
 void
 __twalk (const void *vroot, __action_fn_t action)
 {
-  const node root = (node) vroot;
+  const_node root = (const_node) vroot;
 
   CHECK_TREE (root);
 
 
   CHECK_TREE (root);
 
@@ -631,18 +632,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
 /* 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)
 {
 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);
 }
   /* Free the node itself.  */
   free (root);
 }