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:
parent
a5d48b1162
commit
d4c8e626f2
15
py/stream.c
15
py/stream.c
@ -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);
|
||||
}
|
||||
|
||||
// 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) {
|
||||
mp_buffer_info_t bufinfo;
|
||||
mp_get_buffer_raise(arg, &bufinfo, MP_BUFFER_READ);
|
||||
|
@ -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);
|
||||
|
||||
// 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
|
||||
// TODO: This is POSIX-specific (but then POSIX is the only real thing,
|
||||
// and anything else just emulates it, right?)
|
||||
|
Loading…
Reference in New Issue
Block a user