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;