| 236 |
236 |
| 237 bool cxBufferEof(const CxBuffer *buffer) { |
237 bool cxBufferEof(const CxBuffer *buffer) { |
| 238 return buffer->pos >= buffer->size; |
238 return buffer->pos >= buffer->size; |
| 239 } |
239 } |
| 240 |
240 |
| 241 int cxBufferMinimumCapacity( |
241 int cxBufferReserve(CxBuffer *buffer, size_t newcap) { |
| 242 CxBuffer *buffer, |
242 if (newcap <= buffer->capacity) { |
| 243 size_t newcap |
243 return 0; |
| 244 ) { |
244 } |
| |
245 const int force_copy_flags = CX_BUFFER_COPY_ON_WRITE | CX_BUFFER_COPY_ON_EXTEND; |
| |
246 if (buffer->flags & force_copy_flags) { |
| |
247 void *newspace = cxMalloc(buffer->allocator, newcap); |
| |
248 if (NULL == newspace) return -1; |
| |
249 memcpy(newspace, buffer->space, buffer->size); |
| |
250 buffer->space = newspace; |
| |
251 buffer->capacity = newcap; |
| |
252 buffer->flags &= ~force_copy_flags; |
| |
253 buffer->flags |= CX_BUFFER_FREE_CONTENTS; |
| |
254 return 0; |
| |
255 } else if (cxReallocate(buffer->allocator, |
| |
256 (void **) &buffer->bytes, newcap) == 0) { |
| |
257 buffer->capacity = newcap; |
| |
258 return 0; |
| |
259 } else { |
| |
260 return -1; // LCOV_EXCL_LINE |
| |
261 } |
| |
262 } |
| |
263 |
| |
264 int cxBufferMinimumCapacity(CxBuffer *buffer, size_t newcap) { |
| 245 if (newcap <= buffer->capacity) { |
265 if (newcap <= buffer->capacity) { |
| 246 return 0; |
266 return 0; |
| 247 } |
267 } |
| 248 |
268 |
| 249 unsigned long pagesize = system_page_size(); |
269 unsigned long pagesize = system_page_size(); |
| 265 newcap += pagesize; |
285 newcap += pagesize; |
| 266 // note: if newcap is already page aligned, |
286 // note: if newcap is already page aligned, |
| 267 // this gives a full additional page (which is good) |
287 // this gives a full additional page (which is good) |
| 268 } |
288 } |
| 269 |
289 |
| 270 |
290 return cxBufferReserve(buffer, newcap); |
| 271 const int force_copy_flags = CX_BUFFER_COPY_ON_WRITE | CX_BUFFER_COPY_ON_EXTEND; |
|
| 272 if (buffer->flags & force_copy_flags) { |
|
| 273 void *newspace = cxMalloc(buffer->allocator, newcap); |
|
| 274 if (NULL == newspace) return -1; |
|
| 275 memcpy(newspace, buffer->space, buffer->size); |
|
| 276 buffer->space = newspace; |
|
| 277 buffer->capacity = newcap; |
|
| 278 buffer->flags &= ~force_copy_flags; |
|
| 279 buffer->flags |= CX_BUFFER_FREE_CONTENTS; |
|
| 280 return 0; |
|
| 281 } else if (cxReallocate(buffer->allocator, |
|
| 282 (void **) &buffer->bytes, newcap) == 0) { |
|
| 283 buffer->capacity = newcap; |
|
| 284 return 0; |
|
| 285 } else { |
|
| 286 return -1; // LCOV_EXCL_LINE |
|
| 287 } |
|
| 288 } |
291 } |
| 289 |
292 |
| 290 void cxBufferShrink( |
293 void cxBufferShrink( |
| 291 CxBuffer *buffer, |
294 CxBuffer *buffer, |
| 292 size_t reserve |
295 size_t reserve |