Source file lead.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
open Meta

type t = {
  version : int * int;
  kind : project_type;
  arch_num : int;
  name : string;
  os_num : int;
  signature_type : int;
}

let parser =
  let open Angstrom in
  let* _ =
    string "\xED\xAB\xEE\xDB" <|> fail "invalid lead section magic number"
  in
  let* version = both (int8 3) (int8 0) <|> fail "invalid package version" in
  let* kind =
    int8 0 *> int8 0
    <|> int8 1 >>| project_type_of_int
    <|> fail "invalid project type"
  in
  let* arch_num = BE.any_int16 in
  let* name =
    let* name = take_till (fun c -> c = '\x00') in
    let+ _ = advance (66 - String.length name) in
    name
  in
  let* os_num = BE.any_int16 in
  let* signature_type = BE.any_int16 in

  let* _ = advance 16 in

  return { version; kind; arch_num; name; os_num; signature_type }