src/buffer.c

changeset 1514
ee5d668a71e4
parent 1501
e60860db189f
child 1515
f024313c08f1
equal deleted inserted replaced
1513:4d641c6a2f82 1514:ee5d668a71e4
188 } else { 188 } else {
189 buffer->pos = npos; 189 buffer->pos = npos;
190 return 0; 190 return 0;
191 } 191 }
192 192
193 }
194
195 size_t cxBufferPop(CxBuffer *buffer, size_t size, size_t nitems) {
196 size_t len;
197 if (cx_szmul(size, nitems, &len)) {
198 // LCOV_EXCL_START
199 errno = EOVERFLOW;
200 return 0;
201 // LCOV_EXCL_STOP
202 }
203 if (len == 0) return 0;
204 if (len > buffer->size) {
205 if (size == 1) {
206 // simple case: everything can be discarded
207 len = buffer->size;
208 } else {
209 // complicated case: misaligned bytes must stay
210 size_t misalignment = buffer->size % size;
211 len = buffer->size - misalignment;
212 }
213 }
214 buffer->size -= len;
215
216 // adjust position, if required
217 if (buffer->pos > buffer->size) {
218 buffer->pos = buffer->size;
219 }
220
221 return len / size;
193 } 222 }
194 223
195 void cxBufferClear(CxBuffer *buffer) { 224 void cxBufferClear(CxBuffer *buffer) {
196 if (0 == (buffer->flags & CX_BUFFER_COPY_ON_WRITE)) { 225 if (0 == (buffer->flags & CX_BUFFER_COPY_ON_WRITE)) {
197 memset(buffer->bytes, 0, buffer->size); 226 memset(buffer->bytes, 0, buffer->size);

mercurial