aboutsummaryrefslogtreecommitdiff
path: root/sys/base/flate/write.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/base/flate/write.c')
-rw-r--r--sys/base/flate/write.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/sys/base/flate/write.c b/sys/base/flate/write.c
new file mode 100644
index 0000000..3f07b94
--- /dev/null
+++ b/sys/base/flate/write.c
@@ -0,0 +1,48 @@
+#include "internal.h"
+
+int
+flate·write(flate·Writer *wtr, int sz, int n, void *buf)
+{
+ int r;
+ int err;
+ flate·Writer zwtr;
+
+ zwtr = *wtr;
+ zwtr.next_out = buf;
+DEFLATE:
+ zwtr.avail_out = n*sz;
+ err = deflate(&zwtr.z, Z_NO_FLUSH);
+
+ switch (err) {
+ case Z_STREAM_END:
+ return n;
+
+ case Z_OK:
+ r = (zwtr.next_out - (ubyte*)buf)/sz;
+ n -= r;
+ if (!n) {
+ return r;
+ }
+ buf += n;
+ goto DEFLATE;
+
+ case Z_STREAM_ERROR:
+ errorf("zlib: bad input");
+ goto ERROR;
+
+ case Z_BUF_ERROR:
+ if (!zwtr.avail_in) {
+ zwtr.avail_in += zwtr.wtr.write(zwtr.impl, 1, arrlen(zwtr.buf), buf);
+ if (!zwtr.avail_in) {
+ errorf("reader: failed read");
+ goto ERROR;
+ }
+ goto DEFLATE;
+ }
+ }
+
+ return 0;
+ERROR:
+ errorf("zlib: %s", zwtr.msg);
+ return -1;
+}