-
Notifications
You must be signed in to change notification settings - Fork 28
/
dpdusage.ml
77 lines (69 loc) · 2.82 KB
/
dpdusage.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(* This file is part of the DpdGraph tools. *)
(* Copyright (C) 2009-2015 Anne Pacalet ([email protected]) *)
(* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *)
(* This file is distributed under the terms of the *)
(* GNU Lesser General Public License Version 2.1 *)
(* (see the enclosed LICENSE file for mode details) *)
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
module G = Dpd_compute.G
module Node = Dpd_compute.Node
let version_option = ref false
let print_path_option = ref true
let threshold_option = ref 0
let spec_args = [
("-with-defs", Arg.Set Dpd_compute.with_defs,
": show everything (default)");
("-without-defs", Arg.Clear Dpd_compute.with_defs,
": show only Prop objects");
("-rm-trans", Arg.Set Dpd_compute.reduce_trans,
": remove transitive dependencies (default)");
("-keep-trans", Arg.Clear Dpd_compute.reduce_trans,
": keep transitive dependencies");
("-debug", Arg.Set Dpd_compute.debug_flag,
": set debug mode");
("-threshold", Arg.Set_int threshold_option,
": Max number of references allowed (default 0)");
("-with-path", Arg.Set print_path_option,
": print path (default)");
("-without-path", Arg.Clear print_path_option,
": do not print path");
("-v", Arg.Set version_option,
": print version and exit");
]
let print_usage g t =
let print_node n =
let d = (G.in_degree g n) in
if d <= t then
if !print_path_option then
let prefix = match Node.get_attrib "path" n with
| None -> ""
| Some d -> d^":"
in Format.printf "%s%s\t(%d)\n" prefix (Node.name n) d
else
Format.printf "%s\t(%d)\n" (Node.name n) d
in
G.iter_vertex print_node g
let do_file _ f =
try
Dpd_compute.feedback "read file %s@." f;
let g = Dpd_lex.read f in
let g = Dpd_compute.build_graph g in
Dpd_compute.simplify_graph g;
print_usage g !threshold_option
with Dpd_compute.Error err -> Dpd_compute.pp_error err
let main () =
let usage_msg = "Usage : "^(Sys.argv.(0))^" [options] <input_file.dpd>" in
let args = ref [] in
let memo_arg arg = args := arg :: !args in
Arg.parse spec_args memo_arg usage_msg;
if !version_option
then Format.printf "This is '%s' (part of DpdGraph tools - version %s)@."
(Filename.basename Sys.argv.(0)) Version.version
else match !args with
| [] -> Dpd_compute.error "no source file to process ?@.";
Arg.usage spec_args usage_msg
| f::[] -> do_file 0 f
| l ->
ignore (List.fold_left (fun n f -> do_file n f; n+1) 1 l)
let () = main ()