summaryrefslogtreecommitdiff
path: root/py/stream.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-10-18 22:44:07 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-10-18 22:44:07 +0300
commit1a55b6a787ee7a568550ac0510632965af61c9ee (patch)
tree61f49937226e3dfb945adecef74cc1eff3dfc57e /py/stream.c
parentc92672d7f8fc410477a4e25789d15c1fd99b675b (diff)
unix, stmhal: Implement file.readinto() method.
Also, usocket.readinto(). Known issue is that .readinto() should be available only for binary files, but micropython uses single method table for both binary and text files.
Diffstat (limited to 'py/stream.c')
-rw-r--r--py/stream.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/py/stream.c b/py/stream.c
index a0940599c..7d080331d 100644
--- a/py/stream.c
+++ b/py/stream.c
@@ -215,6 +215,27 @@ STATIC mp_obj_t stream_write_method(mp_obj_t self_in, mp_obj_t arg) {
return mp_stream_write(self_in, bufinfo.buf, bufinfo.len);
}
+STATIC mp_obj_t stream_readinto(mp_obj_t self_in, mp_obj_t arg) {
+ struct _mp_obj_base_t *o = (struct _mp_obj_base_t *)self_in;
+ if (o->type->stream_p == NULL || o->type->stream_p->read == NULL) {
+ // CPython: io.UnsupportedOperation, OSError subclass
+ nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "Operation not supported"));
+ }
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(arg, &bufinfo, MP_BUFFER_WRITE);
+
+ int error;
+ mp_uint_t out_sz = o->type->stream_p->read(o, bufinfo.buf, bufinfo.len, &error);
+ if (out_sz == MP_STREAM_ERROR) {
+ if (is_nonblocking_error(error)) {
+ return mp_const_none;
+ }
+ nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(error)));
+ } else {
+ return MP_OBJ_NEW_SMALL_INT(out_sz);
+ }
+}
+
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 == NULL || o->type->stream_p->read == NULL) {
@@ -349,6 +370,7 @@ mp_obj_t mp_stream_unbuffered_iter(mp_obj_t self) {
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_read_obj, 1, 2, stream_read);
+MP_DEFINE_CONST_FUN_OBJ_2(mp_stream_readinto_obj, stream_readinto);
MP_DEFINE_CONST_FUN_OBJ_1(mp_stream_readall_obj, stream_readall);
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_unbuffered_readline_obj, 1, 2, stream_unbuffered_readline);
MP_DEFINE_CONST_FUN_OBJ_2(mp_stream_write_obj, stream_write_method);