summaryrefslogtreecommitdiffstatshomepage
path: root/py
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-05-03 22:01:32 +0100
committerDamien George <damien.p.george@gmail.com>2014-05-03 22:01:32 +0100
commitd5f5b2f76698e29f9cc2f0ae682d2475c0d77baa (patch)
tree5e1981a9f39935586e4c5310d1d0c0e3853c6887 /py
parent5320bff32c2bb97f36dc9fad62864183520d0327 (diff)
downloadmicropython-d5f5b2f76698e29f9cc2f0ae682d2475c0d77baa.tar.gz
micropython-d5f5b2f76698e29f9cc2f0ae682d2475c0d77baa.zip
py, stream: Implement readlines for a stream.
Diffstat (limited to 'py')
-rw-r--r--py/qstrdefs.h1
-rw-r--r--py/stream.c28
-rw-r--r--py/stream.h9
3 files changed, 26 insertions, 12 deletions
diff --git a/py/qstrdefs.h b/py/qstrdefs.h
index 6960bd06cb..bcaed02d8b 100644
--- a/py/qstrdefs.h
+++ b/py/qstrdefs.h
@@ -314,6 +314,7 @@ Q(unpack)
Q(io)
Q(readall)
Q(readline)
+Q(readlines)
Q(StringIO)
Q(BytesIO)
Q(getvalue)
diff --git a/py/stream.c b/py/stream.c
index 113eaa46ee..f20ee0f5e8 100644
--- a/py/stream.c
+++ b/py/stream.c
@@ -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;
diff --git a/py/stream.h b/py/stream.h
index a0cc34797b..cb70a3d914 100644
--- a/py/stream.h
+++ b/py/stream.h
@@ -1,7 +1,8 @@
-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);