ucx/memstream.c

Wed, 10 Oct 2012 09:32:06 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 10 Oct 2012 09:32:06 +0200
changeset 58
733f22fca61a
parent 57
e18157c52985
permissions
-rw-r--r--

discarded memprintf / memscanf

Reason: memscanf has no chance to get the amount of bytes read

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
olaf@57 6 struct UcxMemstream {
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
olaf@57 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
olaf@57 43 int ucx_memseek(UcxMemstream *stream, 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@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 size_t ucx_memtell(UcxMemstream *stream) {
universe@56 73 return stream->pos;
universe@56 74 }
universe@56 75
universe@56 76 size_t ucx_memio(void* d, size_t s, size_t n, UcxMemstream *m, _Bool read) {
universe@56 77 size_t len;
universe@56 78 if (m->pos + s*n > m->length) {
universe@58 79 len = m->length - m->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) {
olaf@57 90 memcpy(d, (char*)m->space+m->pos, len);
universe@56 91 } else {
olaf@57 92 memcpy((char*)m->space+m->pos, d, len);
universe@56 93 }
universe@56 94 m->pos += len;
universe@56 95
universe@56 96 return len;
universe@56 97 }
universe@56 98
universe@56 99 int ucx_memputc(UcxMemstream *stream, int c) {
universe@56 100 if (ucx_memeof(stream)) {
universe@56 101 return EOF;
universe@56 102 } else {
universe@56 103 c &= 0xFF;
universe@56 104 ((char*)(stream->space))[stream->pos] = (char) c;
universe@56 105 stream->pos++;
universe@56 106 return c;
universe@56 107 }
universe@56 108 }
universe@56 109
universe@56 110 int ucx_memgetc(UcxMemstream *stream) {
universe@56 111 if (ucx_memeof(stream)) {
universe@56 112 return EOF;
universe@56 113 } else {
universe@56 114 int c = ((char*)(stream->space))[stream->pos];
universe@56 115 stream->pos++;
universe@56 116 return c;
universe@56 117 }
universe@56 118 }

mercurial