From c7eae87870da755586446fecb4eb30063c1d641c Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Sun, 11 Jun 2023 17:59:21 +0200 Subject: libio: move istream buffer logic into interall callbacks Signed-off-by: David Oberhollenzer --- lib/io/src/mem.c | 58 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 22 deletions(-) (limited to 'lib/io/src/mem.c') diff --git a/lib/io/src/mem.c b/lib/io/src/mem.c index 39e0d6b..bbb186a 100644 --- a/lib/io/src/mem.c +++ b/lib/io/src/mem.c @@ -20,38 +20,52 @@ typedef struct { const void *data; size_t size; + size_t offset; + size_t visible; char *name; } mem_istream_t; -static int mem_in_precache(istream_t *strm) +static int mem_get_buffered_data(istream_t *strm, const sqfs_u8 **out, + size_t *size, size_t want) { mem_istream_t *mem = (mem_istream_t *)strm; - size_t diff; + size_t have = mem->size - mem->offset; - assert(strm->buffer >= mem->buffer); - assert(strm->buffer <= (mem->buffer + mem->bufsz)); - assert(strm->buffer_used <= mem->bufsz); - assert((size_t)(strm->buffer - mem->buffer) <= - (mem->bufsz - strm->buffer_used)); + if (have > mem->bufsz) + have = mem->bufsz; - if (strm->buffer_used > 0) - memmove(mem->buffer, strm->buffer, strm->buffer_used); + if (want > have) + want = have; - strm->buffer = mem->buffer; + if (mem->visible == 0 || mem->visible < want) { + memcpy(mem->buffer + mem->visible, + (const char *)mem->data + mem->offset + mem->visible, + have - mem->visible); + mem->visible = have; + } - diff = mem->bufsz - strm->buffer_used; - if (diff > mem->size) - diff = mem->size; + *out = mem->buffer; + *size = mem->visible; + return (mem->visible == 0) ? 1 : 0; +} - if (diff > 0) { - memcpy(mem->buffer + strm->buffer_used, mem->data, diff); - strm->buffer_used += diff; - mem->data = (const char *)mem->data + diff; - mem->size -= diff; - } +static void mem_advance_buffer(istream_t *strm, size_t count) +{ + mem_istream_t *mem = (mem_istream_t *)strm; - return 0; + assert(count <= mem->visible); + + if (count > 0 && count < mem->visible) + memmove(mem->buffer, mem->buffer + count, mem->visible - count); + + mem->offset += count; + mem->visible -= count; + + if (mem->visible < mem->bufsz) { + memset(mem->buffer + mem->visible, 0, + mem->bufsz - mem->visible); + } } static const char *mem_in_get_filename(istream_t *strm) @@ -88,8 +102,8 @@ istream_t *istream_memory_create(const char *name, size_t bufsz, mem->data = data; mem->size = size; mem->bufsz = bufsz; - strm->buffer = mem->buffer; - strm->precache = mem_in_precache; + strm->get_buffered_data = mem_get_buffered_data; + strm->advance_buffer = mem_advance_buffer; strm->get_filename = mem_in_get_filename; return strm; } -- cgit v1.2.3