let read path =
let channel = open_in_bin path in
Fun.protect ~finally:(fun () -> close_in_noerr channel) (fun () ->
really_input_string channel (in_channel_length channel))
let rec mkdir path =
if path <> "." && not (Sys.file_exists path) then begin
mkdir (Filename.dirname path);
Unix.mkdir path 0o755
end
let write path text =
mkdir (Filename.dirname path);
let temporary, channel = Filename.open_temp_file ~mode:[Open_binary]
~temp_dir:(Filename.dirname path) ".reorder" ".tmp" in
Fun.protect ~finally:(fun () ->
close_out_noerr channel;
if Sys.file_exists temporary then Sys.remove temporary) (fun () ->
output_string channel text;
close_out channel;
Sys.rename temporary path)
let root () =
let rec find path =
if Sys.file_exists (Filename.concat path "smt/machine.smt2") then path
else
let parent = Filename.dirname path in
if parent = path then invalid_arg "cannot locate smt/machine.smt2"
else find parent
in
match Sys.getenv_opt "REORDER_ROOT" with
| Some path -> find path
| None ->
try find (Sys.getcwd ()) with Invalid_argument _ ->
let executable = if Filename.is_relative Sys.executable_name then
Filename.concat (Sys.getcwd ()) Sys.executable_name else Sys.executable_name in
find (Filename.dirname executable)