From ebc3fc51d04add7bc27fdf8a90f1250f67230762 Mon Sep 17 00:00:00 2001 From: "kr.angelov" Date: Thu, 5 Sep 2013 12:10:55 +0000 Subject: [PATCH] fix gu_in_bytes_ to use buffering --- src/runtime/c/gu/in.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/runtime/c/gu/in.c b/src/runtime/c/gu/in.c index 31a72bf96..835badfa7 100644 --- a/src/runtime/c/gu/in.c +++ b/src/runtime/c/gu/in.c @@ -87,11 +87,20 @@ gu_in_some(GuIn* in, uint8_t* dst, size_t sz, GuExn* err) void gu_in_bytes_(GuIn* in, uint8_t* dst, size_t sz, GuExn* err) { - size_t avail_sz = GU_MIN(sz, (size_t)(-in->buf_curr)); - memcpy(dst, &in->buf_end[in->buf_curr], avail_sz); - in->buf_curr += avail_sz; - if (avail_sz < sz) { - gu_in_input(in, &dst[avail_sz], sz - avail_sz, err); + for (;;) { + size_t avail_sz = GU_MIN(sz, (size_t)(-in->buf_curr)); + memcpy(dst, &in->buf_end[in->buf_curr], avail_sz); + in->buf_curr += avail_sz; + dst += avail_sz; + sz -= avail_sz; + + if (sz == 0) + break; + + if (!gu_in_begin_buffering(in, err)) { + gu_in_input(in, dst, sz, err); + return; + } } } @@ -269,13 +278,6 @@ gu_new_in(GuInStream* stream, GuPool* pool) return in; } - -typedef struct GuProxyInStream GuProxyInStream; - -enum { - GU_BUFFERED_IN_BUF_SIZE = 4096 -}; - typedef struct GuBufferedInStream GuBufferedInStream; struct GuBufferedInStream {