123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336typebigstring=(char,Bigarray_compat.int8_unsigned_elt,Bigarray_compat.c_layout)Bigarray_compat.Array1.ttypet=bigstringletcreatesize=Bigarray_compat.(Array1.createcharc_layoutsize)letempty=create0moduleBA1=Bigarray_compat.Array1letlengtht=BA1.dimtexternalget:t->int->char="%caml_ba_ref_1"externalset:t->int->char->unit="%caml_ba_set_1"externalunsafe_get:t->int->char="%caml_ba_unsafe_ref_1"externalunsafe_set:t->int->char->unit="%caml_ba_unsafe_set_1"externalunsafe_blit:t->src_off:int->t->dst_off:int->len:int->unit="bigstringaf_blit_to_bigstring"[@@noalloc]externalunsafe_blit_to_bytes:t->src_off:int->Bytes.t->dst_off:int->len:int->unit="bigstringaf_blit_to_bytes"[@@noalloc]externalunsafe_blit_from_bytes:Bytes.t->src_off:int->t->dst_off:int->len:int->unit="bigstringaf_blit_from_bytes"[@@noalloc]externalunsafe_blit_from_string:string->src_off:int->t->dst_off:int->len:int->unit="bigstringaf_blit_from_bytes"[@@noalloc]externalunsafe_memcmp:t->int->t->int->int->int="bigstringaf_memcmp_bigstring"[@@noalloc]externalunsafe_memcmp_string:t->int->string->int->int->int="bigstringaf_memcmp_string"[@@noalloc]letsubt~off~len=BA1.subtofflenlet[@inlinenever]invalid_boundsopbuffer_lenofflen=letmessage=Printf.sprintf"Bigstringaf.%s invalid range: { buffer_len: %d, off: %d, len: %d }"opbuffer_lenoffleninraise(Invalid_argumentmessage);;let[@inlinenever]invalid_bounds_blitopsrc_lensrc_offdst_lendst_offlen=letmessage=Printf.sprintf"Bigstringaf.%s invalid range: { src_len: %d, src_off: %d, dst_len: %d, dst_off: %d, len: %d }"opsrc_lensrc_offdst_lendst_offleninraise(Invalid_argumentmessage);;let[@inlinenever]invalid_bounds_memcmpopbuf1_lenbuf1_offbuf2_lenbuf2_offlen=letmessage=Printf.sprintf"Bigstringaf.%s invalid range: { buf1_len: %d, buf1_off: %d, buf2_len: %d, buf2_off: %d, len: %d }"opbuf1_lenbuf1_offbuf2_lenbuf2_offleninraise(Invalid_argumentmessage);;(* A note on bounds checking.
*
* The code should perform the following check to ensure that the blit doesn't
* run off the end of the input buffer:
*
* {[off + len <= buffer_len]}
*
* However, this may lead to an integer overflow for large values of [off],
* e.g., [max_int], which will cause the comparison to return [true] when it
* should really return [false].
*
* An equivalent comparison that does not run into this integer overflow
* problem is:
*
* {[buffer_len - off => len]}
*
* This is checking that the input buffer, less the offset, is sufficiently
* long to perform the blit. Since the expression is subtracting [off] rather
* than adding it, it doesn't suffer from the overflow that the previous
* inequality did. As long as there is a check to ensure that [off] is not
* negative, it won't underflow either. *)letcopyt~off~len=letbuffer_len=lengthtiniflen<0||off<0||buffer_len-off<lentheninvalid_bounds"copy"buffer_lenofflen;letdst=createleninunsafe_blitt~src_off:offdst~dst_off:0~len;dst;;letsubstringt~off~len=letbuffer_len=lengthtiniflen<0||off<0||buffer_len-off<lentheninvalid_bounds"substring"buffer_lenofflen;letb=Bytes.createleninunsafe_blit_to_bytest~src_off:offb~dst_off:0~len;Bytes.unsafe_to_stringb;;letto_stringt=letlen=lengthtinletb=Bytes.createleninunsafe_blit_to_bytest~src_off:0b~dst_off:0~len;Bytes.unsafe_to_stringb;;letof_string~off~lens=letbuffer_len=String.lengthsiniflen<0||off<0||buffer_len-off<lentheninvalid_bounds"of_string"buffer_lenofflen;letb=createleninunsafe_blit_from_strings~src_off:offb~dst_off:0~len;b;;letblitsrc~src_offdst~dst_off~len=letsrc_len=lengthsrcinletdst_len=lengthdstiniflen<0theninvalid_bounds_blit"blit"src_lensrc_offdst_lendst_offlen;ifsrc_off<0||src_len-src_off<lentheninvalid_bounds_blit"blit"src_lensrc_offdst_lendst_offlen;ifdst_off<0||dst_len-dst_off<lentheninvalid_bounds_blit"blit"src_lensrc_offdst_lendst_offlen;unsafe_blitsrc~src_offdst~dst_off~len;;letblit_from_stringsrc~src_offdst~dst_off~len=letsrc_len=String.lengthsrcinletdst_len=lengthdstiniflen<0theninvalid_bounds_blit"blit_from_string"src_lensrc_offdst_lendst_offlen;ifsrc_off<0||src_len-src_off<lentheninvalid_bounds_blit"blit_from_string"src_lensrc_offdst_lendst_offlen;ifdst_off<0||dst_len-dst_off<lentheninvalid_bounds_blit"blit_from_string"src_lensrc_offdst_lendst_offlen;unsafe_blit_from_stringsrc~src_offdst~dst_off~len;;letblit_from_bytessrc~src_offdst~dst_off~len=letsrc_len=Bytes.lengthsrcinletdst_len=lengthdstiniflen<0theninvalid_bounds_blit"blit_from_bytes"src_lensrc_offdst_lendst_offlen;ifsrc_off<0||src_len-src_off<lentheninvalid_bounds_blit"blit_from_bytes"src_lensrc_offdst_lendst_offlen;ifdst_off<0||dst_len-dst_off<lentheninvalid_bounds_blit"blit_from_bytes"src_lensrc_offdst_lendst_offlen;unsafe_blit_from_bytessrc~src_offdst~dst_off~len;;letblit_to_bytessrc~src_offdst~dst_off~len=letsrc_len=lengthsrcinletdst_len=Bytes.lengthdstiniflen<0theninvalid_bounds_blit"blit_to_bytes"src_lensrc_offdst_lendst_offlen;ifsrc_off<0||src_len-src_off<lentheninvalid_bounds_blit"blit_to_bytes"src_lensrc_offdst_lendst_offlen;ifdst_off<0||dst_len-dst_off<lentheninvalid_bounds_blit"blit_to_bytes"src_lensrc_offdst_lendst_offlen;unsafe_blit_to_bytessrc~src_offdst~dst_off~len;;letmemcmpbuf1buf1_offbuf2buf2_offlen=letbuf1_len=lengthbuf1inletbuf2_len=lengthbuf2iniflen<0theninvalid_bounds_memcmp"memcmp"buf1_lenbuf1_offbuf2_lenbuf2_offlen;ifbuf1_off<0||buf1_len-buf1_off<lentheninvalid_bounds_memcmp"memcmp"buf1_lenbuf1_offbuf2_lenbuf2_offlen;ifbuf2_off<0||buf2_len-buf2_off<lentheninvalid_bounds_memcmp"memcmp"buf1_lenbuf1_offbuf2_lenbuf2_offlen;unsafe_memcmpbuf1buf1_offbuf2buf2_offlen;;letmemcmp_stringbuf1buf1_offbuf2buf2_offlen=letbuf1_len=lengthbuf1inletbuf2_len=String.lengthbuf2iniflen<0theninvalid_bounds_memcmp"memcmp_string"buf1_lenbuf1_offbuf2_lenbuf2_offlen;ifbuf1_off<0||buf1_len-buf1_off<lentheninvalid_bounds_memcmp"memcmp_string"buf1_lenbuf1_offbuf2_lenbuf2_offlen;ifbuf2_off<0||buf2_len-buf2_off<lentheninvalid_bounds_memcmp"memcmp_string"buf1_lenbuf1_offbuf2_lenbuf2_offlen;unsafe_memcmp_stringbuf1buf1_offbuf2buf2_offlen;;(* Safe operations *)externalcaml_bigstring_set_16:bigstring->int->int->unit="%caml_bigstring_set16"externalcaml_bigstring_set_32:bigstring->int->int32->unit="%caml_bigstring_set32"externalcaml_bigstring_set_64:bigstring->int->int64->unit="%caml_bigstring_set64"externalcaml_bigstring_get_16:bigstring->int->int="%caml_bigstring_get16"externalcaml_bigstring_get_32:bigstring->int->int32="%caml_bigstring_get32"externalcaml_bigstring_get_64:bigstring->int->int64="%caml_bigstring_get64"moduleSwap=structexternalbswap16:int->int="%bswap16"externalbswap_int32:int32->int32="%bswap_int32"externalbswap_int64:int64->int64="%bswap_int64"letcaml_bigstring_set_16bsoffi=caml_bigstring_set_16bsoff(bswap16i)letcaml_bigstring_set_32bsoffi=caml_bigstring_set_32bsoff(bswap_int32i)letcaml_bigstring_set_64bsoffi=caml_bigstring_set_64bsoff(bswap_int64i)letcaml_bigstring_get_16bsoff=bswap16(caml_bigstring_get_16bsoff)letcaml_bigstring_get_32bsoff=bswap_int32(caml_bigstring_get_32bsoff)letcaml_bigstring_get_64bsoff=bswap_int64(caml_bigstring_get_64bsoff)letget_int16_sign_extendedxoff=((caml_bigstring_get_16xoff)lsl(Sys.int_size-16))asr(Sys.int_size-16)endletset_int16_le,set_int16_be=ifSys.big_endianthenSwap.caml_bigstring_set_16,caml_bigstring_set_16elsecaml_bigstring_set_16,Swap.caml_bigstring_set_16letset_int32_le,set_int32_be=ifSys.big_endianthenSwap.caml_bigstring_set_32,caml_bigstring_set_32elsecaml_bigstring_set_32,Swap.caml_bigstring_set_32letset_int64_le,set_int64_be=ifSys.big_endianthenSwap.caml_bigstring_set_64,caml_bigstring_set_64elsecaml_bigstring_set_64,Swap.caml_bigstring_set_64letget_int16_le,get_int16_be=ifSys.big_endianthenSwap.caml_bigstring_get_16,caml_bigstring_get_16elsecaml_bigstring_get_16,Swap.caml_bigstring_get_16letget_int16_sign_extended_noswapxoff=((caml_bigstring_get_16xoff)lsl(Sys.int_size-16))asr(Sys.int_size-16)letget_int16_sign_extended_le,get_int16_sign_extended_be=ifSys.big_endianthenSwap.get_int16_sign_extended,get_int16_sign_extended_noswapelseget_int16_sign_extended_noswap,Swap.get_int16_sign_extendedletget_int32_le,get_int32_be=ifSys.big_endianthenSwap.caml_bigstring_get_32,caml_bigstring_get_32elsecaml_bigstring_get_32,Swap.caml_bigstring_get_32letget_int64_le,get_int64_be=ifSys.big_endianthenSwap.caml_bigstring_get_64,caml_bigstring_get_64elsecaml_bigstring_get_64,Swap.caml_bigstring_get_64(* Unsafe operations *)externalcaml_bigstring_unsafe_set_16:bigstring->int->int->unit="%caml_bigstring_set16u"externalcaml_bigstring_unsafe_set_32:bigstring->int->int32->unit="%caml_bigstring_set32u"externalcaml_bigstring_unsafe_set_64:bigstring->int->int64->unit="%caml_bigstring_set64u"externalcaml_bigstring_unsafe_get_16:bigstring->int->int="%caml_bigstring_get16u"externalcaml_bigstring_unsafe_get_32:bigstring->int->int32="%caml_bigstring_get32u"externalcaml_bigstring_unsafe_get_64:bigstring->int->int64="%caml_bigstring_get64u"moduleUSwap=structexternalbswap16:int->int="%bswap16"externalbswap_int32:int32->int32="%bswap_int32"externalbswap_int64:int64->int64="%bswap_int64"letcaml_bigstring_unsafe_set_16bsoffi=caml_bigstring_unsafe_set_16bsoff(bswap16i)letcaml_bigstring_unsafe_set_32bsoffi=caml_bigstring_unsafe_set_32bsoff(bswap_int32i)letcaml_bigstring_unsafe_set_64bsoffi=caml_bigstring_unsafe_set_64bsoff(bswap_int64i)letcaml_bigstring_unsafe_get_16bsoff=bswap16(caml_bigstring_unsafe_get_16bsoff)letcaml_bigstring_unsafe_get_32bsoff=bswap_int32(caml_bigstring_unsafe_get_32bsoff)letcaml_bigstring_unsafe_get_64bsoff=bswap_int64(caml_bigstring_unsafe_get_64bsoff)endletunsafe_set_int16_le,unsafe_set_int16_be=ifSys.big_endianthenUSwap.caml_bigstring_unsafe_set_16,caml_bigstring_unsafe_set_16elsecaml_bigstring_unsafe_set_16,USwap.caml_bigstring_unsafe_set_16letunsafe_set_int32_le,unsafe_set_int32_be=ifSys.big_endianthenUSwap.caml_bigstring_unsafe_set_32,caml_bigstring_unsafe_set_32elsecaml_bigstring_unsafe_set_32,USwap.caml_bigstring_unsafe_set_32letunsafe_set_int64_le,unsafe_set_int64_be=ifSys.big_endianthenUSwap.caml_bigstring_unsafe_set_64,caml_bigstring_unsafe_set_64elsecaml_bigstring_unsafe_set_64,USwap.caml_bigstring_unsafe_set_64letunsafe_get_int16_le,unsafe_get_int16_be=ifSys.big_endianthenUSwap.caml_bigstring_unsafe_get_16,caml_bigstring_unsafe_get_16elsecaml_bigstring_unsafe_get_16,USwap.caml_bigstring_unsafe_get_16letunsafe_get_int16_sign_extended_lexoff=((unsafe_get_int16_lexoff)lsl(Sys.int_size-16))asr(Sys.int_size-16)letunsafe_get_int16_sign_extended_bexoff=((unsafe_get_int16_bexoff)lsl(Sys.int_size-16))asr(Sys.int_size-16)letunsafe_get_int32_le,unsafe_get_int32_be=ifSys.big_endianthenUSwap.caml_bigstring_unsafe_get_32,caml_bigstring_unsafe_get_32elsecaml_bigstring_unsafe_get_32,USwap.caml_bigstring_unsafe_get_32letunsafe_get_int64_le,unsafe_get_int64_be=ifSys.big_endianthenUSwap.caml_bigstring_unsafe_get_64,caml_bigstring_unsafe_get_64elsecaml_bigstring_unsafe_get_64,USwap.caml_bigstring_unsafe_get_64