let interval = ref 250
let quiet = ref false
- let args = ref []
let spec = Arg.align [
"-o", Arg.Set_string outfile, " output file (default stderr)";
"-p", Arg.Set_int page_size, " page size in bytes (default autodetect)";
"-i", Arg.Set_int interval, " refresh interval in ms (default 250ms)";
"-q", Arg.Set(quiet), " don't print messages while running";
]
- let argument s = args := s :: !args
- let usage_msg = sprintf "usage: %s [options] <program> [arguments ...]" Sys.argv.(0)
+ let usage_msg = sprintf "usage: %s [options] -- <program> [arguments ...]" Sys.argv.(0)
+ let find_dash a =
+ let rec loop i len =
+ if i < len then
+ if a.(i) = "--" then i
+ else loop (i+1) len
+ else
+ raise Not_found
+ in
+ loop 0 (Array.length a)
let parse_cmdline () =
- let _ = Arg.parse spec argument usage_msg in
- match !args with
- [] -> Arg.usage spec usage_msg; exit 1
- | l -> Array.of_list (List.rev l)
+ try
+ let idash = find_dash Sys.argv in
+ let argv = Array.sub Sys.argv 0 idash in
+ let cmd = Array.sub Sys.argv (idash+1) (Array.length Sys.argv - idash - 1) in
+ let () =
+ Arg.parse_argv argv spec ignore usage_msg
+ in
+ if Array.length cmd = 0 then (Arg.usage spec usage_msg; exit 1);
+ cmd
+ with
+ Arg.Bad(s) -> Printf.eprintf "%s\n" s; exit 1
+ | Arg.Help(s) -> Printf.printf "%s\n" s; exit 0
+ | Not_found -> Arg.usage spec usage_msg; exit 1
end
monitor pid start finish mem fmt
end
else
- let () =
- match s with
- WEXITED c -> fprintf fmt "Process exited with code %i\n" c
- | WSTOPPED s -> fprintf fmt "Process stopped by signal %i\n" s
- | WSIGNALED s -> fprintf fmt "Process killed by signal %i\n" s
- in
- fprintf fmt "Peak memory use: %ikb\n%!" !max_mem
+ if not !Options.quiet then
+ let () =
+ match s with
+ WEXITED c -> fprintf fmt "Process exited with code %i\n" c
+ | WSTOPPED s -> fprintf fmt "Process stopped by signal %i\n" s
+ | WSIGNALED s -> fprintf fmt "Process killed by signal %i\n" s
+ in
+ fprintf fmt "Peak memory use: %ikb\n%!" !max_mem
;;