34
34
35
35
#if MICROPY_READER_VFS
36
36
37
+
37
38
typedef struct _mp_reader_vfs_t {
38
39
mp_obj_t file ;
39
40
uint16_t len ;
40
41
uint16_t pos ;
41
- byte buf [24 ];
42
+ uint8_t bufsize ;
43
+ byte buf [];
42
44
} mp_reader_vfs_t ;
43
45
44
46
STATIC mp_uint_t mp_reader_vfs_readbyte (void * data ) {
45
47
mp_reader_vfs_t * reader = (mp_reader_vfs_t * )data ;
48
+ if (!reader -> bufsize ) {
49
+ // If buffering is disabled read byte from stream directly
50
+ byte c ;
51
+ int errcode = 0 ;
52
+ mp_uint_t len = mp_stream_rw (reader -> file , & c , 1 ,
53
+ & errcode , MP_STREAM_RW_READ | MP_STREAM_RW_ONCE );
54
+ if (errcode != 0 ) {
55
+ // TODO handle errors properly
56
+ return MP_READER_EOF ;
57
+ }
58
+ if (len == 0 ) {
59
+ return MP_READER_EOF ;
60
+ }
61
+ return c ;
62
+ }
63
+
46
64
if (reader -> pos >= reader -> len ) {
47
- if (reader -> len < sizeof ( reader -> buf ) ) {
65
+ if (reader -> len < reader -> bufsize ) {
48
66
return MP_READER_EOF ;
49
67
} else {
50
68
int errcode ;
51
- reader -> len = mp_stream_rw (reader -> file , reader -> buf , sizeof ( reader -> buf ) ,
69
+ reader -> len = mp_stream_rw (reader -> file , reader -> buf , reader -> bufsize ,
52
70
& errcode , MP_STREAM_RW_READ | MP_STREAM_RW_ONCE );
53
71
if (errcode != 0 ) {
54
72
// TODO handle errors properly
@@ -70,14 +88,24 @@ STATIC void mp_reader_vfs_close(void *data) {
70
88
}
71
89
72
90
void mp_reader_new_file (mp_reader_t * reader , qstr filename ) {
73
- mp_reader_vfs_t * rf = m_new_obj (mp_reader_vfs_t );
74
91
mp_obj_t args [2 ] = {
75
92
MP_OBJ_NEW_QSTR (filename ),
76
93
MP_OBJ_NEW_QSTR (MP_QSTR_rb ),
77
94
};
78
- rf -> file = mp_vfs_open (MP_ARRAY_SIZE (args ), & args [0 ], (mp_map_t * )& mp_const_empty_map );
79
- int errcode ;
80
- rf -> len = mp_stream_rw (rf -> file , rf -> buf , sizeof (rf -> buf ), & errcode , MP_STREAM_RW_READ | MP_STREAM_RW_ONCE );
95
+ mp_obj_t file = mp_vfs_open (MP_ARRAY_SIZE (args ), & args [0 ], (mp_map_t * )& mp_const_empty_map );
96
+
97
+ const mp_stream_p_t * stream_p = mp_get_stream (file );
98
+ int errcode = 0 ;
99
+ mp_uint_t bufsize = stream_p -> ioctl (file , MP_STREAM_GET_BUFSIZE , 0 , & errcode );
100
+ if (errcode || bufsize > 255 ) {
101
+ errcode = 0 ;
102
+ bufsize = MICROPY_READER_VFS_DEFAULT_BUF_SIZE ;
103
+ }
104
+
105
+ mp_reader_vfs_t * rf = m_new_obj_var (mp_reader_vfs_t , uint8_t , bufsize );
106
+ rf -> file = file ;
107
+ rf -> bufsize = bufsize ;
108
+ rf -> len = mp_stream_rw (rf -> file , rf -> buf , rf -> bufsize , & errcode , MP_STREAM_RW_READ | MP_STREAM_RW_ONCE );
81
109
if (errcode != 0 ) {
82
110
mp_raise_OSError (errcode );
83
111
}
0 commit comments