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