+(* Construct from a bitstring. *)
+let construct_bitstring buf (data, off, len) =
+ (* Add individual bits until we get to the next byte boundary of
+ * the underlying string.
+ *)
+ let blen = 7 - ((off + 7) land 7) in
+ let blen = min blen len in
+ let rec loop off len blen =
+ if blen = 0 then (off, len)
+ else (
+ let b, off, len = extract_bit data off len 1 in
+ Buffer.add_bit buf b;
+ loop off len (blen-1)
+ )
+ in
+ let off, len = loop off len blen in
+ assert (len = 0 || (off land 7) = 0);
+
+ (* Add the remaining 'len' bits. *)
+ let data =
+ let off = off lsr 3 in
+ (* XXX dangerous allocation *)
+ if off = 0 then data
+ else String.sub data off (String.length data - off) in
+
+ Buffer.add_bits buf data len
+