ucx/buffer.c

changeset 62
6814aea8462d
parent 61
fb07a0ab9a17
child 63
1d3500806565
     1.1 --- a/ucx/buffer.c	Wed Oct 10 10:04:01 2012 +0200
     1.2 +++ b/ucx/buffer.c	Wed Oct 10 10:46:20 2012 +0200
     1.3 @@ -5,8 +5,8 @@
     1.4  
     1.5  struct UcxBuffer {
     1.6      void *space;
     1.7 -    off_t pos;
     1.8 -    size_t length;
     1.9 +    size_t pos;
    1.10 +    size_t size;
    1.11      int flags;
    1.12  };
    1.13  
    1.14 @@ -25,7 +25,7 @@
    1.15          } else {
    1.16              buffer->space = space;
    1.17          }
    1.18 -        buffer->length = length;
    1.19 +        buffer->size = length;
    1.20  
    1.21          buffer->pos = 0;
    1.22      }
    1.23 @@ -34,12 +34,36 @@
    1.24  }
    1.25  
    1.26  void ucx_buffer_free(UcxBuffer *buffer) {
    1.27 -    if ((buffer->flags & UCX_BUFFER_AUTOFREE) > 0) {
    1.28 +    if (ucx_buffer_testflags(buffer, UCX_BUFFER_AUTOFREE)) {
    1.29          free(buffer->space);
    1.30      }
    1.31      free(buffer);
    1.32  }
    1.33  
    1.34 +UcxBuffer *ucx_buffer_extract(
    1.35 +        UcxBuffer *src, size_t start, size_t length, int flags) {
    1.36 +    if (length == 0) {
    1.37 +        length = src->size - start;
    1.38 +    }
    1.39 +    if (start+length > src->size) {
    1.40 +        return NULL;
    1.41 +    }
    1.42 +
    1.43 +    UcxBuffer *dst = (UcxBuffer*) malloc(sizeof(UcxBuffer));
    1.44 +    if (dst) {
    1.45 +        dst->space = malloc(length);
    1.46 +        if (!dst->space) {
    1.47 +            free(dst);
    1.48 +            return NULL;
    1.49 +        }
    1.50 +        dst->size = length;
    1.51 +        dst->flags = flags | UCX_BUFFER_AUTOFREE;
    1.52 +        dst->pos = 0;
    1.53 +        memcpy(dst->space, (char*)src->space+start, length);
    1.54 +    }
    1.55 +    return dst;
    1.56 +}
    1.57 +
    1.58  int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence) {
    1.59      off_t npos;
    1.60      switch (whence) {
    1.61 @@ -56,7 +80,7 @@
    1.62  
    1.63      npos += offset;
    1.64  
    1.65 -    if (npos < 0 || npos > buffer->length) {
    1.66 +    if (npos < 0 || npos > buffer->size) {
    1.67          return -1;
    1.68      } else {
    1.69          buffer->pos = npos;
    1.70 @@ -66,17 +90,25 @@
    1.71  }
    1.72  
    1.73  int ucx_buffer_eof(UcxBuffer *buffer) {
    1.74 -    return buffer->pos >= buffer->length;
    1.75 +    return buffer->pos >= buffer->size;
    1.76  }
    1.77  
    1.78  size_t ucx_buffer_tell(UcxBuffer *buffer) {
    1.79      return buffer->pos;
    1.80  }
    1.81  
    1.82 +size_t ucx_buffer_size(UcxBuffer *buffer) {
    1.83 +    return buffer->size;
    1.84 +}
    1.85 +
    1.86 +int ucx_buffer_testflags(UcxBuffer *buffer, int flags) {
    1.87 +    return (buffer->flags & flags) == flags;
    1.88 +}
    1.89 +
    1.90  size_t ucx_bufio(void* d, size_t s, size_t n, UcxBuffer *b, _Bool read) {
    1.91      size_t len;
    1.92 -    if (b->pos + s*n > b->length) {
    1.93 -        len = b->length - b->pos;
    1.94 +    if (b->pos + s*n > b->size) {
    1.95 +        len = b->size - b->pos;
    1.96          if (s > 1) len -= len%s;
    1.97      } else {
    1.98          len = s*n;

mercurial