8000 WIP · jimmo/micropython@94fcf2f · GitHub
[go: up one dir, main page]

Skip to content

Commit 94fcf2f

Browse files
committed
WIP
Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
1 parent b52d34b commit 94fcf2f

File tree

2 files changed

+20
-19
lines changed

2 files changed

+20
-19
lines changed

extmod/vfs_reader.c

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
#include <stdio.h>
2828
#include <string.h>
29+
#include <stdlib.h>
2930

3031
#include "py/runtime.h"
3132
#include "py/stream.h"
@@ -34,34 +35,37 @@
3435

3536
#if MICROPY_READER_VFS
3637

38+
#define MICROPY_READER_VFS_DEFAULT_BUFFER_SIZE (2 * MICROPY_BYTES_PER_GC_BLOCK - offsetof(mp_reader_vfs_t, buf))
39+
#define MICROPY_READER_VFS_MIN_BUFFER_SIZE (MICROPY_BYTES_PER_GC_BLOCK - offsetof(mp_reader_vfs_t, buf))
40+
#define MICROPY_READER_VFS_MAX_BUFFER_SIZE (65536)
41+
3742
typedef struct _mp_reader_vfs_t {
3843
mp_obj_t file;
39-
uint16_t len;
40-
uint16_t pos;
41-
uint8_t bufsize;
44+
uint16_t bufpos;
45+
uint16_t buflen;
46+
uint16_t bufsize;
4247
byte buf[];
4348
} mp_reader_vfs_t;
4449

4550
STATIC mp_uint_t mp_reader_vfs_readbyte(void *data) {
4651
mp_reader_vfs_t *reader = (mp_reader_vfs_t *)data;
47-
if (reader->pos >= reader->len) {
48-
if (reader->len < reader->bufsize) {
52+
if (reader->bufpos >= reader->buflen) {
53+
if (reader->buflen < reader->bufsize) {
4954
return MP_READER_EOF;
5055
} else {
5156
int errcode;
52-
reader->len = mp_stream_rw(reader->file, reader->buf, reader->bufsize,
53-
&errcode, MP_STREAM_RW_READ | MP_STREAM_RW_ONCE);
57+
reader->buflen = mp_stream_rw(reader->file, reader->buf, reader->bufsize, &errcode, MP_STREAM_RW_READ | MP_STREAM_RW_ONCE);
5458
if (errcode != 0) {
5559
// TODO handle errors properly
5660
return MP_READER_EOF;
5761
}
58-
if (reader->len == 0) {
62+
if (reader->buflen == 0) {
5963
return MP_READER_EOF;
6064
}
61-
reader->pos = 0;
65+
reader->bufpos = 0;
6266
}
6367
}
64-
return reader->buf[reader->pos++];
68+
return reader->buf[reader->bufpos++];
6569
}
6670

6771
STATIC void mp_reader_vfs_close(void *data) {
@@ -80,19 +84,20 @@ void mp_reader_new_file(mp_reader_t *reader, qstr filename) {
8084
const mp_stream_p_t *stream_p = mp_get_stream(file);
8185
int errcode = 0;
8286
mp_uint_t bufsize = stream_p->ioctl(file, MP_STREAM_GET_BUFFER_SIZE, 0, &errcode);
83-
if (bufsize < 7 || bufsize > 255) {
84-
// ioctl returns unsigned -1 ( MP_STREAM_ERROR) on error, which is >255, so will set to default.
87+
if (bufsize == MP_STREAM_ERROR) {
8588
bufsize = MICROPY_READER_VFS_DEFAULT_BUFFER_SIZE;
89+
} else {
90+
bufsize = MIN(MICROPY_READER_VFS_MAX_BUFFER_SIZE, MAX(MICROPY_READER_VFS_MIN_BUFFER_SIZE, bufsize));
8691
}
8792

88-
mp_reader_vfs_t *rf = m_new_obj_var(mp_reader_vfs_t, byte, bufsize);
93+
mp_reader_vfs_t *rf = m_new_obj_var(mp_reader_vfs_t, buf, byte, bufsize);
8994
rf->file = file;
9095
rf->bufsize = bufsize;
91-
rf->len = mp_stream_rw(rf->file, rf->buf, rf->bufsize, &errcode, MP_STREAM_RW_READ | MP_STREAM_RW_ONCE);
96+
rf->buflen = mp_stream_rw(rf->file, rf->buf, rf->bufsize, &errcode, MP_STREAM_RW_READ | MP_STREAM_RW_ONCE);
9297
if (errcode != 0) {
9398
mp_raise_OSError(errcode);
9499
}
95-
rf->pos = 0;
100+
rf->bufpos = 0;
96101
reader->data = rf;
97102
reader->readbyte = mp_reader_vfs_readbyte;
98103
reader->close = mp_reader_vfs_close;

py/mpconfig.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -597,10 +597,6 @@
597597
#define MICROPY_READER_VFS (0)
598598
#endif
599599

600-
#ifndef MICROPY_READER_VFS_DEFAULT_BUFFER_SIZE
601-
#define MICROPY_READER_VFS_DEFAULT_BUFFER_SIZE (23)
602-
#endif
603-
604600
// Whether any readers have been defined
605601
#ifndef MICROPY_HAS_FILE_READER
606602
#define MICROPY_HAS_FILE_READER (MICROPY_READER_POSIX || MICROPY_READER_VFS)

0 commit comments

Comments
 (0)
0