summaryrefslogtreecommitdiffstats
path: root/firmware/common/inflate.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/common/inflate.c')
-rw-r--r--firmware/common/inflate.c25
1 files changed, 25 insertions, 0 deletions
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 <stdbool.h>
+#include <string.h>
#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);
+}