* Copyright (c) 1990 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* %sccs.include.redist.c%
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)bt_utils.c 5.7 (Berkeley) %G%";
#endif /* LIBC_SCCS and not lint */
* __BT_RET -- Build return key/data pair as a result of search or scan.
* d: LEAF to be returned to the user.
* key: user's key structure (NULL if not to be filled in)
* data: user's data structure
* RET_SUCCESS, RET_ERROR.
__bt_ret(t
, e
, key
, data
)
bl
= GETBLEAF(e
->page
, e
->index
);
if (bl
->flags
& P_BIGDATA
) {
if (__ovfl_get(t
, bl
->bytes
+ bl
->ksize
,
&data
->size
, &t
->bt_dbuf
, &t
->bt_dbufsz
))
/* Use +1 in case the first record retrieved is 0 length. */
if (bl
->dsize
+ 1 > t
->bt_dbufsz
) {
if ((p
= realloc(t
->bt_dbuf
, bl
->dsize
+ 1)) == NULL
)
t
->bt_dbufsz
= bl
->dsize
+ 1;
bcopy(bl
->bytes
+ bl
->ksize
, t
->bt_dbuf
, t
->bt_dbufsz
);
if (bl
->flags
& P_BIGKEY
) {
if (__ovfl_get(t
, bl
->bytes
,
&key
->size
, &t
->bt_kbuf
, &t
->bt_kbufsz
))
if (bl
->ksize
> t
->bt_kbufsz
) {
if ((p
= realloc(t
->bt_kbuf
, bl
->ksize
)) == NULL
)
t
->bt_kbufsz
= bl
->ksize
;
bcopy(bl
->bytes
, t
->bt_kbuf
, t
->bt_kbufsz
);
* __BT_CMP -- Compare a key to a given record.
* k1: DBT pointer of first arg to comparison
* e: pointer to EPG for comparison
* The left-most key on internal pages, at any level of the tree, is
* guaranteed by the following code to be less than any user key.
* This saves us from having to update the leftmost key on an internal
* page when the user inserts a new key in the tree smaller than
* anything we've yet seen.
if (e
->index
== 0 && h
->prevpg
== P_INVALID
&& !(h
->flags
& P_BLEAF
))
if (h
->flags
& P_BLEAF
) {
bl
= GETBLEAF(h
, e
->index
);
if (bl
->flags
& P_BIGKEY
)
bi
= GETBINTERNAL(h
, e
->index
);
if (bi
->flags
& P_BIGKEY
)
if (__ovfl_get(t
, bigkey
,
&k2
.size
, &t
->bt_dbuf
, &t
->bt_dbufsz
))
return((*t
->bt_cmp
)(k1
, &k2
));
* __BT_DEFCMP -- Default comparison routine.
register u_char
*p1
, *p2
;
len
= MIN(a
->size
, b
->size
);
for (p1
= a
->data
, p2
= b
->data
; len
--; ++p1
, ++p2
)
return(a
->size
- b
->size
);
* __BT_DEFPFX -- Default prefix routine.
* Number of bytes needed to distinguish b from a.
register u_char
*p1
, *p2
;
len
= MIN(a
->size
, b
->size
);
for (p1
= a
->data
, p2
= b
->data
; len
--; ++p1
, ++p2
, ++cnt
)
/* a->size must be <= b->size, or they wouldn't be in this order. */
return (a
->size
< b
->size
? a
->size
+ 1 : a
->size
);