implemented split_buffer()

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18850 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Marcus Overhagen
2006-09-14 23:04:54 +00:00
parent f452f9dc78
commit 4462d8b41b
@@ -55,7 +55,8 @@ struct net_buffer_private : net_buffer {
static status_t append_data(net_buffer *buffer, const void *data, size_t size);
static status_t trim_data(net_buffer *_buffer, size_t newSize);
static status_t remove_header(net_buffer *_buffer, size_t bytes);
static data_header *
create_data_header(size_t size, size_t headerSpace)
@@ -343,6 +344,29 @@ clone_buffer(net_buffer *_buffer, bool shareFreeSpace)
}
/*!
Split the buffer at offset, the trailer data
is returned as new buffer.
TODO: optimize and avoid making a copy.
*/
static net_buffer *
split_buffer(net_buffer *from, uint32 offset)
{
status_t err;
net_buffer *buf = duplicate_buffer(from);
if (buf == NULL)
return NULL;
if ((err = remove_header(buf, offset)) < B_OK)
goto fail;
if ((err = trim_data(from, from->size - offset)) < B_OK)
goto fail;
return buf;
fail:
free_buffer(buf);
return NULL;
}
/*!
Merges the second buffer with the first. If \a after is \c true, the
second buffer's contents will be appended to the first ones, else they
@@ -872,7 +896,7 @@ net_buffer_module_info gNetBufferModule = {
duplicate_buffer,
clone_buffer,
NULL, // split
split_buffer,
merge_buffer,
prepend_size,