From 43de01e92a629d6728b48be1a7d38ee9a37c2626 Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Sun, 4 Sep 2022 19:12:29 +0200 Subject: Add `Commandline.longopt` function for options of the form `-=` Also: use `int_of_string_opt` instead of `int_of_string` for slightly cleaner code. --- lib/Commandline.ml | 33 +++++++++++++-------------------- 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=] 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=] and calls [fn] with the integer argument -- cgit