#include "buffer.h" #include #include void buffer_init(buffer* b) { *b = (buffer) { .sz = 0, .run = 256, }; b -> ptr = malloc(b -> run); } buffer buffer_mk() { buffer b; buffer_init(&b); return b; } void buffer_push(buffer* b, strp const data) { size_t run = b->run; while (b -> sz + data.sz > run) run *= 2; if (run != b->run) { b->ptr = realloc(b->ptr, run); b->run = run; } memcpy(&b->ptr[b->sz], data.ptr, data.sz); b->sz += data.sz; } strp buffer_crush(buffer* b, size_t max) { if (b->run>max) { b->run = max; if (b->sz > max) { free(b->ptr); b->sz = 0; b->ptr = malloc(b->run); } else { b->ptr = realloc(b->ptr, b->run); } } return (strp){b->sz, b->ptr}; } size_t buffer_pushs(buffer* b, char const* data) { size_t len = strlen(data); buffer_push(b, (strp){len, .cptr = data}); return len; } void buffer_clear(buffer* b) { b -> sz = 0; }