From: Richard W.M. Jones Date: Tue, 1 Jul 2008 11:19:34 +0000 (+0000) Subject: Refactor constructor and extractor function name generation (Bluestorm). X-Git-Url: http://git.annexia.org/?a=commitdiff_plain;h=46047bb453d9c4e831e6d646062567106592f542;hp=41b0cba3e1ce05c96c330d76200ca38e9c4bd3c2;p=ocaml-bitstring.git Refactor constructor and extractor function name generation (Bluestorm). --- diff --git a/pa_bitmatch.ml b/pa_bitmatch.ml index 3cea7f2..da477e7 100644 --- a/pa_bitmatch.ml +++ b/pa_bitmatch.ml @@ -133,6 +133,37 @@ let parse_field _loc field qs = field +(* Choose the right constructor function. *) +let build_bitmatch_call _loc funcname length endian signed = + match length, endian, signed with + (* XXX The meaning of signed/unsigned breaks down at + * 31, 32, 63 and 64 bits. + *) + | (Some 1, _, _) -> <:expr> + | (Some (2|3|4|5|6|7|8), _, sign) -> + let call = Printf.sprintf "%s_char_%s" + funcname (if sign then "signed" else "unsigned") in + <:expr< Bitmatch.$lid:call$ >> + | (len, endian, signed) -> + let t = match len with + | Some i when i <= 31 -> "int" + | Some 32 -> "int32" + | _ -> "int64" in + let sign = if signed then "signed" else "unsigned" in + match endian with + | P.ConstantEndian constant -> + let endianness = match constant with + | BigEndian -> "be" + | LittleEndian -> "le" + | NativeEndian -> "ne" in + let call = Printf.sprintf "%s_%s_%s_%s" + funcname t endianness sign in + <:expr< Bitmatch.$lid:call$ >> + | P.EndianExpr expr -> + let call = Printf.sprintf "%s_%s_%s_%s" + funcname t "ee" sign in + <:expr< Bitmatch.$lid:call$ $expr$ >> + (* Generate the code for a constructor, ie. 'BITSTRING ...'. *) let output_constructor _loc fields = let fail = locfail _loc in @@ -179,84 +210,10 @@ let output_constructor _loc fields = *) let flen_is_const = expr_is_constant flen in - (* Choose the right constructor function. *) - let int_construct_const = function - (* XXX The meaning of signed/unsigned breaks down at - * 31, 32, 63 and 64 bits. - *) - | (1, _, _) -> - <:expr> - | ((2|3|4|5|6|7|8), _, false) -> - <:expr> - | ((2|3|4|5|6|7|8), _, true) -> - <:expr> - | (i, P.ConstantEndian BigEndian, false) when i <= 31 -> - <:expr> - | (i, P.ConstantEndian BigEndian, true) when i <= 31 -> - <:expr> - | (i, P.ConstantEndian LittleEndian, false) when i <= 31 -> - <:expr> - | (i, P.ConstantEndian LittleEndian, true) when i <= 31 -> - <:expr> - | (i, P.ConstantEndian NativeEndian, false) when i <= 31 -> - <:expr> - | (i, P.ConstantEndian NativeEndian, true) when i <= 31 -> - <:expr> - | (i, P.EndianExpr expr, false) when i <= 31 -> - <:expr> - | (i, P.EndianExpr expr, true) when i <= 31 -> - <:expr> - | (32, P.ConstantEndian BigEndian, false) -> - <:expr> - | (32, P.ConstantEndian BigEndian, true) -> - <:expr> - | (32, P.ConstantEndian LittleEndian, false) -> - <:expr> - | (32, P.ConstantEndian LittleEndian, true) -> - <:expr> - | (32, P.ConstantEndian NativeEndian, false) -> - <:expr> - | (32, P.ConstantEndian NativeEndian, true) -> - <:expr> - | (32, P.EndianExpr expr, false) -> - <:expr> - | (32, P.EndianExpr expr, true) -> - <:expr> - | (_, P.ConstantEndian BigEndian, false) -> - <:expr> - | (_, P.ConstantEndian BigEndian, true) -> - <:expr> - | (_, P.ConstantEndian LittleEndian, false) -> - <:expr> - | (_, P.ConstantEndian LittleEndian, true) -> - <:expr> - | (_, P.ConstantEndian NativeEndian, false) -> - <:expr> - | (_, P.ConstantEndian NativeEndian, true) -> - <:expr> - | (_, P.EndianExpr expr, false) -> - <:expr> - | (_, P.EndianExpr expr, true) -> - <:expr> - in - let int_construct = function - | (P.ConstantEndian BigEndian, false) -> - <:expr> - | (P.ConstantEndian BigEndian, true) -> - <:expr> - | (P.ConstantEndian LittleEndian, false) -> - <:expr> - | (P.ConstantEndian LittleEndian, true) -> - <:expr> - | (P.ConstantEndian NativeEndian, false) -> - <:expr> - | (P.ConstantEndian NativeEndian, true) -> - <:expr> - | (P.EndianExpr expr, false) -> - <:expr> - | (P.EndianExpr expr, true) -> - <:expr> - in + let int_construct_const (i, endian, signed) = + build_bitmatch_call _loc "construct" (Some i) endian signed in + let int_construct (endian, signed) = + build_bitmatch_call _loc "construct" None endian signed in let expr = match t, flen_is_const with @@ -475,83 +432,10 @@ let output_bitmatch _loc bs cases = *) let flen_is_const = expr_is_constant flen in - let int_extract_const = function - (* XXX The meaning of signed/unsigned breaks down at - * 31, 32, 63 and 64 bits. - *) - | (1, _, _) -> - <:expr> - | ((2|3|4|5|6|7|8), _, false) -> - <:expr> - | ((2|3|4|5|6|7|8), _, true) -> - <:expr> - | (i, P.ConstantEndian BigEndian, false) when i <= 31 -> - <:expr> - | (i, P.ConstantEndian BigEndian, true) when i <= 31 -> - <:expr> - | (i, P.ConstantEndian LittleEndian, false) when i <= 31 -> - <:expr> - | (i, P.ConstantEndian LittleEndian, true) when i <= 31 -> - <:expr> - | (i, P.ConstantEndian NativeEndian, false) when i <= 31 -> - <:expr> - | (i, P.ConstantEndian NativeEndian, true) when i <= 31 -> - <:expr> - | (i, P.EndianExpr expr, false) when i <= 31 -> - <:expr> - | (i, P.EndianExpr expr, true) when i <= 31 -> - <:expr> - | (32, P.ConstantEndian BigEndian, false) -> - <:expr> - | (32, P.ConstantEndian BigEndian, true) -> - <:expr> - | (32, P.ConstantEndian LittleEndian, false) -> - <:expr> - | (32, P.ConstantEndian LittleEndian, true) -> - <:expr> - | (32, P.ConstantEndian NativeEndian, false) -> - <:expr> - | (32, P.ConstantEndian NativeEndian, true) -> - <:expr> - | (32, P.EndianExpr expr, false) -> - <:expr> - | (32, P.EndianExpr expr, true) -> - <:expr> - | (_, P.ConstantEndian BigEndian, false) -> - <:expr> - | (_, P.ConstantEndian BigEndian, true) -> - <:expr> - | (_, P.ConstantEndian LittleEndian, false) -> - <:expr> - | (_, P.ConstantEndian LittleEndian, true) -> - <:expr> - | (_, P.ConstantEndian NativeEndian, false) -> - <:expr> - | (_, P.ConstantEndian NativeEndian, true) -> - <:expr> - | (_, P.EndianExpr expr, false) -> - <:expr> - | (_, P.EndianExpr expr, true) -> - <:expr> - in - let int_extract = function - | (P.ConstantEndian BigEndian, false) -> - <:expr> - | (P.ConstantEndian BigEndian, true) -> - <:expr> - | (P.ConstantEndian LittleEndian, false) -> - <:expr> - | (P.ConstantEndian LittleEndian, true) -> - <:expr> - | (P.ConstantEndian NativeEndian, false) -> - <:expr> - | (P.ConstantEndian NativeEndian, true) -> - <:expr> - | (P.EndianExpr expr, false) -> - <:expr> - | (P.EndianExpr expr, true) -> - <:expr> - in + let int_extract_const (i, endian, signed) = + build_bitmatch_call _loc "extract" (Some i) endian signed in + let int_extract (endian, signed) = + build_bitmatch_call _loc "extract" None endian signed in let expr = match t, flen_is_const with