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