kopia lustrzana https://github.com/micropython/micropython
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>pull/12961/head
rodzic
85028aadab
commit
b726022509
31
py/stream.c
31
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) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue