From de0244cfd38842c68de6557c2765c382b9ef1283 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kim=20Nguy=E1=BB=85n?= Date: Wed, 22 Feb 2012 17:56:34 +0100 Subject: [PATCH] Modify alarm to not treat the program's options as its own. - Changes the way alarm is invoked: alarm [options] -- program [program options] --- utils/alarm.ml | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/utils/alarm.ml b/utils/alarm.ml index 3387b45..06a4913 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,15 +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) - + 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 () = + try + Arg.parse_argv argv spec ignore usage_msg + 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 + in + if Array.length cmd = 0 then (Arg.usage spec usage_msg; exit 1); + cmd end -- 2.17.1