Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file zip.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253openCFStreammoduleDefault=structletzlib_buffer_size=4096letlevel=3endmoduleError=structtypeunzip=[`garbage_at_end_of_compressed_dataofstring|`zlibofstring|`wrong_gzip_headerof[`compression_method|`flags|`magic_number]*int][@@derivingsexp](** The possible unzipping errors. *)typet=unzip[@@derivingsexp]endmoduleTransform=structlettry_skip_gzip_header_exnbuffer=letopenResult.Monad_infixinletbytes_read=ref0inletignore_bytesn=bytes_read:=!bytes_read+ninletassert_byteferror=letbyte=(Char.to_int(Bytes.getbuffer(!bytes_read)))iniffbytethen(incrbytes_read;Okbyte)elseError(`wrong_gzip_header(error,byte))inletassert_byte_eqberror=assert_byte((=)b)errorinletread_byte()=letbyte=(Char.to_int(Bytes.getbuffer(!bytes_read)))in(incrbytes_read;Okbyte)inletrecskip_null_terminated()=read_byte()>>=funx->ifx=0thenOk()elseskip_null_terminated()inassert_byte_eq0x1f`magic_number>>=fun_->assert_byte_eq0x8b`magic_number>>=fun_->assert_byte_eq8`compression_method>>=fun_->assert_byte(funb->bland0xe0=0)`flags>>=funflags->ignore_bytes6;(ifflagsland0x04<>0then((* Skip extra data *)read_byte()>>=funlen1->read_byte()>>=funlen2->ignore_bytes(len1+len2lsl8);Ok())elseOk())>>=fun()->(ifflagsland0x08<>0thenskip_null_terminated()elseOk())>>=fun()->(ifflagsland0x10<>0thenskip_null_terminated()elseOk())>>=fun()->ifflagsland0x02<>0thenbegin(* Skip header CRC *)ignore_bytes2;end;if!bytes_read>Bytes.lengthbufferthenfailwith"NOT-YET"elseOk!bytes_readletinflate_as_much_as_possiblein_bufferbufferzstreamzlib_write_bufferzlib_buffer_sizeformat=letlen=Bytes.lengthbufferinlettry_to_outputused_out=ifused_out>0then(`output(Ok(Bytes.To_string.subzlib_write_buffer~pos:0~len:used_out)))else(`not_ready)inlet(finished,used_in,used_out)=Zlib.inflatezstreambuffer0lenzlib_write_buffer0zlib_buffer_sizeZlib.Z_SYNC_FLUSHinifused_in<lenthen(iffinishedthen(matchformatwith|`gzipwhenlen-used_in>=8->(* The 8-bytes CRC must be skipped then another Gzip header +
stream can follow *)letcontinue_after_gzip=len-used_in>8inifcontinue_after_gzipthenBuffer.add_stringin_buffer(Bytes.To_string.subbuffer~pos:(used_in+8)~len:(len-used_in-8));`finished_gzip(try_to_outputused_out)|`gzip->Buffer.add_stringin_bufferBytes.To_string.(subbuffer~pos:used_in~len:(len-used_in));try_to_outputused_out|_->`error(`garbage_at_end_of_compressed_dataBytes.To_string.(subbuffer~pos:used_in~len:(len-used_in))))else(Buffer.add_stringin_bufferBytes.To_string.(subbuffer~pos:used_in~len:(len-used_in));try_to_outputused_out))elsetry_to_outputused_outletunzip?(format=`raw)?(zlib_buffer_size=Default.zlib_buffer_size)()=letzstream=ref(Zlib.inflate_initfalse)inletin_buffer=Buffer.create42inletzlib_write_buffer=Bytes.createzlib_buffer_sizeinletcurrent_state=ref(matchformatwith`gzip->`gzip_header|`raw->`inflate)inletrecnextstopped=letbuffered=Buffer.contents_bytesin_bufferinletlen=Bytes.lengthbufferedinBuffer.clearin_buffer;beginmatchlenwith|0->ifstoppedthen`end_of_streamelse`not_ready|_->beginmatch!current_statewith|`inflate->begintryletinflation=inflate_as_much_as_possiblein_bufferbuffered!zstreamzlib_write_bufferzlib_buffer_sizeformatinbeginmatchinflationwith|`outputo->`outputo|`errore->`output(Errore)|`not_ready->`not_ready|`finished_gzipout->current_state:=`gzip_header;zstream:=Zlib.inflate_initfalse;outendwith|e->`output(Error(`zlib(Exn.to_stringe)))end|`gzip_header->begintrymatchtry_skip_gzip_header_exnbufferedwith|Okbytes_read->current_state:=`inflate;Buffer.add_stringin_bufferBytes.To_string.(subbuffered~pos:bytes_read~len:(len-bytes_read));nextstopped|Errore->`output(Errore)with_->Buffer.add_bytesin_bufferbuffered;`not_readyendendendinTfxm.make_result()~feed:(funstring->Buffer.add_stringin_bufferstring;)~nextletgzip_default_header=(* ID1, Id2, compr meth, flags,
mtime (4 bytes),
xflags, OS (unknown) *)"\x1F\x8B\x08\x00\
\x00\x00\x00\x00\
\x00\xff"letzip?(format=`raw)?(level=Default.level)?(zlib_buffer_size=Default.zlib_buffer_size)()=letzstream=ref(Zlib.deflate_initlevelfalse)inletin_buffer=Buffer.create42inletzlib_write_buffer=Bytes.createzlib_buffer_sizeinletstate=ref(matchformatwith`raw->`deflating|`gzip->`gzip_header)inletthis_is_the_end=reffalseinletupdate_crc,output_crc=matchformatwith|`raw->((fun__->()),(fun()->""))|`gzip->letgzip_crc=ref0linletgzip_size=ref0lin((funbufused_in->gzip_crc:=Zlib.update_crc!gzip_crcbuf0used_in;gzip_size:=Int32.(!gzip_size+(of_int_exnused_in));()),(fun()->letbuf=Bytes.create8inBinary_packing.pack_signed_32~byte_order:`Little_endian~pos:0~buf!gzip_crc;Binary_packing.pack_signed_32~byte_order:`Little_endian~pos:4~buf!gzip_size;buf))inletnextstopped=matchstate.contentswith|`gzip_header->state:=`deflating;`outputgzip_default_header|`deflating->letbuffered=Buffer.contentsin_bufferinbeginmatchString.lengthbufferedwith|0->ifstoppedthenbeginif!this_is_the_endthen`end_of_streamelsebeginlet(_,_,used_out)=Zlib.deflate!zstream""00zlib_write_buffer0zlib_buffer_sizeZlib.Z_FINISHinletto_output=ifused_out<zlib_buffer_sizethen(this_is_the_end:=true;Zlib.deflate_end!zstream;Bytes.To_string.subzlib_write_buffer~pos:0~len:used_out^output_crc())else(Bytes.To_string.subzlib_write_buffer~pos:0~len:used_out)in`outputto_outputendendelse`not_ready|len->Buffer.clearin_buffer;let(_,used_in,used_out)=Zlib.deflate!zstreambuffered0lenzlib_write_buffer0zlib_buffer_size(* Zlib.Z_NO_FLUSH *)Zlib.Z_SYNC_FLUSHinupdate_crcbufferedused_in;ifused_in<lenthen(Buffer.add_substringin_bufferbuffered~pos:used_in~len:(String.lengthbuffered-used_in));ifused_out>0then`outputString.(subzlib_write_buffer~pos:0~len:used_out)else`not_readyendinTfxm.make()~feed:(funstring->Buffer.add_stringin_bufferstring;)~nextendletunzip_in_channel?format?zlib_buffer_size?buffer_sizeinp=lett=Transform.unzip?format?zlib_buffer_size()inTfxm.in_channel_strings_to_stream?buffer_sizeinptletzip_in_channel?format?zlib_buffer_size?level?buffer_sizeinp=lett=Transform.zip?format?zlib_buffer_size?level()inTfxm.in_channel_strings_to_stream?buffer_sizeinptexceptionErrorofError.unzipleterror_to_exne=Erroreletunzip_in_channel_exn?format?zlib_buffer_size?buffer_sizeinp=Stream.result_to_exn~error_to_exn(unzip_in_channel?format?zlib_buffer_size?buffer_sizeinp)