diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2014-12-24 14:20:30 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2014-12-24 14:20:30 +0000 |
| commit | 8fd24c3839e7d171e0c4170ae17b26c7ff5aec1b (patch) | |
| tree | 5a6d6c94bf4ca039bdac1b9ce0287ba0d00de0d0 /src/runtime/c/gu/seq.c | |
| parent | 537bc249f966064ea0b68e6c1bf1d26e63f0524e (diff) | |
more compact implementation for GuStringBuf
Diffstat (limited to 'src/runtime/c/gu/seq.c')
| -rw-r--r-- | src/runtime/c/gu/seq.c | 63 |
1 files changed, 1 insertions, 62 deletions
diff --git a/src/runtime/c/gu/seq.c b/src/runtime/c/gu/seq.c index a923081b3..88b762a04 100644 --- a/src/runtime/c/gu/seq.c +++ b/src/runtime/c/gu/seq.c @@ -100,7 +100,7 @@ gu_seq_free(GuSeq* seq) gu_mem_buf_free(seq); } -static void +void gu_buf_require(GuBuf* buf, size_t req_len) { if (req_len <= buf->avail_len) { @@ -364,64 +364,3 @@ gu_buf_heapify(GuBuf *buf, GuOrder *order) gu_heap_siftup(buf, order, value, i); } } - -typedef struct GuBufOut GuBufOut; -struct GuBufOut -{ - GuOutStream stream; - GuBuf* buf; -}; - -static size_t -gu_buf_out_output(GuOutStream* stream, const uint8_t* src, size_t sz, - GuExn* err) -{ - (void) err; - GuBufOut* bout = gu_container(stream, GuBufOut, stream); - GuBuf* buf = bout->buf; - gu_assert(sz % buf->elem_size == 0); - size_t len = sz / buf->elem_size; - gu_buf_push_n(bout->buf, src, len); - return len; -} - -static uint8_t* -gu_buf_outbuf_begin(GuOutStream* stream, size_t req, size_t* sz_out, GuExn* err) -{ - (void) req; - (void) err; - GuBufOut* bout = gu_container(stream, GuBufOut, stream); - GuBuf* buf = bout->buf; - size_t esz = buf->elem_size; - size_t len = gu_buf_length(buf); - gu_buf_require(buf, len + (req + esz - 1) / esz); - size_t avail = buf->avail_len; - gu_assert(len < avail); - *sz_out = esz * (avail - len); - return &buf->seq->data[len * esz]; -} - -static void -gu_buf_outbuf_end(GuOutStream* stream, size_t sz, GuExn* err) -{ - (void) err; - GuBufOut* bout = gu_container(stream, GuBufOut, stream); - GuBuf* buf = bout->buf; - size_t len = gu_buf_length(buf); - size_t elem_size = buf->elem_size; - gu_require(sz % elem_size == 0); - gu_require(sz < elem_size * (len - buf->avail_len)); - buf->seq->len = len + (sz / elem_size); -} - -GuOut* -gu_buf_out(GuBuf* buf, GuPool* pool) -{ - GuBufOut* bout = gu_new(GuBufOut, pool); - bout->stream.output = gu_buf_out_output; - bout->stream.begin_buf = gu_buf_outbuf_begin; - bout->stream.end_buf = gu_buf_outbuf_end; - bout->stream.flush = NULL; - bout->buf = buf; - return gu_new_out(&bout->stream, pool); -} |
