123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142letdim=Bigarray.Array1.dimtypet=(int,Bigarray.int8_unsigned_elt,Bigarray.c_layout)Bigarray.Array1.ttypecursor={buffer:t;mutableposition:int;}exceptionInvalid_formatofstringletinvalid_formatmsg=raise(Invalid_formatmsg)letassert_formatbmsg=ifnotbtheninvalid_formatmsgletcursor?(at=0)buffer={buffer;position=at}letseektposition=t.position<-positionletensuretcountmsg=ift.position+count>dimt.buffertheninvalid_formatmsgletadvancetcount=t.position<-t.position+countletat_endt=dimt.buffer=t.positiontypes8=inttypeu8=inttypeu16=inttypes32=inttypeu32=inttypeu64=inttypes128=inttypeu128=int(* All endian and bit-width dependent code starts here *)moduleRead=structletu8t:u8=letresult=t.buffer.{t.position}inadvancet1;resultlets8t:s8=letresult=t.buffer.{t.position}inadvancet1;ifresult>0x7Fthenresultlor((-1)lsl8)elseresultletu16t:u16=letresult=t.buffer.{t.position}lort.buffer.{t.position+1}lsl8inadvancet2;resultletu32t:u32=letresult=t.buffer.{t.position}lort.buffer.{t.position+1}lsl8lort.buffer.{t.position+2}lsl16lort.buffer.{t.position+3}lsl24inadvancet4;resultletu32be=u32letu64t:u64=letresult=t.buffer.{t.position}lort.buffer.{t.position+1}lsl8lort.buffer.{t.position+2}lsl16lort.buffer.{t.position+3}lsl24lort.buffer.{t.position+4}lsl32lort.buffer.{t.position+5}lsl40lort.buffer.{t.position+6}lsl48lort.buffer.{t.position+7}lsl56inadvancet8;resultletuleb128t:u128=letrecauxtshiftacc=letx=u8tinletacc=acclor((xland0x7f)lslshift)inifxland0x80=0thenaccelseauxt(shift+7)accinauxt00letsleb128t:s128=letrecauxtshiftacc=letx=u8tinletacc=acclor((xland0x7f)lslshift)inifxland0x80=0thenifxland0x40=0thenaccelseacclor-(1lsl(shift+7))elseauxt(shift+7)accinauxt00letfixed_stringtlength=let{buffer;position}=tinletresult=Bytes.createlengthinfori=0tolength-1doBytes.setresulti(Char.unsafe_chrbuffer.{position+i})done;advancetlength;Bytes.unsafe_to_stringresultletrecscan_0msg(b:t)ofsli=ifi>=ltheninvalid_formatmsgelseifb.{ofs+i}=0thenielsescan_0msgbofsl(i+1)letzero_stringmsgt?maxlen()=letmaxlen=matchmaxlenwith|None->dimt.buffer-t.position|Somemaxlen->maxleninletlength=scan_0msgt.buffert.positionmaxlen0inletresult=fixed_stringtlengthinadvancet1;resultletbuffertlength=letresult=Bigarray.Array1.subt.buffert.positionlengthinadvancetlength;resultendletsubtlength=cursor(Read.buffertlength)