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; |