summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2024-02-29 15:21:56 +1100
committerDamien George <damien@micropython.org>2024-03-15 18:11:28 +1100
commitb72602250929234dbdbba084ca0dc4fc94b056ae (patch)
tree8104b60ad1fb495026b241bff6b19e9448518637
parent85028aadab6763a0d899e71f54643840d9f8546d (diff)
py/stream: Factor stream implementations.
So there's only one location that does the ioctl(MP_STREAM_SEEK) call. Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--py/stream.c31
-rw-r--r--py/stream.h2
2 files changed, 13 insertions, 20 deletions
diff --git a/py/stream.c b/py/stream.c
index e008fb999..d7a8881e1 100644
--- a/py/stream.c
+++ b/py/stream.c
@@ -82,14 +82,14 @@ mp_uint_t mp_stream_rw(mp_obj_t stream, void *buf_, mp_uint_t size, int *errcode
return done;
}
-mp_uint_t mp_stream_seek(mp_obj_t stream, mp_off_t offset, int whence, int *errcode) {
+mp_off_t mp_stream_seek(mp_obj_t stream, mp_off_t offset, int whence, int *errcode) {
struct mp_stream_seek_t seek_s;
seek_s.offset = offset;
seek_s.whence = whence;
const mp_stream_p_t *stream_p = mp_get_stream(stream);
mp_uint_t res = stream_p->ioctl(MP_OBJ_FROM_PTR(stream), MP_STREAM_SEEK, (mp_uint_t)(uintptr_t)&seek_s, errcode);
if (res == MP_STREAM_ERROR) {
- return -1;
+ return (mp_off_t)-1;
}
return seek_s.offset;
}
@@ -457,28 +457,26 @@ static mp_obj_t mp_stream___exit__(size_t n_args, const mp_obj_t *args) {
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream___exit___obj, 4, 4, mp_stream___exit__);
static mp_obj_t stream_seek(size_t n_args, const mp_obj_t *args) {
- struct mp_stream_seek_t seek_s;
// TODO: Could be uint64
- seek_s.offset = mp_obj_get_int(args[1]);
- seek_s.whence = SEEK_SET;
+ mp_off_t offset = mp_obj_get_int(args[1]);
+ int whence = SEEK_SET;
if (n_args == 3) {
- seek_s.whence = mp_obj_get_int(args[2]);
+ whence = mp_obj_get_int(args[2]);
}
// In POSIX, it's error to seek before end of stream, we enforce it here.
- if (seek_s.whence == SEEK_SET && seek_s.offset < 0) {
+ if (whence == SEEK_SET && offset < 0) {
mp_raise_OSError(MP_EINVAL);
}
- const mp_stream_p_t *stream_p = mp_get_stream(args[0]);
int error;
- mp_uint_t res = stream_p->ioctl(args[0], MP_STREAM_SEEK, (mp_uint_t)(uintptr_t)&seek_s, &error);
- if (res == MP_STREAM_ERROR) {
+ mp_off_t res = mp_stream_seek(args[0], offset, whence, &error);
+ if (res == (mp_off_t)-1) {
mp_raise_OSError(error);
}
// TODO: Could be uint64
- return mp_obj_new_int_from_uint(seek_s.offset);
+ return mp_obj_new_int_from_uint(res);
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_seek_obj, 2, 3, stream_seek);
@@ -557,16 +555,11 @@ ssize_t mp_stream_posix_read(void *stream, void *buf, size_t len) {
}
off_t mp_stream_posix_lseek(void *stream, off_t offset, int whence) {
- const mp_obj_base_t *o = stream;
- const mp_stream_p_t *stream_p = MP_OBJ_TYPE_GET_SLOT(o->type, protocol);
- struct mp_stream_seek_t seek_s;
- seek_s.offset = offset;
- seek_s.whence = whence;
- mp_uint_t res = stream_p->ioctl(MP_OBJ_FROM_PTR(stream), MP_STREAM_SEEK, (mp_uint_t)(uintptr_t)&seek_s, &errno);
- if (res == MP_STREAM_ERROR) {
+ mp_off_t res = mp_stream_seek(MP_OBJ_FROM_PTR(stream), offset, whence, &errno);
+ if (res == (mp_off_t)-1) {
return -1;
}
- return seek_s.offset;
+ return res;
}
int mp_stream_posix_fsync(void *stream) {
diff --git a/py/stream.h b/py/stream.h
index 7c2e87a87..7c4d38afa 100644
--- a/py/stream.h
+++ b/py/stream.h
@@ -115,7 +115,7 @@ mp_obj_t mp_stream_write(mp_obj_t self_in, const void *buf, size_t len, byte fla
mp_uint_t mp_stream_rw(mp_obj_t stream, void *buf, mp_uint_t size, int *errcode, byte flags);
#define mp_stream_write_exactly(stream, buf, size, err) mp_stream_rw(stream, (byte *)buf, size, err, MP_STREAM_RW_WRITE)
#define mp_stream_read_exactly(stream, buf, size, err) mp_stream_rw(stream, buf, size, err, MP_STREAM_RW_READ)
-mp_uint_t mp_stream_seek(mp_obj_t stream, mp_off_t offset, int whence, int *errcode);
+mp_off_t mp_stream_seek(mp_obj_t stream, mp_off_t offset, int whence, int *errcode);
void mp_stream_write_adaptor(void *self, const char *buf, size_t len);