updated
[platform/upstream/glib.git] / gtree.c
diff --git a/gtree.c b/gtree.c
index aeeb467..3cb7e1a 100644 (file)
--- a/gtree.c
+++ b/gtree.c
  * MT safe
  */
 
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include "glib.h"
 
 
@@ -37,7 +41,7 @@ typedef struct _GTreeNode  GTreeNode;
 struct _GRealTree
 {
   GTreeNode *root;
-  GCompareFuncData key_compare;
+  GCompareDataFunc key_compare;
   gpointer key_compare_data;
 };
 
@@ -55,13 +59,13 @@ static GTreeNode* g_tree_node_new                   (gpointer        key,
                                                     gpointer        value);
 static void       g_tree_node_destroy               (GTreeNode      *node);
 static GTreeNode* g_tree_node_insert                (GTreeNode      *node,
-                                                    GCompareFuncData compare,
+                                                    GCompareDataFunc compare,
                                                     gpointer        comp_data,
                                                     gpointer        key,
                                                     gpointer        value,
                                                     gint           *inserted);
 static GTreeNode* g_tree_node_remove                (GTreeNode      *node,
-                                                    GCompareFuncData compare,
+                                                    GCompareDataFunc compare,
                                                     gpointer        comp_data,
                                                     gconstpointer   key);
 static GTreeNode* g_tree_node_balance               (GTreeNode      *node);
@@ -71,8 +75,8 @@ static GTreeNode* g_tree_node_restore_left_balance  (GTreeNode      *node,
                                                     gint            old_balance);
 static GTreeNode* g_tree_node_restore_right_balance (GTreeNode      *node,
                                                     gint            old_balance);
-static gpointer   g_tree_node_lookup                (GTreeNode      *node,
-                                                    GCompareFuncData compare,
+static GTreeNode* g_tree_node_lookup                (GTreeNode      *node,
+                                                    GCompareDataFunc compare,
                                                     gpointer        comp_data,
                                                     gconstpointer   key);
 static gint       g_tree_node_count                 (GTreeNode      *node);
@@ -153,7 +157,7 @@ g_tree_node_destroy (GTreeNode *node)
    }
 }
 
-GTree*  g_tree_new_udata(GCompareFuncData key_compare_func,
+GTree*  g_tree_new_udata(GCompareDataFunc key_compare_func,
                           gpointer        key_compare_data)
 {
   GRealTree *rtree;
@@ -171,7 +175,7 @@ GTree*       g_tree_new_udata(GCompareFuncData key_compare_func,
 GTree*
 g_tree_new (GCompareFunc key_compare_func)
 {
-  return g_tree_new_udata ((GCompareFuncData) key_compare_func, NULL);
+  return g_tree_new_udata ((GCompareDataFunc) key_compare_func, NULL);
 }
 
 
@@ -225,13 +229,46 @@ g_tree_lookup (GTree         *tree,
               gconstpointer  key)
 {
   GRealTree *rtree;
+  GTreeNode *node;
 
   g_return_val_if_fail (tree != NULL, NULL);
 
   rtree = (GRealTree*) tree;
 
-  return g_tree_node_lookup (rtree->root, rtree->key_compare, 
+  node = g_tree_node_lookup (rtree->root, rtree->key_compare, 
                              rtree->key_compare_data, key);
+
+  return node ? node->value : NULL;
+}
+
+gboolean
+g_tree_lookup_extended (GTree         *tree,
+                        gconstpointer  lookup_key,
+                        gpointer      *orig_key,
+                        gpointer      *value)
+{
+  GRealTree *rtree;
+  GTreeNode *node;
+  
+  g_return_val_if_fail (tree != NULL, FALSE);
+  
+  rtree = (GRealTree*) tree;
+  
+  node = g_tree_node_lookup (rtree->root, 
+                             rtree->key_compare,
+                             rtree->key_compare_data, 
+                             lookup_key);
+
+  if (node)
+    {
+      if (orig_key)
+        *orig_key = node->key;
+      if (value)
+        *value = node->value;
+      return TRUE;
+    }
+  else
+    return FALSE;
 }
 
 void
@@ -318,7 +355,7 @@ g_tree_nnodes (GTree *tree)
 
 static GTreeNode*
 g_tree_node_insert (GTreeNode      *node,
-                   GCompareFuncData compare,
+                   GCompareDataFunc compare,
                    gpointer        compare_data,
                    gpointer        key,
                    gpointer        value,
@@ -389,7 +426,7 @@ g_tree_node_insert (GTreeNode      *node,
 
 static GTreeNode*
 g_tree_node_remove (GTreeNode      *node,
-                   GCompareFuncData compare,
+                   GCompareDataFunc compare,
                    gpointer        compare_data,
                    gconstpointer   key)
 {
@@ -520,9 +557,9 @@ g_tree_node_restore_right_balance (GTreeNode *node,
   return node;
 }
 
-static gpointer
+static GTreeNode *
 g_tree_node_lookup (GTreeNode      *node,
-                   GCompareFuncData compare,
+                   GCompareDataFunc compare,
                    gpointer        compare_data,
                    gconstpointer   key)
 {
@@ -533,7 +570,7 @@ g_tree_node_lookup (GTreeNode      *node,
 
   cmp = (* compare) (key, node->key, compare_data);
   if (cmp == 0)
-    return node->value;
+    return node;
 
   if (cmp < 0)
     {
@@ -645,7 +682,7 @@ g_tree_node_search (GTreeNode     *node,
       node = node->left;
     else if (dir > 0)
       node = node->right;
-  } while (node && (dir != 0));
+  } while (node);
 
   return NULL;
 }