src/buffer.c

changeset 1542
197450c2b0b3
parent 1539
2cbdb482d325
equal deleted inserted replaced
1541:d06aa9db0408 1542:197450c2b0b3
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 }

mercurial