:- use_module(library(lists)).
:- use_module(library(lineutils)).
:- use_module(library(system)).

:- initialization(main).

:- yap_flag(write_strings,on).

main :-
  S = popen('./get_comments'),
 file_filter_with_start_end( S, user_output, add2graph, initgraph,  checkgraph).

initgraph(_,_) :-
    retractall(node(_,_,_,_)),
    retractall(edge(_,_,_)),
    retractall(e_b_n(_,_,_)).

:- dynamic node/4, edge/3, e_b_n/3.

checkgraph(_,_) :-
  e_b_n(F,KN,_C),
  node(_,KF,KN,_),
  add_edge(KF, F, KN),
  fail.
checkgraph(_,_) :-
  listing(node),
  listing(edge).


add2graph(Line, _Out) :-
	writeln(Line),
    split( Line, ":@% \t*", [File, Job, Name|_]),
    append(Name, R, L),
    append(   _, L, Line),
    !,
    dispatch( Name, File, Job, R).

dispatch( Name, File, "defgroup", Comment):-
    atom_codes(KN, Name),
    atom_codes(KF, File),
    atom_codes(C, Comment),
          add_node(KF, KN,C).
dispatch( Name, File, "addtogroup", Comment):-
  atom_codes(KN, Name),
  atom_codes(KF, File),
  atom_codes(C, Comment),
  add_node_edge(KF, KN,C).
dispatch( Name, File, "ingroup", Comment):-
    atom_codes(KN, Name),
    atom_codes(KF, File),
    atom_codes(C, Comment),
          add_edge(KF, KN,C).
add_node(F, K,_C) :-
  node(d,F0,K,_),
  !,
  throw( repeat(K:F0/F) ).
add_node(F, K,_C) :-
  retract(node(d,F1,K,_)),
  !,
    assert(edge(F,F1,K)),
  assert(node(d,F,K,C)).
add_node(F, K,C) :-
  assert(node(d,F,K,C)).

  add_node_edge(F, K,_C) :-
    node(_,F1,K,_),
    !,
    assert(edge(F1,F,K)).
  add_node_edge(F, K,C) :-
    assert(node(a,F,K,C)).

    add_edge(F, K,_C) :-
      node(_,F1,K,_),
      !,
      assert(edge(F1,F,K)).
    add_edge(F, K,C) :-
      assert(e_b_n(F,K,C)).