#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; }