@@ -75,13 +75,18 @@ STATIC mp_uint_t stringio_write(mp_obj_t o_in, const void *buf, mp_uint_t size,
75
75
(void )errcode ;
76
76
mp_obj_stringio_t * o = MP_OBJ_TO_PTR (o_in );
77
77
check_stringio_is_open (o );
78
- mp_uint_t remaining = o -> vstr -> alloc - o -> pos ;
79
- if (size > remaining ) {
78
+ mp_int_t remaining = o -> vstr -> alloc - o -> pos ;
79
+ mp_uint_t org_len = o -> vstr -> len ;
80
+ if ((mp_int_t )size > remaining ) {
80
81
// Take all what's already allocated...
81
82
o -> vstr -> len = o -> vstr -> alloc ;
82
83
// ... and add more
83
84
vstr_add_len (o -> vstr , size - remaining );
84
85
}
86
+ // If there was a seek past EOF, clear the hole
87
+ if (o -> pos > org_len ) {
88
+
8000
memset (o -> vstr -> buf + org_len , 0 , o -> pos - org_len );
89
+ }
85
90
memcpy (o -> vstr -> buf + o -> pos , buf , size );
86
91
o -> pos += size ;
87
92
if (o -> pos > o -> vstr -> len ) {
@@ -92,8 +97,23 @@ STATIC mp_uint_t stringio_write(mp_obj_t o_in, const void *buf, mp_uint_t size,
92
97
93
98
STATIC mp_uint_t stringio_ioctl (mp_obj_t o_in , mp_uint_t request , uintptr_t arg , int * errcode ) {
94
99
(void )errcode ;
95
- // mp_obj_stringio_t *o = MP_OBJ_TO_PTR(o_in);
100
+ mp_obj_stringio_t * o = MP_OBJ_TO_PTR (o_in );
96
101
switch (request ) {
102
+ case MP_STREAM_SEEK : {
103
+ struct mp_stream_seek_t * s = (struct mp_stream_seek_t * )arg ;
104
+ mp_uint_t ref = 0 ;
105
+ switch (s -> whence ) {
106
+ case 1 : // SEEK_CUR
107
+ ref = o -> pos ;
108
+ break ;
109
+ case 2 : // SEEK_END
110
+ ref = o -> vstr -> len ;
111
+ break ;
112
+ }
113
+ o -> pos = ref + s -> offset ;
114
+ s -> offset = o -> pos ;
115
+ return 0 ;
116
+ }
97
117
case MP_STREAM_FLUSH :
98
118
return 0 ;
99
119
default :
@@ -160,6 +180,7 @@ STATIC const mp_rom_map_elem_t stringio_locals_dict_table[] = {
160
180
{ MP_ROM_QSTR (MP_QSTR_readall ), MP_ROM_PTR (& mp_stream_readall_obj ) },
161
181
{ MP_ROM_QSTR (MP_QSTR_readline ), MP_ROM_PTR (& mp_stream_unbuffered_readline_obj ) },
162
182
{ MP_ROM_QSTR (MP_QSTR_write ), MP_ROM_PTR (& mp_stream_write_obj ) },
183
+ { MP_ROM_QSTR (MP_QSTR_seek ), MP_ROM_PTR (& mp_stream_seek_obj ) },
163
184
{ MP_ROM_QSTR (MP_QSTR_flush ), MP_ROM_PTR (& mp_stream_flush_obj ) },
164
185
{ MP_ROM_QSTR (MP_QSTR_close ), MP_ROM_PTR (& stringio_close_obj ) },
165
186
{ MP_ROM_QSTR (MP_QSTR_getvalue ), MP_ROM_PTR (& stringio_getvalue_obj ) },
0 commit comments