diff options
Diffstat (limited to 'firmware/common')
-rw-r--r-- | firmware/common/inflate.c | 25 |
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 @@ | |||
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 | } | ||