diff options
author | John R. Lenton <jlenton@gmail.com> | 2014-01-14 23:58:05 +0000 |
---|---|---|
committer | John R. Lenton <jlenton@gmail.com> | 2014-01-14 23:58:05 +0000 |
commit | ff8007c7d6497b108e8abe80ab3311945a03fe52 (patch) | |
tree | e2f6974d6476cc46b7414ba0626cb519142c3e3d /py/stream.c | |
parent | 9daa78943e58602f74c89a2b5b1ed225f4ccf6cc (diff) | |
parent | c6920d31e2b03205fe2851f74a6a4b48d0165608 (diff) | |
download | micropython-ff8007c7d6497b108e8abe80ab3311945a03fe52.tar.gz micropython-ff8007c7d6497b108e8abe80ab3311945a03fe52.zip |
Merge remote-tracking branch 'upstream/master' into builtins
Diffstat (limited to 'py/stream.c')
-rw-r--r-- | py/stream.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/py/stream.c b/py/stream.c index f883efcd25..48cd0bcd6c 100644 --- a/py/stream.c +++ b/py/stream.c @@ -51,5 +51,47 @@ static mp_obj_t stream_write(mp_obj_t self_in, mp_obj_t arg) { } } +// TODO: should be in mpconfig.h +#define READ_SIZE 256 +static mp_obj_t stream_readall(mp_obj_t self_in) { + struct _mp_obj_base_t *o = (struct _mp_obj_base_t *)self_in; + if (o->type->stream_p.read == NULL) { + // CPython: io.UnsupportedOperation, OSError subclass + nlr_jump(mp_obj_new_exception_msg(MP_QSTR_OSError, "Operation not supported")); + } + + int total_size = 0; + vstr_t *vstr = vstr_new_size(READ_SIZE); + char *buf = vstr_str(vstr); + char *p = buf; + int error; + int current_read = READ_SIZE; + while (true) { + machine_int_t out_sz = o->type->stream_p.read(self_in, p, current_read, &error); + if (out_sz == -1) { + nlr_jump(mp_obj_new_exception_msg_varg(MP_QSTR_OSError, "[Errno %d]", error)); + } + if (out_sz == 0) { + break; + } + total_size += out_sz; + if (out_sz < current_read) { + current_read -= out_sz; + p += out_sz; + } else { + current_read = READ_SIZE; + p = vstr_extend(vstr, current_read); + if (p == NULL) { + // TODO + nlr_jump(mp_obj_new_exception_msg_varg(MP_QSTR_OSError/*MP_QSTR_RuntimeError*/, "Out of memory")); + } + } + } + vstr_set_size(vstr, total_size + 1); // TODO: for \0 + buf[total_size] = 0; + return mp_obj_new_str(qstr_from_str_take(buf, total_size + 1)); +} + MP_DEFINE_CONST_FUN_OBJ_2(mp_stream_read_obj, stream_read); +MP_DEFINE_CONST_FUN_OBJ_1(mp_stream_readall_obj, stream_readall); MP_DEFINE_CONST_FUN_OBJ_2(mp_stream_write_obj, stream_write); |