aboutsummaryrefslogtreecommitdiff
path: root/sys/base/flate/reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/base/flate/reader.c')
-rw-r--r--sys/base/flate/reader.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/sys/base/flate/reader.c b/sys/base/flate/reader.c
new file mode 100644
index 0000000..84f0d80
--- /dev/null
+++ b/sys/base/flate/reader.c
@@ -0,0 +1,59 @@
+#include "internal.h"
+
+flate·Reader*
+flate·openreader(io·Reader rdr, void* r, mem·Allocator mem, void* m)
+{
+ error err;
+ flate·Reader *zrdr;
+
+ zrdr = mem.alloc(m, 1, sizeof(*zrdr));
+
+ zrdr->zalloc = (void *(*)(void *, unsigned int, unsigned int))mem.alloc;
+ zrdr->zfree = mem.free;
+ zrdr->opaque = m;
+ zrdr->avail_in = rdr.read(r, 1, arrlen(zrdr->buf), zrdr->buf);
+ zrdr->next_in = zrdr->buf;
+
+ err = inflateInit(&zrdr->b.z);
+
+ switch (err) {
+ case Z_OK:
+ return zrdr;
+
+ case Z_MEM_ERROR:
+ errorf("zlib: not enough memory");
+ goto ERROR;
+
+ case Z_VERSION_ERROR:
+ errorf("zlib: incompatible version");
+ goto ERROR;
+
+ case Z_STREAM_ERROR:
+ errorf("zlib: incorrect input parameters");
+ goto ERROR;
+
+ default:
+ errorf("zlib: unrecognized error code");
+ }
+ERROR:
+ errorf("zlib: msg: %s", zrdr->msg);
+ mem.free(m, zrdr);
+ return nil;
+}
+
+error
+flate·closereader(flate·Reader *rdr)
+{
+ int err;
+ flate·Reader zrdr;
+
+ zrdr = *rdr;
+ err = inflateEnd(&zrdr.b.z);
+ if (err != Z_OK) {
+ errorf("zlib: failed to cleanup");
+ return err;
+ }
+ rdr->zfree(rdr->opaque, rdr);
+
+ return 0;
+}