Modify alarm to not treat the program's options as its own.
[SXSI/xpathcomp.git] / utils / alarm.ml
index 3387b45..06a4913 100644 (file)
@@ -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] <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