ucx/buffer.c

Wed, 10 Oct 2012 10:46:20 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 10 Oct 2012 10:46:20 +0200
changeset 62
6814aea8462d
parent 61
fb07a0ab9a17
child 63
1d3500806565
permissions
-rw-r--r--

added extract function

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;
universe@62 8 size_t pos;
universe@62 9 size_t size;
universe@61 10 int flags;
universe@56 11 };
universe@56 12
universe@61 13 UcxBuffer *ucx_buffer_new(void *space, size_t length, int flags) {
universe@60 14 UcxBuffer *buffer = (UcxBuffer*) malloc(sizeof(UcxBuffer));
universe@60 15 if (buffer) {
universe@61 16 buffer->flags = flags;
universe@56 17 if (!space) {
universe@60 18 buffer->space = malloc(length);
universe@60 19 if (!buffer->space) {
universe@60 20 free(buffer);
universe@56 21 return NULL;
universe@56 22 }
universe@60 23 memset(buffer->space, 0, length);
universe@61 24 buffer->flags |= UCX_BUFFER_AUTOFREE;
universe@56 25 } else {
universe@60 26 buffer->space = space;
universe@56 27 }
universe@62 28 buffer->size = 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@62 37 if (ucx_buffer_testflags(buffer, UCX_BUFFER_AUTOFREE)) {
universe@60 38 free(buffer->space);
universe@56 39 }
universe@60 40 free(buffer);
universe@56 41 }
universe@56 42
universe@62 43 UcxBuffer *ucx_buffer_extract(
universe@62 44 UcxBuffer *src, size_t start, size_t length, int flags) {
universe@62 45 if (length == 0) {
universe@62 46 length = src->size - start;
universe@62 47 }
universe@62 48 if (start+length > src->size) {
universe@62 49 return NULL;
universe@62 50 }
universe@62 51
universe@62 52 UcxBuffer *dst = (UcxBuffer*) malloc(sizeof(UcxBuffer));
universe@62 53 if (dst) {
universe@62 54 dst->space = malloc(length);
universe@62 55 if (!dst->space) {
universe@62 56 free(dst);
universe@62 57 return NULL;
universe@62 58 }
universe@62 59 dst->size = length;
universe@62 60 dst->flags = flags | UCX_BUFFER_AUTOFREE;
universe@62 61 dst->pos = 0;
universe@62 62 memcpy(dst->space, (char*)src->space+start, length);
universe@62 63 }
universe@62 64 return dst;
universe@62 65 }
universe@62 66
universe@60 67 int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence) {
olaf@57 68 off_t npos;
universe@56 69 switch (whence) {
universe@56 70 case SEEK_SET:
universe@56 71 npos = 0;
universe@56 72 break;
universe@56 73 case SEEK_CUR:
universe@60 74 npos = buffer->pos;
universe@56 75 break;
universe@56 76 case SEEK_END:
universe@60 77 npos = strlen(buffer->space);
universe@56 78 break;
universe@56 79 }
universe@56 80
universe@56 81 npos += offset;
universe@56 82
universe@62 83 if (npos < 0 || npos > buffer->size) {
universe@56 84 return -1;
universe@56 85 } else {
universe@60 86 buffer->pos = npos;
universe@56 87 return 0;
universe@56 88 }
universe@56 89
universe@56 90 }
universe@56 91
universe@60 92 int ucx_buffer_eof(UcxBuffer *buffer) {
universe@62 93 return buffer->pos >= buffer->size;
universe@56 94 }
universe@56 95
universe@60 96 size_t ucx_buffer_tell(UcxBuffer *buffer) {
universe@60 97 return buffer->pos;
universe@56 98 }
universe@56 99
universe@62 100 size_t ucx_buffer_size(UcxBuffer *buffer) {
universe@62 101 return buffer->size;
universe@62 102 }
universe@62 103
universe@62 104 int ucx_buffer_testflags(UcxBuffer *buffer, int flags) {
universe@62 105 return (buffer->flags & flags) == flags;
universe@62 106 }
universe@62 107
universe@60 108 size_t ucx_bufio(void* d, size_t s, size_t n, UcxBuffer *b, _Bool read) {
universe@56 109 size_t len;
universe@62 110 if (b->pos + s*n > b->size) {
universe@62 111 len = b->size - b->pos;
universe@58 112 if (s > 1) len -= len%s;
universe@56 113 } else {
universe@56 114 len = s*n;
universe@56 115 }
universe@56 116
universe@56 117 if (len == 0) {
universe@56 118 return 0;
universe@56 119 }
universe@56 120
universe@56 121 if (read) {
universe@60 122 memcpy(d, (char*)b->space+b->pos, len);
universe@56 123 } else {
universe@60 124 memcpy((char*)b->space+b->pos, d, len);
universe@56 125 }
universe@60 126 b->pos += len;
universe@56 127
universe@56 128 return len;
universe@56 129 }
universe@56 130
universe@60 131 int ucx_buffer_putc(UcxBuffer *buffer, int c) {
universe@60 132 if (ucx_buffer_eof(buffer)) {
universe@56 133 return EOF;
universe@56 134 } else {
universe@56 135 c &= 0xFF;
universe@60 136 ((char*)(buffer->space))[buffer->pos] = (char) c;
universe@60 137 buffer->pos++;
universe@56 138 return c;
universe@56 139 }
universe@56 140 }
universe@56 141
universe@60 142 int ucx_buffer_getc(UcxBuffer *buffer) {
universe@60 143 if (ucx_buffer_eof(buffer)) {
universe@56 144 return EOF;
universe@56 145 } else {
universe@60 146 int c = ((char*)(buffer->space))[buffer->pos];
universe@60 147 buffer->pos++;
universe@56 148 return c;
universe@56 149 }
universe@56 150 }

mercurial