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