12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394(* This file is part of Markup.ml, released under the MIT license. See
LICENSE.md for details, or visit https://github.com/aantron/markup.ml. *)openKstreamletstate_foldfinitial=letstate=refinitialin(funthrowek->f!statethrowe(fun(c,new_state)->state:=new_state;kc))|>makeletstrings=state_fold(funi_ek->ifi>=String.lengthsthene()elsek(s.[i],i+1))0letbufferb=state_fold(funi_ek->ifi>=Buffer.lengthbthene()elsek(Buffer.nthbi,i+1))0(* Optimized away by Flambda. *)typeresult=Countofint|Exnofexnletchannelc=letended=reffalseinletbuffer_length=4096inletbuffer=Bytes.createbuffer_lengthinletposition=ref0inletbuffered=ref0in(funthrowek->letposition'=!positioninifposition'<!bufferedthenbeginposition:=position'+1;k(Bytes.getbufferposition')endelseletresult=tryCount(inputcbuffer0buffer_length)withexn->Exnexninmatchresultwith|Count0->ended:=true;e()|Countn->position:=1;buffered:=n;k(Bytes.getbuffer0)|Exnexn->if!endedthene()elsethrowexn)|>makeletfilef=letc=open_infinlets=channelcinlets'=(funthrowek->nexts(funexn->close_in_noerrc;throwexn)(fun()->close_in_noerrc;e())k)|>makeins',fun()->close_in_noerrcletto_buffersthrowk=letbuffer=Buffer.create4096initer(funb_k->Buffer.add_charbufferb;k())sthrow(fun()->kbuffer)letto_stringsthrowk=to_buffersthrow(funbuffer->k(Buffer.contentsbuffer))letto_channelcsthrowk=letwritebthrowk=letexn=tryoutput_charcb;Nonewithexn->Someexninmatchexnwith|None->k()|Someexn->throwexniniterwritesthrowkletto_filefsthrowk=letc=open_outfinto_channelcs(funexn->close_out_noerrc;throwexn)(fun()->close_out_noerrc;k())