1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/ucx/buffer.c Wed Oct 10 09:54:57 2012 +0200 1.3 @@ -0,0 +1,118 @@ 1.4 +#include "buffer.h" 1.5 +#include <stdarg.h> 1.6 +#include <stdlib.h> 1.7 +#include <string.h> 1.8 + 1.9 +struct UcxBuffer { 1.10 + void *space; 1.11 + off_t pos; 1.12 + size_t length; 1.13 + _Bool autofree; 1.14 +}; 1.15 + 1.16 +UcxBuffer *ucx_buffer_new(void *space, size_t length) { 1.17 + UcxBuffer *buffer = (UcxBuffer*) malloc(sizeof(UcxBuffer)); 1.18 + if (buffer) { 1.19 + if (!space) { 1.20 + buffer->space = malloc(length); 1.21 + if (!buffer->space) { 1.22 + free(buffer); 1.23 + return NULL; 1.24 + } 1.25 + memset(buffer->space, 0, length); 1.26 + buffer->autofree = 1; 1.27 + } else { 1.28 + buffer->space = space; 1.29 + buffer->autofree = 0; 1.30 + } 1.31 + buffer->length = length; 1.32 + 1.33 + buffer->pos = 0; 1.34 + } 1.35 + 1.36 + return buffer; 1.37 +} 1.38 + 1.39 +void ucx_buffer_free(UcxBuffer *buffer) { 1.40 + if (buffer->autofree) { 1.41 + free(buffer->space); 1.42 + } 1.43 + free(buffer); 1.44 +} 1.45 + 1.46 +int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence) { 1.47 + off_t npos; 1.48 + switch (whence) { 1.49 + case SEEK_SET: 1.50 + npos = 0; 1.51 + break; 1.52 + case SEEK_CUR: 1.53 + npos = buffer->pos; 1.54 + break; 1.55 + case SEEK_END: 1.56 + npos = strlen(buffer->space); 1.57 + break; 1.58 + } 1.59 + 1.60 + npos += offset; 1.61 + 1.62 + if (npos < 0 || npos > buffer->length) { 1.63 + return -1; 1.64 + } else { 1.65 + buffer->pos = npos; 1.66 + return 0; 1.67 + } 1.68 + 1.69 +} 1.70 + 1.71 +int ucx_buffer_eof(UcxBuffer *buffer) { 1.72 + return buffer->pos >= buffer->length; 1.73 +} 1.74 + 1.75 +size_t ucx_buffer_tell(UcxBuffer *buffer) { 1.76 + return buffer->pos; 1.77 +} 1.78 + 1.79 +size_t ucx_bufio(void* d, size_t s, size_t n, UcxBuffer *b, _Bool read) { 1.80 + size_t len; 1.81 + if (b->pos + s*n > b->length) { 1.82 + len = b->length - b->pos; 1.83 + if (s > 1) len -= len%s; 1.84 + } else { 1.85 + len = s*n; 1.86 + } 1.87 + 1.88 + if (len == 0) { 1.89 + return 0; 1.90 + } 1.91 + 1.92 + if (read) { 1.93 + memcpy(d, (char*)b->space+b->pos, len); 1.94 + } else { 1.95 + memcpy((char*)b->space+b->pos, d, len); 1.96 + } 1.97 + b->pos += len; 1.98 + 1.99 + return len; 1.100 +} 1.101 + 1.102 +int ucx_buffer_putc(UcxBuffer *buffer, int c) { 1.103 + if (ucx_buffer_eof(buffer)) { 1.104 + return EOF; 1.105 + } else { 1.106 + c &= 0xFF; 1.107 + ((char*)(buffer->space))[buffer->pos] = (char) c; 1.108 + buffer->pos++; 1.109 + return c; 1.110 + } 1.111 +} 1.112 + 1.113 +int ucx_buffer_getc(UcxBuffer *buffer) { 1.114 + if (ucx_buffer_eof(buffer)) { 1.115 + return EOF; 1.116 + } else { 1.117 + int c = ((char*)(buffer->space))[buffer->pos]; 1.118 + buffer->pos++; 1.119 + return c; 1.120 + } 1.121 +}