diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/common/inflate.c | 25 | ||||
-rw-r--r-- | firmware/include/inflate.h | 15 |
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 | |||
762 | static 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 | |||
774 | uint32_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 | |||
780 | uint32_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 | ||
27 | enum { | 28 | enum { |
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. |
44 | int inflate(struct inflate* it, int st, inflate_reader read, void* rctx, inflate_writer write, void* wctx); | 45 | int inflate(struct inflate* it, int st, inflate_reader read, void* rctx, inflate_writer write, void* wctx); |
45 | 46 | ||
47 | struct 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. | ||
58 | uint32_t inflate_buffer_reader(void* block, uint32_t block_size, void* ctx); | ||
59 | uint32_t inflate_buffer_writer(const void* block, uint32_t block_size, void* ctx); | ||
60 | |||
46 | #endif | 61 | #endif |