Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file zl.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554letio_buffer_size=65536letkstrfkfmt=Format.kasprintfkfmtletinvalid_argfmt=Format.kasprintfinvalid_argfmtmoduleBigarray=Bigarray_compattypebigstring=(char,Bigarray.int8_unsigned_elt,Bigarray.c_layout)Bigarray.Array1.ttypewindow=De.windowletbigstring_createl=Bigarray.Array1.createBigarray.charBigarray.c_layoutlletbigstring_empty=Bigarray.Array1.createBigarray.charBigarray.c_layout0letbigstring_lengthx=Bigarray.Array1.dimx[@@inline]externalunsafe_get_uint8:bigstring->int->int="%caml_ba_ref_1"externalunsafe_get_uint16:bigstring->int->int="%caml_bigstring_get16"externalunsafe_get_uint32:bigstring->int->int32="%caml_bigstring_get32"externalunsafe_set_uint8:bigstring->int->int->unit="%caml_ba_set_1"externalunsafe_set_uint16:bigstring->int->int->unit="%caml_bigstring_set16"externalunsafe_set_uint32:bigstring->int->int32->unit="%caml_bigstring_set32"externalswap16:int->int="%bswap16"externalswap32:int32->int32="caml_int32_bswap"letstring_unsafe_get_uint8:string->int->int=funbufoff->Char.code(String.getbufoff)externalstring_unsafe_get_uint32:string->int->int32="%caml_string_get32"letbytes_unsafe_get_uint8:bytes->int->int=funbufoff->Char.code(Bytes.getbufoff)externalbytes_unsafe_get_uint32:bytes->int->int32="%caml_bytes_get32"letbytes_unsafe_set_uint8:bytes->int->int->unit=funbufoffv->Bytes.setbufoff(Char.unsafe_chr(vland0xff))externalbytes_unsafe_set_uint32:bytes->int->int32->unit="%caml_bytes_set32"letinput_bigstringicbufofflen=lettmp=Bytes.createleninletres=inputictmp0leninletlen0=resland3inletlen1=resasr2infori=0tolen1-1doleti=i*4inletv=bytes_unsafe_get_uint32tmpiinunsafe_set_uint32buf(off+i)vdone;fori=0tolen0-1doleti=len1*4+iinletv=bytes_unsafe_get_uint8tmpiinunsafe_set_uint8buf(off+i)vdone;resletbigstring_to_stringv=letlen=bigstring_lengthvinletres=Bytes.createleninletlen0=lenland3inletlen1=lenasr2infori=0tolen1-1doleti=i*4inletv=unsafe_get_uint32viinbytes_unsafe_set_uint32resivdone;fori=0tolen0-1doleti=len1*4+iinletv=unsafe_get_uint8viinbytes_unsafe_set_uint8resivdone;Bytes.unsafe_to_stringresletoutput_bigstringocbufofflen=(* XXX(dinosaure): stupidly slow! *)letv=Bigarray.Array1.subbufoffleninletv=bigstring_to_stringvinoutput_stringocvletbigstring_of_stringv=letlen=String.lengthvinletres=bigstring_createleninletlen0=lenland3inletlen1=lenasr2infori=0tolen1-1doleti=i*4inletv=string_unsafe_get_uint32viinunsafe_set_uint32resivdone;fori=0tolen0-1doleti=len1*4+iinletv=string_unsafe_get_uint8viinunsafe_set_uint8resivdone;resletunsafe_get_uint32_be=ifSys.big_endianthenfunbufoff->unsafe_get_uint32bufoffelsefunbufoff->swap32(unsafe_get_uint32bufoff)letunsafe_set_uint32_be=ifSys.big_endianthenfunbufoffv->unsafe_set_uint32bufoffvelsefunbufoffv->unsafe_set_uint32bufoff(swap32v)letunsafe_set_uint16_be=ifSys.big_endianthenfunbufoffv->unsafe_set_uint16bufoffvelsefunbufoffv->unsafe_set_uint16bufoff(swap16v)letinvalid_boundsofflen=invalid_arg"Out of bounds (off: %d, len: %d)"offlenlet_deflated=8(* Compression method *)moduleInf=structtypesrc=[`Channelofin_channel|`Stringofstring|`Manual](* XXX(dinosaure): immutable style. *)typedecoder={src:De.Inf.src;i:bigstring;i_pos:int;i_len:int;f:bool;wr:int;hd:int;dd:dd;fdict:bool;flevel:int;cinfo:int;allocate:int->De.window;t:bigstring;t_need:int;t_len:int;k:decoder->signal}anddd=|Ddof{state:De.Inf.decoder;window:De.window;o:De.bigstring}|Hdof{o:De.bigstring}andsignal=[`Awaitofdecoder|`Flushofdecoder|`Endofdecoder|`Malformedofstring]letmalformedffmt=kstrf(funs->`Malformeds)fmtleterr_unexpected_end_of_input_=malformedf"Unexpected end of input"leterr_invalid_checksumhasexpect_=malformedf"Invalid checksum (expect:%04lx, has:%04lx)"expect(Optint.to_int32has)leterr_invalid_header_=malformedf"Invalid Zlib header"(* remaining bytes to read [d.i] *)leti_remd=d.i_len-d.i_pos+1[@@inline](* End of input [eoi] is signalled by [d.i_pos = 0] and [d.i_len = min_int]
which implies [i_rem d < 0] is [true]. *)leteoid={dwithi=bigstring_empty;i_pos=0;i_len=min_int}letrefillkd=matchd.dd,d.srcwith|Dd{state;_},`String_->De.Inf.srcstatebigstring_empty00;k(eoid)|Dd{state;_},`Channelic->letres=input_bigstringicd.i0(bigstring_lengthd.i)inDe.Inf.srcstated.i0res;kd|(Dd_|Hd_),`Manual->`Await{dwithk}|Hd_,`String_->k(eoid)|Hd_,`Channelic->letres=input_bigstringicd.i0(bigstring_lengthd.i)inifres==0thenk(eoid)elsek{dwithi_pos=0;i_len=res-1}letflushkd=`Flush{dwithk}letblitsrc~src_offdst~dst_off~len=leta=Bigarray.Array1.subsrcsrc_offleninletb=Bigarray.Array1.subdstdst_offleninBigarray.Array1.blitabletrect_fillkd=letblitdlen=blitd.i~src_off:d.i_posd.t~dst_off:d.t_len~len;{dwithi_pos=d.i_pos+len;t_len=d.t_len+len}inletrem=i_remdinifrem<0thenmalformedf"Unexpected end of input"elseletneed=d.t_need-d.t_leninifrem<needthenletd=blitdreminrefill(t_fillk)delseletd=blitdneedink{dwitht_need=0}lett_neednd={dwitht_need=n}letchecksumd=letkd=matchd.ddwith|Dd{state;_}->leta=De.Inf.checksumstateinletb=unsafe_get_uint32_bed.t0inifOptint.to_int32a=b(* FIXME: Optint.equal a (Optint.of_int32 b) bugs! *)then`Enddelseerr_invalid_checksumabd|Hd_->assertfalseint_fillk(t_need4d)letrecheaderd=letkd=let[@warning"-8"]Hd{o;}=d.ddinletcmf=unsafe_get_uint16d.t0inletcm=cmfland0b1111inletcinfo=(cmflsr4)land0b1111inletflg=cmflsr8inletfdict=(flglsr5)land0b1inletflevel=(flglsr6)land0b11inletwindow=d.allocate(cinfo+8)inletstate=De.Inf.decoder`Manual~o~w:windowinletdd=Dd{state;window;o;}inif((cmfland0xff)lsl8+(cmflsr8))mod31!=0||cm!=_deflatedthenerr_invalid_headerdelse(ifi_remd>0thenDe.Inf.srcstated.id.i_pos(i_remd);decode{dwithhd=unsafe_get_uint16d.t0;k=decode;dd;t_need=0;t_len=0;fdict=fdict==1;flevel;cinfo})inifi_remd>=2then(unsafe_set_uint16d.t0(unsafe_get_uint16d.id.i_pos);k{dwithi_pos=d.i_pos+2})else(ifi_remd<0thenerr_unexpected_end_of_inputdelseifi_remd==0thenrefillheaderdelset_fillk(t_need2d))anddecoded=matchd.ddwith|Hd_->headerd|Dd{state;o;_}->matchDe.Inf.decodestatewith|`Flush->ifd.fthenflushdecodedelseletlen=bigstring_lengtho-De.Inf.dst_remstateinflushdecode{dwithwr=d.wr+len;f=true;}|`Await->letlen=i_remd-De.Inf.src_remstateinrefilldecode{dwithi_pos=d.i_pos+len}|`End->ifd.fthenflushdecodedelseletlen=bigstring_lengtho-De.Inf.dst_remstateiniflen>0thenflushdecode{dwithi_pos=d.i_pos+(i_remd-De.Inf.src_remstate);wr=d.wr+len;f=true}elsechecksum{dwithi_pos=d.i_pos+(i_remd-De.Inf.src_remstate)}|`Malformederr->`Malformederrletsrcdsjl=if(j<0||l<0||j+l>bigstring_lengths)theninvalid_boundsjl;letd=if(l==0)theneoidelse{dwithi=s;i_pos=j;i_len=j+l-1}inmatchd.ddwith|Dd{state;_}->De.Inf.srcstatesjl;d|Hd_->dletflushd=matchd.ddwith|Hd_->{dwithf=false}|Dd{state;_}->De.Inf.flushstate;{dwithf=false}letdst_remd=matchd.ddwith|Hd_->0|Dd{state;_}->De.Inf.dst_remstateletsrc_remd=i_remdletwrite{wr;_}=wrletdecodersrc~o~allocate=leti,i_pos,i_len=matchsrcwith|`Manual->bigstring_empty,1,0|`Stringx->bigstring_of_stringx,0,String.lengthx-1|`Channel_->bigstring_createio_buffer_size,1,0in{i;i_pos;i_len;src;f=false;wr=0;hd=0;dd=Hd{o;};fdict=false;flevel=2;cinfo=8;allocate;t=bigstring_create4;t_need=0;t_len=0;k=decode}letresetd=leti,i_pos,i_len=matchd.srcwith|`Manual->bigstring_empty,1,0|`Stringx->bigstring_of_stringx,0,String.lengthx-1|`Channel_->bigstring_createio_buffer_size,1,0inleto=matchd.ddwith|Hd{o;}->o|Dd{o;_}->oin{i;i_pos;i_len;src=d.src;f=false;wr=0;hd=0;dd=Hd{o;};fdict=false;flevel=2;cinfo=8;allocate=d.allocate;t=d.t;t_need=0;t_len=0;k=decode}letdecoded=d.kdendmoduleDef=structtypesrc=[`Channelofin_channel|`Stringofstring|`Manual]typedst=[`Channelofout_channel|`BufferofBuffer.t|`Manual]typeencoder={src:src;dst:dst;level:int;i:bigstring;i_pos:int;i_len:int;o:bigstring;o_pos:int;o_len:int;q:De.Queue.t;s:De.Lz77.state;e:De.Def.encoder;w:De.window;state:state;k:encoder->[`Awaitofencoder|`Flushofencoder|`Endofencoder]}andstate=Hd(* header process *)|Dd(* DEFLATE process *)typeret=[`Awaitofencoder|`Endofencoder|`Flushofencoder]leto_reme=e.o_len-e.o_pos+1leti_rems=s.i_len-s.i_pos+1leteoie=De.Lz77.srce.sbigstring_empty00;{ewithi=bigstring_empty;i_pos=0;i_len=min_int}letsrcesjl=if(j<0||l<0||j+l>bigstring_lengths)theninvalid_boundsjl;De.Lz77.srce.ssjl;if(l==0)theneoieelse{ewithi=s;i_pos=j;i_len=j+l-1}letdstesjl=if(j<0||l<0||j+l>bigstring_lengths)theninvalid_boundsjl;((matche.statewith|Hd->()|Dd->De.Def.dste.esjl);{ewitho=s;o_pos=j;o_len=j+l-1})letrefillke=matche.srcwith|`String_->k(eoie)|`Channelic->letres=input_bigstringice.i0(bigstring_lengthe.i)ink(srcee.i0res)|`Manual->`Await{ewithk}letflushke=matche.dstwith|`Bufferb->letlen=bigstring_lengthe.o-o_remeinfori=0tolen-1doBuffer.add_charbe.o.{i}done;k(dstee.o0(bigstring_lengthe.o))|`Channeloc->output_bigstringoce.o0(bigstring_lengthe.o-o_reme);k(dstee.o0(bigstring_lengthe.o))|`Manual->`Flush{ewithk}letidentitye=`Endeletrecchecksume=letke=letchecksum=Optint.to_int32(De.Lz77.checksume.s)inunsafe_set_uint32_bee.oe.o_poschecksum;flushidentity{ewitho_pos=e.o_pos+4}inifo_reme>=4thenkeelseflushchecksumeletmake_block?(last=false)e=iflast=falsethenletliterals=De.Lz77.literalse.sinletdistances=De.Lz77.distancese.sinletdynamic=De.Def.dynamic_of_frequencies~literals~distancesin{De.Def.kind=De.Def.Dynamicdynamic;last;}else{De.Def.kind=De.Def.Fixed;last;}letrecencodee=matche.statewith|Hd->letke=letheader=(_deflated+((De.window_bitse.w-8)lsl4))lsl8inletheader=headerlor(e.levellsl6)inletheader=header+(31-(headermod31))inunsafe_set_uint16_bee.oe.o_posheader;ifi_reme>0thenDe.Lz77.srce.se.ie.i_pos(i_reme);(* XXX(dinosaure): we need to protect [e.s] against EOI signal. *)De.Def.dste.ee.o(e.o_pos+2)(o_reme-2);encode{ewithstate=Dd;o_pos=e.o_pos+2}inifo_reme>=2thenkeelseflushencodee|Dd->letrecpartialke=ke(De.Def.encodee.e`Await)andcompresse=matchDe.Lz77.compresse.swith|`Await->refillcompress{ewithi_pos=e.i_pos+(i_reme-De.Lz77.src_reme.s)}|`Flush->encode_deflatee(De.Def.encodee.e`Flush)|`End->De.Queue.push_exne.qDe.Queue.eob;letblock=make_block~last:trueeintrailinge(De.Def.encodee.e(`Blockblock))andencode_deflatee=function|`Partial->letlen=o_reme-De.Def.dst_reme.einflush(partialencode_deflate){ewitho_pos=e.o_pos+len}|`Ok->compresse|`Block->letblock=make_blockeinencode_deflatee(De.Def.encodee.e(`Blockblock))andtrailinge=function|`Partial->letlen=o_reme-De.Def.dst_reme.einflush(partialtrailing){ewitho_pos=e.o_pos+len}|`Ok->letlen=o_reme-De.Def.dst_reme.einchecksum{ewitho_pos=e.o_pos+len}|`Block->assertfalse(* XXX(dinosaure): should never occur! *)incompresseletsrc_rem=i_remletdst_rem=o_remletencodersrcdst~q~w~level=leti,i_pos,i_len=matchsrcwith|`Manual->bigstring_empty,1,0|`Stringx->bigstring_of_stringx,0,String.lengthx-1|`Channel_->bigstring_createio_buffer_size,1,0inleto,o_pos,o_len=matchdstwith|`Manual->bigstring_empty,1,0|`Buffer_|`Channel_->bigstring_createio_buffer_size,0,io_buffer_size-1iniflevel<0||level>3theninvalid_arg"Invalid compression level %d (must be in the range 0...3)"level;{src;dst;i;i_pos;i_len;o;o_pos;o_len;level;e=De.Def.encoder`Manual~q;s=De.Lz77.state`Manual~q~w;q;w;state=Hd;k=encode}letencodee=e.keendmoduleHigher=structletcompress?(level=0)~w~q~i~o~refill~flush=letencoder=Def.encoder`Manual`Manual~q~w~levelinletrecgoencoder=matchDef.encodeencoderwith|`Awaitencoder->letlen=refilliingo(Def.srcencoderi0len)|`Flushencoder->letlen=bigstring_lengtho-Def.dst_remencoderinflusholen;go(Def.dstencodero0(bigstring_lengtho))|`Endencoder->letlen=bigstring_lengtho-Def.dst_remencoderiniflen>0thenflusholeningo(Def.dstencodero0(bigstring_lengtho))letuncompress~allocate~i~o~refill~flush=letdecoder=Inf.decoder`Manual~allocate~oinletrecgodecoder=matchInf.decodedecoderwith|`Awaitdecoder->letlen=refilliingo(Inf.srcdecoderi0len)|`Flushdecoder->letlen=bigstring_lengtho-Inf.dst_remdecoderinflusholen;go(Inf.flushdecoder)|`Enddecoder->letlen=bigstring_lengtho-Inf.dst_remdecoderiniflen>0thenflusholen;Ok()|`Malformederr->Error(`Msgerr)ingodecoderend