/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 2005-2008 The OpenLDAP Foundation.
+ * Copyright 2005-2013 The OpenLDAP Foundation.
* Portions Copyright (c) 2005 by Howard Chu, Symas Corp.
* All rights reserved.
*
#include "portable.h"
+#include <limits.h>
#include <stdio.h>
#include <ac/stdlib.h>
#define AVL_INTERNAL
#include "avl.h"
+/* Maximum tree depth this host's address space could support */
+#define MAX_TREE_DEPTH (sizeof(void *) * CHAR_BIT)
+
static const int avl_bfs[] = {LH, RH};
/*
int side, side_bf, shorter, nside = -1;
/* parent stack */
- Avlnode *pptr[sizeof(void *)*8];
- unsigned char pdir[sizeof(void *)*8];
+ Avlnode *pptr[MAX_TREE_DEPTH];
+ unsigned char pdir[MAX_TREE_DEPTH];
int depth = 0;
if ( *root == NULL )
/*
* 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.
+ * also set *ret = last comparison result, or -1 if root == NULL.
*/
Avlnode *
tavl_find3( Avlnode *root, const void *data, AVL_CMP fcmp, int *ret )
{
- int cmp, dir;
- Avlnode *prev;
+ int cmp = -1, dir;
+ Avlnode *prev = root;
while ( root != 0 && (cmp = (*fcmp)( data, root->avl_data )) != 0 ) {
prev = root;