Forgot to add GNU headers, here they are.
[cacao.git] / toolbox / tree.c
index d38f4d7e1eba222d267c3157519dd7e9333db425..b0d65549493858449fe5d2ac6eb68e40ca46d933 100644 (file)
@@ -1,16 +1,36 @@
-/************************** toolbox/tree.c *************************************
+/* toolbox/tree.h - binary tree management
 
-       Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
+   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+   Institut f. Computersprachen, TU Wien
+   R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Probst,
+   S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich,
+   J. Wenninger
 
-       See file COPYRIGHT for information on usage and disclaimer of warranties
+   This file is part of CACAO.
 
-       Not documented, see tree.h.
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
 
-       Authors: Reinhard Grafl      EMAIL: cacao@complang.tuwien.ac.at
+   This program 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
+   General Public License for more details.
 
-       Last Change: 1996/10/03
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA.
+
+   Contact: cacao@complang.tuwien.ac.at
+
+   Authors: Reinhard Grafl
+
+   $Id: tree.c 684 2003-12-02 16:50:17Z twisti $
+
+*/
 
-*******************************************************************************/
 
 #include <stdio.h>
 #include <assert.h>
 #include "tree.h"
 
 
-tree *tree_new (treeelementcomperator comperator)
+tree *tree_new(treeelementcomperator comperator)
 {
-       tree *t = NEW (tree);
+       tree *t = NEW(tree);
        
-       t -> usedump = 0;
-       t -> comperator = comperator;
-       t -> top = NULL;
-       t -> active = NULL;
+       t->usedump = 0;
+       t->comperator = comperator;
+       t->top = NULL;
+       t->active = NULL;
                
        return t;
 }
 
-tree *tree_dnew (treeelementcomperator comperator)
+
+tree *tree_dnew(treeelementcomperator comperator)
 {
-       tree *t = DNEW (tree);
+       tree *t = DNEW(tree);
        
-       t -> usedump = 1;
-       t -> comperator = comperator;
-       t -> top = NULL;
-       t -> active = NULL;
+       t->usedump = 1;
+       t->comperator = comperator;
+       t->top = NULL;
+       t->active = NULL;
        
        return t;
 }
 
 
-static void tree_nodefree (treenode *tn)
+static void tree_nodefree(treenode *tn)
 {
-       if (!tn) return;
-       tree_nodefree (tn -> left);
-       tree_nodefree (tn -> right);
-       FREE (tn, treenode);
+       if (!tn)
+               return;
+
+       tree_nodefree(tn->left);
+       tree_nodefree(tn->right);
+       FREE(tn, treenode);
 }
 
-void tree_free (tree *t)
+
+void tree_free(tree *t)
 {
-       assert (! t -> usedump);
+       assert(!t->usedump);
        
-       tree_nodefree ( t -> top );
-       FREE (t, tree);
+       tree_nodefree(t->top);
+       FREE(t, tree);
 }
 
 
-static treenode *tree_nodeadd 
-    (tree *t, treenode *par, treenode *n, void *element, void *key)
+static treenode *tree_nodeadd(tree *t, treenode *par, treenode *n, 
+                                                         void *element, void *key)
 {
        if (!n) {
-               if ( t-> usedump )  n = DNEW (treenode);
-               else                n = NEW (treenode);
-               
-               n -> left = NULL;
-               n -> right = NULL;
-               n -> parent = par;
-               n -> element = element;
+               if (t->usedump) {
+                       n = DNEW(treenode);
+
+               } else {
+                       n = NEW(treenode);
                }
-       else {
-               if ( t->comperator (key, n -> element) < 0 ) {
-                       n -> left = tree_nodeadd (t, n, n -> left, element, key);
-                       }
-               else {
-                       n -> right = tree_nodeadd (t, n, n -> right, element, key);
-                       }
+               
+               n->left = NULL;
+               n->right = NULL;
+               n->parent = par;
+               n->element = element;
+
+       } else {
+               if (t->comperator(key, n->element) < 0) {
+                       n->left = tree_nodeadd(t, n, n->left, element, key);
+
+               } else {
+                       n->right = tree_nodeadd(t, n, n->right, element, key);
                }
+       }
                
        return n;
 }
 
-void tree_add (tree *t, void *element, void *key)
+
+void tree_add(tree *t, void *element, void *key)
 {
-       t -> top = tree_nodeadd (t, NULL, t -> top, element, key);
-       t -> active = t -> top;
+       t->top = tree_nodeadd(t, NULL, t->top, element, key);
+       t->active = t->top;
 }
 
 
-static treenode *tree_nodefind (tree *t, treenode *n, void *key)
+static treenode *tree_nodefind(tree *t, treenode *n, void *key)
 {
        int way;
 
-       if (!n) return NULL;
+       if (!n)
+               return NULL;
+
+       way = t->comperator(key, n->element);
+       if (way == 0)
+               return n;
 
-       way = t -> comperator (key, n->element);
-       if (way==0) return n;
-       if (way<0) return tree_nodefind (t, n -> left, key);
-       else       return tree_nodefind (t, n -> right, key);
+       if (way < 0) {
+               return tree_nodefind(t, n->left, key);
+
+       } else {
+               return tree_nodefind (t, n -> right, key);
+       }
 }
 
 
-void *tree_find (tree *t, void *key)
+void *tree_find(tree *t, void *key)
 {
-       treenode *tn = tree_nodefind (t, t -> top, key);
-       if (!tn) return NULL;
+       treenode *tn = tree_nodefind(t, t->top, key);
+
+       if (!tn)
+               return NULL;
 
-       t -> active = tn;
-       return tn -> element;
+       t->active = tn;
+
+       return tn->element;
 }
 
 
 
-void *tree_this (tree *t)
+void *tree_this(tree *t)
 {      
-       if (! t->active) return NULL;
+       if (!t->active)
+               return NULL;
+
        return t->active->element;
 }
 
 
 static treenode *leftmostnode(treenode *t)
 {
-       while (t->left) t=t->left;
+       while (t->left) {
+               t = t->left;
+       }
+
        return t;
 }
 
-void *tree_first (tree *t)
+
+void *tree_first(tree *t)
 {
        treenode *a = t->top;
-       if (!a) return NULL;
 
-       a = leftmostnode (a);
+       if (!a)
+               return NULL;
+
+       a = leftmostnode(a);
        t->active = a;
+
        return a->element;
 }
 
+
 void *tree_next (tree *t)
 {
        treenode *a = t->active;
        treenode *comefrom = NULL;
 
        while (a) {
-               if (!a) return NULL;
+               if (!a)
+                       return NULL;
 
                if (a->left && (a->left == comefrom)) {
                        t -> active = a;
                        return a->element;
-                       }
+               }
        
-               if (a->right && (a->right != comefrom) ) {
+               if (a->right && (a->right != comefrom)) {
                        a = leftmostnode(a->right);
                        t -> active = a;
                        return a->element;
-                       }
-               
-               comefrom=a;
-               a=a->parent;
                }
+               
+               comefrom = a;
+               a = a->parent;
+       }
+
        t->active = NULL;
+
        return NULL;
 }
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */