X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=utils%2Falarm.ml;h=0eeb82331fadce33a792345c89a1f14ed94d93a1;hb=046839a3969319f5d38e8f72fe9cb640a639af6c;hp=3387b45f66f38f04c439aeab5aa2df17f0652815;hpb=5eb07e84bb9c3ee6f66b655ef4ab3b4797e0831a;p=SXSI%2Fxpathcomp.git diff --git a/utils/alarm.ml b/utils/alarm.ml index 3387b45..0eeb823 100644 --- a/utils/alarm.ml +++ b/utils/alarm.ml @@ -9,7 +9,6 @@ module Options = 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)"; @@ -18,14 +17,31 @@ module Options = "-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] [arguments ...]" Sys.argv.(0) + let usage_msg = sprintf "usage: %s [options] -- [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 @@ -77,13 +93,14 @@ let rec monitor pid start finish mem fmt = 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 ;;