1 module StringSet = Set.Make (String)
5 rdeps: StringSet.t option
8 let graph = Hashtbl.create 503
11 if Hashtbl.mem graph fname then () else
12 Hashtbl.add graph fname {ddeps = []; rdeps = None}
14 let add_ddep fname dname =
15 let file = Hashtbl.find graph fname in
16 Hashtbl.replace graph fname {file with ddeps = dname :: file.ddeps}
18 let init fname dname =
19 add fname; add dname; add_ddep fname dname
21 let rec compute fname file = match file.rdeps with
24 let rdeps = List.fold_left (iter fname) StringSet.empty file.ddeps in
25 Hashtbl.replace graph fname {file with rdeps = Some rdeps};
28 and iter fname rdeps dname =
29 if StringSet.mem dname rdeps then
30 begin Printf.printf "%s: redundant %s\n" fname dname; rdeps end
32 let file = Hashtbl.find graph dname in
33 StringSet.add dname (StringSet.union (compute dname file) rdeps)
37 if StringSet.mem fname (compute fname file) then
38 Printf.printf "%s: circular\n" fname
40 Hashtbl.iter iter graph
43 let _ = Scanf.fscanf ich "./%s@:include \"%s@\". " init in
47 try read stdin with End_of_file -> check ()