summaryrefslogtreecommitdiff
path: root/src/runtime/c
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2013-09-05 12:10:55 +0000
committerkr.angelov <kr.angelov@gmail.com>2013-09-05 12:10:55 +0000
commitebc3fc51d04add7bc27fdf8a90f1250f67230762 (patch)
tree47ea352669820c4fc8d5e5c3b25a630f03921a44 /src/runtime/c
parent7c0bad50921365746ea362710015853a4879c0a7 (diff)
fix gu_in_bytes_ to use buffering
Diffstat (limited to 'src/runtime/c')
-rw-r--r--src/runtime/c/gu/in.c26
1 files 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 {