diff src/lib/buffer.c @ 805:5ac361acb316 HEAD

Marked all non-trivial buffer modifications with @UNSAFE tag. Several cleanups and a couple of minor bugfixes.
author Timo Sirainen <tss@iki.fi>
date Wed, 18 Dec 2002 17:15:41 +0200
parents 553f050c8313
children 27774d0493dd
line wrap: on
line diff
--- a/src/lib/buffer.c	Wed Dec 18 12:40:43 2002 +0200
+++ b/src/lib/buffer.c	Wed Dec 18 17:15:41 2002 +0200
@@ -21,6 +21,8 @@
     SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
 
+/* @UNSAFE: whole file */
+
 #include "lib.h"
 #include "buffer.h"
 
@@ -212,6 +214,58 @@
 	return data_size;
 }
 
+size_t buffer_insert(Buffer *buf, size_t pos,
+		     const void *data, size_t data_size)
+{
+	size_t move_size, size;
+
+	move_size = buf->used - buf->start_pos;
+	i_assert(pos <= move_size);
+	move_size -= pos;
+
+	if (data_size < (size_t)-1 - move_size)
+		size = data_size + move_size;
+	else
+		size = (size_t)-1;
+
+	if (!buffer_check_write(buf, &pos, &size, TRUE))
+		return 0;
+
+	i_assert(size >= move_size);
+	size -= move_size;
+
+	memmove(buf->w_buffer + pos + size, buf->w_buffer + pos, move_size);
+	memcpy(buf->w_buffer + pos, data, size);
+	return size;
+}
+
+size_t buffer_delete(Buffer *buf, size_t pos, size_t size)
+{
+	size_t end_size;
+
+	if (buf->readonly)
+		return 0;
+
+	end_size = buf->used - buf->start_pos;
+	i_assert(pos <= end_size);
+	end_size -= pos;
+
+	if (size < end_size) {
+		/* delete from between */
+		memmove(buf->w_buffer + buf->start_pos + pos,
+			buf->w_buffer + buf->start_pos + pos + size,
+			end_size - size);
+		end_size = size;
+	} else {
+		/* delete the rest of the buffer */
+		size = end_size;
+		end_size = 0;
+	}
+
+	buffer_set_used_size(buf, pos + end_size);
+	return size;
+}
+
 size_t buffer_copy(Buffer *dest, size_t dest_pos,
 		   const Buffer *src, size_t src_pos, size_t copy_size)
 {