| 208 bool cxBufferEof(const CxBuffer *buffer) { |
208 bool cxBufferEof(const CxBuffer *buffer) { |
| 209 return buffer->pos >= buffer->size; |
209 return buffer->pos >= buffer->size; |
| 210 } |
210 } |
| 211 |
211 |
| 212 int cxBufferReserve(CxBuffer *buffer, size_t newcap) { |
212 int cxBufferReserve(CxBuffer *buffer, size_t newcap) { |
| 213 if (newcap <= buffer->capacity) { |
213 if (newcap == buffer->capacity) { |
| 214 return 0; |
214 return 0; |
| 215 } |
215 } |
| 216 const int force_copy_flags = CX_BUFFER_COPY_ON_WRITE | CX_BUFFER_COPY_ON_EXTEND; |
216 const int force_copy_flags = CX_BUFFER_COPY_ON_WRITE | CX_BUFFER_COPY_ON_EXTEND; |
| 217 if (buffer->flags & force_copy_flags) { |
217 if (buffer->flags & force_copy_flags) { |
| 218 void *newspace = cxMalloc(buffer->allocator, newcap); |
218 void *newspace = cxMalloc(buffer->allocator, newcap); |
| 223 buffer->flags &= ~force_copy_flags; |
223 buffer->flags &= ~force_copy_flags; |
| 224 buffer->flags |= CX_BUFFER_FREE_CONTENTS; |
224 buffer->flags |= CX_BUFFER_FREE_CONTENTS; |
| 225 return 0; |
225 return 0; |
| 226 } else if (cxReallocate(buffer->allocator, |
226 } else if (cxReallocate(buffer->allocator, |
| 227 (void **) &buffer->bytes, newcap) == 0) { |
227 (void **) &buffer->bytes, newcap) == 0) { |
| |
228 buffer->flags |= CX_BUFFER_FREE_CONTENTS; |
| 228 buffer->capacity = newcap; |
229 buffer->capacity = newcap; |
| |
230 if (buffer->size > newcap) { |
| |
231 buffer->size = newcap; |
| |
232 } |
| 229 return 0; |
233 return 0; |
| 230 } else { |
234 } else { |
| 231 return -1; // LCOV_EXCL_LINE |
235 return -1; // LCOV_EXCL_LINE |
| 232 } |
236 } |
| 233 } |
237 } |