signed : bool; (* true if signed, false if unsigned *)
t : field_type; (* type *)
_loc : Loc.t; (* location in source code *)
+ offset : expr option; (* offset expression *)
(* Turn the field into a string. This used to be a function,
* but that would prevent this structure from being marshalled.
t = Int;
_loc = _loc;
printer = PattPrinter;
+ offset = None;
}
let set_lident_patt field id =
let set_type_string field = { field with t = String }
let set_type_bitstring field = { field with t = Bitstring }
let set_location field loc = { field with _loc = loc }
+let set_offset_int field i =
+ let _loc = field._loc in
+ { field with offset = Some <:expr< $`int:i$ >> }
+let set_offset field expr = { field with offset = Some expr }
+let set_no_offset field = { field with offset = None }
let create_constructor_field _loc =
{
t = Int;
_loc = _loc;
printer = ExprPrinter;
+ offset = None;
}
let set_lident_expr field id =
let get_signed field = field.signed
let get_type field = field.t
let get_location field = field._loc
+let get_offset field = field.offset
The pattern is unbound, the type is set to [int], bit length to [32],
endianness to [BigEndian], signedness to unsigned ([false]),
- and source code location to the [_loc] parameter.
+ source code location to the [_loc] parameter, and no offset expression.
To create a complete field you need to call the [set_*]
functions. For example, to create [{ len : 8 : int }]
(** Sets the source code location of a field. This is used when
pa_bitmatch displays error messages. *)
+val set_offset_int : 'a field -> int -> 'a field
+(** Set the offset expression for a field to the given number.
+
+ The effect is that the field [{ _ : 8 : offset(160) }] could
+ be created by calling [set_offset_int field 160]. *)
+
+val set_offset : 'a field -> expr -> 'a field
+(** Set the offset expression for a field to the given expression.
+
+ The effect is that the field [{ _ : 8 : offset(160) }] could
+ be created by calling [set_offset_int field <:expr< 160 >>]. *)
+
+val set_no_offset : 'a field -> 'a field
+(** Remove the offset expression from a field. The field will
+ follow the previous field, or if it is the first field will
+ be at offset zero. *)
+
(** {3 Create constructor fields}
These fields are used in constructors ([BITSTRING]). *)
val get_location : 'a field -> loc_t
(** Get the source code location of a field. *)
+
+val get_offset : 'a field -> expr option
+(** Get the offset expression of a field, or [None] if there is none. *)