int fbuf_copy(fbuf_t *fbufsrc, fbuf_t *fbufdst) { if (!fbuf_extend(fbufdst, fbufsrc->used)) return -1; fbuf_clear(fbufdst); memcpy(fbufdst->data + fbufdst->skip, fbufsrc->data + fbufsrc->skip, fbufsrc->used); fbufdst->used = fbufsrc->used; fbufdst->data[fbufdst->skip+fbufdst->used] = 0; return fbufdst->used; }
void fbuf_consume(struct fbuf *buf, size_t sz) { assert_valid_fbuf(buf); /* overflow check */ assert(sz <= fbuf_avail(buf)); buf->start += sz; /* if our buffer is empty, clear it */ if (fbuf_avail(buf) == 0) fbuf_clear(buf); }
void fbuf_free(struct fbuf *buf) { assert_valid_fbuf(buf); /* if we have a non-zero object then free it's buffer */ if (buf->base) free(buf->base); /* and ensure it is cleared */ buf->base = 0; buf->size = 0; fbuf_clear(buf); }