universe@60: #include "buffer.h" universe@56: #include universe@56: #include universe@56: #include universe@56: universe@60: struct UcxBuffer { universe@56: void *space; olaf@57: off_t pos; universe@56: size_t length; universe@56: _Bool autofree; universe@56: }; universe@56: universe@60: UcxBuffer *ucx_buffer_new(void *space, size_t length) { universe@60: UcxBuffer *buffer = (UcxBuffer*) malloc(sizeof(UcxBuffer)); universe@60: if (buffer) { 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@60: buffer->autofree = 1; universe@56: } else { universe@60: buffer->space = space; universe@60: buffer->autofree = 0; universe@56: } universe@60: buffer->length = 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@60: if (buffer->autofree) { universe@60: free(buffer->space); universe@56: } universe@60: free(buffer); universe@56: } universe@56: 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@60: if (npos < 0 || npos > buffer->length) { 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@60: return buffer->pos >= buffer->length; universe@56: } universe@56: universe@60: size_t ucx_buffer_tell(UcxBuffer *buffer) { universe@60: return buffer->pos; universe@56: } universe@56: universe@60: size_t ucx_bufio(void* d, size_t s, size_t n, UcxBuffer *b, _Bool read) { universe@56: size_t len; universe@60: if (b->pos + s*n > b->length) { universe@60: len = b->length - 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: }