updated
[platform/upstream/glib.git] / gtree.c
diff --git a/gtree.c b/gtree.c
index 5e0c0f5..3cb7e1a 100644 (file)
--- a/gtree.c
+++ b/gtree.c
@@ -75,7 +75,7 @@ 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,
+static GTreeNode* g_tree_node_lookup                (GTreeNode      *node,
                                                     GCompareDataFunc compare,
                                                     gpointer        comp_data,
                                                     gconstpointer   key);
@@ -229,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
@@ -524,7 +557,7 @@ g_tree_node_restore_right_balance (GTreeNode *node,
   return node;
 }
 
-static gpointer
+static GTreeNode *
 g_tree_node_lookup (GTreeNode      *node,
                    GCompareDataFunc compare,
                    gpointer        compare_data,
@@ -537,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)
     {