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)
-
+ 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