Fix bug in commandline parsing.
[SXSI/xpathcomp.git] / utils / alarm.ml
index 5a9c83f..0eeb823 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,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] <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
 
@@ -71,19 +87,20 @@ let rec monitor pid start finish mem fmt =
       else
        begin
          if not !Options.quiet then
-           fprintf fmt "[%f] Memory: current=%ikb max=%ikb\n%!"
+           fprintf fmt "[% 11.3f] Memory: current=%ikb max=%ikb\n%!"
              (current_time -. start) current_mem !max_mem;
          usleep !Options.interval;
          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
 ;;