aboutsummaryrefslogtreecommitdiff
path: root/src/base/flate/read.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/flate/read.c')
-rw-r--r--src/base/flate/read.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/base/flate/read.c b/src/base/flate/read.c
new file mode 100644
index 0000000..9a42070
--- /dev/null
+++ b/src/base/flate/read.c
@@ -0,0 +1,41 @@
+#include "internal.h"
+
+int
+flate·read(flate·Reader *rdr, int sz, int n, void *buf)
+{
+ int r;
+ int err;
+ flate·Reader zrdr;
+
+ zrdr = *rdr;
+ zrdr.next_out = buf;
+ zrdr.avail_out = n*sz;
+
+READ:
+ err = inflate(&zrdr.b.z, Z_STREAM_END);
+ switch (err) {
+ case Z_OK:
+ return n;
+
+ case Z_STREAM_END:
+ r = zrdr.next_out - (ubyte*)buf;
+ n -= r;
+ zrdr.avail_in = zrdr.rdr.read(zrdr.impl, 1, arrlen(zrdr.buf), zrdr.buf);
+ if (!zrdr.avail_in) {
+ return r;
+ }
+ zrdr.next_in = zrdr.buf;
+ goto READ;
+
+ case Z_NEED_DICT:
+ errorf("zlib: need input dictionary");
+ goto ERROR;
+
+ case Z_STREAM_ERROR:
+ errorf("zlib: inconsistent stream structure");
+ goto ERROR;
+ }
+ERROR:
+ flate·closereader(rdr);
+ return -1;
+}