diff options
author | Pierre Weis <Pierre.Weis@inria.fr> | 2002-03-22 20:46:06 +0000 |
---|---|---|
committer | Pierre Weis <Pierre.Weis@inria.fr> | 2002-03-22 20:46:06 +0000 |
commit | e40ea8f198f572451585c83c9b8f89fbd21594a1 (patch) | |
tree | f39aae6de1766507235d227bfcf6eaceab612c0e | |
parent | c4b203f34c45c1f5974c21aad048bd06bc9faa2b (diff) |
Generalization of Arg.parse into Arg.parse_array: we now can parse an
arbitrary string array built during program execution.
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@4556 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r-- | stdlib/arg.ml | 18 | ||||
-rw-r--r-- | stdlib/arg.mli | 5 |
2 files changed, 15 insertions, 8 deletions
diff --git a/stdlib/arg.ml b/stdlib/arg.ml index f2a660f84..69f868f73 100644 --- a/stdlib/arg.ml +++ b/stdlib/arg.ml @@ -51,11 +51,11 @@ let usage speclist errmsg = let current = ref 0;; -let parse speclist anonfun errmsg = +let parse_array argv speclist anonfun errmsg = let initpos = !current in let stop error = let progname = - if initpos < Array.length Sys.argv then Sys.argv.(initpos) else "(?)" in + if initpos < Array.length argv then argv.(initpos) else "(?)" in begin match error with | Unknown "-help" -> () | Unknown "--help" -> () @@ -74,10 +74,10 @@ let parse speclist anonfun errmsg = then exit 0 else exit 2 in - let l = Array.length Sys.argv in + let l = Array.length argv in incr current; while !current < l do - let s = Sys.argv.(!current) in + let s = argv.(!current) in if String.length s >= 1 && String.get s 0 = '-' then begin let action = try assoc3 s speclist @@ -89,24 +89,24 @@ let parse speclist anonfun errmsg = | Set r -> r := true; | Clear r -> r := false; | String f when !current + 1 < l -> - let arg = Sys.argv.(!current+1) in + let arg = argv.(!current+1) in f arg; incr current; | Int f when !current + 1 < l -> - let arg = Sys.argv.(!current+1) in + let arg = argv.(!current+1) in begin try f (int_of_string arg) with Failure "int_of_string" -> stop (Wrong (s, arg, "an integer")) end; incr current; | Float f when !current + 1 < l -> - let arg = Sys.argv.(!current+1) in + let arg = argv.(!current+1) in begin try f (float_of_string arg); with Failure "float_of_string" -> stop (Wrong (s, arg, "a float")) end; incr current; | Rest f -> while !current < l-1 do - f Sys.argv.(!current+1); + f argv.(!current+1); incr current; done; | _ -> stop (Missing s) @@ -119,3 +119,5 @@ let parse speclist anonfun errmsg = end; done; ;; + +let parse = parse_array Sys.argv;; diff --git a/stdlib/arg.mli b/stdlib/arg.mli index a4be84d58..cea753a50 100644 --- a/stdlib/arg.mli +++ b/stdlib/arg.mli @@ -78,6 +78,11 @@ val parse : own [-help] and [--help] options in [speclist]. *) +val parse_array : string array -> + (string * spec * string) list -> (string -> unit) -> string -> unit +(** [Arg.parse_array a speclist anonfun usage_msg] parses array [a] as + if it were the the command line. *) + exception Bad of string (** Functions in [spec] or [anonfun] can raise [Arg.Bad] with an error message to reject invalid arguments. *) |