[dovecot-cvs] dovecot/src/lib buffer.c,1.2,1.3
cras at procontrol.fi
cras at procontrol.fi
Sat Dec 21 21:10:37 EET 2002
Update of /home/cvs/dovecot/src/lib
In directory danu:/tmp/cvs-serv19660
Modified Files:
buffer.c
Log Message:
Fixed several bugs, added a small testsuite. Still requires careful auditing.
Index: buffer.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib/buffer.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- buffer.c 18 Dec 2002 15:15:41 -0000 1.2
+++ buffer.c 21 Dec 2002 19:10:35 -0000 1.3
@@ -43,6 +43,8 @@
if (min_size == 0)
return;
+ i_assert(buf->w_buffer == NULL || buf->alloced);
+
buf->alloc = min_size;
if (buf->w_buffer == NULL)
buf->w_buffer = p_malloc(buf->pool, buf->alloc);
@@ -102,13 +104,14 @@
return FALSE;
new_size = buf->limit;
- if (new_size == buf->alloc || new_size <= *pos)
+ if (*pos >= new_size)
return FALSE;
*data_size = new_size - *pos;
}
- buffer_alloc(buf, new_size);
+ if (new_size != buf->alloc)
+ buffer_alloc(buf, new_size);
}
if (new_size > buf->used)
@@ -142,7 +145,7 @@
buf = p_new(pool, Buffer, 1);
buf->pool = pool;
- buf->max_alloc = buf->limit = size;
+ buf->alloc = buf->max_alloc = buf->limit = size;
buf->r_buffer = buf->w_buffer = data;
return buf;
}
@@ -153,7 +156,7 @@
buf = p_new(pool, Buffer, 1);
buf->pool = pool;
- buf->used = buf->max_alloc = buf->limit = size;
+ buf->used = buf->alloc = buf->max_alloc = buf->limit = size;
buf->r_buffer = data;
buf->readonly = TRUE;
return buf;
@@ -252,10 +255,9 @@
if (size < end_size) {
/* delete from between */
+ end_size -= size;
memmove(buf->w_buffer + buf->start_pos + pos,
- buf->w_buffer + buf->start_pos + pos + size,
- end_size - size);
- end_size = size;
+ buf->w_buffer + buf->start_pos + pos + size, end_size);
} else {
/* delete the rest of the buffer */
size = end_size;
@@ -368,3 +370,51 @@
{
return buf->alloc - buf->start_pos;
}
+
+#ifdef BUFFER_TEST
+/* gcc buffer.c -o buffer liblib.a -Wall -DHAVE_CONFIG_H -DBUFFER_TEST -g */
+int main(void)
+{
+ Buffer *buf;
+ char data[12], *bufdata;
+ size_t bufsize;
+
+ memset(data, '!', sizeof(data));
+ bufdata = data + 1;
+ bufsize = sizeof(data)-2;
+
+ buf = buffer_create_data(system_pool, bufdata, bufsize);
+ i_assert(buffer_write(buf, 5, "12345", 5) == 5);
+ i_assert(buf->used == 10);
+ i_assert(buffer_write(buf, 6, "12345", 5) == 4);
+ i_assert(buf->used == 10);
+
+ buf = buffer_create_data(system_pool, bufdata, bufsize);
+ i_assert(buffer_write(buf, 0, "1234567890", 10) == 10);
+ i_assert(buffer_write(buf, 0, "12345678901", 11) == 10);
+ i_assert(buffer_append(buf, "1", 1) == 0);
+ i_assert(buf->used == 10);
+
+ buf = buffer_create_data(system_pool, bufdata, bufsize);
+ i_assert(buffer_append(buf, "12345", 5) == 5);
+ i_assert(buf->used == 5);
+ i_assert(buffer_append(buf, "123456", 6) == 5);
+ i_assert(buf->used == 10);
+
+ buf = buffer_create_data(system_pool, bufdata, bufsize);
+ i_assert(buffer_append(buf, "12345", 5) == 5);
+ i_assert(buffer_insert(buf, 2, "123456", 6) == 5);
+ i_assert(buf->used == 10);
+ i_assert(memcmp(buf->r_buffer, "1212345345", 10) == 0);
+ i_assert(buffer_delete(buf, 2, 5) == 5);
+ i_assert(buf->used == 5);
+ i_assert(memcmp(buf->r_buffer, "12345", 5) == 0);
+ i_assert(buffer_delete(buf, 3, 5) == 2);
+ i_assert(buf->used == 3);
+ i_assert(memcmp(buf->r_buffer, "123", 3) == 0);
+
+ i_assert(data[0] == '!');
+ i_assert(data[sizeof(data)-1] == '!');
+ return 0;
+}
+#endif
More information about the dovecot-cvs
mailing list