ucx/memstream.c

changeset 57
e18157c52985
parent 56
76caac0da4a0
child 58
733f22fca61a
equal deleted inserted replaced
56:76caac0da4a0 57:e18157c52985
1 #include "memstream.h" 1 #include "memstream.h"
2 #include <stdarg.h> 2 #include <stdarg.h>
3 #include <stdlib.h> 3 #include <stdlib.h>
4 #include <string.h> 4 #include <string.h>
5 5
6 struct _UcxMemstream { 6 struct UcxMemstream {
7 void *space; 7 void *space;
8 size_t pos; 8 off_t pos;
9 size_t length; 9 size_t length;
10 _Bool autofree; 10 _Bool autofree;
11 }; 11 };
12 12
13 UcxMemstream *ucx_memopen(void* space, size_t length) { 13 UcxMemstream *ucx_memopen(void *space, size_t length) {
14 UcxMemstream *stream = (UcxMemstream*) malloc(sizeof(UcxMemstream)); 14 UcxMemstream *stream = (UcxMemstream*) malloc(sizeof(UcxMemstream));
15 if (stream) { 15 if (stream) {
16 if (!space) { 16 if (!space) {
17 stream->space = malloc(length); 17 stream->space = malloc(length);
18 if (!stream->space) { 18 if (!stream->space) {
38 free(stream->space); 38 free(stream->space);
39 } 39 }
40 free(stream); 40 free(stream);
41 } 41 }
42 42
43 int ucx_memseek(UcxMemstream *stream, long offset, int whence) { 43 int ucx_memseek(UcxMemstream *stream, off_t offset, int whence) {
44 size_t npos; 44 off_t npos;
45 switch (whence) { 45 switch (whence) {
46 case SEEK_SET: 46 case SEEK_SET:
47 npos = 0; 47 npos = 0;
48 break; 48 break;
49 case SEEK_CUR: 49 case SEEK_CUR:
93 if (len == 0) { 93 if (len == 0) {
94 return 0; 94 return 0;
95 } 95 }
96 96
97 if (read) { 97 if (read) {
98 memcpy(d, m->space+m->pos, len); 98 memcpy(d, (char*)m->space+m->pos, len);
99 } else { 99 } else {
100 memcpy(m->space+m->pos, d, len); 100 memcpy((char*)m->space+m->pos, d, len);
101 } 101 }
102 m->pos += len; 102 m->pos += len;
103 103
104 return len; 104 return len;
105 } 105 }
126 } 126 }
127 127
128 int ucx_memprintf(UcxMemstream *stream, const char* format, ...) { 128 int ucx_memprintf(UcxMemstream *stream, const char* format, ...) {
129 va_list v; 129 va_list v;
130 va_start(v, format); 130 va_start(v, format);
131 int r = vsprintf(stream->space+stream->pos, format, v); 131 int r = vsprintf((char*)stream->space+stream->pos, format, v);
132 va_end(v); 132 va_end(v);
133 133
134 stream->pos += r; 134 stream->pos += r;
135 135
136 return r; 136 return r;
141 /* TODO: vsscanf returns the number of fields read, 141 /* TODO: vsscanf returns the number of fields read,
142 * we need the number of bytes */ 142 * we need the number of bytes */
143 143
144 va_list v; 144 va_list v;
145 va_start(v, format); 145 va_start(v, format);
146 int r = vsscanf(stream->space+stream->pos, format, v); 146 int r = vsscanf((char*)stream->space+stream->pos, format, v);
147 va_end(v); 147 va_end(v);
148 148
149 stream->pos += r; 149 stream->pos += r;
150 150
151 return r; 151 return r;

mercurial