51 lines
1.3 KiB
OCaml
51 lines
1.3 KiB
OCaml
|
|
(* script to generate signatures.ml module
|
||
|
|
get signatures definition form `exchange/src/include/taler/taler_signatures.h`
|
||
|
|
the make a ocaml value for each #define and print them in a
|
||
|
|
taler_signatures.ml module *)
|
||
|
|
|
||
|
|
open Angstrom
|
||
|
|
|
||
|
|
type define = {
|
||
|
|
name: string;
|
||
|
|
value: int;
|
||
|
|
}
|
||
|
|
|
||
|
|
let define_line : define t =
|
||
|
|
let is_ident_char = function
|
||
|
|
| 'A' .. 'Z' | '0' .. '9' | '_' -> true
|
||
|
|
| _ -> false
|
||
|
|
in
|
||
|
|
let p =
|
||
|
|
string "#define"
|
||
|
|
*> skip_while (( = ) ' ')
|
||
|
|
*> string "TALER_SIGNATURE_"
|
||
|
|
*> take_while1 is_ident_char
|
||
|
|
>>= fun name ->
|
||
|
|
skip_while (( = ) ' ')
|
||
|
|
*> take_while1 (function '0' .. '9' -> true | _ -> false)
|
||
|
|
>>| fun digits ->
|
||
|
|
let name = String.lowercase_ascii name in
|
||
|
|
let value = int_of_string digits in
|
||
|
|
{ name; value }
|
||
|
|
in
|
||
|
|
p <* end_of_line
|
||
|
|
|
||
|
|
let all_defines : define list t =
|
||
|
|
let any_line = take_till (Char.equal '\n') <* end_of_line in
|
||
|
|
many (choice [ define_line >>| Option.some; any_line *> return None ])
|
||
|
|
>>| List.filter_map Fun.id
|
||
|
|
|
||
|
|
let parse input =
|
||
|
|
match parse_string ~consume:All all_defines input with
|
||
|
|
| Ok defs -> defs
|
||
|
|
| Error msg -> failwith msg
|
||
|
|
|
||
|
|
let () =
|
||
|
|
let l = parse Data.content in
|
||
|
|
assert (List.length l = 74);
|
||
|
|
|
||
|
|
let pp ppf { name; value } = Fmt.pf ppf "let %s = %d@." name value in
|
||
|
|
Fmt.pr "%a" (Fmt.list pp) l;
|
||
|
|
|
||
|
|
()
|