added extract function

Wed, 10 Oct 2012 10:46:20 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 10 Oct 2012 10:46:20 +0200
changeset 62
6814aea8462d
parent 61
fb07a0ab9a17
child 63
1d3500806565

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

mercurial