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