-(* Bitmatch persistent patterns.
+(* Bitstring persistent patterns.
* Copyright (C) 2008 Red Hat Inc., Richard W.M. Jones
*
* This library is free software; you can redistribute it and/or
}
and field_type = Int | String | Bitstring (* field type *)
and endian_expr =
- | ConstantEndian of Bitmatch.endian (* a constant little/big/nativeendian *)
+ | ConstantEndian of Bitstring.endian (* a constant little/big/nativeendian *)
| EndianExpr of expr (* an endian expression *)
type pattern = patt field list
| <:patt< _ >> -> "_"
| _ -> "[pattern]"
-let expr_printer = function
+let rec expr_printer = function
| <:expr< $lid:id$ >> -> id
| <:expr< $int:i$ >> -> i
- | _ -> "[expression]"
+ | <:expr< $lid:op$ $a$ $b$ >> ->
+ sprintf "%s %s %s" op (expr_printer a) (expr_printer b)
+ | _ -> "[expr]"
let _string_of_field { flen = flen;
endian = endian; signed = signed; t = t;
_loc = _loc;
offset = offset; check = check; bind = bind;
save_offset_to = save_offset_to } =
- let flen =
- match expr_is_constant flen with
- | Some i -> string_of_int i
- | None -> "[non-const-len]" in
+ let flen = expr_printer flen in
let endian =
match endian with
- | ConstantEndian endian -> Bitmatch.string_of_endian endian
- | EndianExpr _ -> "endian([expr])" in
+ | ConstantEndian endian -> Bitstring.string_of_endian endian
+ | EndianExpr expr -> sprintf "endian(%s)" (expr_printer expr) in
let signed = if signed then "signed" else "unsigned" in
let t = string_of_field_type t in
let offset =
match offset with
| None -> ""
- | Some expr ->
- match expr_is_constant expr with
- | Some i -> sprintf ", offset(%d)" i
- | None -> sprintf ", offset([expr])" in
+ | Some expr -> sprintf ", offset(%s)" (expr_printer expr) in
let check =
match check with
| None -> ""
- | Some expr -> sprintf ", check([expr])" in
+ | Some expr -> sprintf ", check(%s)" (expr_printer expr) in
let bind =
match bind with
| None -> ""
- | Some expr -> sprintf ", bind([expr])" in
+ | Some expr -> sprintf ", bind(%s)" (expr_printer expr) in
let save_offset_to =
match save_offset_to with
{
field = <:patt< _ >>;
flen = <:expr< 32 >>;
- endian = ConstantEndian Bitmatch.BigEndian;
+ endian = ConstantEndian Bitstring.BigEndian;
signed = false;
t = Int;
_loc = _loc;
{
field = <:expr< 0 >>;
flen = <:expr< 32 >>;
- endian = ConstantEndian Bitmatch.BigEndian;
+ endian = ConstantEndian Bitstring.BigEndian;
signed = false;
t = Int;
_loc = _loc;