Wed, 10 Oct 2012 10:46:20 +0200
added extract function
test/buffer_tests.c | file | annotate | diff | comparison | revisions | |
test/buffer_tests.h | file | annotate | diff | comparison | revisions | |
test/main.c | file | annotate | diff | comparison | revisions | |
ucx/buffer.c | file | annotate | diff | comparison | revisions | |
ucx/buffer.h | file | annotate | diff | comparison | revisions |
1.1 --- a/test/buffer_tests.c Wed Oct 10 10:04:01 2012 +0200 1.2 +++ b/test/buffer_tests.c Wed Oct 10 10:46:20 2012 +0200 1.3 @@ -62,7 +62,8 @@ 1.4 ucx_buffer_putc(b, 48); ucx_buffer_putc(b, 48); ucx_buffer_putc(b, 48); 1.5 UCX_TEST_ASSERT(ucx_buffer_tell(b) == 16, "pos wrong after last 3 puts"); 1.6 UCX_TEST_ASSERT(ucx_buffer_eof(b), "eof not set"); 1.7 - UCX_TEST_ASSERT(ucx_buffer_putc(b, 48) == EOF, "put shall return EOF on memof"); 1.8 + UCX_TEST_ASSERT(ucx_buffer_putc(b, 48) == EOF, 1.9 + "put shall return EOF when buffer is full"); 1.10 UCX_TEST_ASSERT(memcmp(buffer, "000 000", 16) == 0, 1.11 "buffer contains incorrect content"); 1.12 1.13 @@ -184,3 +185,28 @@ 1.14 ucx_buffer_free(b); 1.15 free(buffer); 1.16 } 1.17 + 1.18 +UCX_TEST_IMPLEMENT(test_ucx_buffer_extract) { 1.19 + char *buffer = malloc(16); 1.20 + strcpy(buffer, "this is a test!"); 1.21 + 1.22 + UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE), 1.23 + *dst = ucx_buffer_extract(src, 5, 5, UCX_BUFFER_DEFAULT); 1.24 + 1.25 + UCX_TEST_BEGIN 1.26 + UCX_TEST_ASSERT(ucx_buffer_testflags(dst, UCX_BUFFER_AUTOFREE), 1.27 + "autofree flag shall be enforced"); 1.28 + UCX_TEST_ASSERT(ucx_buffer_size(dst) == 5, "wrong size for new buffer"); 1.29 + char rb[5]; 1.30 + ucx_buffer_read(rb, 1, 5, dst); 1.31 + UCX_TEST_ASSERT(memcmp(rb, "is a ", 5) == 0, 1.32 + "new buffer has incorrect content"); 1.33 + 1.34 + UCX_TEST_ASSERT(ucx_buffer_extract(dst, 3, 3, UCX_BUFFER_DEFAULT) == NULL, 1.35 + "extract shall fail on invalid bounds"); 1.36 + 1.37 + UCX_TEST_END 1.38 + 1.39 + ucx_buffer_free(dst); 1.40 + ucx_buffer_free(src); 1.41 +}
2.1 --- a/test/buffer_tests.h Wed Oct 10 10:04:01 2012 +0200 2.2 +++ b/test/buffer_tests.h Wed Oct 10 10:46:20 2012 +0200 2.3 @@ -19,6 +19,7 @@ 2.4 UCX_TEST_DECLARE(test_ucx_buffer_getc); 2.5 UCX_TEST_DECLARE(test_ucx_buffer_write); 2.6 UCX_TEST_DECLARE(test_ucx_buffer_read); 2.7 +UCX_TEST_DECLARE(test_ucx_buffer_extract); 2.8 2.9 #ifdef __cplusplus 2.10 }
3.1 --- a/test/main.c Wed Oct 10 10:04:01 2012 +0200 3.2 +++ b/test/main.c Wed Oct 10 10:46:20 2012 +0200 3.3 @@ -169,6 +169,7 @@ 3.4 ucx_test_register(suite, test_ucx_buffer_getc); 3.5 ucx_test_register(suite, test_ucx_buffer_write); 3.6 ucx_test_register(suite, test_ucx_buffer_read); 3.7 + ucx_test_register(suite, test_ucx_buffer_extract); 3.8 3.9 ucx_test_run(suite, stdout); 3.10 fflush(stdout);
4.1 --- a/ucx/buffer.c Wed Oct 10 10:04:01 2012 +0200 4.2 +++ b/ucx/buffer.c Wed Oct 10 10:46:20 2012 +0200 4.3 @@ -5,8 +5,8 @@ 4.4 4.5 struct UcxBuffer { 4.6 void *space; 4.7 - off_t pos; 4.8 - size_t length; 4.9 + size_t pos; 4.10 + size_t size; 4.11 int flags; 4.12 }; 4.13 4.14 @@ -25,7 +25,7 @@ 4.15 } else { 4.16 buffer->space = space; 4.17 } 4.18 - buffer->length = length; 4.19 + buffer->size = length; 4.20 4.21 buffer->pos = 0; 4.22 } 4.23 @@ -34,12 +34,36 @@ 4.24 } 4.25 4.26 void ucx_buffer_free(UcxBuffer *buffer) { 4.27 - if ((buffer->flags & UCX_BUFFER_AUTOFREE) > 0) { 4.28 + if (ucx_buffer_testflags(buffer, UCX_BUFFER_AUTOFREE)) { 4.29 free(buffer->space); 4.30 } 4.31 free(buffer); 4.32 } 4.33 4.34 +UcxBuffer *ucx_buffer_extract( 4.35 + UcxBuffer *src, size_t start, size_t length, int flags) { 4.36 + if (length == 0) { 4.37 + length = src->size - start; 4.38 + } 4.39 + if (start+length > src->size) { 4.40 + return NULL; 4.41 + } 4.42 + 4.43 + UcxBuffer *dst = (UcxBuffer*) malloc(sizeof(UcxBuffer)); 4.44 + if (dst) { 4.45 + dst->space = malloc(length); 4.46 + if (!dst->space) { 4.47 + free(dst); 4.48 + return NULL; 4.49 + } 4.50 + dst->size = length; 4.51 + dst->flags = flags | UCX_BUFFER_AUTOFREE; 4.52 + dst->pos = 0; 4.53 + memcpy(dst->space, (char*)src->space+start, length); 4.54 + } 4.55 + return dst; 4.56 +} 4.57 + 4.58 int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence) { 4.59 off_t npos; 4.60 switch (whence) { 4.61 @@ -56,7 +80,7 @@ 4.62 4.63 npos += offset; 4.64 4.65 - if (npos < 0 || npos > buffer->length) { 4.66 + if (npos < 0 || npos > buffer->size) { 4.67 return -1; 4.68 } else { 4.69 buffer->pos = npos; 4.70 @@ -66,17 +90,25 @@ 4.71 } 4.72 4.73 int ucx_buffer_eof(UcxBuffer *buffer) { 4.74 - return buffer->pos >= buffer->length; 4.75 + return buffer->pos >= buffer->size; 4.76 } 4.77 4.78 size_t ucx_buffer_tell(UcxBuffer *buffer) { 4.79 return buffer->pos; 4.80 } 4.81 4.82 +size_t ucx_buffer_size(UcxBuffer *buffer) { 4.83 + return buffer->size; 4.84 +} 4.85 + 4.86 +int ucx_buffer_testflags(UcxBuffer *buffer, int flags) { 4.87 + return (buffer->flags & flags) == flags; 4.88 +} 4.89 + 4.90 size_t ucx_bufio(void* d, size_t s, size_t n, UcxBuffer *b, _Bool read) { 4.91 size_t len; 4.92 - if (b->pos + s*n > b->length) { 4.93 - len = b->length - b->pos; 4.94 + if (b->pos + s*n > b->size) { 4.95 + len = b->size - b->pos; 4.96 if (s > 1) len -= len%s; 4.97 } else { 4.98 len = s*n;
5.1 --- a/ucx/buffer.h Wed Oct 10 10:04:01 2012 +0200 5.2 +++ b/ucx/buffer.h Wed Oct 10 10:46:20 2012 +0200 5.3 @@ -1,6 +1,7 @@ 5.4 #ifndef BUFFER_H 5.5 #define BUFFER_H 5.6 5.7 +#include <sys/types.h> 5.8 #include <stdio.h> 5.9 5.10 #ifdef __cplusplus 5.11 @@ -18,6 +19,16 @@ 5.12 void ucx_buffer_free(UcxBuffer* buffer); 5.13 5.14 /* 5.15 + * the autofree flag is enforced for the new buffer 5.16 + * if length is zero, the whole remaining buffer shall be extracted 5.17 + * the position of the new buffer is set to zero 5.18 + */ 5.19 +UcxBuffer *ucx_buffer_extract(UcxBuffer *src, 5.20 + size_t start, size_t length, int flags); 5.21 +#define ucx_buffer_clone(src,flags) \ 5.22 + ucx_buffer_extract(src, 0, 0, flags) 5.23 + 5.24 +/* 5.25 * Moves the position of the buffer to a new position relative to whence. 5.26 * 5.27 * SEEK_SET marks the start of the buffer 5.28 @@ -31,6 +42,9 @@ 5.29 */ 5.30 int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence); 5.31 size_t ucx_buffer_tell(UcxBuffer *buffer); 5.32 +size_t ucx_buffer_size(UcxBuffer *buffer); 5.33 +/* returns non-zero, if at least the specified flags are set */ 5.34 +int ucx_buffer_testflags(UcxBuffer *buffer, int flags); 5.35 5.36 /* 5.37 * returns non-zero, iff the current buffer position has exceeded the last