1 /*********************** -*- Mode: C -*- ***********************
2  * File            : bintree_findlast.c
3  *---------------------------------------------------------------
4  * Description
5  * ===========
6  * This operation returns the last "clientnode" present in the
7  * specified "tree"
8  *
9  * tree - the "tree" instance to invoke this operation upon
10  *
11  * RETURNS
12  * "clientnode" instance or NULL if no nodes are present in this view.
13  *
14  *---------------------------------------------------------------
15  * Author          : Graeme McKerrell
16  * Created On      : Wed Jan 28 10:17:17 2004
17  * Status          : TESTED
18  *---------------------------------------------------------------
19  * HISTORY
20  * 7-Dec-2004		Graeme McKerrell
21  *    Renamed to the "lub_" namespace
22  * 5-May-2004		Graeme McKerrell
23  *    updates following review
24  * 2-Mar-2004		Graeme McKerrell
25  *    fixed comparison logic
26  * 9-Feb-2004		Graeme McKerrell
27  *    update to use new getkey prototype, removed the now spurious
28  *    nullgetkey() function
29  * 28-Jan-2004		Graeme McKerrell
30  *   Initial version
31  *---------------------------------------------------------------
32  * Copyright (C) 2004 3Com Corporation. All Rights Reserved.
33  **************************************************************** */
34 #include "private.h"
35 
36 /* forward declare these functions */
37 static lub_bintree_compare_fn compareright;
38 
39 /*--------------------------------------------------------- */
lub_bintree_findlast(lub_bintree_t * this)40 void *lub_bintree_findlast(lub_bintree_t * this)
41 {
42 	lub_bintree_compare_fn *client_compare = this->compareFn;
43 
44 	/*
45 	 * put dummy functions in place
46 	 * This will make the search faster and direct it to the right most
47 	 * node
48 	 */
49 	this->compareFn = compareright;
50 
51 	/*
52 	 * the key doesn't matter here cos we've cobbled the compare function
53 	 */
54 	this->root = lub_bintree_splay(this, this->root, NULL);
55 
56 	/* restore the client functions */
57 	this->compareFn = client_compare;
58 
59 	if (NULL == this->root)
60 		return NULL;
61 	else
62 		return lub_bintree_getclientnode(this, this->root);
63 }
64 
65 /*--------------------------------------------------------- */
66 /*
67  * This comparison operation always returns -1 hence will force a
68  * search to the left most node.
69  *
70  * key1 - first node to compare (not used)
71  * key2 - second node to compare (not used)
72  */
compareright(const void * clientnode,const void * clientkey)73 static int compareright(const void *clientnode, const void *clientkey)
74 {
75 	clientnode = clientnode;
76 	clientkey = clientkey;
77 	return -1;
78 }
79 
80 /*--------------------------------------------------------- */
81