57 lines
1.4 KiB
OCaml
57 lines
1.4 KiB
OCaml
let sprintf = Printf.sprintf
|
|
|
|
type ('impl, 'intf) intf_or_impl =
|
|
| Impl of 'impl
|
|
| Intf of 'intf
|
|
|
|
module File = struct
|
|
let of_filename s = if Filename.check_suffix s ".rei" then Intf s else Impl s
|
|
|
|
let output_fn = function
|
|
| Impl fn -> fn ^ ".ml"
|
|
| Intf fn -> fn ^ ".mli"
|
|
;;
|
|
end
|
|
|
|
let () =
|
|
let set_binary = function
|
|
| "binary" -> ()
|
|
| _ -> failwith "Only the value 'binary' is allowed for --parse / --print"
|
|
in
|
|
let args =
|
|
[ "--print", Arg.String set_binary, ""
|
|
; "--parse", Arg.String set_binary, ""
|
|
; "-i", Arg.Bool ignore, ""
|
|
]
|
|
in
|
|
let source = ref None in
|
|
let anon s =
|
|
match !source with
|
|
| None -> source := Some s
|
|
| Some _ -> failwith "source may be set only once"
|
|
in
|
|
Arg.parse args anon "";
|
|
let source =
|
|
match !source with
|
|
| None -> failwith "source file isn't set"
|
|
| Some s -> s
|
|
in
|
|
let ic = open_in source in
|
|
let source_file = File.of_filename source in
|
|
let out_fn = File.output_fn source_file in
|
|
let out = open_out_bin out_fn in
|
|
output_string out (sprintf "# 1 %S\n" source);
|
|
let rec loop () =
|
|
match input_char ic with
|
|
| exception End_of_file -> ()
|
|
| s ->
|
|
output_char out s;
|
|
loop ()
|
|
in
|
|
loop ();
|
|
close_out_noerr out;
|
|
let inch = open_in_bin out_fn in
|
|
let contents = really_input_string inch (in_channel_length inch) in
|
|
close_in inch;
|
|
Printf.printf "%s" contents
|
|
;;
|