- <div class="lineNone">001045| (* To channel. *)</div>
- <div class="lineNone">001046| </div>
- <div class="lineNone">001047| let bitstring_to_chan ((data, off, len) as bits) chan =</div>
- <div class="lineNone">001048| (* Fail if the bitstring length isn't a multiple of 8. *)</div>
- <div class="lineMixed">001049| (*[1]*)if len land 7 <> 0 then (*[0]*)invalid_arg "bitstring_to_chan";</div>
- <div class="lineNone">001050| </div>
- <div class="lineAllVisited">001051| (*[1]*)if off land 7 = 0 then</div>
- <div class="lineNone">001052| (* Easy case: string is byte-aligned. *)</div>
- <div class="lineAllVisited">001053| (*[1]*)output chan data (off lsr 3) (len lsr 3)</div>
- <div class="lineNone">001054| else (</div>
- <div class="lineNone">001055| (* Bit-twiddling case: reuse string_of_bitstring *)</div>
- <div class="lineAllUnvisited">001056| (*[0]*)let str = string_of_bitstring bits in</div>
- <div class="lineAllUnvisited">001057| (*[0]*)output_string chan str</div>
- <div class="lineNone">001058| )</div>
- <div class="lineNone">001059| </div>
- <div class="lineNone">001060| let bitstring_to_file bits filename =</div>
- <div class="lineAllUnvisited">001061| (*[0]*)let chan = open_out_bin filename in</div>
- <div class="lineAllUnvisited">001062| (*[0]*)try</div>
- <div class="lineAllUnvisited">001063| (*[0]*)bitstring_to_chan bits chan;</div>
- <div class="lineAllUnvisited">001064| (*[0]*)close_out chan</div>
- <div class="lineNone">001065| with exn -></div>
- <div class="lineAllUnvisited">001066| (*[0]*)close_out (*[0]*)chan;</div>
- <div class="lineAllUnvisited">001067| (*[0]*)raise exn</div>
- <div class="lineNone">001068| </div>
- <div class="lineNone">001069| (*----------------------------------------------------------------------*)</div>
- <div class="lineNone">001070| (* Comparison. *)</div>
- <div class="lineNone">001071| let compare ((data1, off1, len1) as bs1) ((data2, off2, len2) as bs2) =</div>
- <div class="lineNone">001072| (* In the fully-aligned case, this is reduced to string comparison ... *)</div>
- <div class="lineAllVisited">001073| (*[4624]*)if off1 (*[4624]*)land 7 = 0 && len1 (*[4624]*)land 7 (*[4624]*)= 0 && off2 (*[680]*)land 7 (*[680]*)= 0 && len2 (*[535]*)land 7 = 0</div>
- <div class="lineNone">001074| then (</div>
- <div class="lineNone">001075| (* ... but we have to do that by hand because the bits may</div>
- <div class="lineNone">001076| * not extend to the full length of the underlying string.</div>
- <div class="lineNone">001077| *)</div>
- <div class="lineAllVisited">001078| (*[100]*)let off1 = off1 lsr 3 and off2 = off2 lsr 3</div>
- <div class="lineNone">001079| and len1 = len1 lsr 3 and len2 = len2 lsr 3 in</div>
- <div class="lineAllVisited">001080| (*[100]*)let rec loop i =</div>
- <div class="lineAllVisited">001081| (*[240]*)if (*[240]*)i < len1 && (*[170]*)i < len2 then (</div>
- <div class="lineAllVisited">001082| (*[140]*)let c1 = String.unsafe_get data1 (off1 + i)</div>
- <div class="lineNone">001083| and c2 = String.unsafe_get data2 (off2 + i) in</div>
- <div class="lineAllVisited">001084| (*[140]*)let r = compare c1 c2 in</div>
- <div class="lineMixed">001085| (*[140]*)if r <> 0 then (*[0]*)r</div>
- <div class="lineAllVisited">001086| else (*[140]*)loop (i+1)</div>
- <div class="lineNone">001087| )</div>
- <div class="lineAllVisited">001088| else (*[100]*)len1 - len2</div>
- <div class="lineNone">001089| in</div>
- <div class="lineAllVisited">001090| (*[100]*)loop 0</div>
- <div class="lineNone">001091| )</div>
- <div class="lineNone">001092| else (</div>
- <div class="lineNone">001093| (* Slow/unaligned. *)</div>
- <div class="lineAllVisited">001094| (*[4524]*)let str1 = string_of_bitstring bs1</div>
- <div class="lineNone">001095| and str2 = string_of_bitstring bs2 in</div>
- <div class="lineAllVisited">001096| (*[4524]*)let r = String.compare str1 str2 in</div>
- <div class="lineAllVisited">001097| (*[4524]*)if r <> 0 then (*[3058]*)r else (*[1466]*)len1 - len2</div>
- <div class="lineNone">001098| )</div>
- <div class="lineNone">001099| </div>
- <div class="lineNone">001100| let equals ((_, _, len1) as bs1) ((_, _, len2) as bs2) =</div>
- <div class="lineMixed">001101| (*[7]*)if len1 <> len2 then (*[0]*)false</div>
- <div class="lineAllVisited">001102| else (*[7]*)if bs1 = bs2 then (*[7]*)true</div>
- <div class="lineAllUnvisited">001103| else (*[0]*)0 = compare bs1 bs2</div>
- <div class="lineNone">001104| </div>
- <div class="lineNone">001105| (*----------------------------------------------------------------------*)</div>
- <div class="lineNone">001106| (* Bit get/set functions. *)</div>
+ <div class="lineNone">001045| let bitstring_to_chan ((data, off, len) as bits) chan =</div>
+ <div class="lineNone">001046| (* Fail if the bitstring length isn't a multiple of 8. *)</div>
+ <div class="lineMixed">001047| (*[1]*)if len land 7 <> 0 then (*[0]*)invalid_arg "bitstring_to_chan";</div>
+ <div class="lineNone">001048| </div>
+ <div class="lineAllVisited">001049| (*[1]*)if off land 7 = 0 then</div>
+ <div class="lineNone">001050| (* Easy case: string is byte-aligned. *)</div>
+ <div class="lineAllVisited">001051| (*[1]*)output chan data (off lsr 3) (len lsr 3)</div>
+ <div class="lineNone">001052| else (</div>
+ <div class="lineNone">001053| (* Bit-twiddling case: reuse string_of_bitstring *)</div>
+ <div class="lineAllUnvisited">001054| (*[0]*)let str = string_of_bitstring bits in</div>
+ <div class="lineAllUnvisited">001055| (*[0]*)output_string chan str</div>
+ <div class="lineNone">001056| )</div>
+ <div class="lineNone">001057| </div>
+ <div class="lineNone">001058| let bitstring_to_file bits filename =</div>
+ <div class="lineAllUnvisited">001059| (*[0]*)let chan = open_out_bin filename in</div>
+ <div class="lineAllUnvisited">001060| (*[0]*)try</div>
+ <div class="lineAllUnvisited">001061| (*[0]*)bitstring_to_chan bits chan;</div>
+ <div class="lineAllUnvisited">001062| (*[0]*)close_out chan</div>
+ <div class="lineNone">001063| with exn -></div>
+ <div class="lineAllUnvisited">001064| (*[0]*)close_out (*[0]*)chan;</div>
+ <div class="lineAllUnvisited">001065| (*[0]*)raise exn</div>
+ <div class="lineNone">001066| </div>
+ <div class="lineNone">001067| (*----------------------------------------------------------------------*)</div>
+ <div class="lineNone">001068| (* Comparison. *)</div>
+ <div class="lineNone">001069| let compare ((data1, off1, len1) as bs1) ((data2, off2, len2) as bs2) =</div>
+ <div class="lineNone">001070| (* In the fully-aligned case, this is reduced to string comparison ... *)</div>
+ <div class="lineAllVisited">001071| (*[4624]*)if off1 (*[4624]*)land 7 = 0 && len1 (*[4624]*)land 7 (*[4624]*)= 0 && off2 (*[680]*)land 7 (*[680]*)= 0 && len2 (*[535]*)land 7 = 0</div>
+ <div class="lineNone">001072| then (</div>
+ <div class="lineNone">001073| (* ... but we have to do that by hand because the bits may</div>
+ <div class="lineNone">001074| * not extend to the full length of the underlying string.</div>
+ <div class="lineNone">001075| *)</div>
+ <div class="lineAllVisited">001076| (*[100]*)let off1 = off1 lsr 3 and off2 = off2 lsr 3</div>
+ <div class="lineNone">001077| and len1 = len1 lsr 3 and len2 = len2 lsr 3 in</div>
+ <div class="lineAllVisited">001078| (*[100]*)let rec loop i =</div>
+ <div class="lineAllVisited">001079| (*[240]*)if (*[240]*)i < len1 && (*[170]*)i < len2 then (</div>
+ <div class="lineAllVisited">001080| (*[140]*)let c1 = String.unsafe_get data1 (off1 + i)</div>
+ <div class="lineNone">001081| and c2 = String.unsafe_get data2 (off2 + i) in</div>
+ <div class="lineAllVisited">001082| (*[140]*)let r = compare c1 c2 in</div>
+ <div class="lineMixed">001083| (*[140]*)if r <> 0 then (*[0]*)r</div>
+ <div class="lineAllVisited">001084| else (*[140]*)loop (i+1)</div>
+ <div class="lineNone">001085| )</div>
+ <div class="lineAllVisited">001086| else (*[100]*)len1 - len2</div>
+ <div class="lineNone">001087| in</div>
+ <div class="lineAllVisited">001088| (*[100]*)loop 0</div>
+ <div class="lineNone">001089| )</div>
+ <div class="lineNone">001090| else (</div>
+ <div class="lineNone">001091| (* Slow/unaligned. *)</div>
+ <div class="lineAllVisited">001092| (*[4524]*)let str1 = string_of_bitstring bs1</div>
+ <div class="lineNone">001093| and str2 = string_of_bitstring bs2 in</div>
+ <div class="lineAllVisited">001094| (*[4524]*)let r = String.compare str1 str2 in</div>
+ <div class="lineAllVisited">001095| (*[4524]*)if r <> 0 then (*[3058]*)r else (*[1466]*)len1 - len2</div>
+ <div class="lineNone">001096| )</div>
+ <div class="lineNone">001097| </div>
+ <div class="lineNone">001098| let equals ((_, _, len1) as bs1) ((_, _, len2) as bs2) =</div>
+ <div class="lineMixed">001099| (*[7]*)if len1 <> len2 then (*[0]*)false</div>
+ <div class="lineAllVisited">001100| else (*[7]*)if bs1 = bs2 then (*[7]*)true</div>
+ <div class="lineAllUnvisited">001101| else (*[0]*)0 = compare bs1 bs2</div>
+ <div class="lineNone">001102| </div>
+ <div class="lineNone">001103| (*----------------------------------------------------------------------*)</div>
+ <div class="lineNone">001104| (* Bit get/set functions. *)</div>
+ <div class="lineNone">001105| </div>
+ <div class="lineAllUnvisited">001106| let index_out_of_bounds () = (*[0]*)invalid_arg "index out of bounds"</div>