ucx/buffer.c

Wed, 10 Oct 2012 09:54:57 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 10 Oct 2012 09:54:57 +0200
changeset 60
abae4669fba7
parent 58
ucx/memstream.c@733f22fca61a
child 61
fb07a0ab9a17
permissions
-rw-r--r--

renamed UcxMemstream to UcxBuffer

universe@60 1 #include "buffer.h"
universe@56 2 #include <stdarg.h>
universe@56 3 #include <stdlib.h>
universe@56 4 #include <string.h>
universe@56 5
universe@60 6 struct UcxBuffer {
universe@56 7 void *space;
olaf@57 8 off_t pos;
universe@56 9 size_t length;
universe@56 10 _Bool autofree;
universe@56 11 };
universe@56 12
universe@60 13 UcxBuffer *ucx_buffer_new(void *space, size_t length) {
universe@60 14 UcxBuffer *buffer = (UcxBuffer*) malloc(sizeof(UcxBuffer));
universe@60 15 if (buffer) {
universe@56 16 if (!space) {
universe@60 17 buffer->space = malloc(length);
universe@60 18 if (!buffer->space) {
universe@60 19 free(buffer);
universe@56 20 return NULL;
universe@56 21 }
universe@60 22 memset(buffer->space, 0, length);
universe@60 23 buffer->autofree = 1;
universe@56 24 } else {
universe@60 25 buffer->space = space;
universe@60 26 buffer->autofree = 0;
universe@56 27 }
universe@60 28 buffer->length = length;
universe@56 29
universe@60 30 buffer->pos = 0;
universe@56 31 }
universe@56 32
universe@60 33 return buffer;
universe@56 34 }
universe@56 35
universe@60 36 void ucx_buffer_free(UcxBuffer *buffer) {
universe@60 37 if (buffer->autofree) {
universe@60 38 free(buffer->space);
universe@56 39 }
universe@60 40 free(buffer);
universe@56 41 }
universe@56 42
universe@60 43 int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence) {
olaf@57 44 off_t npos;
universe@56 45 switch (whence) {
universe@56 46 case SEEK_SET:
universe@56 47 npos = 0;
universe@56 48 break;
universe@56 49 case SEEK_CUR:
universe@60 50 npos = buffer->pos;
universe@56 51 break;
universe@56 52 case SEEK_END:
universe@60 53 npos = strlen(buffer->space);
universe@56 54 break;
universe@56 55 }
universe@56 56
universe@56 57 npos += offset;
universe@56 58
universe@60 59 if (npos < 0 || npos > buffer->length) {
universe@56 60 return -1;
universe@56 61 } else {
universe@60 62 buffer->pos = npos;
universe@56 63 return 0;
universe@56 64 }
universe@56 65
universe@56 66 }
universe@56 67
universe@60 68 int ucx_buffer_eof(UcxBuffer *buffer) {
universe@60 69 return buffer->pos >= buffer->length;
universe@56 70 }
universe@56 71
universe@60 72 size_t ucx_buffer_tell(UcxBuffer *buffer) {
universe@60 73 return buffer->pos;
universe@56 74 }
universe@56 75
universe@60 76 size_t ucx_bufio(void* d, size_t s, size_t n, UcxBuffer *b, _Bool read) {
universe@56 77 size_t len;
universe@60 78 if (b->pos + s*n > b->length) {
universe@60 79 len = b->length - b->pos;
universe@58 80 if (s > 1) len -= len%s;
universe@56 81 } else {
universe@56 82 len = s*n;
universe@56 83 }
universe@56 84
universe@56 85 if (len == 0) {
universe@56 86 return 0;
universe@56 87 }
universe@56 88
universe@56 89 if (read) {
universe@60 90 memcpy(d, (char*)b->space+b->pos, len);
universe@56 91 } else {
universe@60 92 memcpy((char*)b->space+b->pos, d, len);
universe@56 93 }
universe@60 94 b->pos += len;
universe@56 95
universe@56 96 return len;
universe@56 97 }
universe@56 98
universe@60 99 int ucx_buffer_putc(UcxBuffer *buffer, int c) {
universe@60 100 if (ucx_buffer_eof(buffer)) {
universe@56 101 return EOF;
universe@56 102 } else {
universe@56 103 c &= 0xFF;
universe@60 104 ((char*)(buffer->space))[buffer->pos] = (char) c;
universe@60 105 buffer->pos++;
universe@56 106 return c;
universe@56 107 }
universe@56 108 }
universe@56 109
universe@60 110 int ucx_buffer_getc(UcxBuffer *buffer) {
universe@60 111 if (ucx_buffer_eof(buffer)) {
universe@56 112 return EOF;
universe@56 113 } else {
universe@60 114 int c = ((char*)(buffer->space))[buffer->pos];
universe@60 115 buffer->pos++;
universe@56 116 return c;
universe@56 117 }
universe@56 118 }

mercurial