@@ -51,5 +51,47 @@ static mp_obj_t stream_write(mp_obj_t self_in, mp_obj_t arg) {
5151 }
5252}
5353
54+ // TODO: should be in mpconfig.h
55+ #define READ_SIZE 256
56+ static mp_obj_t stream_readall (mp_obj_t self_in ) {
57+ struct _mp_obj_base_t * o = (struct _mp_obj_base_t * )self_in ;
58+ if (o -> type -> stream_p .read == NULL ) {
59+ // CPython: io.UnsupportedOperation, OSError subclass
60+ nlr_jump (mp_obj_new_exception_msg (MP_QSTR_OSError , "Operation not supported" ));
61+ }
62+
63+ int total_size = 0 ;
64+ vstr_t * vstr = vstr_new_size (READ_SIZE );
65+ char * buf = vstr_str (vstr );
66+ char * p = buf ;
67+ int error ;
68+ int current_read = READ_SIZE ;
69+ while (true) {
70+ machine_int_t out_sz = o -> type -> stream_p .read (self_in , p , current_read , & error );
71+ if (out_sz == -1 ) {
72+ nlr_jump (mp_obj_new_exception_msg_varg (MP_QSTR_OSError , "[Errno %d]" , error ));
73+ }
74+ if (out_sz == 0 ) {
75+ break ;
76+ }
77+ total_size += out_sz ;
78+ if (out_sz < current_read ) {
79+ current_read -= out_sz ;
80+ p += out_sz ;
81+ } else {
82+ current_read = READ_SIZE ;
83+ p = vstr_extend (vstr , current_read );
84+ if (p == NULL ) {
85+ // TODO
86+ nlr_jump (mp_obj_new_exception_msg_varg (MP_QSTR_OSError /*MP_QSTR_RuntimeError*/ , "Out of memory" ));
87+ }
88+ }
89+ }
90+ vstr_set_size (vstr , total_size + 1 ); // TODO: for \0
91+ buf [total_size ] = 0 ;
92+ return mp_obj_new_str (qstr_from_str_take (buf , total_size + 1 ));
93+ }
94+
5495MP_DEFINE_CONST_FUN_OBJ_2 (mp_stream_read_obj , stream_read );
96+ MP_DEFINE_CONST_FUN_OBJ_1 (mp_stream_readall_obj , stream_readall );
5597MP_DEFINE_CONST_FUN_OBJ_2 (mp_stream_write_obj , stream_write );
0 commit comments