universe@60: #include "buffer.h" universe@56: #include universe@56: #include universe@56: #include universe@56: universe@60: struct UcxBuffer { universe@56: void *space; universe@62: size_t pos; universe@62: size_t size; universe@61: int flags; universe@56: }; universe@56: universe@61: UcxBuffer *ucx_buffer_new(void *space, size_t length, int flags) { universe@60: UcxBuffer *buffer = (UcxBuffer*) malloc(sizeof(UcxBuffer)); universe@60: if (buffer) { universe@61: buffer->flags = flags; universe@56: if (!space) { universe@60: buffer->space = malloc(length); universe@60: if (!buffer->space) { universe@60: free(buffer); universe@56: return NULL; universe@56: } universe@60: memset(buffer->space, 0, length); universe@61: buffer->flags |= UCX_BUFFER_AUTOFREE; universe@56: } else { universe@60: buffer->space = space; universe@56: } universe@62: buffer->size = length; universe@56: universe@60: buffer->pos = 0; universe@56: } universe@56: universe@60: return buffer; universe@56: } universe@56: universe@60: void ucx_buffer_free(UcxBuffer *buffer) { universe@62: if (ucx_buffer_testflags(buffer, UCX_BUFFER_AUTOFREE)) { universe@60: free(buffer->space); universe@56: } universe@60: free(buffer); universe@56: } universe@56: universe@62: UcxBuffer *ucx_buffer_extract( universe@62: UcxBuffer *src, size_t start, size_t length, int flags) { universe@62: if (length == 0) { universe@62: length = src->size - start; universe@62: } universe@62: if (start+length > src->size) { universe@62: return NULL; universe@62: } universe@62: universe@62: UcxBuffer *dst = (UcxBuffer*) malloc(sizeof(UcxBuffer)); universe@62: if (dst) { universe@62: dst->space = malloc(length); universe@62: if (!dst->space) { universe@62: free(dst); universe@62: return NULL; universe@62: } universe@62: dst->size = length; universe@62: dst->flags = flags | UCX_BUFFER_AUTOFREE; universe@62: dst->pos = 0; universe@62: memcpy(dst->space, (char*)src->space+start, length); universe@62: } universe@62: return dst; universe@62: } universe@62: universe@60: int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence) { olaf@57: off_t npos; universe@56: switch (whence) { universe@56: case SEEK_SET: universe@56: npos = 0; universe@56: break; universe@56: case SEEK_CUR: universe@60: npos = buffer->pos; universe@56: break; universe@56: case SEEK_END: universe@60: npos = strlen(buffer->space); universe@56: break; universe@56: } universe@56: universe@56: npos += offset; universe@56: universe@62: if (npos < 0 || npos > buffer->size) { universe@56: return -1; universe@56: } else { universe@60: buffer->pos = npos; universe@56: return 0; universe@56: } universe@56: universe@56: } universe@56: universe@60: int ucx_buffer_eof(UcxBuffer *buffer) { universe@62: return buffer->pos >= buffer->size; universe@56: } universe@56: universe@60: size_t ucx_buffer_tell(UcxBuffer *buffer) { universe@60: return buffer->pos; universe@56: } universe@56: universe@62: size_t ucx_buffer_size(UcxBuffer *buffer) { universe@62: return buffer->size; universe@62: } universe@62: universe@62: int ucx_buffer_testflags(UcxBuffer *buffer, int flags) { universe@62: return (buffer->flags & flags) == flags; universe@62: } universe@62: universe@60: size_t ucx_bufio(void* d, size_t s, size_t n, UcxBuffer *b, _Bool read) { universe@56: size_t len; universe@62: if (b->pos + s*n > b->size) { universe@62: len = b->size - b->pos; universe@58: if (s > 1) len -= len%s; universe@56: } else { universe@56: len = s*n; universe@56: } universe@56: universe@56: if (len == 0) { universe@56: return 0; universe@56: } universe@56: universe@56: if (read) { universe@60: memcpy(d, (char*)b->space+b->pos, len); universe@56: } else { universe@60: memcpy((char*)b->space+b->pos, d, len); universe@56: } universe@60: b->pos += len; universe@56: universe@56: return len; universe@56: } universe@56: universe@60: int ucx_buffer_putc(UcxBuffer *buffer, int c) { universe@60: if (ucx_buffer_eof(buffer)) { universe@56: return EOF; universe@56: } else { universe@56: c &= 0xFF; universe@60: ((char*)(buffer->space))[buffer->pos] = (char) c; universe@60: buffer->pos++; universe@56: return c; universe@56: } universe@56: } universe@56: universe@60: int ucx_buffer_getc(UcxBuffer *buffer) { universe@60: if (ucx_buffer_eof(buffer)) { universe@56: return EOF; universe@56: } else { universe@60: int c = ((char*)(buffer->space))[buffer->pos]; universe@60: buffer->pos++; universe@56: return c; universe@56: } universe@56: }