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