summaryrefslogtreecommitdiff
path: root/py/reader.c
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2022-03-04 10:54:05 +1100
committerDamien George <damien@micropython.org>2024-12-23 13:04:54 +1100
commitf870e8d2d406e809b4494e6d029fee0269b1ea05 (patch)
treec925e58b53fa4d67b8c45e6c87ac0d8aa431ef82 /py/reader.c
parenta1c32101ac3bc70ed2774f461c69548ce8dae23d (diff)
py/reader: Provide mp_reader_try_read_rom() function.
This allows accessing data directly in ROM if the reader supports it. Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'py/reader.c')
-rw-r--r--py/reader.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/py/reader.c b/py/reader.c
index 151e04cac..8feb6d752 100644
--- a/py/reader.c
+++ b/py/reader.c
@@ -50,7 +50,7 @@ static mp_uint_t mp_reader_mem_readbyte(void *data) {
static void mp_reader_mem_close(void *data) {
mp_reader_mem_t *reader = (mp_reader_mem_t *)data;
- if (reader->free_len > 0) {
+ if (reader->free_len > 0 && reader->free_len != MP_READER_IS_ROM) {
m_del(char, (char *)reader->beg, reader->free_len);
}
m_del_obj(mp_reader_mem_t, reader);
@@ -67,6 +67,19 @@ void mp_reader_new_mem(mp_reader_t *reader, const byte *buf, size_t len, size_t
reader->close = mp_reader_mem_close;
}
+const uint8_t *mp_reader_try_read_rom(mp_reader_t *reader, size_t len) {
+ if (reader->readbyte != mp_reader_mem_readbyte) {
+ return NULL;
+ }
+ mp_reader_mem_t *m = reader->data;
+ if (m->free_len != MP_READER_IS_ROM) {
+ return NULL;
+ }
+ const uint8_t *data = m->cur;
+ m->cur += len;
+ return data;
+}
+
#if MICROPY_READER_POSIX
#include <sys/stat.h>