52 lines
1.1 KiB
OCaml
52 lines
1.1 KiB
OCaml
(* Copyright (c) 2014-2017 David Kaloper Meršinjak. All rights reserved.
|
|
See LICENSE.md. *)
|
|
|
|
let lex_compare cs1 cs2 =
|
|
let (s1, s2) = String.(length cs1, length cs2) in
|
|
let rec go i lim =
|
|
if i = lim then
|
|
compare s1 s2
|
|
else
|
|
match compare (String.get_uint8 cs1 i) (String.get_uint8 cs2 i) with
|
|
| 0 -> go (succ i) lim
|
|
| n -> n in
|
|
go 0 (min s1 s2)
|
|
|
|
type t = int * (int -> bytes -> unit)
|
|
|
|
let immediate n f = (n, f)
|
|
|
|
let len (n, _) = n
|
|
|
|
let empty = (0, (fun _ _ -> ()))
|
|
|
|
let (<+>) (l1, w1) (l2, w2) =
|
|
let w off buf =
|
|
( w1 off buf ; w2 (off + l1) buf ) in
|
|
(l1 + l2, w)
|
|
|
|
let append = (<+>)
|
|
|
|
let rec concat = function
|
|
| [] -> empty
|
|
| w::ws -> w <+> concat ws
|
|
|
|
let of_list lst =
|
|
let open List in
|
|
let w off buf =
|
|
iteri (fun i -> Bytes.set_uint8 buf (off + i)) lst in
|
|
(length lst, w)
|
|
|
|
let of_octets str =
|
|
let n = String.length str in
|
|
(n, fun off buf -> Bytes.blit_string str 0 buf off n)
|
|
|
|
let of_byte b = (1, fun off buf -> Bytes.set_uint8 buf off b)
|
|
|
|
let to_octets (n, w) =
|
|
let buf = Bytes.create n in
|
|
w 0 buf;
|
|
Bytes.unsafe_to_string buf
|
|
|
|
let to_writer (n, w) = (n, fun buf -> w 0 buf)
|
|
|