diff -r ee5d668a71e4 -r f024313c08f1 src/buffer.c --- a/src/buffer.c Wed Nov 26 23:06:12 2025 +0100 +++ b/src/buffer.c Wed Nov 26 23:22:03 2025 +0100 @@ -238,10 +238,30 @@ return buffer->pos >= buffer->size; } -int cxBufferMinimumCapacity( - CxBuffer *buffer, - size_t newcap -) { +int cxBufferReserve(CxBuffer *buffer, size_t newcap) { + if (newcap <= buffer->capacity) { + return 0; + } + const int force_copy_flags = CX_BUFFER_COPY_ON_WRITE | CX_BUFFER_COPY_ON_EXTEND; + if (buffer->flags & force_copy_flags) { + void *newspace = cxMalloc(buffer->allocator, newcap); + if (NULL == newspace) return -1; + memcpy(newspace, buffer->space, buffer->size); + buffer->space = newspace; + buffer->capacity = newcap; + buffer->flags &= ~force_copy_flags; + buffer->flags |= CX_BUFFER_FREE_CONTENTS; + return 0; + } else if (cxReallocate(buffer->allocator, + (void **) &buffer->bytes, newcap) == 0) { + buffer->capacity = newcap; + return 0; + } else { + return -1; // LCOV_EXCL_LINE + } +} + +int cxBufferMinimumCapacity(CxBuffer *buffer, size_t newcap) { if (newcap <= buffer->capacity) { return 0; } @@ -267,24 +287,7 @@ // this gives a full additional page (which is good) } - - const int force_copy_flags = CX_BUFFER_COPY_ON_WRITE | CX_BUFFER_COPY_ON_EXTEND; - if (buffer->flags & force_copy_flags) { - void *newspace = cxMalloc(buffer->allocator, newcap); - if (NULL == newspace) return -1; - memcpy(newspace, buffer->space, buffer->size); - buffer->space = newspace; - buffer->capacity = newcap; - buffer->flags &= ~force_copy_flags; - buffer->flags |= CX_BUFFER_FREE_CONTENTS; - return 0; - } else if (cxReallocate(buffer->allocator, - (void **) &buffer->bytes, newcap) == 0) { - buffer->capacity = newcap; - return 0; - } else { - return -1; // LCOV_EXCL_LINE - } + return cxBufferReserve(buffer, newcap); } void cxBufferShrink(