src/buffer.c

changeset 1515
f024313c08f1
parent 1514
ee5d668a71e4
child 1516
95b094472e9a
equal deleted inserted replaced
1514:ee5d668a71e4 1515:f024313c08f1
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

mercurial