summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2022-02-26 20:02:14 +0000
committerAidan MacDonald <amachronic@protonmail.com>2022-03-04 08:44:56 -0500
commitce4620413b42e93db4c58449691eec113f0723b1 (patch)
treec96a5f61c9596b1e335ffce70893a13049e236ea /firmware
parentfe4628fc3044bb2d21ee49f29ae1dba546db2453 (diff)
downloadrockbox-ce4620413b42e93db4c58449691eec113f0723b1.tar.gz
rockbox-ce4620413b42e93db4c58449691eec113f0723b1.zip
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
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