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
d5f5b2f7
Commit
d5f5b2f7
authored
May 03, 2014
by
Damien George
Browse files
py, stream: Implement readlines for a stream.
parent
5320bff3
Changes
6
Hide whitespace changes
Inline
Side-by-side
py/qstrdefs.h
View file @
d5f5b2f7
...
...
@@ -314,6 +314,7 @@ Q(unpack)
Q
(
io
)
Q
(
readall
)
Q
(
readline
)
Q
(
readlines
)
Q
(
StringIO
)
Q
(
BytesIO
)
Q
(
getvalue
)
...
...
py/stream.c
View file @
d5f5b2f7
...
...
@@ -123,8 +123,7 @@ STATIC mp_obj_t stream_unbuffered_readline(uint n_args, const mp_obj_t *args) {
while
(
max_size
==
-
1
||
max_size
--
!=
0
)
{
char
*
p
=
vstr_add_len
(
vstr
,
1
);
if
(
p
==
NULL
)
{
// TODO
nlr_raise
(
mp_obj_new_exception_msg_varg
(
&
mp_type_OSError
/*&mp_type_RuntimeError*/
,
"Out of memory"
));
nlr_raise
(
mp_obj_new_exception_msg_varg
(
&
mp_type_MemoryError
,
"out of memory"
));
}
machine_int_t
out_sz
=
o
->
type
->
stream_p
->
read
(
o
,
p
,
1
,
&
error
);
...
...
@@ -143,16 +142,29 @@ STATIC mp_obj_t stream_unbuffered_readline(uint n_args, const mp_obj_t *args) {
break
;
}
}
// TODO don't intern this string
vstr_shrink
(
vstr
);
return
MP_OBJ_NEW_QSTR
(
qstr_from_strn_take
(
vstr_str
(
vstr
),
vstr
->
alloc
,
vstr_len
(
vstr
)));
// TODO need a string creation API that doesn't copy the given data
mp_obj_t
ret
=
mp_obj_new_str
((
byte
*
)
vstr
->
buf
,
vstr
->
len
,
false
);
vstr_free
(
vstr
);
return
ret
;
}
// TODO take an optional extra argument (what does it do exactly?)
STATIC
mp_obj_t
stream_unbuffered_readlines
(
mp_obj_t
self
)
{
mp_obj_t
lines
=
mp_obj_new_list
(
0
,
NULL
);
for
(;;)
{
mp_obj_t
line
=
stream_unbuffered_readline
(
1
,
&
self
);
if
(
mp_obj_str_get_len
(
line
)
==
0
)
{
break
;
}
mp_obj_list_append
(
lines
,
line
);
}
return
lines
;
}
MP_DEFINE_CONST_FUN_OBJ_1
(
mp_stream_unbuffered_readlines_obj
,
stream_unbuffered_readlines
);
mp_obj_t
mp_stream_unbuffered_iter
(
mp_obj_t
self
)
{
mp_obj_t
l_in
=
stream_unbuffered_readline
(
1
,
&
self
);
uint
sz
;
mp_obj_str_get_data
(
l_in
,
&
sz
);
if
(
sz
!=
0
)
{
if
(
mp_obj_str_get_len
(
l_in
)
!=
0
)
{
return
l_in
;
}
return
MP_OBJ_STOP_ITERATION
;
...
...
py/stream.h
View file @
d5f5b2f7
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_unbuffered_readline_obj
;
extern
const
mp_obj_fun_native_t
mp_stream_write_obj
;
MP_DECLARE_CONST_FUN_OBJ
(
mp_stream_read_obj
);
MP_DECLARE_CONST_FUN_OBJ
(
mp_stream_readall_obj
);
MP_DECLARE_CONST_FUN_OBJ
(
mp_stream_unbuffered_readline_obj
);
MP_DECLARE_CONST_FUN_OBJ
(
mp_stream_unbuffered_readlines_obj
);
MP_DECLARE_CONST_FUN_OBJ
(
mp_stream_write_obj
);
// Iterator which uses mp_stream_unbuffered_readline_obj
mp_obj_t
mp_stream_unbuffered_iter
(
mp_obj_t
self
);
stmhal/file.c
View file @
d5f5b2f7
...
...
@@ -51,6 +51,7 @@ STATIC const mp_map_elem_t file_locals_dict_table[] = {
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_read
),
(
mp_obj_t
)
&
mp_stream_read_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_readall
),
(
mp_obj_t
)
&
mp_stream_readall_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_readline
),
(
mp_obj_t
)
&
mp_stream_unbuffered_readline_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_readlines
),
(
mp_obj_t
)
&
mp_stream_unbuffered_readlines_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_write
),
(
mp_obj_t
)
&
mp_stream_write_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_close
),
(
mp_obj_t
)
&
file_obj_close_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR___del__
),
(
mp_obj_t
)
&
file_obj_close_obj
},
...
...
tests/io/file1.py
View file @
d5f5b2f7
...
...
@@ -2,3 +2,5 @@ f = open("io/data/file1")
print
(
f
.
read
(
5
))
print
(
f
.
readline
())
print
(
f
.
read
())
f
=
open
(
"io/data/file1"
)
print
(
f
.
readlines
())
unix/file.c
View file @
d5f5b2f7
...
...
@@ -132,6 +132,7 @@ STATIC const mp_map_elem_t rawfile_locals_dict_table[] = {
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_read
),
(
mp_obj_t
)
&
mp_stream_read_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_readall
),
(
mp_obj_t
)
&
mp_stream_readall_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_readline
),
(
mp_obj_t
)
&
mp_stream_unbuffered_readline_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_readlines
),
(
mp_obj_t
)
&
mp_stream_unbuffered_readlines_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_write
),
(
mp_obj_t
)
&
mp_stream_write_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_close
),
(
mp_obj_t
)
&
fdfile_close_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR___enter__
),
(
mp_obj_t
)
&
mp_identity_obj
},
...
...
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