aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@college-de-france.fr>2022-09-04 19:12:29 +0200
committerXavier Leroy <xavierleroy@users.noreply.github.com>2022-09-23 13:55:44 +0200
commit43de01e92a629d6728b48be1a7d38ee9a37c2626 (patch)
treeafc9d71e3e9f2fe935df9d237a226b2bcee3d09a
parentefcb5cacba9bcdbd31c583ff1308a06daf56d35d (diff)
downloadcompcert-43de01e92a629d6728b48be1a7d38ee9a37c2626.tar.gz
compcert-43de01e92a629d6728b48be1a7d38ee9a37c2626.zip
Add `Commandline.longopt` function for options of the form `-<key>=<arg>`
Also: use `int_of_string_opt` instead of `int_of_string` for slightly cleaner code.
-rw-r--r--lib/Commandline.ml33
-rw-r--r--lib/Commandline.mli5
2 files changed, 18 insertions, 20 deletions
diff --git a/lib/Commandline.ml b/lib/Commandline.ml
index 2f0d7cc1..3030eab5 100644
--- a/lib/Commandline.ml
+++ b/lib/Commandline.ml
@@ -91,14 +91,11 @@ let parse_array spec argv first last =
end
| Some(Integer fn) ->
if i + 1 <= last then begin
- let n =
- try
- int_of_string argv.(i+1)
- with Failure _ ->
+ match int_of_string_opt argv.(i+1) with
+ | Some n -> fn n; parse (i+2)
+ | None ->
let msg = sprintf "argument to option `%s' must be an integer" s in
raise (CmdError msg)
- in
- fn n; parse (i+2)
end else begin
let msg = sprintf "option `%s' expects an argument" s in
raise (CmdError msg)
@@ -124,19 +121,15 @@ let argv =
let parse_cmdline spec =
parse_array spec argv 1 (Array.length argv - 1)
-let long_int_action key s =
- let ls = String.length s
- and lkey = String.length key in
- assert (ls > lkey);
- let s = String.sub s (lkey + 1) (ls - lkey - 1) in
- try
- int_of_string s
- with Failure _ ->
- let msg = sprintf "argument to option `%s' must be an integer" key in
- raise (CmdError msg)
+let longopt key f =
+ let lkey = String.length key + 1 in
+ let act s = f (String.sub s lkey (String.length s - lkey)) in
+ (Prefix (key ^ "="), Self act)
let longopt_int key f =
- let act s =
- let n = long_int_action key s in
- f n in
- Prefix (key ^ "="),Self act
+ longopt key (fun s ->
+ match int_of_string_opt s with
+ | Some n -> f n
+ | None ->
+ let msg = sprintf "argument to option `%s' must be an integer" key in
+ raise (CmdError msg))
diff --git a/lib/Commandline.mli b/lib/Commandline.mli
index cb9a7513..350a48ea 100644
--- a/lib/Commandline.mli
+++ b/lib/Commandline.mli
@@ -47,6 +47,11 @@ val parse_cmdline: (pattern * action) list -> unit
and performs all [actions]. Raises [CmdError] if an error occurred.
*)
+val longopt: string -> (string -> unit) -> pattern * action
+(** [longopt_int key fn] generates a pattern and an action for
+ options of the form [key=<text>] and calls [fn] with the string argument
+*)
+
val longopt_int: string -> (int -> unit) -> pattern * action
(** [longopt_int key fn] generates a pattern and an action for
options of the form [key=<n>] and calls [fn] with the integer argument