Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
5225450b
Commit
5225450b
authored
Jan 13, 2014
by
Paul Sokolovsky
Browse files
Add generic impl of stream .readall() method. Use one for unix io.FileIO.
parent
5d2499c6
Changes
3
Hide whitespace changes
Inline
Side-by-side
py/stream.c
View file @
5225450b
...
...
@@ -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
);
py/stream.h
View file @
5225450b
extern
const
mp_obj_fun_native_t
mp_stream_read_obj
;
extern
const
mp_obj_fun_native_t
mp_stream_readall_obj
;
extern
const
mp_obj_fun_native_t
mp_stream_write_obj
;
unix/file.c
View file @
5225450b
...
...
@@ -90,6 +90,7 @@ static mp_obj_t fdfile_make_new(mp_obj_t type_in, int n_args, const mp_obj_t *ar
static
const
mp_method_t
rawfile_type_methods
[]
=
{
{
"read"
,
&
mp_stream_read_obj
},
{
"readall"
,
&
mp_stream_readall_obj
},
{
"write"
,
&
mp_stream_write_obj
},
{
"close"
,
&
fdfile_close_obj
},
{
NULL
,
NULL
},
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment