Newer
Older
(* Time-stamp: <modified the 09/03/2019 (at 14:37) by Erwan Jahier> *)
type t = {
mutable topo: string;
mutable length: int;
mutable verbose: int;
mutable demon: Demon.t;
mutable rif: bool;
mutable _args : (string * Arg.spec * string) list;
mutable _user_man : (string * string list) list;
mutable _hidden_man: (string * string list) list;
mutable _others : string list;
mutable _margin : int;
}
let usage_msg = ("usage: " ^Sys.argv.(0) ^ " [<option>] [<topology>.dot file]
use --help to see the available options.
" )
let print_usage () = Printf.printf "%s\n" usage_msg; flush stdout
let (make_args : unit -> t) =
fun () ->
{
topo = "";
length = 100;
verbose = 0;
demon = Demon.Distributed;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
_args = [];
_user_man = [];
_hidden_man = [];
_others = [];
_margin =12;
}
let (args : t) = make_args ()
let pspec os (c, ml) = (
let (m1, oth) = match ml with
| h::t -> (h,t)
| _ -> ("",[])
in
let t2 = String.make args._margin ' ' in
let cl = String.length c in
let t1 = if (cl < args._margin ) then
String.make (args._margin - cl) ' '
else
"\n"^t2
in
Printf.fprintf os "%s%s%s" c t1 m1;
List.iter (function x -> Printf.fprintf os "\n%s%s" t2 x) oth ;
Printf.fprintf os "\n" ;
)
let options oc = (
let l = List.rev args._user_man in
List.iter (pspec oc) l
)
let more_options oc = (
let l = List.rev (args._hidden_man) in
List.iter (pspec oc) l
)
let (mkopt : t -> string list -> ?hide:bool -> ?arg:string -> Arg.spec ->
string list -> unit) =
fun opt ol ?(hide=false) ?(arg="") se ml ->
let treto o = opt._args <- (o, se, "")::opt._args in
List.iter treto ol ;
let col1 = (String.concat ", " ol)^arg in
if hide
then opt._hidden_man <- (col1, ml)::opt._hidden_man
else opt._user_man <- (col1, ml)::opt._user_man
let myexit i = exit i
(*** User Options Tab **)
let (mkoptab : t -> unit) =
fun opt ->
let _nl = "\n"^(String.make args._margin ' ') in
(
mkopt opt ["--synchronous-demon";"-sd"]
(Arg.Unit(fun () -> args.demon <- Demon.Synchronous))
["Use a Synchronous deamon"];
mkopt opt ["--central-demon";"-cd"]
(Arg.Unit(fun () -> args.demon <- Demon.Synchronous))
["Use a Central deamon (selects exactly one action)"];
mkopt opt ["--locally-central-demon";"-lcd"]
(Arg.Unit(fun () -> args.demon <- Demon.Synchronous))
["Use a Locally Central deamon (never activates two neighbor";
"actions in the same step)"];
mkopt opt ["--distributed-demon";"-dd"]
(Arg.Unit(fun () -> args.demon <- Demon.Synchronous))
["Use a Distributed deamon (select at least one action)"];
mkopt opt ["--custom-demon";"-custd"]
(Arg.Unit(fun () -> args.demon <- Demon.Synchronous))
["Use a Custom deamon"];
mkopt opt ["--rif";"-rif"]
(Arg.Unit(fun () -> args.rif <- true))
["Follows RIF conventions"];
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
mkopt opt ["--length";"-l"] ~arg:" <int>"
(Arg.Int (fun i -> args.length <- i))
["Maximum number of steps to be done (" ^ (string_of_int args.length) ^ " by default).\n"];
mkopt opt ~hide:true ["--ocaml-version"]
(Arg.Unit (fun _ -> (print_string (Sys.ocaml_version) ; flush stdout; exit 0)))
["Display the version ocaml version sasa was compiled with and exit."];
mkopt opt ["--verbose";"-vl"] ~arg:" <int>"
(Arg.Int (fun i -> args.verbose <- i)) ["Set the verbose level"];
mkopt opt ["--help";"-help"; "-h"]
(Arg.Unit (fun _ -> print_usage();options stdout; exit 0))
["Display main options"];
mkopt opt ["--more";"-m"] (Arg.Unit (fun () -> more_options stdout; exit 0))
["Display more options"]
)
(* all unrecognized options are accumulated *)
let (add_other : t -> string -> unit) =
fun opt s ->
opt._others <- s::opt._others
let current = ref 0;;
let first_line b = (
try (
let f = String.index b '\n' in
String.sub b 0 f
) with Not_found -> b
)
let file_notfound f = (
prerr_string ("File not found: \""^f^"\"");
prerr_newline ();
myexit 1
)
let unexpected s = (
prerr_string ("unexpected argument \""^s^"\"");
prerr_newline ();
myexit 1
)
let parse argv = (
let save_current = !current in
try (
mkoptab args;
Arg.parse_argv ~current:current argv args._args (add_other args) usage_msg;
(List.iter
(fun f ->
if (String.sub f 0 1 = "-") then
unexpected f
else if not (Sys.file_exists f) then
file_notfound f
else ()
)
args._others);
current := save_current;
args.topo <- (match args._others with
[] ->
Printf.fprintf stderr "*** The topology file is missing in '%s'\n%s\n"
(Sys.argv.(0)) usage_msg;
exit 2;
| x::_ -> x
)
)
with
(* only 1rst line is interesting ! *)
| Arg.Bad msg ->
Printf.fprintf stderr "*** Error when calling '%s': %s\n%s\n" (Sys.argv.(0))
(first_line msg) usage_msg; exit 2;
| Arg.Help msg ->
Printf.fprintf stdout "%s\n%s\n" msg usage_msg;
options stdout; exit 0
)