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