ucx/memstream.c

Tue, 09 Oct 2012 15:02:40 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 09 Oct 2012 15:02:40 +0200
changeset 56
76caac0da4a0
child 57
e18157c52985
permissions
-rw-r--r--

added memstream to ucx - still little work to do

universe@56 1 #include "memstream.h"
universe@56 2 #include <stdarg.h>
universe@56 3 #include <stdlib.h>
universe@56 4 #include <string.h>
universe@56 5
universe@56 6 struct _UcxMemstream {
universe@56 7 void *space;
universe@56 8 size_t pos;
universe@56 9 size_t length;
universe@56 10 _Bool autofree;
universe@56 11 };
universe@56 12
universe@56 13 UcxMemstream *ucx_memopen(void* space, size_t length) {
universe@56 14 UcxMemstream *stream = (UcxMemstream*) malloc(sizeof(UcxMemstream));
universe@56 15 if (stream) {
universe@56 16 if (!space) {
universe@56 17 stream->space = malloc(length);
universe@56 18 if (!stream->space) {
universe@56 19 free(stream);
universe@56 20 return NULL;
universe@56 21 }
universe@56 22 memset(stream->space, 0, length);
universe@56 23 stream->autofree = 1;
universe@56 24 } else {
universe@56 25 stream->space = space;
universe@56 26 stream->autofree = 0;
universe@56 27 }
universe@56 28 stream->length = length;
universe@56 29
universe@56 30 stream->pos = 0;
universe@56 31 }
universe@56 32
universe@56 33 return stream;
universe@56 34 }
universe@56 35
universe@56 36 void ucx_memclose(UcxMemstream *stream) {
universe@56 37 if (stream->autofree) {
universe@56 38 free(stream->space);
universe@56 39 }
universe@56 40 free(stream);
universe@56 41 }
universe@56 42
universe@56 43 int ucx_memseek(UcxMemstream *stream, long offset, int whence) {
universe@56 44 size_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@56 50 npos = stream->pos;
universe@56 51 break;
universe@56 52 case SEEK_END:
universe@56 53 npos = strlen(stream->space);
universe@56 54 break;
universe@56 55 }
universe@56 56
universe@56 57 npos += offset;
universe@56 58
universe@56 59 if (npos < 0 || npos > stream->length) {
universe@56 60 return -1;
universe@56 61 } else {
universe@56 62 stream->pos = npos;
universe@56 63 return 0;
universe@56 64 }
universe@56 65
universe@56 66 }
universe@56 67
universe@56 68 int ucx_memeof(UcxMemstream *stream) {
universe@56 69 return stream->pos >= stream->length;
universe@56 70 }
universe@56 71
universe@56 72 int ucx_memoverflow(UcxMemstream *stream) {
universe@56 73 return stream->pos > stream->length;
universe@56 74 }
universe@56 75
universe@56 76 size_t ucx_memtell(UcxMemstream *stream) {
universe@56 77 return stream->pos;
universe@56 78 }
universe@56 79
universe@56 80 size_t ucx_memio(void* d, size_t s, size_t n, UcxMemstream *m, _Bool read) {
universe@56 81 size_t len;
universe@56 82 if (m->pos + s*n > m->length) {
universe@56 83 if (ucx_memoverflow(m)) {
universe@56 84 len = 0;
universe@56 85 } else {
universe@56 86 len = m->length - m->pos;
universe@56 87 if (s > 1) len -= len%s;
universe@56 88 }
universe@56 89 } else {
universe@56 90 len = s*n;
universe@56 91 }
universe@56 92
universe@56 93 if (len == 0) {
universe@56 94 return 0;
universe@56 95 }
universe@56 96
universe@56 97 if (read) {
universe@56 98 memcpy(d, m->space+m->pos, len);
universe@56 99 } else {
universe@56 100 memcpy(m->space+m->pos, d, len);
universe@56 101 }
universe@56 102 m->pos += len;
universe@56 103
universe@56 104 return len;
universe@56 105 }
universe@56 106
universe@56 107 int ucx_memputc(UcxMemstream *stream, int c) {
universe@56 108 if (ucx_memeof(stream)) {
universe@56 109 return EOF;
universe@56 110 } else {
universe@56 111 c &= 0xFF;
universe@56 112 ((char*)(stream->space))[stream->pos] = (char) c;
universe@56 113 stream->pos++;
universe@56 114 return c;
universe@56 115 }
universe@56 116 }
universe@56 117
universe@56 118 int ucx_memgetc(UcxMemstream *stream) {
universe@56 119 if (ucx_memeof(stream)) {
universe@56 120 return EOF;
universe@56 121 } else {
universe@56 122 int c = ((char*)(stream->space))[stream->pos];
universe@56 123 stream->pos++;
universe@56 124 return c;
universe@56 125 }
universe@56 126 }
universe@56 127
universe@56 128 int ucx_memprintf(UcxMemstream *stream, const char* format, ...) {
universe@56 129 va_list v;
universe@56 130 va_start(v, format);
universe@56 131 int r = vsprintf(stream->space+stream->pos, format, v);
universe@56 132 va_end(v);
universe@56 133
universe@56 134 stream->pos += r;
universe@56 135
universe@56 136 return r;
universe@56 137 }
universe@56 138
universe@56 139 int ucx_memscanf(UcxMemstream *stream, const char* format, ...) {
universe@56 140
universe@56 141 /* TODO: vsscanf returns the number of fields read,
universe@56 142 * we need the number of bytes */
universe@56 143
universe@56 144 va_list v;
universe@56 145 va_start(v, format);
universe@56 146 int r = vsscanf(stream->space+stream->pos, format, v);
universe@56 147 va_end(v);
universe@56 148
universe@56 149 stream->pos += r;
universe@56 150
universe@56 151 return r;
universe@56 152 }

mercurial