Mercurial > libjeffpc
changeset 850:3a53836f2274
buffer: add buffer_delete
Removes arbitrary number of bytes at arbitrary offset into the buffer.
Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Thu, 16 Sep 2021 23:34:34 -0400 |
parents | 1c4d7ff0a682 |
children | f9a9816e0142 |
files | buffer.c buffer_static.c include/jeffpc/buffer.h mapfile-vers |
diffstat | 4 files changed, 39 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/buffer.c Thu Sep 16 22:39:12 2021 -0400 +++ b/buffer.c Thu Sep 16 23:34:34 2021 -0400 @@ -181,6 +181,36 @@ return 0; } +int buffer_delete(struct buffer *buffer, size_t offset, size_t len) +{ + int ret; + + if (!buffer) + return -EINVAL; + + if (buffer->ops->check_delete) { + ret = buffer->ops->check_delete(buffer, offset, len); + if (ret) + return ret; + } + + if (!len) + return 0; /* delete(..., 0) is a no-op */ + + if (offset >= buffer->size) + return -EINVAL; + + len = MIN(len, buffer->size - offset); + + if ((offset + len) < buffer->size) + buffer->ops->move(buffer, offset, offset + len, + buffer->size - offset - len); + + buffer->size -= len; + + return 0; +} + ssize_t buffer_seek(struct buffer *buffer, off_t offset, int whence) { size_t newoff;
--- a/buffer_static.c Thu Sep 16 22:39:12 2021 -0400 +++ b/buffer_static.c Thu Sep 16 23:34:34 2021 -0400 @@ -56,6 +56,11 @@ return -ENOSPC; } +static int static_buffer_check_delete_ro(struct buffer *buffer, size_t off, size_t len) +{ + return -EROFS; +} + static int static_buffer_check_truncate_ro(struct buffer *buffer, size_t size) { return -EROFS; @@ -87,6 +92,7 @@ /* a read-only static buffer */ const struct buffer_ops static_buffer_ro = { .check_insert = static_buffer_check_insert_ro, + .check_delete = static_buffer_check_delete_ro, .check_truncate = static_buffer_check_truncate_ro, .check_write = static_buffer_check_write_ro,
--- a/include/jeffpc/buffer.h Thu Sep 16 22:39:12 2021 -0400 +++ b/include/jeffpc/buffer.h Thu Sep 16 23:34:34 2021 -0400 @@ -35,6 +35,7 @@ struct buffer_ops { /* op checking */ int (*check_insert)(struct buffer *, const void *, size_t, size_t); + int (*check_delete)(struct buffer *, size_t, size_t); int (*check_read)(struct buffer *, void *, size_t, size_t); int (*check_truncate)(struct buffer *, size_t); int (*check_write)(struct buffer *, const void *, size_t, size_t); @@ -81,6 +82,7 @@ size_t off); /* append specified number of bytes from src to dst */ extern int buffer_copy(struct buffer *dst, struct buffer *src, size_t len); +extern int buffer_delete(struct buffer *buffer, size_t offset, size_t len); extern ssize_t buffer_seek(struct buffer *buffer, off_t offset, int whence); extern int buffer_truncate(struct buffer *buffer, size_t size); extern ssize_t buffer_pread(struct buffer *buffer, void *data, size_t len,