119 lines
4.3 KiB
Diff
119 lines
4.3 KiB
Diff
From e48a32ed47b6b5a77653ca3b40afb7c26aca7123 Mon Sep 17 00:00:00 2001
|
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
Date: Tue, 1 Apr 2014 11:17:07 +0100
|
|
Subject: [PATCH 11/19] arg: Add no_arg and get_arg helper functions.
|
|
|
|
The no_arg function in this patch is a no-op. It will do something
|
|
useful in the followups.
|
|
|
|
The get_arg function simply checks the next position on the command
|
|
line exists and returns that argument or raises a Arg.Missing.
|
|
|
|
This patch should introduce no functional change, it is simply code
|
|
refactoring.
|
|
|
|
In particular, this should not change the treatment of Arg.current
|
|
(see: http://caml.inria.fr/mantis/view.php?id=5197#c11147)
|
|
---
|
|
stdlib/arg.ml | 47 ++++++++++++++++++++++++++---------------------
|
|
1 file changed, 26 insertions(+), 21 deletions(-)
|
|
|
|
diff --git a/stdlib/arg.ml b/stdlib/arg.ml
|
|
index d7b8ac0..a8f3964 100644
|
|
--- a/stdlib/arg.ml
|
|
+++ b/stdlib/arg.ml
|
|
@@ -134,56 +134,62 @@ let parse_argv_dynamic ?(current=current) argv speclist anonfun errmsg =
|
|
try assoc3 s !speclist
|
|
with Not_found -> stop (Unknown s)
|
|
in
|
|
+ let no_arg () = () in
|
|
+ let get_arg () =
|
|
+ if !current + 1 < l then argv.(!current + 1)
|
|
+ else stop (Missing s)
|
|
+ in
|
|
begin try
|
|
let rec treat_action = function
|
|
- | Unit f -> f ();
|
|
- | Bool f when !current + 1 < l ->
|
|
- let arg = argv.(!current + 1) in
|
|
+ | Unit f -> no_arg (); f ();
|
|
+ | Bool f ->
|
|
+ let arg = get_arg () in
|
|
begin try f (bool_of_string arg)
|
|
with Invalid_argument "bool_of_string" ->
|
|
raise (Stop (Wrong (s, arg, "a boolean")))
|
|
end;
|
|
incr current;
|
|
- | Set r -> r := true;
|
|
- | Clear r -> r := false;
|
|
- | String f when !current + 1 < l ->
|
|
- f argv.(!current + 1);
|
|
+ | Set r -> no_arg (); r := true;
|
|
+ | Clear r -> no_arg (); r := false;
|
|
+ | String f ->
|
|
+ let arg = get_arg () in
|
|
+ f arg;
|
|
incr current;
|
|
- | Symbol (symb, f) when !current + 1 < l ->
|
|
- let arg = argv.(!current + 1) in
|
|
+ | Symbol (symb, f) ->
|
|
+ let arg = get_arg () in
|
|
if List.mem arg symb then begin
|
|
- f argv.(!current + 1);
|
|
+ f arg;
|
|
incr current;
|
|
end else begin
|
|
raise (Stop (Wrong (s, arg, "one of: "
|
|
^ (make_symlist "" " " "" symb))))
|
|
end
|
|
- | Set_string r when !current + 1 < l ->
|
|
- r := argv.(!current + 1);
|
|
+ | Set_string r ->
|
|
+ r := get_arg ();
|
|
incr current;
|
|
- | Int f when !current + 1 < l ->
|
|
- let arg = argv.(!current + 1) in
|
|
+ | Int f ->
|
|
+ let arg = get_arg () in
|
|
begin try f (int_of_string arg)
|
|
with Failure "int_of_string" ->
|
|
raise (Stop (Wrong (s, arg, "an integer")))
|
|
end;
|
|
incr current;
|
|
- | Set_int r when !current + 1 < l ->
|
|
- let arg = argv.(!current + 1) in
|
|
+ | Set_int r ->
|
|
+ let arg = get_arg () in
|
|
begin try r := (int_of_string arg)
|
|
with Failure "int_of_string" ->
|
|
raise (Stop (Wrong (s, arg, "an integer")))
|
|
end;
|
|
incr current;
|
|
- | Float f when !current + 1 < l ->
|
|
- let arg = argv.(!current + 1) in
|
|
+ | Float f ->
|
|
+ let arg = get_arg () in
|
|
begin try f (float_of_string arg);
|
|
with Failure "float_of_string" ->
|
|
raise (Stop (Wrong (s, arg, "a float")))
|
|
end;
|
|
incr current;
|
|
- | Set_float r when !current + 1 < l ->
|
|
- let arg = argv.(!current + 1) in
|
|
+ | Set_float r ->
|
|
+ let arg = get_arg () in
|
|
begin try r := (float_of_string arg);
|
|
with Failure "float_of_string" ->
|
|
raise (Stop (Wrong (s, arg, "a float")))
|
|
@@ -196,7 +202,6 @@ let parse_argv_dynamic ?(current=current) argv speclist anonfun errmsg =
|
|
f argv.(!current + 1);
|
|
incr current;
|
|
done;
|
|
- | _ -> raise (Stop (Missing s))
|
|
in
|
|
treat_action action
|
|
with Bad m -> stop (Message m);
|
|
--
|
|
2.4.3
|
|
|