#include "xh_config.h" #include "xh_core.h" void xh_perl_buffer_init(xh_perl_buffer_t *buf, size_t size) { buf->scalar = newSV(size); sv_setpv(buf->scalar, ""); buf->start = buf->cur = XH_CHAR_CAST SvPVX(buf->scalar); buf->end = buf->start + size; xh_log_debug2("buf: %p size: %lu", buf->start, size); } void xh_perl_buffer_grow(xh_perl_buffer_t *buf, size_t inc) { size_t size, use; if (inc <= (size_t) (buf->end - buf->cur)) return; size = buf->end - buf->start; use = buf->cur - buf->start; xh_log_debug2("old buf: %p size: %lu", buf->start, size); size += inc < size ? size : inc; SvCUR_set(buf->scalar, use); SvGROW(buf->scalar, size); buf->start = XH_CHAR_CAST SvPVX(buf->scalar); buf->cur = buf->start + use; buf->end = buf->start + size; xh_log_debug2("new buf: %p size: %lu", buf->start, size); } void xh_perl_buffer_sync(xh_perl_buffer_t *buf) { size_t use = buf->cur - buf->start; size_t size = SvLEN(buf->scalar); buf->start = XH_CHAR_CAST SvPVX(buf->scalar); buf->end = buf->start + size; buf->cur = buf->start + use; xh_log_debug2("buf: %p size: %lu", buf->start, size); }