(* $Id: smisc.ml 77 2007-08-08 07:49:58Z guesdon $ *)

let fatal_error msg =
  prerr_endline msg;
  exit 1

let safe_main main =
  try main ()
  with
    Failure s
  | Sys_error s ->
      prerr_endline s;
      exit 1

let try_finalize f x finally y =
  let res =
    try f x
    with exn -> finally y; raise exn
  in
  finally y;
  res

let unopt = fun ?default v ->
  match v, default with
  | None,   None   -> raise (Invalid_argument "unopt None")
  | None,   Some v -> v
  | Some v, _      -> v

let md5sum_of_file file =
  let com = Printf.sprintf "md5sum %s | cut -d\" \" -f 1"
      (Filename.quote file)
  in
  let ic = Unix.open_process_in com in
  let s = input_line ic in
  close_in ic;
  ignore (Unix.wait ());
  s

let md5sum_of_string s =
  let com = Printf.sprintf "echo %s | md5sum | cut -d\" \" -f 1"
      (Filename.quote s)
  in
  let ic = Unix.open_process_in com in
  let s = input_line ic in
  close_in ic;
  ignore (Unix.wait ());
  s

let rec my_int_of_string s =
  let len = String.length s in
  if len <= 0 then invalid_arg "my_int_of_string";
  match s.[0] with
    '+' -> my_int_of_string (String.sub s 1 (len - 1))
  | _ -> int_of_string s;;