--- src/sbin/hammer/misc.c 2008/01/17 04:59:48 1.1 +++ src/sbin/hammer/misc.c 2008/01/21 00:03:31 1.2 @@ -36,3 +36,51 @@ #include "hammer.h" +/* + * (taken from /usr/src/sys/vfs/hammer/hammer_btree.c) + * + * Compare two B-Tree elements, return -N, 0, or +N (e.g. similar to strcmp). + * + * Note that for this particular function a return value of -1, 0, or +1 + * can denote a match if delete_tid is otherwise discounted. A delete_tid + * of zero is considered to be 'infinity' in comparisons. + * + * See also hammer_rec_rb_compare() and hammer_rec_cmp() in hammer_object.c. + */ +int +hammer_btree_cmp(hammer_base_elm_t key1, hammer_base_elm_t key2) +{ + if (key1->obj_id < key2->obj_id) + return(-4); + if (key1->obj_id > key2->obj_id) + return(4); + + if (key1->rec_type < key2->rec_type) + return(-3); + if (key1->rec_type > key2->rec_type) + return(3); + + if (key1->key < key2->key) + return(-2); + if (key1->key > key2->key) + return(2); + + /* + * A delete_tid of zero indicates a record which has not been + * deleted yet and must be considered to have a value of positive + * infinity. + */ + if (key1->delete_tid == 0) { + if (key2->delete_tid == 0) + return(0); + return(1); + } + if (key2->delete_tid == 0) + return(-1); + if (key1->delete_tid < key2->delete_tid) + return(-1); + if (key1->delete_tid > key2->delete_tid) + return(1); + return(0); +} +