value camlzip_deflate(value vzs, value srcbuf, value srcpos, value srclen, value dstbuf, value dstpos, value dstlen, value vflush) { z_stream * zs = ZStream_val(vzs); int retcode; long used_in, used_out; value res; zs->next_in = &Byte_u(srcbuf, Long_val(srcpos)); zs->avail_in = Long_val(srclen); zs->next_out = &Byte_u(dstbuf, Long_val(dstpos)); zs->avail_out = Long_val(dstlen); retcode = deflate(zs, camlzip_flush_table[Int_val(vflush)]); if (retcode < 0) camlzip_error("Zlib.deflate", vzs); used_in = Long_val(srclen) - zs->avail_in; used_out = Long_val(dstlen) - zs->avail_out; zs->next_in = NULL; /* not required, but cleaner */ zs->next_out = NULL; /* (avoid dangling pointers into Caml heap) */ res = caml_alloc_small(3, 0); Field(res, 0) = Val_bool(retcode == Z_STREAM_END); Field(res, 1) = Val_int(used_in); Field(res, 2) = Val_int(used_out); return res; }
value camlzip_inflateEnd(value vzs) { if (inflateEnd(ZStream_val(vzs)) != Z_OK) camlzip_error("Zlib.inflateEnd", vzs); free(ZStream_val(vzs)); return Val_unit; }
value camlzip_inflateInit(value expect_header) { value vzs = camlzip_new_stream(); if (inflateInit2(ZStream_val(vzs), Bool_val(expect_header) ? MAX_WBITS : -MAX_WBITS) != Z_OK) camlzip_error("Zlib.inflateInit", vzs); return vzs; }
value camlzip_deflateInit(value vlevel, value expect_header) { value vzs = camlzip_new_stream(); if (deflateInit2(ZStream_val(vzs), Int_val(vlevel), Z_DEFLATED, Bool_val(expect_header) ? MAX_WBITS : -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK) camlzip_error("Zlib.deflateInit", vzs); return vzs; }
value camlzip_deflateEnd(value vzs) { if (deflateEnd(ZStream_val(vzs)) != Z_OK) camlzip_error("Zlib.deflateEnd", vzs); return Val_unit; }