]> git.sur5r.net Git - openldap/commitdiff
ITS#4549 add tavl_find3() to return closest match
authorHoward Chu <hyc@openldap.org>
Fri, 19 May 2006 15:24:16 +0000 (15:24 +0000)
committerHoward Chu <hyc@openldap.org>
Fri, 19 May 2006 15:24:16 +0000 (15:24 +0000)
include/avl.h
libraries/liblutil/tavl.c

index 05315377c0544e0ded177b7db212957bde92811b..7b1bafb14e7bd52cb020b37aabf6190f715188c5 100644 (file)
@@ -134,6 +134,9 @@ tavl_find LDAP_P((Avlnode *, const void*, AVL_CMP));
 LDAP_AVL_F( Avlnode* )
 tavl_find2 LDAP_P((Avlnode *, const void*, AVL_CMP));
 
+LDAP_AVL_F( Avlnode* )
+tavl_find3 LDAP_P((Avlnode *, const void*, AVL_CMP, int *ret));
+
 #define        TAVL_DIR_LEFT   0
 #define        TAVL_DIR_RIGHT  1
 
index f4a8d84e53b36b9706fc57d195094681eb6cd11a..0e7283c55422f13d392616356dee1f7295e67583 100644 (file)
@@ -443,6 +443,26 @@ tavl_free( Avlnode *root, AVL_FREE dfree )
  * < 0 if arg1 is less than arg2 and > 0 if arg1 is greater than arg2.
  */
 
+/*
+ * tavl_find2 - returns Avlnode instead of data pointer.
+ * tavl_find3 - as above, but returns Avlnode even if no match is found.
+ *                             also return the last comparison result in ret.
+ */
+Avlnode *
+tavl_find3( Avlnode *root, const void *data, AVL_CMP fcmp, int *ret )
+{
+       int     cmp, dir;
+       Avlnode *prev;
+
+       while ( root != 0 && (cmp = (*fcmp)( data, root->avl_data )) != 0 ) {
+               prev = root;
+               dir = cmp > 0;
+               root = avl_child( root, dir );
+       }
+       *ret = cmp;
+       return root ? root : prev;
+}
+
 Avlnode *
 tavl_find2( Avlnode *root, const void *data, AVL_CMP fcmp )
 {