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,
--- a/mapfile-vers	Thu Sep 16 22:39:12 2021 -0400
+++ b/mapfile-vers	Thu Sep 16 23:34:34 2021 -0400
@@ -56,6 +56,7 @@
 		# buffer
 		buffer_alloc;
 		buffer_copy;
+		buffer_delete;
 		buffer_free;
 		buffer_init_heap;
 		buffer_init_sink;