summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/common/inflate.c25
-rw-r--r--firmware/include/inflate.h15
2 files changed, 40 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 @@
43 43
44#include "inflate.h" 44#include "inflate.h"
45#include <stdbool.h> 45#include <stdbool.h>
46#include <string.h>
46#include "adler32.h" 47#include "adler32.h"
47#include "crc32.h" 48#include "crc32.h"
48#include "system.h" 49#include "system.h"
@@ -757,3 +758,27 @@ int inflate(struct inflate* it, int st, inflate_reader read, void* rctx, inflate
757 758
758 return inflate_blocks(it, st, read, rctx, write, wctx); 759 return inflate_blocks(it, st, read, rctx, write, wctx);
759} 760}
761
762static uint32_t inflate_buffer_rw(struct inflate_bufferctx* c,
763 void* dst, const void* src, uint32_t block_size)
764{
765 size_t size_left = c->end - c->buf;
766 size_t copy_size = MIN((size_t)block_size, size_left);
767
768 memcpy(dst, src, copy_size);
769 c->buf += copy_size;
770
771 return copy_size;
772}
773
774uint32_t inflate_buffer_reader(void* block, uint32_t block_size, void* ctx)
775{
776 struct inflate_bufferctx* c = ctx;
777 return inflate_buffer_rw(c, block, c->buf, block_size);
778}
779
780uint32_t inflate_buffer_writer(const void* block, uint32_t block_size, void* ctx)
781{
782 struct inflate_bufferctx* c = ctx;
783 return inflate_buffer_rw(c, c->buf, block, block_size);
784}
diff --git a/firmware/include/inflate.h b/firmware/include/inflate.h
index b56ccf181a..7dae0448e3 100644
--- a/firmware/include/inflate.h
+++ b/firmware/include/inflate.h
@@ -23,6 +23,7 @@
23#define _INFLATE_H_ 23#define _INFLATE_H_
24 24
25#include <stdint.h> 25#include <stdint.h>
26#include <stddef.h>
26 27
27enum { 28enum {
28 INFLATE_RAW, 29 INFLATE_RAW,
@@ -43,4 +44,18 @@ extern const uint32_t inflate_align;
43// see above enum for possible options. 44// see above enum for possible options.
44int inflate(struct inflate* it, int st, inflate_reader read, void* rctx, inflate_writer write, void* wctx); 45int inflate(struct inflate* it, int st, inflate_reader read, void* rctx, inflate_writer write, void* wctx);
45 46
47struct inflate_bufferctx {
48 // initialize this with your input/output buffer.
49 // the pointer is updated as data is read or written.
50 void* buf;
51
52 // buffer end marker (= buf + buf_size).
53 void* end;
54};
55
56// reader and writer for using an in-memory buffer.
57// Use 'inflate_bufferctx' as the context argument.
58uint32_t inflate_buffer_reader(void* block, uint32_t block_size, void* ctx);
59uint32_t inflate_buffer_writer(const void* block, uint32_t block_size, void* ctx);
60
46#endif 61#endif