ucx/memstream.c

changeset 58
733f22fca61a
parent 57
e18157c52985
equal deleted inserted replaced
57:e18157c52985 58:733f22fca61a
67 67
68 int ucx_memeof(UcxMemstream *stream) { 68 int ucx_memeof(UcxMemstream *stream) {
69 return stream->pos >= stream->length; 69 return stream->pos >= stream->length;
70 } 70 }
71 71
72 int ucx_memoverflow(UcxMemstream *stream) {
73 return stream->pos > stream->length;
74 }
75
76 size_t ucx_memtell(UcxMemstream *stream) { 72 size_t ucx_memtell(UcxMemstream *stream) {
77 return stream->pos; 73 return stream->pos;
78 } 74 }
79 75
80 size_t ucx_memio(void* d, size_t s, size_t n, UcxMemstream *m, _Bool read) { 76 size_t ucx_memio(void* d, size_t s, size_t n, UcxMemstream *m, _Bool read) {
81 size_t len; 77 size_t len;
82 if (m->pos + s*n > m->length) { 78 if (m->pos + s*n > m->length) {
83 if (ucx_memoverflow(m)) { 79 len = m->length - m->pos;
84 len = 0; 80 if (s > 1) len -= len%s;
85 } else {
86 len = m->length - m->pos;
87 if (s > 1) len -= len%s;
88 }
89 } else { 81 } else {
90 len = s*n; 82 len = s*n;
91 } 83 }
92 84
93 if (len == 0) { 85 if (len == 0) {
122 int c = ((char*)(stream->space))[stream->pos]; 114 int c = ((char*)(stream->space))[stream->pos];
123 stream->pos++; 115 stream->pos++;
124 return c; 116 return c;
125 } 117 }
126 } 118 }
127
128 int ucx_memprintf(UcxMemstream *stream, const char* format, ...) {
129 va_list v;
130 va_start(v, format);
131 int r = vsprintf((char*)stream->space+stream->pos, format, v);
132 va_end(v);
133
134 stream->pos += r;
135
136 return r;
137 }
138
139 int ucx_memscanf(UcxMemstream *stream, const char* format, ...) {
140
141 /* TODO: vsscanf returns the number of fields read,
142 * we need the number of bytes */
143
144 va_list v;
145 va_start(v, format);
146 int r = vsscanf((char*)stream->space+stream->pos, format, v);
147 va_end(v);
148
149 stream->pos += r;
150
151 return r;
152 }

mercurial