-(* Bitmatch library.
+(* Bitstring library.
* Copyright (C) 2008 Red Hat Inc., Richard W.M. Jones
*
* This library is free software; you can redistribute it and/or
open Printf
-include Bitmatch_types
-include Bitmatch_config
+include Bitstring_types
+include Bitstring_config
(* Enable runtime debug messages. Must also have been enabled
- * in pa_bitmatch.ml.
+ * in pa_bitstring.ml.
*)
let debug = ref false
else if bits = 31 then
minus_one
else
- invalid_arg "Bitmatch.I.mask"
+ invalid_arg "Bitstring.I.mask"
(* Byte swap an int of a given size. *)
let byteswap v bits =
let lsb = v land (mask bits) in
g (to_int lsb) bits
)
+
+ (* Call function g on the top bits, then f on each full byte
+ * (little endian - so start at root).
+ *)
+ let rec map_bytes_le g f v bits =
+ if bits >= 8 then (
+ let lsb = v land ff in
+ f (to_int lsb);
+ map_bytes_le g f (v >> 8) (bits-8)
+ ) else if bits > 0 then (
+ let lsb = v land (mask bits) in
+ g (to_int lsb) bits
+ )
end
module I32 = struct
else if bits = 32 then
minus_one
else
- invalid_arg "Bitmatch.I32.mask"
+ invalid_arg "Bitstring.I32.mask"
(* Byte swap an int of a given size. *)
let byteswap v bits =
let lsb = v land (mask bits) in
g (to_int lsb) bits
)
+
+ (* Call function g on the top bits, then f on each full byte
+ * (little endian - so start at root).
+ *)
+ let rec map_bytes_le g f v bits =
+ if bits >= 8 then (
+ let lsb = v land ff in
+ f (to_int lsb);
+ map_bytes_le g f (v >> 8) (bits-8)
+ ) else if bits > 0 then (
+ let lsb = v land (mask bits) in
+ g (to_int lsb) bits
+ )
end
module I64 = struct
else if bits = 64 then
minus_one
else
- invalid_arg "Bitmatch.I64.mask"
+ invalid_arg "Bitstring.I64.mask"
(* Byte swap an int of a given size. *)
(* let byteswap v bits = *)
let lsb = v land (mask bits) in
g (to_int lsb) bits
)
+
+ (* Call function g on the top bits, then f on each full byte
+ * (little endian - so start at root).
+ *)
+ let rec map_bytes_le g f v bits =
+ if bits >= 8 then (
+ let lsb = v land ff in
+ f (to_int lsb);
+ map_bytes_le g f (v >> 8) (bits-8)
+ ) else if bits > 0 then (
+ let lsb = v land (mask bits) in
+ g (to_int lsb) bits
+ )
end
(*----------------------------------------------------------------------*)
(* Add exactly 8 bits. *)
let add_byte ({ buf = buf; len = len; last = last } as t) byte =
- if byte < 0 || byte > 255 then invalid_arg "Bitmatch.Buffer.add_byte";
+ if byte < 0 || byte > 255 then invalid_arg "Bitstring.Buffer.add_byte";
let shift = len land 7 in
if shift = 0 then
(* Target buffer is byte-aligned. *)
* to call add_bit so it's slow.
*)
let _add_bits t c slen =
- if slen < 1 || slen >= 8 then invalid_arg "Bitmatch.Buffer._add_bits";
+ if slen < 1 || slen >= 8 then invalid_arg "Bitstring.Buffer._add_bits";
for i = slen-1 downto 0 do
let bit = c land (1 lsl i) <> 0 in
add_bit t bit
(* Add the bytes. *)
I.map_bytes_be (Buffer._add_bits buf) (Buffer.add_byte buf) v flen
+(* Construct a field of up to 31 bits. *)
+let construct_int_le_unsigned buf v flen exn =
+ (* Check value is within range. *)
+ if not (I.range_unsigned v flen) then raise exn;
+ (* Add the bytes. *)
+ I.map_bytes_le (Buffer._add_bits buf) (Buffer.add_byte buf) v flen
+
let construct_int_ne_unsigned =
if nativeendian = BigEndian
then construct_int_be_unsigned
- else (*construct_int_le_unsigned*)
- fun _ _ _ _ -> failwith "construct_int_le_unsigned"
+ else construct_int_le_unsigned
let construct_int_ee_unsigned = function
| BigEndian -> construct_int_be_unsigned
- | LittleEndian -> (*construct_int_le_unsigned*)
- (fun _ _ _ _ -> failwith "construct_int_le_unsigned")
+ | LittleEndian -> construct_int_le_unsigned
| NativeEndian -> construct_int_ne_unsigned
(* Construct a field of exactly 32 bits. *)
(* Add the bytes. *)
I64.map_bytes_be (Buffer._add_bits buf) (Buffer.add_byte buf) v flen
+(* Construct a field of up to 64 bits. *)
+let construct_int64_le_unsigned buf v flen exn =
+ (* Check value is within range. *)
+ if not (I64.range_unsigned v flen) then raise exn;
+ (* Add the bytes. *)
+ I64.map_bytes_le (Buffer._add_bits buf) (Buffer.add_byte buf) v flen
+
let construct_int64_ne_unsigned =
if nativeendian = BigEndian
then construct_int64_be_unsigned