| 297 const void *ptr, |
297 const void *ptr, |
| 298 size_t size, |
298 size_t size, |
| 299 size_t nitems, |
299 size_t nitems, |
| 300 CxBuffer *buffer |
300 CxBuffer *buffer |
| 301 ) { |
301 ) { |
| |
302 // trivial case |
| |
303 if (size == 0 || nitems == 0) return 0; |
| |
304 |
| 302 // optimize for easy case |
305 // optimize for easy case |
| 303 if (size == 1 && (buffer->capacity - buffer->pos) >= nitems) { |
306 if (size == 1 && (buffer->capacity - buffer->pos) >= nitems) { |
| 304 if (buffer_copy_on_write(buffer)) return 0; |
307 if (buffer_copy_on_write(buffer)) return 0; |
| 305 memcpy(buffer->bytes + buffer->pos, ptr, nitems); |
308 memcpy(buffer->bytes + buffer->pos, ptr, nitems); |
| 306 buffer->pos += nitems; |
309 buffer->pos += nitems; |
| 362 const void *ptr, |
365 const void *ptr, |
| 363 size_t size, |
366 size_t size, |
| 364 size_t nitems, |
367 size_t nitems, |
| 365 CxBuffer *buffer |
368 CxBuffer *buffer |
| 366 ) { |
369 ) { |
| |
370 // trivial case |
| |
371 if (size == 0 || nitems == 0) return 0; |
| |
372 |
| 367 size_t pos = buffer->pos; |
373 size_t pos = buffer->pos; |
| 368 size_t append_pos = buffer->size; |
374 size_t append_pos = buffer->size; |
| 369 buffer->pos = append_pos; |
375 buffer->pos = append_pos; |
| 370 size_t written = cxBufferWrite(ptr, size, nitems, buffer); |
376 size_t written = cxBufferWrite(ptr, size, nitems, buffer); |
| 371 // the buffer might have been flushed |
377 // the buffer might have been flushed |
| 416 // write the terminator and exit |
422 // write the terminator and exit |
| 417 buffer->space[buffer->pos] = '\0'; |
423 buffer->space[buffer->pos] = '\0'; |
| 418 return 0; |
424 return 0; |
| 419 } |
425 } |
| 420 |
426 |
| 421 size_t cxBufferPutString( |
427 size_t cx_buffer_put_string(CxBuffer *buffer, cxstring str) { |
| 422 CxBuffer *buffer, |
428 return cxBufferWrite(str.ptr, 1, str.length, buffer); |
| 423 const char *str |
429 } |
| 424 ) { |
430 |
| 425 return cxBufferWrite(str, 1, strlen(str), buffer); |
431 size_t cx_buffer_append_string(CxBuffer *buffer, cxstring str) { |
| |
432 return cxBufferAppend(str.ptr, 1, str.length, buffer); |
| 426 } |
433 } |
| 427 |
434 |
| 428 size_t cxBufferRead( |
435 size_t cxBufferRead( |
| 429 void *ptr, |
436 void *ptr, |
| 430 size_t size, |
437 size_t size, |