aboutsummaryrefslogtreecommitdiff
path: root/sys/base/flate/writer.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/base/flate/writer.c')
-rw-r--r--sys/base/flate/writer.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/sys/base/flate/writer.c b/sys/base/flate/writer.c
new file mode 100644
index 0000000..f339ae0
--- /dev/null
+++ b/sys/base/flate/writer.c
@@ -0,0 +1,57 @@
+#include "internal.h"
+
+flate·Writer*
+flate·openwriter(io·Writer wtr, void* w, mem·Allocator mem, void* m)
+{
+ error err;
+ flate·Writer *zwtr;
+
+ zwtr = mem.alloc(m, 1, sizeof(*zwtr));
+ zwtr->zalloc = (void *(*)(void *, unsigned int, unsigned int))mem.alloc;
+ zwtr->zfree = mem.free;
+ zwtr->opaque = m;
+ zwtr->avail_in = 0;
+
+ err = deflateInit(&zwtr->b.z, Z_DEFAULT_COMPRESSION);
+
+ switch (err) {
+ case Z_OK:
+ return zwtr;
+
+ 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 compression level");
+ goto ERROR;
+
+ default:
+ errorf("zlib: unrecognized error code");
+ }
+ERROR:
+ errorf("zlib: msg: %s", zwtr->msg);
+ mem.free(m, zwtr);
+ return nil;
+}
+
+error
+flate·closewriter(flate·Writer *wtr)
+{
+ int err;
+ flate·Writer zwtr;
+
+ zwtr = *wtr;
+ err = deflateEnd(&zwtr.b.z);
+ if (err != Z_OK) {
+ errorf("zlib: failed to cleanup");
+ return err;
+ }
+ zwtr.zfree(zwtr.opaque, wtr);
+
+ return 0;
+}