123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158letsize=Bigarray.Array1.dimtypet=(int,Bigarray.int8_unsigned_elt,Bigarray.c_layout)Bigarray.Array1.ttypecursor={buffer:t;mutableposition:int;}letmap_binarypath=letfd=Unix.openfilepath[Unix.O_RDONLY]0inletlen=Unix.lseekfd0Unix.SEEK_ENDinlett=Bigarray.array1_of_genarray(Unix.map_filefdBigarray.int8_unsignedBigarray.c_layoutfalse[|len|])inUnix.closefd;texceptionInvalid_formatofstringletinvalid_formatmsg=raise(Invalid_formatmsg)letassert_formatbmsg=ifnotbtheninvalid_formatmsgletcursor?(at=0)buffer={buffer;position=at}letseektposition=t.position<-positionletensuretcountmsg=(* Ensure position does not overflow before checking for buffer overflow. *)letnew_pos=t.position+countinif(new_pos<0)||(sizet.buffer<new_pos)theninvalid_formatmsgletadvancetcount=t.position<-t.position+countletat_endt=sizet.buffer=t.positiontypes8=inttypeu8=inttypeu16=inttypes32=inttypeu32=inttypeu64=int64typei64=int64types128=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=ref0Linfori=0to7doletopenInt64inletn=of_intt.buffer.{t.position+i}inresult:=logor!result(shift_leftn(i*8))done;advancet8;!resultleti64t:i64=(* u64 are wrapped in an i64 and are actually signed. *)u64tletuleb128t: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_0(b:t)ofsli=ifi>=lthenNoneelseifb.{ofs+i}=0thenSomeielsescan_0bofsl(i+1)letzero_stringt?maxlen()=letmaxlen=matchmaxlenwith|None->sizet.buffer-t.position|Somemaxlen->maxleninmatchscan_0t.buffert.positionmaxlen0with|None->None|Somelength->letresult=fixed_stringtlengthinadvancet1;Someresultletbuffertlength=letresult=Bigarray.Array1.subt.buffert.positionlengthinadvancetlength;resultendletsubtlength=cursor(Read.buffertlength)