diff options
author | Xavier Leroy <xavier.leroy@college-de-france.fr> | 2022-09-04 19:12:29 +0200 |
---|---|---|
committer | Xavier Leroy <xavierleroy@users.noreply.github.com> | 2022-09-23 13:55:44 +0200 |
commit | 43de01e92a629d6728b48be1a7d38ee9a37c2626 (patch) | |
tree | afc9d71e3e9f2fe935df9d237a226b2bcee3d09a | |
parent | efcb5cacba9bcdbd31c583ff1308a06daf56d35d (diff) | |
download | compcert-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.ml | 33 | ||||
-rw-r--r-- | lib/Commandline.mli | 5 |
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 |