Indentation
This commit is contained in:
parent
00c1b4cf93
commit
cb8a3bbb41
1 changed files with 188 additions and 188 deletions
78
cbor/CBOR.ml
78
cbor/CBOR.ml
|
@ -13,24 +13,24 @@ let fail fmt = ksprintf (fun s -> raise (Error s)) fmt
|
|||
|
||||
module Encode = struct
|
||||
|
||||
let start () = Buffer.create 10
|
||||
let start () = Buffer.create 10
|
||||
|
||||
let init b ~maj add =
|
||||
let init b ~maj add =
|
||||
assert (maj >= 0 && maj < 8);
|
||||
assert (add >= 0 && add < 32);
|
||||
Buffer.add_char b @@ char_of_int @@ (maj lsl 5) lor add
|
||||
|
||||
let put_n b n f x =
|
||||
let put_n b n f x =
|
||||
let s = Bytes.create n in
|
||||
f s 0 x;
|
||||
Buffer.add_string b (Bytes.unsafe_to_string s)
|
||||
|
||||
let max_uint32 =
|
||||
let max_uint32 =
|
||||
match Sys.word_size with
|
||||
| 32 -> max_int (* max signed int, but on 32-bit this is enough *)
|
||||
| _ -> int_of_string "0xFF_FF_FF_FF" (* so that it compiles on 32-bit *)
|
||||
|
||||
let put b ~maj n =
|
||||
let put b ~maj n =
|
||||
assert (n >= 0);
|
||||
if n < 24 then
|
||||
init b ~maj n
|
||||
|
@ -43,16 +43,16 @@ let put b ~maj n =
|
|||
else
|
||||
begin init b ~maj 27; put_n b 8 BE.set_int64 @@ Int64.of_int n end
|
||||
|
||||
let int b n =
|
||||
let int b n =
|
||||
let (maj,n) = if n < 0 then 1, -1 - n else 0, n in
|
||||
put b ~maj n
|
||||
|
||||
let hex_char x =
|
||||
let hex_char x =
|
||||
assert (x >= 0 && x < 16);
|
||||
if x <= 9 then Char.chr @@ Char.code '0' + x
|
||||
else Char.chr @@ Char.code 'a' + x - 10
|
||||
|
||||
let to_hex s =
|
||||
let to_hex s =
|
||||
let r = Bytes.create (String.length s * 2) in
|
||||
for i = 0 to String.length s - 1 do
|
||||
Bytes.set r (i*2) @@ hex_char @@ Char.code s.[i] lsr 4;
|
||||
|
@ -64,20 +64,20 @@ end
|
|||
|
||||
module Simple = struct
|
||||
|
||||
type t =
|
||||
[ `Null
|
||||
| `Undefined
|
||||
| `Simple of int
|
||||
| `Bool of bool
|
||||
| `Int of int
|
||||
| `Float of float
|
||||
| `Bytes of string
|
||||
| `Text of string
|
||||
| `Array of t list
|
||||
| `Map of (t * t) list
|
||||
]
|
||||
type t =
|
||||
[ `Null
|
||||
| `Undefined
|
||||
| `Simple of int
|
||||
| `Bool of bool
|
||||
| `Int of int
|
||||
| `Float of float
|
||||
| `Bytes of string
|
||||
| `Text of string
|
||||
| `Array of t list
|
||||
| `Map of (t * t) list
|
||||
]
|
||||
|
||||
let encode item =
|
||||
let encode item =
|
||||
let open Encode in
|
||||
let b = start () in
|
||||
let rec write = function
|
||||
|
@ -97,24 +97,24 @@ let encode item =
|
|||
write item;
|
||||
Buffer.contents b
|
||||
|
||||
let need (s,i) n =
|
||||
let need (s,i) n =
|
||||
if n > String.length s || !i + n > String.length s then
|
||||
fail "truncated: len %d pos %d need %d" (String.length s) !i n;
|
||||
let j = !i in
|
||||
i := !i + n;
|
||||
j
|
||||
|
||||
let get_byte (s,_ as r) = int_of_char @@ s.[need r 1]
|
||||
let get_n (s,_ as r) n f = f s @@ need r n
|
||||
let get_s (s,_ as r) n = String.sub s (need r n) n
|
||||
let get_byte (s,_ as r) = int_of_char @@ s.[need r 1]
|
||||
let get_n (s,_ as r) n f = f s @@ need r n
|
||||
let get_s (s,_ as r) n = String.sub s (need r n) n
|
||||
|
||||
let get_additional byte1 = byte1 land 0b11111
|
||||
let is_indefinite byte1 = get_additional byte1 = 31
|
||||
let get_additional byte1 = byte1 land 0b11111
|
||||
let is_indefinite byte1 = get_additional byte1 = 31
|
||||
|
||||
let int64_max_int = Int64.of_int max_int
|
||||
let two_min_int32 = 2 * Int32.to_int Int32.min_int
|
||||
let int64_max_int = Int64.of_int max_int
|
||||
let two_min_int32 = 2 * Int32.to_int Int32.min_int
|
||||
|
||||
let extract_number byte1 r =
|
||||
let extract_number byte1 r =
|
||||
match get_additional byte1 with
|
||||
| n when n < 24 -> n
|
||||
| 24 -> get_byte r
|
||||
|
@ -128,7 +128,7 @@ let extract_number byte1 r =
|
|||
Int64.to_int n
|
||||
| n -> fail "bad additional %d" n
|
||||
|
||||
let get_float16 s i =
|
||||
let get_float16 s i =
|
||||
let half = Char.code s.[i] lsl 8 + Char.code s.[i+1] in
|
||||
let mant = half land 0x3ff in
|
||||
let value =
|
||||
|
@ -140,26 +140,26 @@ let get_float16 s i =
|
|||
in
|
||||
if half land 0x8000 = 0 then value else ~-. value
|
||||
|
||||
exception Break
|
||||
exception Break
|
||||
|
||||
let extract_list byte1 r f =
|
||||
let extract_list byte1 r f =
|
||||
if is_indefinite byte1 then
|
||||
let l = ref [] in
|
||||
try while true do l := f r :: !l done; assert false with Break -> List.rev !l
|
||||
else
|
||||
let n = extract_number byte1 r in Array.to_list @@ Array.init n (fun _ -> f r)
|
||||
|
||||
let rec extract_pair r =
|
||||
let rec extract_pair r =
|
||||
let a = extract r in
|
||||
let b = try extract r with Break -> fail "extract_pair: unexpected break" in
|
||||
a,b
|
||||
and extract_string byte1 r f =
|
||||
and extract_string byte1 r f =
|
||||
if is_indefinite byte1 then
|
||||
let b = Buffer.create 10 in
|
||||
try while true do Buffer.add_string b (f @@ extract r) done; assert false with Break -> Buffer.contents b
|
||||
else
|
||||
let n = extract_number byte1 r in get_s r n
|
||||
and extract r =
|
||||
and extract r =
|
||||
let byte1 = get_byte r in
|
||||
match byte1 lsr 5 with
|
||||
| 0 -> `Int (extract_number byte1 r)
|
||||
|
@ -185,17 +185,17 @@ and extract r =
|
|||
end
|
||||
| _ -> assert false
|
||||
|
||||
let decode_partial s =
|
||||
let decode_partial s =
|
||||
let i = ref 0 in
|
||||
let x = try extract (s,i) with Break -> fail "decode: unexpected break" in
|
||||
x, String.sub s !i (String.length s - !i)
|
||||
|
||||
let decode s : t =
|
||||
let decode s : t =
|
||||
let x, rest = decode_partial s in
|
||||
if rest = "" then x
|
||||
else fail "decode: extra data: len %d pos %d" (String.length s) (String.length s - String.length rest)
|
||||
|
||||
let to_diagnostic item =
|
||||
let to_diagnostic item =
|
||||
let b = Buffer.create 10 in
|
||||
let put = Buffer.add_string b in
|
||||
let rec write = function
|
||||
|
|
Loading…
Reference in a new issue