26
26
27
27
#include <stdio.h>
28
28
#include <string.h>
29
+ #include <stdlib.h>
29
30
30
31
#include "py/runtime.h"
31
32
#include "py/stream.h"
34
35
35
36
#if MICROPY_READER_VFS
36
37
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
+
37
42
typedef struct _mp_reader_vfs_t {
38
43
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 ;
42
47
byte buf [];
43
48
} mp_reader_vfs_t ;
44
49
45
50
STATIC mp_uint_t mp_reader_vfs_readbyte (void * data ) {
46
51
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 ) {
49
54
return MP_READER_EOF ;
50
55
} else {
51
56
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 );
54
58
if (errcode != 0 ) {
55
59
// TODO handle errors properly
56
60
return MP_READER_EOF ;
57
61
}
58
- if (reader -> len == 0 ) {
62
+ if (reader -> buflen == 0 ) {
59
63
return MP_READER_EOF ;
60
64
}
61
- reader -> pos = 0 ;
65
+ reader -> bufpos = 0 ;
62
66
}
63
67
}
64
- return reader -> buf [reader -> pos ++ ];
68
+ return reader -> buf [reader -> bufpos ++ ];
65
69
}
66
70
67
71
STATIC void mp_reader_vfs_close (void * data ) {
@@ -80,19 +84,20 @@ void mp_reader_new_file(mp_reader_t *reader, qstr filename) {
80
84
const mp_stream_p_t * stream_p = mp_get_stream (file );
81
85
int errcode = 0 ;
82
86
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 ) {
85
88
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 ));
86
91
}
87
92
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 );
89
94
rf -> file = file ;
90
95
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 );
92
97
if (errcode != 0 ) {
93
98
mp_raise_OSError (errcode );
94
99
}
95
- rf -> pos = 0 ;
100
+ rf -> bufpos = 0 ;
96
101
reader -> data = rf ;
97
102
reader -> readbyte = mp_reader_vfs_readbyte ;
98
103
reader -> close = mp_reader_vfs_close ;
0 commit comments