Mercurial > dovecot > original-hg > dovecot-1.2
changeset 830:27774d0493dd HEAD
Fixed several bugs, added a small testsuite. Still requires careful auditing.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 21 Dec 2002 21:10:35 +0200 |
parents | 56bbee9df6f4 |
children | 0ae9b03a0f05 |
files | src/lib/buffer.c |
diffstat | 1 files changed, 57 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/buffer.c Sat Dec 21 16:06:21 2002 +0200 +++ b/src/lib/buffer.c Sat Dec 21 21:10:35 2002 +0200 @@ -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