diff -r c80c910fe191 -r abae4669fba7 ucx/buffer.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ucx/buffer.c Wed Oct 10 09:54:57 2012 +0200 @@ -0,0 +1,118 @@ +#include "buffer.h" +#include +#include +#include + +struct UcxBuffer { + void *space; + off_t pos; + size_t length; + _Bool autofree; +}; + +UcxBuffer *ucx_buffer_new(void *space, size_t length) { + UcxBuffer *buffer = (UcxBuffer*) malloc(sizeof(UcxBuffer)); + if (buffer) { + if (!space) { + buffer->space = malloc(length); + if (!buffer->space) { + free(buffer); + return NULL; + } + memset(buffer->space, 0, length); + buffer->autofree = 1; + } else { + buffer->space = space; + buffer->autofree = 0; + } + buffer->length = length; + + buffer->pos = 0; + } + + return buffer; +} + +void ucx_buffer_free(UcxBuffer *buffer) { + if (buffer->autofree) { + free(buffer->space); + } + free(buffer); +} + +int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence) { + off_t npos; + switch (whence) { + case SEEK_SET: + npos = 0; + break; + case SEEK_CUR: + npos = buffer->pos; + break; + case SEEK_END: + npos = strlen(buffer->space); + break; + } + + npos += offset; + + if (npos < 0 || npos > buffer->length) { + return -1; + } else { + buffer->pos = npos; + return 0; + } + +} + +int ucx_buffer_eof(UcxBuffer *buffer) { + return buffer->pos >= buffer->length; +} + +size_t ucx_buffer_tell(UcxBuffer *buffer) { + return buffer->pos; +} + +size_t ucx_bufio(void* d, size_t s, size_t n, UcxBuffer *b, _Bool read) { + size_t len; + if (b->pos + s*n > b->length) { + len = b->length - b->pos; + if (s > 1) len -= len%s; + } else { + len = s*n; + } + + if (len == 0) { + return 0; + } + + if (read) { + memcpy(d, (char*)b->space+b->pos, len); + } else { + memcpy((char*)b->space+b->pos, d, len); + } + b->pos += len; + + return len; +} + +int ucx_buffer_putc(UcxBuffer *buffer, int c) { + if (ucx_buffer_eof(buffer)) { + return EOF; + } else { + c &= 0xFF; + ((char*)(buffer->space))[buffer->pos] = (char) c; + buffer->pos++; + return c; + } +} + +int ucx_buffer_getc(UcxBuffer *buffer) { + if (ucx_buffer_eof(buffer)) { + return EOF; + } else { + int c = ((char*)(buffer->space))[buffer->pos]; + buffer->pos++; + return c; + } +}