py/stream: Add mp_stream_writeall() helper function.

Spools entire output buffer to a blocking stream (chunk by chunk if
needed).
This commit is contained in:
Paul Sokolovsky 2016-03-24 19:09:00 +02:00
parent a5d48b1162
commit d4c8e626f2
2 changed files with 18 additions and 0 deletions

View File

@ -208,6 +208,21 @@ void mp_stream_write_adaptor(void *self, const char *buf, size_t len) {
mp_stream_write(MP_OBJ_FROM_PTR(self), buf, len); mp_stream_write(MP_OBJ_FROM_PTR(self), buf, len);
} }
// Works only with blocking streams
mp_uint_t mp_stream_writeall(mp_obj_t stream, const byte *buf, mp_uint_t size, int *errcode) {
mp_obj_base_t* s = (mp_obj_base_t*)MP_OBJ_TO_PTR(stream);
mp_uint_t sz = size;
while (sz > 0) {
mp_uint_t out_sz = s->type->stream_p->write(s, buf, size, errcode);
if (out_sz == MP_STREAM_ERROR) {
return MP_STREAM_ERROR;
}
buf += out_sz;
sz -= out_sz;
}
return size;
}
STATIC mp_obj_t stream_write_method(mp_obj_t self_in, mp_obj_t arg) { STATIC mp_obj_t stream_write_method(mp_obj_t self_in, mp_obj_t arg) {
mp_buffer_info_t bufinfo; mp_buffer_info_t bufinfo;
mp_get_buffer_raise(arg, &bufinfo, MP_BUFFER_READ); mp_get_buffer_raise(arg, &bufinfo, MP_BUFFER_READ);

View File

@ -49,6 +49,9 @@ mp_obj_t mp_stream_unbuffered_iter(mp_obj_t self);
mp_obj_t mp_stream_write(mp_obj_t self_in, const void *buf, size_t len); mp_obj_t mp_stream_write(mp_obj_t self_in, const void *buf, size_t len);
// Helper function to write entire buf to *blocking* stream
mp_uint_t mp_stream_writeall(mp_obj_t stream, const byte *buf, mp_uint_t size, int *errcode);
#if MICROPY_STREAMS_NON_BLOCK #if MICROPY_STREAMS_NON_BLOCK
// TODO: This is POSIX-specific (but then POSIX is the only real thing, // TODO: This is POSIX-specific (but then POSIX is the only real thing,
// and anything else just emulates it, right?) // and anything else just emulates it, right?)