123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145(*
* Copyright (c) 2015, Christopher Zimmermann
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*)typestatus=|Ok(* 0 *)|Stream_end(* 1 *)|Need_dict(* 2 *)|Buf_error(* 3 (zlib -5) *)|Data_errorofstring(* 0 (zlib -3) *)typealgo=Deflatedtypestrategy=|Default_strategy(* 0 *)|Filtered(* 1 *)|Huffman_only(* 2 *)|RLE(* 3 *)|Fixed(* 4 *)typeflush=|No_flush(* 0 *)|Partial_flush(* 1 *)|Sync_flush(* 2 *)|Full_flush(* 3 *)|Finish(* 4 *)|Block(* 5 *)|Trees(* 6 *)typedata_type=|Binary(* 0 *)|Text(* 1 *)|Unknown(* 2 *)typedeflatetypeinflatetype'astatetypebigstring=(char,Bigarray.int8_unsigned_elt,Bigarray.c_layout)Bigarray.Array1.ttype'at={state:'astate;mutablein_buf:((char,Bigarray.int8_unsigned_elt,Bigarray.c_layout)Bigarray.Array1.t);mutableout_buf:((char,Bigarray.int8_unsigned_elt,Bigarray.c_layout)Bigarray.Array1.t);mutablein_ofs:int;mutableout_ofs:int;mutablein_len:int;mutableout_len:int;mutablein_total:int;mutableout_total:int;mutabledata_type:int;mutablecksum:int32}typeheader={text:bool;mtime:int32;os:int;xflags:int;extra:stringoption;name:stringoption;comment:stringoption}externalinflate_init:window_bits:int->inflatestate="zlib_inflate_init"externaldeflate_init:level:int->algo:algo->window_bits:int->memory:int->strategy:strategy->deflatestate="zlib_deflate_init"(* calculate upper bound on deflated stream. *)externaldeflate_bound:deflatestate->int->int="zlib_deflate_bound"(* flate handle flush *)externalflate:'at->flush->status="zlib_flate"(* set dictionary *)externaldeflate_set_dictionary:deflatestate->string->int32="zlib_deflate_set_dictionary"externalinflate_set_dictionary:inflatestate->string->status="zlib_inflate_set_dictionary"(* set/get header *)externalset_header:deflatestate->header->unit="zlib_set_header"externalget_header:inflatestate->header="zlib_get_header"(* reset *)externalreset:'at->unit="zlib_reset"(* adler32 *)externaladler32:int32->string->int32="zlib_adler32"letadler32_empty=Int32.oneletget_data_type(mlstate:deflatet)=matchmlstate.data_typewith|0->Binary|1->Text|2->Unknown|_->assert(false);;(* create caml record wrapping zlib state and bigarray buffers *)letcreate_deflate,create_inflate=letdummy_buf=Bigarray.(Array1.createcharc_layout0)inletwrapstate={state;in_buf=dummy_buf;out_buf=dummy_buf;in_ofs=0;out_ofs=0;in_len=-1;out_len=-1;in_total=0;out_total=0;cksum=Int32.zero;data_type=2}inletcreate_deflate?(level=(-1))?(algo=Deflated)?(window_bits=15)?(memory=8)?(strategy=Default_strategy)()=wrap(deflate_init~level~algo~window_bits~memory~strategy)inletcreate_inflate?(window_bits=15)()=wrap(inflate_init~window_bits)increate_deflate,create_inflate