From ce4620413b42e93db4c58449691eec113f0723b1 Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Sat, 26 Feb 2022 20:02:14 +0000 Subject: inflate: Add helpers for using in-memory buffers Using an in-memory buffer for the input or output data for 'inflate' is likely to be extremely common and there's really only one way to do it, so predefined helpers should be provided. Change-Id: Ifd22e7b140a08e0e7dc05aec6b340dff5e2d9d0a --- firmware/common/inflate.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'firmware/common') diff --git a/firmware/common/inflate.c b/firmware/common/inflate.c index 26fd191690..62661ee111 100644 --- a/firmware/common/inflate.c +++ b/firmware/common/inflate.c @@ -43,6 +43,7 @@ #include "inflate.h" #include +#include #include "adler32.h" #include "crc32.h" #include "system.h" @@ -757,3 +758,27 @@ int inflate(struct inflate* it, int st, inflate_reader read, void* rctx, inflate return inflate_blocks(it, st, read, rctx, write, wctx); } + +static uint32_t inflate_buffer_rw(struct inflate_bufferctx* c, + void* dst, const void* src, uint32_t block_size) +{ + size_t size_left = c->end - c->buf; + size_t copy_size = MIN((size_t)block_size, size_left); + + memcpy(dst, src, copy_size); + c->buf += copy_size; + + return copy_size; +} + +uint32_t inflate_buffer_reader(void* block, uint32_t block_size, void* ctx) +{ + struct inflate_bufferctx* c = ctx; + return inflate_buffer_rw(c, block, c->buf, block_size); +} + +uint32_t inflate_buffer_writer(const void* block, uint32_t block_size, void* ctx) +{ + struct inflate_bufferctx* c = ctx; + return inflate_buffer_rw(c, c->buf, block, block_size); +} -- cgit v1.2.3