home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / cset21v1.zip / IBMCPP / SYS / IBRSDBQ.PRO < prev   
Text File  |  1993-04-30  |  52KB  |  1,716 lines

  1. %  @(#)37       1.5  src/sys/ibrsdbq.pro, sys, brs110, 930429 93/03/18 14:07:07
  2. %  db_define(Name/Arity,                Index,  TableSize(default=4000)).
  3.  
  4. :- db_define(pd_directory/4,            [1,4]).
  5. :- db_define(pd_file/6,                 [1,6]).
  6. :- db_define(pd_class/3,                [1]).
  7. :- db_define(pd_function/11,            [1]).
  8. :- db_define(pd_variable/6,             [1]).
  9. :- db_define(pd_block/1,                [1]).
  10. :- db_define(pd_enumeraton_tag/2,       [1]).
  11. :- db_define(pd_enumerator/3,           [1]).
  12. :- db_define(pd_macro/3,                [1]).
  13. :- db_define(pd_typedef/3,              [1]).
  14. :- db_define(pd_label/2,                [1]).
  15. :- db_define(pd_template/4,             [1]).
  16. :- db_define(pd_try/1,                  [1]).
  17. :- db_define(pd_catch/5,                [1]).
  18. :- db_define(pd_throw/4,                [1]).
  19. :- db_define(pd_defined/4,              [1,2,3]).
  20. :- db_define(pd_declared/4,             [1,2,3]).
  21. :- db_define(pd_used/4,                 [1,2,3],                50000).
  22. :- db_define(pd_used_implicit/4,        [1,2,3]).
  23. :- db_define(pd_used_lvalue/4,          [1,2,3]).
  24. :- db_define(pd_member/4,               [1,2]).
  25. :- db_define(pd_friend/5,               [1,2,5]).
  26. :- db_define(pd_inherit/6,              [1,2,6]).
  27. :- db_define(pd_include/3,              [1,2]).
  28. :- db_define(pd_instantiated/2,         [1,2]).
  29. :- db_define(pd_initializer/3,          [1,3]).
  30. :- db_define(pd_exception_specifier/5,  [1]).
  31. :- db_define(pd_source2xcoff/3,         [1,2]).
  32. :- db_define(pd_typeof_variable/2,      [1]).
  33. :- db_define(pd_typeof_function/4,      [1]).
  34. :- db_define(pd_typeof_typedef/2,       [1]).
  35.  
  36. %%%%%% command line interface
  37.  
  38. id(ID, Name) :-
  39.         pd_directory(ID,Name,_, _).
  40. id(ID, Name) :-
  41.         pd_file(ID,Name,_,_,_, _).
  42. id(ID, Name) :-
  43.         pd_class(ID,Name,_).
  44. id(ID, Name) :-
  45.         pd_function(ID,Name,_,_,_, _,_,_,_,_, _).
  46. id(ID, Name) :-
  47.         pd_variable(ID,Name,_,_,_, _).
  48. id(ID, Name) :-
  49.         pd_enumerator(ID,Name,_).
  50. id(ID, Name) :-
  51.         pd_enumeration_tag(ID,Name).
  52. id(ID, Name) :-
  53.         pd_macro(ID,Name,_).
  54. id(ID, Name) :-
  55.         pd_typedef(ID,Name,_).
  56. id(ID, Name) :-
  57.         pd_label(ID,Name).
  58. id(ID, Name) :-
  59.         pd_template(ID,Name,_,_).
  60.  
  61. %%%
  62.  
  63. defined(ID, FileID, Line, Column) :-
  64.         pd_defined(ID,BlockID,Line,Column),
  65.         block_in_file(BlockID, FileID).
  66.  
  67. declared(ID, FileID, Line, Column) :-
  68.         pd_declared(ID,BlockID,Line,Column),
  69.         block_in_file(BlockID, FileID).
  70.  
  71. used(ID, FileID, Line, Column) :-
  72.         pd_used(ID,BlockID,Line,Column),
  73.         block_in_file(BlockID, FileID).
  74. used(ID, FileID, Line, Column) :-
  75.         pd_used_implicit(ID,BlockID,Line,Column),
  76.         block_in_file(BlockID, FileID).
  77. used(ID, FileID, Line, Column) :-
  78.         pd_used_lvalue(ID,BlockID,Line,Column),
  79.         block_in_file(BlockID, FileID).
  80.  
  81. %%%
  82.  
  83. directory(ID) :-
  84.         pd_directory(ID,_,_,_).
  85.  
  86. file(ID) :-
  87.         pd_file(ID,_,_,_,_, _).
  88.  
  89. variable(ID) :-
  90.         pd_variable(ID,_,_,_,_, _).
  91.  
  92. function(ID) :-
  93.         pd_function(ID,_,_,_,_, _,_,_,_,_, _).
  94.  
  95. class(ID) :-
  96.         pd_class(ID,_,class).
  97. class(ID) :-
  98.         pd_template(ID,_,class,_).
  99.  
  100. struct(ID) :-
  101.         pd_class(ID,_,struct).
  102. struct(ID) :-
  103.         pd_template(ID,_,struct,_).
  104.  
  105. union(ID) :-
  106.         pd_class(ID,_,union).
  107. union(ID) :-
  108.         pd_class(ID,_,static_union).
  109. union(ID) :-
  110.         pd_template(ID,_,union,_).
  111.  
  112. enumeration_tag(ID) :-
  113.         pd_enumeration_tag(ID,_).
  114.  
  115. enumerator(ID) :-
  116.         pd_enumerator(ID,_,_).
  117.  
  118. typedef(ID) :-
  119.         pd_typedef(ID,_,_).
  120.  
  121. macro(ID) :-
  122.         pd_macro(ID,_,_).
  123.  
  124. try(ID) :-
  125.         pd_try(ID).
  126.  
  127. catch(ID) :-
  128.         pd_catch(ID,_,_,_,_).
  129.  
  130. throw(ID) :-
  131.         pd_throw(ID,_,_,_).
  132.  
  133. template(ID) :-
  134.         pd_template(ID,_,_,_).
  135.  
  136. label(ID) :-
  137.         pd_label(ID,_).
  138.  
  139. block(ID) :-
  140.         pd_block(ID).
  141.  
  142. %%%
  143.  
  144. auto(ID) :-
  145.         pd_variable(ID,_,_,auto,_, _).
  146.  
  147. register(ID) :-
  148.         pd_variable(ID,_,_,register,_, _).
  149.  
  150. static(ID) :-
  151.         pd_variable(ID,_,_,static,_,_).
  152. static(ID) :-
  153.         pd_function(ID,_,_,static,_, _,_,_,_,_, _).
  154. static(ID) :-
  155.         pd_class(ID,_,static_union).
  156.  
  157. extern(ID) :-
  158.         pd_variable(ID,_,_,extern,_,_).
  159. extern(ID) :-
  160.         pd_function(ID,_,_,extern,_, _,_,_,_,_, _).
  161.  
  162. extern_c(ID) :-
  163.         pd_variable(ID,_,_,extern_c,_, _)
  164.         ;
  165.         pd_function(ID,_,_,extern_c,_, _,_,_,_,_, _).
  166.  
  167. constructor(ID) :-
  168.         pd_function(ID,_,_,constructor,_, _,_,_,_,_, _).
  169.  
  170. destructor(ID) :-
  171.         pd_function(ID,_,_,destructor,_, _,_,_,_,_, _).
  172.  
  173. public(ID) :-
  174.         pd_member(_,ID,public,_).
  175.  
  176. protected(ID) :-
  177.         pd_member(_,ID,protected,_).
  178.  
  179. private(ID) :-
  180.         pd_member(_,ID,private,_).
  181.  
  182. virtual(ID) :-
  183.         pd_function(ID,_,_,_,_, _,_,_,virtual,_, _).
  184.  
  185. pure_virtual(ID) :-
  186.         pd_function(ID,_,_,_,_, _,_,_,pure_virtual,_, _).
  187.  
  188. non_virtual(ID) :-
  189.         pd_function(ID,_,_,_,_, _,_,_,no_specifier,_, _).
  190.  
  191. const(ID) :-
  192.         pd_variable(ID,_,_,_,true, _)
  193.         ;
  194.         pd_function(ID,_,_,_,true, _,_,_,_,_, _).
  195.  
  196. volatile(ID) :-
  197.         pd_variable(ID,_,_,_,_, true)
  198.         ;
  199.         pd_function(ID,_,_,_,_, _,_,_,_,_, true).
  200.  
  201. inline(ID) :-
  202.         pd_function(ID,_,_,_,_, true,_,_,_,_, _).
  203.  
  204. operator(ID) :-
  205.         pd_function(ID,_,_,_,_, _,_,true,_,_, _).
  206.  
  207. overload(ID) :-
  208.         pd_function(ID,_,_,_,_, _,true,_,_,_, _).
  209.  
  210. override(ID) :-
  211.         pd_function(ID,_,_,_,_, _,_,_,_,override, _).
  212.  
  213. compiler_generated(ID) :-
  214.         pd_function(ID,_,_,_,_, _,_,_,_,compiler_generated, _).
  215.  
  216. %%%
  217.  
  218. include(ID1,ID2) :-
  219.         pd_include(ID1,ID2,_).
  220.  
  221. inherit(ID1,ID2,Access,Virtual) :-
  222.         pd_inherit(ID1,ID2,Access,Virtual,_, _).
  223.  
  224. friend(ID,ClassID) :-
  225.         pd_friend(ID,ClassID,_,_, _).
  226.  
  227. instantiated(ID, TempID) :-
  228.         pd_instantiated(ID,TempID).
  229.  
  230. %%%
  231.  
  232. local(ID, FunctionID) :-
  233.         nonvar(ID), !,
  234.         \+ pd_block(ID),
  235.         pd_defined(ID,BlockID,_,_),
  236.         block_in_function(BlockID, FunctionID).
  237. local(ID, FunctionID) :-
  238.         var(ID), !,
  239.         block_in_function(BlockID,FunctionID),
  240.         pd_defined(ID,BlockID,_,_),
  241.         \+ pd_block(ID).
  242.  
  243. member(ID,ClassID,Access) :-
  244.         pd_member(ClassID,ID,Access,_).
  245.  
  246. inherited_member(ID,ClassID,BaseClassID,Access) :-
  247.         inherit_closure(ClassID,BaseClassID),
  248.         pd_member(BaseClassID,ID,Access,_).
  249.  
  250. inherit_closure(ClassID,BaseClassID) :-
  251.         inherit_closure(ClassID,BaseClassID,false)
  252.         ;
  253.         group([ClassID,BaseClassID],inherit_closure(ClassID,BaseClassID,true)).
  254.  
  255. inherit_closure(ClassID1,ClassID2,Virtual) :-
  256.         pd_inherit(ClassID1,ClassID2,_,Virtual,_, _).
  257. inherit_closure(ClassID1,ClassID2,Virtual) :-
  258.         nonvar(ClassID1),!,
  259.         pd_inherit(ClassID1,ClassIDT,_,CurrentVirtual,_, _),
  260.         inherit_closure(ClassIDT,ClassID2,RestVirtual),
  261.         or_op(CurrentVirtual, RestVirtual, Virtual).
  262. inherit_closure(ClassID1,ClassID2,Virtual) :-
  263.         var(ClassID1),!,
  264.         pd_inherit(ClassIDT,ClassID2,_,CurrentVirtual,_, _),
  265.         inherit_closure(ClassID1,ClassIDT,RestVirtual),
  266.         or_op(CurrentVirtual, RestVirtual, Virtual).
  267.  
  268. % refers(ID1, ID2)
  269. %
  270. %    ID1  \ ID2  variable function class macro enum_tag enumerator typedef
  271. % function        o        o(*1)    o      o      o       o          o
  272. % class           x        x        o      o      o       x          o
  273. % try             o        o        o      o      o       o          o
  274. % catch           o        o        o      o      o       o          o
  275. %
  276. %     *1 : same as call/2
  277.  
  278. refers(ID1, ID2) :-
  279.         nonvar(ID1),!,
  280.         (
  281.                 function(ID1)
  282.                 ;
  283.                 class(ID1); struct(ID1); union(ID)
  284.                 ;
  285.                 try(ID1); catch(ID1)
  286.         ),
  287.         block_in_block(BlockID, ID1),
  288.         (
  289.                 pd_used(ID2,BlockID,_,_)
  290.                 ;
  291.                 pd_used_lvalue(ID2,BlockID,_,_)
  292.                 ;
  293.                 pd_used_implicit(ID2,BlockID,_,_)
  294.         ).
  295. refers(ID1, ID2) :-
  296.         var(ID1),!,
  297.         (
  298.                 pd_used(ID2,BlockID,_,_)
  299.                 ;
  300.                 pd_used_lvalue(ID2,BlockID,_,_)
  301.                 ;
  302.                 pd_used_implicit(ID2,BlockID,_,_)
  303.         ),
  304.         block_in_block(BlockID,ID1),
  305.         (
  306.                 function(ID1)
  307.                 ;
  308.                 class(ID1); struct(ID1); union(ID)
  309.                 ;
  310.                 try(ID1); catch(ID1)
  311.         ).
  312.  
  313. calls(ID1,ID2) :-
  314.         nonvar(ID1),!,
  315.         group(ID2, (
  316.                 block_in_function(BlockID, ID1),
  317.                 (
  318.                         pd_used(ID2,BlockID,_,_)
  319.                         ;
  320.                         pd_used_lvalue(ID2,BlockID,_,_)
  321.                         ;
  322.                         pd_used_implicit(ID2,BlockID,_,_)
  323.                 )
  324.         )),
  325.         function(ID2).
  326. calls(ID1,ID2) :-
  327.         var(ID1), !,
  328.         function(ID2),
  329.         group(ID1, (
  330.                 (
  331.                         pd_used(ID2,BlockID,_,_)
  332.                         ;
  333.                         pd_used_lvalue(ID2,BlockID,_,_)
  334.                         ;
  335.                         pd_used_implicit(ID2,BlockID,_,_)
  336.                 ),
  337.                 block_in_function(BlockID, ID1)
  338.         )).
  339.  
  340. % closure(Predicate, ID1, ID2)
  341. %
  342. %                 ID1 ::= <variable in Predicate>
  343. %                 ID2 ::= <variable in Predicate>
  344. %
  345. %                  x  closure(p(a,a,B), a, B)
  346. %                  o  closure(p(A,a,B), A, B), A = a
  347.  
  348. closure(P,ID1,ID2) :-
  349.         general_closure(P,ID1,ID2).
  350.  
  351. %%%%%% Database Control
  352.  
  353. %%% for pb
  354.  
  355. pr_update(Path,RC) :-
  356.                 retract('$update'(_))
  357.                 ;
  358.                 brs_file(_,Path),
  359.                 unload_old_brs(Path),
  360.                 assert('$update'(Path)),
  361.                 fail
  362.                 ;
  363.                 retract('$update'(Path)),
  364.                 sconsult(Path,RC).
  365.  
  366. pr_load_match(PathExp,Path,RC) :-
  367.         ignore_signal(2,(       % SIGINT
  368.                 find_file(PathExp, Path),
  369.                 unload_old_brs(Path),
  370.                 fail
  371.                 ;
  372.                 find_file(PathExp, Path),
  373.                 sconsult(Path,RC)
  374.         )).
  375.  
  376. pr_unloadable(Path) :-
  377.         brs_file(_, Path).
  378.  
  379. pr_unload_match(PathExp) :-
  380.         ignore_signal(2,(       % SIGINT
  381.                 brs_file(_, Path),
  382.                 wildcard_match(Path, PathExp),
  383.                 unload_brs(Path)
  384.         )).
  385.  
  386. pr_inconsistent_file(SrcName) :-
  387.         pd_source2xcoff(SrcID,BrsID,_),
  388.         pd_file(SrcID,_,SrcName,_,_,_),
  389.         pd_file(BrsID,_,BrsName,_,_,_),
  390.         filemodtime(SrcName,SrcTime),
  391.         filemodtime(BrsName,BrsTime),
  392.         SrcTime > BrsTime.
  393.  
  394. %%% for XCOFF translator %%%
  395. %%% called by sconsult/1, sconsult/2 and unsconsult/1 %%%
  396.  
  397. pr_remove_location(PID) :-
  398.         pd_defined(CID, PID, _, _),
  399.         pr_remove_location(CID).
  400. pr_remove_location(BlockID) :-
  401.         retract(pd_defined(_,BlockID,_,_)).
  402. pr_remove_location(BlockID) :-
  403.         retract(pd_declared(_,BlockID,_,_)).
  404. pr_remove_location(BlockID) :-
  405.         retract(pd_used(_,BlockID,_,_)).
  406. pr_remove_location(BlockID) :-
  407.         retract(pd_used_implicit(_,BlockID,_,_)).
  408. pr_remove_location(BlockID) :-
  409.         retract(pd_used_lvalue(_,BlockID,_,_)).
  410.  
  411. %%% local
  412.  
  413. brs_file(ID, Path) :-
  414.         group(ID, (
  415.                 pd_source2xcoff(_, ID, _),
  416.                 pd_file(ID, _, Path, _, _, _)
  417.         )).
  418.  
  419. unload_old_brs(Path) :-
  420.         brs_file(ID,Path),
  421.         pd_file(ID,_,_,OldTime,_,_),
  422.         filemodtime(Path,CurrTime),
  423.         OldTime =\= CurrTime,
  424.         (unload_brs(Path),false;true),
  425.         !.
  426. unload_old_brs(Path) :-
  427.         true.
  428.  
  429. unload_brs(BrsPath) :-
  430.         pd_file(BrsID, _, BrsPath, _, _, _),
  431.         pd_source2xcoff(SrcID, BrsID, _),
  432.         count(group(ID,pd_source2xcoff(SrcID,ID,_)),C),
  433.         C =:= 1,
  434.         remove_src(SrcID).
  435. unload_brs(BrsPath) :-
  436.         retract(pd_file(BrsID,_,BrsPath,_,_,_)),
  437.         retract(pd_source2xcoff(_, BrsID, _)).
  438. unload_brs(_) :-
  439. %       \+ (pd_file(ID,_,_,_,_,_), pd_source2xcoff(_,ID,_)),
  440. %        remove_all_src.
  441.         pd_file(ID,_,Path,_,_,_),
  442.         \+   pd_source2xcoff(_,ID,_),
  443.         \+   reachable_to_brs(ID),
  444.         unsconsult(Path).
  445.  
  446. reachable_to_brs(ID) :-
  447.         reachable_to_brs(ID,[ID]).
  448.  
  449. reachable_to_brs(ID,L) :-
  450.         pd_include(PID,ID,_),
  451.         \+ is_included(PID,L),
  452.         reachable_to_brs(PID,[PID|L]).
  453.  
  454. reachable_to_brs(ID,_) :-
  455.         pd_source2xcoff(ID,_,_).
  456.  
  457.  
  458. unload_brs(_) :-
  459.         pd_directory(_,_,_,PID),
  460.         \+ pd_directory(PID,_,_,_),
  461.         remove_dir(PID).
  462.  
  463. remove_src(ID) :-
  464.         pd_include(ID, CID,_),
  465.         count(group(PID,pd_include(PID,CID,_)),C),
  466.         C =:= 1,
  467.         remove_src(CID).
  468.  
  469. remove_src(ID) :-
  470.         pd_file(ID, _, Path, _, _, _),
  471.         unsconsult(Path).
  472.  
  473. remove_all_src :-
  474.         pd_file(_, _, Path, _, _, _),
  475.         unsconsult(Path),
  476.         fail.
  477. remove_all_src.
  478.  
  479. remove_dir(ID) :-
  480.         pd_directory(CID,_,_,ID),
  481.         remove_dir(CID).
  482. remove_dir(ID) :-
  483.         \+ pd_directory(_,_,_,ID),
  484.         \+ pd_file(_,_,_,_,_,ID),
  485.         retract(pd_directory(ID,_,_,_)).
  486.  
  487. find_file(PathExp, File) :-
  488.         normalize_filename(PathExp, Path),
  489.         find_file(Path, '.', File).
  490.  
  491. find_file(_, '\', '\').
  492.  
  493. find_file(PathExp, CurrentDir, File) :-
  494.         divpath(PathExp, PathExp2, FileExp),
  495.         !,
  496.         find_file(PathExp2, PathExp2, Dir),
  497.         dir(Dir, Member, File),
  498.         wildcard_match(Member,FileExp).
  499.  
  500. find_file(PathExp, CurrentDir, File) :-
  501.         dir(CurrentDir, Member, File),
  502.         wildcard_match(Member,PathExp).
  503.  
  504. normalize_filename(Name, Norm) :-
  505.         divpath(Name, Parent, '.'),
  506.         !,
  507.         normalize_filename(Parent, Norm).
  508.  
  509. normalize_filename(Name, Norm) :-
  510.         divpath(Name, Parent, '..'),
  511.         !,
  512.         normalize_filename(Parent, NormParent),
  513.         divpath(NormParent, Norm, _).
  514.  
  515. normalize_filename(Name, Norm) :-
  516.         divpath(Name, Parent, Child),
  517.         !,
  518.         normalize_filename(Parent, NormParent),
  519.         divpath(Norm, NormParent, Child).
  520.  
  521. normalize_filename('..', Norm) :-
  522.         !,
  523.         divpath('.', Norm, _).
  524.  
  525. normalize_filename('.', Norm) :-
  526.         !,
  527.         divpath('.', Parent, Current),
  528.         divpath(Norm, Parent, Current).
  529.  
  530. normalize_filename('\', '\') :-
  531.         !.
  532.  
  533. normalize_filename(Name, Norm) :-
  534.         divpath('.', Parent, Member),
  535.         divpath(Current, Parent, Member),
  536.         divpath(Norm, Current, Name).
  537.  
  538. %%% end local
  539.  
  540. %%%%%% Scope Queries
  541.  
  542. local_scopes(ID, Name, QName, Kind) :-
  543.         generic(ID, Name, QName, Kind),
  544.         group(ID, (
  545.                 (
  546.                         pd_defined(ID, BlockID, _, _)
  547.                         ;
  548.                         pd_declared(ID, BlockID, _, _)
  549.                 ),
  550.                 \+ pd_file(BlockID,_,_,_,_,_),
  551.                 \+ pd_class(BlockID,_,_)
  552.         )).
  553.  
  554. class_scopes(ID, Name, QName, Kind) :-
  555.         pd_member(_, ID, _, _),
  556.         generic(ID, Name, QName, Kind).
  557.  
  558. file_scopes(ID, Name, QName, Kind) :-
  559.         group(ID, (
  560.                 pd_defined(ID, BlockID, _, _),
  561.                 pd_file(BlockID, _, _, _, _, _),
  562.                 \+ pd_member(_,ID,_,_)
  563.                 ;
  564.                 pd_declared(ID, BlockID, _, _),
  565.                 pd_file(BlockID, _, _, _, _, _)
  566.                 ;
  567.                 pd_macro(ID,_,_)
  568.         )),
  569.         generic(ID, Name, QName, Kind).
  570.  
  571. all_globals(ID, Name, QName, Kind) :-
  572.         file_scopes(ID, Name, QName, Kind).
  573. all_globals(ID, Name, QName, Kind) :-
  574.         pd_member(ClassID, ID, public, _),
  575.         \+ local(ClassID),
  576.         generic(ID, Name, QName, Kind).
  577.  
  578. all_names(ID, Name, QName, Kind) :-
  579.         generic(ID, Name, QName, Kind).
  580.  
  581. %%%%%% Directory Queries
  582.  
  583. directory_list(FID, ID, Name, QName, directory) :-
  584.         pd_directory(ID, Name, QName, FID).
  585. directory_list(FID, ID, Name, QName, file) :-
  586.         pd_file(ID, Name, QName, _, _, FID),
  587.         \+ pd_source2xcoff(_, ID, _).
  588.  
  589. %%%%%% File Queries
  590.  
  591. file_declaration(BaseFID, ID, Name, QName, Kind, Type) :-
  592.         group(ID, (
  593.                 (
  594.                         Type = direct,
  595.                         BaseFID = FID
  596.                         ;
  597.                         Type = indirect,
  598.                         file_all_includes(BaseFID, FID, _, _, _)
  599.                 ),
  600.                 (
  601.                         pd_declared(ID, FID, _, _),file(FID)
  602.                         ;
  603.                         pd_defined(ID, FID, _, _), file(FID)
  604.                 )
  605.         )),
  606.         \+ pd_function(ID,_,_,_,_,_,_,_,_,compiler_generated, _),
  607.         generic(ID, Name, QName, Kind).
  608.  
  609. file_direct_includes(FID, ID, Name, QName, file) :-
  610.         file_includes(1, FID, ID, Name, QName, _).
  611.  
  612. file_direct_inclusions(FID, ID, Name, QName, file) :-
  613.         file_inclusions(1, FID, ID, Name, QName, _).
  614.  
  615. file_all_includes(FID, ID, Name, QName, file) :-
  616.         file_includes(10000, FID, ID, Name, QName, _).
  617.  
  618. file_all_inclusions(FID, ID, Name, QName, file) :-
  619.         file_inclusions(10000, FID, ID, Name, QName, _).
  620.  
  621. file_includes(L, FID, ID, Name, QName, file) :-
  622.         group(ID, file_includes_aux(L, FID, ID, Name, QName, [FID])).
  623.  
  624. file_inclusions(L, FID, ID, Name, QName, file) :-
  625.         group(ID, file_inclusions_aux(L, FID, ID, Name, QName, [FID])).
  626.  
  627. % local
  628.  
  629. file_includes_aux(L, FID, ID, Name, QName, H) :-
  630.         pd_include(FID, ID, _),
  631.         \+ is_member(ID, H),
  632.         pd_file(ID, Name, QName, _, _, _)
  633.         ;
  634.         L > 1, L1 is L - 1,
  635.         pd_include(FID, TID, _),
  636.         \+ is_member(TID, H),
  637.         file_includes_aux(L1, TID, ID, Name, QName, [TID|H]).
  638.  
  639. file_inclusions_aux(L,FID, ID, Name, QName, H) :-
  640.         pd_include(ID, FID, _),
  641.         \+ is_member(ID, H),
  642.         pd_file(ID, Name, QName, _, _, _)
  643.         ;
  644.         L > 1, L1 is L - 1,
  645.         pd_include(TID, FID, _),
  646.         \+ is_member(TID, H),
  647.         file_inclusions_aux(L1, TID, ID, Name, QName, [TID|H]).
  648.  
  649. % end local
  650.  
  651. %%%%%% Class Queries
  652.  
  653. class_declaration(FID, ID, Name, QName, Type, Access) :-
  654.         group(ID, (
  655.                 (
  656.                         pd_declared(ID, FID, _, _)
  657.                         ;
  658.                         pd_defined(ID, FID, _, _)
  659.                 ),
  660.                 pd_member(FID, ID, Access, _),
  661.                 generic(ID, Name, QName, Type)
  662.                 ;
  663.                 pd_friend(FID, ID, _, _,_),
  664.                 Access = friend,
  665.                 generic(ID, Name, Name1, Type),
  666.                 concat('friend ', Name1, QName)
  667.         )).
  668.  
  669. class_members(FID, ID, Name, QName, Type, immediate, BaseAccess, MemAccess) :-
  670.         pd_member(FID, ID, MemAccess, _),
  671.         generic(ID, Name, QName, Type).
  672.  
  673. class_members(FID, ID, Name, QName, Type, base, BaseAccess, MemAccess) :-
  674.         (
  675.                 class_base_classes_aux(10000,FID,IID,_,BaseAccess,false)
  676.                 ;
  677.                 group(IID,class_base_classes_aux(10000,FID,IID,_,BaseAccess,true))
  678.         ),
  679.         pd_member(IID, ID, MemAccess, _),
  680.         generic1(ID, Name, Name1, Type),
  681.         (
  682.                 MemAccess = public,
  683.                 (
  684.                         BaseAccess = public,
  685.                         concat('public:    ', Name1, QName)
  686.                         ;
  687.                         BaseAccess = protected,
  688.                         concat('protected: ', Name1, QName)
  689.                         ;
  690.                         BaseAccess = private,
  691.                         concat('private:   ', Name1, QName)
  692.                 )
  693.                 ;
  694.                 MemAccess = protected,
  695.                 (
  696.                         BaseAccess = public,
  697.                         concat('protected:    ', Name1, QName)
  698.                         ;
  699.                         BaseAccess = protected,
  700.                         concat('protected: ', Name1, QName)
  701.                         ;
  702.                         BaseAccess = private,
  703.                         concat('private:   ', Name1, QName)
  704.                 )
  705.                 ;
  706.                 MemAccess = private,
  707.                 concat('private:   ', Name1, QName)
  708.         ).
  709.  
  710. class_friends(FID, ID, Name, QName, Type) :-
  711.         pd_friend(FID, ID, _, _, _),
  712.         generic(ID, Name, QName, Type).
  713.  
  714. class_friendships(FID, ID, Name, Name, class) :-
  715.         pd_friend(ID, FID, _, _, _),
  716.         pd_class(ID, Name, _).
  717.  
  718. class_direct_base_classes(FID, ID, Name, QName, class) :-
  719.         class_base_classes(1, FID, ID, Name, QName, _).
  720.  
  721. class_direct_derived_classes(FID, ID, Name, QName, class) :-
  722.         class_derived_classes(1, FID, ID, Name, QName, _).
  723.  
  724. class_all_base_classes(FID, ID, Name, QName, class) :-
  725.         class_base_classes(10000, FID, ID, Name, QName, _).
  726.  
  727. class_all_derived_classes(FID, ID, Name, QName, class) :-
  728.         class_derived_classes(10000, FID, ID, Name, QName, _).
  729.  
  730. class_base_classes(L, FID, ID, Name, Name, class) :-
  731.         group(ID, class_base_classes_aux(L, FID, ID, Name, _, _)).
  732.  
  733. class_derived_classes(L, FID, ID, Name, Name, class) :-
  734.         group(ID, class_derived_classes_aux(L, FID, ID, Name)).
  735.  
  736. class_implementation_file(FID, ID, Name, QName, file) :-
  737.         group(ID, (
  738.                 defined(FID, ID, _, _)
  739.                 ;
  740.                 pd_member(FID, MID, _, _),
  741.                 defined(MID, ID, _, _)
  742.         )),
  743.         pd_file(ID, Name, QName, _, _, _).
  744.  
  745. class_template_instantiations(FID, ID, Name, QName, class) :-
  746.         pd_instantiated(ID, FID),
  747.         generic(ID, Name, QName, _).
  748.  
  749. % local
  750.  
  751. class_base_classes_aux(L, FID, ID, Name, BaseAccess, Virtual) :-
  752.         pd_inherit(FID, ID, BaseAccess, Virtual, _, _),
  753.         pd_class(ID, Name, _)
  754.         ;
  755.         L > 1, L1 is L - 1,
  756.         pd_inherit(FID, TID, CurrentAccess, CurrentVirtual, _, _),
  757.         class_base_classes_aux(L1, TID, ID, Name, RestAccess, RestVirtual),
  758.         inherit_access_op(CurrentAccess, RestAccess, BaseAccess),
  759.         or_op(CurrentVirtual, RestVirtual, Virtual).
  760.  
  761. class_derived_classes_aux(L, FID, ID, Name) :-
  762.         pd_inherit(ID, FID, _, _, _, _),
  763.         pd_class(ID, Name, _)
  764.         ;
  765.         L > 1, L1 is L - 1,
  766.         pd_inherit(TID, FID, _, _, _, _),
  767.         class_derived_classes_aux(L1, TID, ID, Name).
  768.  
  769. % inherit_access_op(+Current, +Rest, -Result)
  770.  
  771. inherit_access_op(public, public, public) :- !.
  772. inherit_access_op(_     , _     ,private).
  773.  
  774. % end local
  775.  
  776. %%%%%% Function Queries
  777.  
  778. function_direct_calls(FID, ID, Name, QName, function) :-
  779.         function_calls(1, FID, ID, Name, QName, _).
  780.  
  781. function_direct_callers(FID, ID, Name, QName, function) :-
  782.         function_callers(1, FID, ID, Name, QName, _).
  783.  
  784. function_all_calls(FID, ID, Name, QName, function) :-
  785.         function_calls(10000, FID, ID, Name, QName, _).
  786.  
  787. function_all_callers(FID, ID, Name, QName, function) :-
  788.         function_callers(10000, FID, ID, Name, QName, _).
  789.  
  790. function_calls(L, FID, ID, Name, QName, function) :-
  791.         group(ID, function_calls_aux(L, FID, ID, Name, QName, [])).
  792.  
  793. function_callers(L, FID, ID, Name, QName, function) :-
  794.         group(ID, function_callers_aux(L, FID, ID, Name, QName, [])).
  795.  
  796. function_template_instantiations(FID, ID, Name, QName, function) :-
  797.         pd_instantiated(ID, FID),
  798.         generic(ID, Name, QName, _).
  799.  
  800. % local
  801.  
  802. function_calls_aux(L, FID, ID, Name, QName, H) :-
  803.         calls(FID, ID),
  804.         \+ is_member(ID, H),
  805.         pd_function(ID, Name, Name1, _, _, _, _, _, _, _, _),
  806.         make_qname(ID, Name1, QName)
  807.         ;
  808.         L > 1, L1 is L - 1,
  809.         calls(FID, TID),
  810.         \+ is_member(TID, H),
  811.         function_calls_aux(L1, TID, ID, Name, QName, [TID|H]).
  812.  
  813. function_callers_aux(L, FID, ID, Name, QName, H) :-
  814.         calls(ID, FID),
  815.         \+ is_member(ID, H),
  816.         pd_function(ID, Name, Name1, _, _, _, _, _, _, _, _),
  817.         make_qname(ID, Name1, QName)
  818.         ;
  819.         L > 1, L1 is L - 1,
  820.         calls(TID, FID),
  821.         \+ is_member(TID, H),
  822.         function_callers_aux(L1, TID, ID, Name, QName, [TID|H]).
  823.  
  824. % end local
  825.  
  826. %%%%%% List Pane Queries
  827.  
  828. impacted_file(FID, ID, Name, QName, file) :-
  829.         group(ID, ((
  830.                 declared(FID, PID, _,_)
  831.                 ;
  832.                 defined(FID, PID, _,_)
  833.                 ;
  834.                 used(FID, PID, _, _)
  835.                 ;
  836.                 pd_instantiated(InstID, FID),
  837.                 used(InstID, PID, _, _)
  838.                 ),
  839.                 include_closure(ID, PID)
  840.         )),
  841.         pd_file(ID, Name, QName, _, _, _).
  842.  
  843. usage(FID, ID, Name, QName, function) :-
  844.         group(ID, (
  845.                 (
  846.                         pd_used(FID, BID, _, _)
  847.                         ;
  848.                         pd_used_lvalue(FID, BID, _, _)
  849.                         ;
  850.                         pd_used_implicit(FID, BID, _, _)
  851.                 ),
  852.                 block_in_function(BID, ID),
  853.                 pd_function(ID, Name, Name1, _, _, _, _, _, _, _, _),
  854.                 make_qname(ID, Name1, QName)
  855.         )).
  856.  
  857. usage(FID, ID, Name, Name, class) :-
  858.         group(ID, (
  859.                 (
  860.                         pd_used(FID, ID, _, _);
  861.                         pd_used_lvalue(FID, ID, _, _);
  862.                         pd_used_implicit(FID, ID, _, _)
  863.                 ),
  864.                 pd_class(ID, Name, _)
  865.         )).
  866.  
  867. usage(FID, ID, Name, QName, file) :-
  868.         group(ID, (
  869.                 (
  870.                         pd_used(FID, ID, _, _);
  871.                         pd_used_lvalue(FID, ID, _, _);
  872.                         pd_used_implicit(FID, ID, _, _)
  873.                 ),
  874.                 pd_file(ID, Name, QName, _, _, _)
  875.         )).
  876.  
  877. modifiers(FID, ID, Name, QName, function) :-
  878.         group(ID, (
  879.                 (
  880.                         pd_used_lvalue(FID, BID, _, _)
  881.                         ;
  882.                         pd_used(FID, BID, _, _),
  883.                         pd_initializer(FID,_,_)
  884.                 ),
  885.                 block_in_function(BID, ID),
  886.                 pd_function(ID, Name, Name1, _, _, _, _, _, _, _, _),
  887.                 make_qname(ID, Name1, QName)
  888.         )).
  889.  
  890. enumerators(FID, ID, Name, Name, enumerator) :-
  891.         pd_enumerator(ID, Name, FID).
  892.  
  893.  
  894. % local
  895.  
  896. include_closure(PID,CID) :-
  897.         nonvar(PID),!,
  898.         group(CID, include_closure_1(PID, CID, [PID])).
  899. include_closure(PID,CID) :-
  900.         group(PID, include_closure_2(PID, CID, [CID])).
  901.  
  902. include_closure_1(ID, ID, _).
  903. include_closure_1(PID, CID, H) :-
  904.         group(TID, pd_include(PID, TID,_)),
  905.         \+ is_member(TID, H),
  906.         include_closure_1(TID, CID, [TID|H]).
  907.  
  908. include_closure_2(ID, ID, _).
  909. include_closure_2(PID, CID, H) :-
  910.         group(TID, pd_include(TID, CID,_)),
  911.         \+ is_member(TID, H),
  912.         include_closure_2(PID, TID, [TID|H]).
  913.  
  914. % end local
  915.  
  916. %%%%%%% Graph Pane
  917.  
  918. %%% directory
  919. % ArcType ::= directory_to_directory | directory_to_file
  920.  
  921. % local
  922.  
  923. dir_include(PID, CID, directory_to_file) :-
  924.         pd_file(CID, _, _, _, _, PID),
  925.         \+ pd_source2xcoff(_,CID, _).
  926. dir_include(PID, CID, directory_to_directory) :-
  927.         pd_directory(CID, _, _, PID).
  928.  
  929. directory_downward2(PID, L, CID, PID, ArcType) :-
  930.         dir_include(PID, CID, ArcType).
  931. directory_downward2(SID, L, CID, PID, ArcType) :-
  932.         L > 1,
  933.         dir_include(SID, SID2,_),
  934.         L2 is L - 1,
  935.         directory_downward2(SID2, L2, CID, PID, ArcType).
  936.  
  937. directory_downward_expand(ID, right) :-
  938.         directory_downward2(ID, 1, _, _, _), !.
  939. directory_downward_expand(ID, none).
  940.  
  941. % end local
  942.  
  943. directory_top_root(SID, '\', Expand) :-
  944.         pd_directory(SID, _, '\',_),
  945.         directory_downward_expand(SID, Expand).
  946.  
  947. directory_downward(SID, L, CID, CName, PID, PName, ArcType, Expand) :-
  948.         directory_downward2(SID, L, CID, PID, ArcType),
  949.         id_name(CID, CName),
  950.         id_name(PID, PName),
  951.         directory_downward_expand(CID, Expand).
  952.  
  953. %%% include
  954. % ArcType ::= normal | cycle
  955.  
  956. % local
  957.  
  958. file_include_upward(PID, CID, ArcType, History) :-
  959.         group(PID, pd_include(PID, CID, _)),
  960.         include_arc_type(PID, ArcType, History).
  961.  
  962. file_include_downward(PID, CID, ArcType, History) :-
  963.         group(CID, pd_include(PID, CID, _)),
  964.         include_arc_type(CID, ArcType, History).
  965.  
  966. include_arc_type(ID, ArcType, History) :-
  967.         var(ArcType),!,
  968.         (
  969.                 is_member(ID, History), !,
  970.                 ArcType = cycle
  971.                 ;
  972.                 ArcType = normal
  973.         ).
  974. include_arc_type(ID, cycle, History) :-
  975.         is_member(ID, History).
  976. include_arc_type(ID, normal, History) :-
  977.         not_member(ID, History).
  978.  
  979. include_upward2(CID, L, CID, PID, ArcType, History) :-
  980.         file_include_upward(PID, CID, ArcType, History).
  981. include_upward2(SID, L, CID, PID, ArcType, History) :-
  982.         L > 1,
  983.         file_include_upward(SID2, SID, normal, History),
  984.         L2 is L - 1,
  985.         include_upward2(SID2, L2, CID, PID, ArcType, [SID2|History]).
  986.  
  987. include_downward2(PID, L, CID, PID, ArcType, History) :-
  988.         file_include_downward(PID, CID, ArcType, History).
  989. include_downward2(SID, L, CID, PID, ArcType, History) :-
  990.         L > 1,
  991.         file_include_downward(SID, SID2, normal, History),
  992.         L2 is L - 1,
  993.         include_downward2(SID2, L2, CID, PID, ArcType, [SID2|History]).
  994.  
  995. include_downward_expand(ID, right) :-
  996.         include_downward2(ID, 1, _, _, _, []), !.
  997. include_downward_expand(ID, none).
  998.  
  999. include_upward_expand(ID, left) :-
  1000.         include_upward2(ID, 1, _, _, _, []), !.
  1001. include_upward_expand(ID, none).
  1002.  
  1003. % end local
  1004.  
  1005. include_top_root(SID, Name, Expand) :-
  1006.         pd_file(SID,Name,_,_,_,_),
  1007.         \+ pd_include(_,SID,_),
  1008.         \+ wildcard_match(Name,'*.brs'),
  1009.         include_downward_expand(SID, Expand).
  1010.  
  1011. include_downward(SID, L, CID, CName, PID, PName, ArcType, Expand) :-
  1012.         include_downward2(SID, L, CID, PID, ArcType, [SID]),
  1013.         pd_file(CID, CName, _, _, _, _),
  1014.         pd_file(PID, PName, _, _, _, _),
  1015.         include_downward_expand(CID, Expand).
  1016.  
  1017. include_bottom_root(SID, Name, Expand) :-
  1018.         pd_file(SID,Name,_,_,_,_),
  1019.         \+ pd_include(SID,_,_),
  1020.         \+ wildcard_match(Name,'*.brs'),
  1021.         include_upward_expand(SID, Expand).
  1022.  
  1023. include_upward(SID, L, CID, CName, PID, PName, ArcType, Expand) :-
  1024.         include_upward2(SID, L, CID, PID, ArcType, [SID]),
  1025.         pd_file(CID, CName, _, _, _, _),
  1026.         pd_file(PID, PName, _, _, _, _),
  1027.         include_upward_expand(PID, Expand).
  1028.  
  1029. %%% inherit
  1030. % ArcType ::= [Access|Virtual]
  1031. % Access  ::= private | public
  1032. % Virtual ::= virtual | no_specifier
  1033.  
  1034. % local
  1035.  
  1036. inherit_upward2(CID, L, CID, PID, [Access | Virtual]) :-
  1037.         pd_inherit(CID, PID, Access, IsVirtual, _, _),
  1038.         get_virtual(IsVirtual, Virtual).
  1039. inherit_upward2(SID, L, CID, PID, ArcType) :-
  1040.         L > 1,
  1041.         pd_inherit(SID, SID2, _, _, _, _),
  1042.         L2 is L - 1,
  1043.         inherit_upward2(SID2, L2, CID, PID, ArcType).
  1044.  
  1045. inherit_downward2(PID, L, CID, PID, [Access | Virtual]) :-
  1046.         pd_inherit(CID, PID, Access, IsVirtual, _, _),
  1047.         get_virtual(IsVirtual, Virtual).
  1048. inherit_downward2(SID, L, CID, PID, ArcType) :-
  1049.         L > 1,
  1050.         pd_inherit(SID2, SID, _, _, _, _),
  1051.         L2 is L - 1,
  1052.         inherit_downward2(SID2, L2, CID, PID, ArcType).
  1053.  
  1054. get_virtual(true, virtual).
  1055. get_virtual(false,non_virtual).
  1056.  
  1057. inherit_upward_expand(ID, left) :-
  1058.         inherit_upward2(ID, 1, _, _, _), !.
  1059. inherit_upward_expand(ID, none).
  1060.  
  1061. inherit_downward_expand(ID, right) :-
  1062.         inherit_downward2(ID, 1, _, _, _), !.
  1063. inherit_downward_expand(ID, none).
  1064.  
  1065. % end local
  1066.  
  1067. inherit_top_root(SID, Name, Expand) :-
  1068.         pd_class(SID, Name, _),
  1069.         \+ pd_inherit(SID,_,_,_,_,_),
  1070.         inherit_downward_expand(SID, Expand).
  1071.  
  1072. inherit_downward(SID, L, CID, CName, PID, PName, ArcType, Expand) :-
  1073.         inherit_downward2(SID, L, CID, PID, ArcType),
  1074.         pd_class(CID, CName, _),
  1075.         pd_class(PID, PName, _),
  1076.         inherit_downward_expand(CID, Expand).
  1077.  
  1078. inherit_bottom_root(SID, Name, Expand) :-
  1079.         pd_class(SID, Name, _),
  1080.         \+ pd_inherit(_,SID,_,_,_,_),
  1081.         inherit_upward_expand(SID, Expand).
  1082.  
  1083. inherit_upward(SID, L, CID, CName, PID, PName, ArcType, Expand) :-
  1084.         inherit_upward2(SID, L, CID, PID, ArcType),
  1085.         pd_class(CID, CName, _),
  1086.         pd_class(PID, PName, _),
  1087.         inherit_upward_expand(PID, Expand).
  1088.  
  1089. %%% call
  1090. % ArcType ::= normal | cycle
  1091.  
  1092. % local
  1093.  
  1094. function_call_upward(PID, CID, ArcType, History) :-
  1095.         calls(PID, CID),
  1096.         call_arc_type(PID, ArcType, History).
  1097.  
  1098. function_call_downward(PID, CID, ArcType, History) :-
  1099.         calls(PID, CID),
  1100.         call_arc_type(CID, ArcType, History).
  1101.  
  1102. call_arc_type(ID, ArcType, History) :-
  1103.         var(ArcType), !,
  1104.         (
  1105.                 is_member(ID, History), !,
  1106.                 ArcType = cycle
  1107.                 ;
  1108.                 ArcType = normal
  1109.         ).
  1110. call_arc_type(ID, cycle, History) :-
  1111.         is_member(ID, History).
  1112. call_arc_type(ID,  normal, History) :-
  1113.         not_member(ID, History).
  1114.  
  1115. call_upward2(CID, L, CID, PID, ArcType, History) :-
  1116.         function_call_upward(PID, CID, ArcType, History).
  1117. call_upward2(SID, L, CID, PID, ArcType, History) :-
  1118.         L > 1,
  1119.         function_call_upward(SID2, SID, normal, History),
  1120.         L2 is L - 1,
  1121.         call_upward2(SID2, L2, CID, PID, ArcType, [SID2|History]).
  1122.  
  1123. call_downward2(PID, L, CID, PID, ArcType, History) :-
  1124.         function_call_downward(PID, CID, ArcType, History).
  1125. call_downward2(SID, L, CID, PID, ArcType, History) :-
  1126.         L > 1,
  1127.         function_call_downward(SID, SID2, normal, History),
  1128.         L2 is L - 1,
  1129.         call_downward2(SID2, L2, CID, PID, ArcType,[SID2|History]).
  1130.  
  1131. call_upward_expand(ID, left) :-
  1132.         call_upward2(ID, 1, _, _, _, []), !.
  1133. call_upward_expand(ID, none).
  1134.  
  1135. call_downward_expand(ID, right) :-
  1136.         call_downward2(ID, 1, _, _, _, []), !.
  1137. call_downward_expand(ID, none).
  1138.  
  1139. % end local
  1140.  
  1141. call_top_root(SID,Name, Expand) :-
  1142.         pd_function(SID,Name,_,_,_,_,_,_,_,_, _),
  1143.         (
  1144.                 \+ pd_used(SID,_,_,_),
  1145.                 \+ pd_used_implicit(SID,_,_,_),
  1146.                 \+ pd_used_lvalue(SID,_,_,_)
  1147.         ),
  1148.         call_downward_expand(SID, Expand).
  1149.  
  1150. call_downward(SID, L, CID, CName, PID, PName, ArcType, Expand):-
  1151.         call_downward2(SID, L, CID, PID, ArcType, [SID]),
  1152.         pd_function(CID, CName, _,_,_,_,_,_,_,_, _),
  1153.         pd_function(PID, PName, _,_,_,_,_,_,_,_, _),
  1154.         call_downward_expand(CID, Expand).
  1155.  
  1156. call_bottom_root(SID,Name, Expand) :-
  1157.         pd_function(SID,Name,_,_,_,_,_,_,_,_, _),
  1158.         (
  1159.                 \+ pd_used(_,SID,_,_),
  1160.                 \+ pd_used_implicit(_,SID,_,_),
  1161.                 \+ pd_used_lvalue(_,SID,_,_)
  1162.         ),
  1163.         call_upward_expand(SID, Expand).
  1164.  
  1165. call_upward(SID, L, CID, CName, PID, PName, ArcType, Expand) :-
  1166.         call_upward2(SID, L, CID, PID, ArcType, [SID]),
  1167.         pd_function(CID, CName, _,_,_,_,_,_,_,_, _),
  1168.         pd_function(PID, PName, _,_,_,_,_,_,_,_, _),
  1169.         call_upward_expand(PID, Expand).
  1170.  
  1171. %%% program_structure
  1172. % ArcType ::=
  1173. %       directory_to_file |
  1174. %       directory_to_directory |
  1175. %       file_to_class |
  1176. %       file_to_struct |
  1177. %       file_to_union |
  1178. %       file_to_function |
  1179. %       file_to_variable |
  1180. %       file_to_enumeration_tag |
  1181. %       file_to_macro |
  1182. %       file_to_typedef |
  1183. %       file_to_template |
  1184. %       class_to_class |
  1185. %       class_to_struct |
  1186. %       class_to_union |
  1187. %       class_to_function |
  1188. %       class_to_variable |
  1189. %       class_to_enumeration_tag |
  1190. %       class_to_macro |
  1191. %       class_to_typedef |
  1192. %       class_to_template |
  1193. %       function_to_variable |
  1194. %       function_to_class |
  1195. %       enumeration_tag_to_enumerator
  1196.  
  1197. % local
  1198.  
  1199. include(PID, CID, directory_to_file) :-
  1200.         pd_file(CID, _, _, _, _, PID),
  1201.         \+ pd_source2xcoff(_,CID, _).
  1202.  
  1203. include(PID, CID, directory_to_directory) :-
  1204.         pd_directory(CID, _, _, PID).
  1205.  
  1206. include(FID,ID,T) :-
  1207.         pd_defined(ID,FID,_,_),
  1208.         \+ pd_member(_,ID,_,_),
  1209.         pd_file(FID,_,_,_,_,_),
  1210.         (
  1211.          pd_class(ID,_,class),                  T = file_to_class;
  1212.          pd_class(ID,_,struct),                 T = file_to_struct;
  1213.          pd_class(ID,_,union),                  T = file_to_union;
  1214.          pd_class(ID,_,static_union),           T = file_to_union;
  1215.          pd_function(ID,_,_,_,_,_,_,_,_,_, _),  T = file_to_function;
  1216.          pd_variable(ID,_,_,_,_,_),             T = file_to_variable;
  1217.          pd_enumeration_tag(ID,_),              T = file_to_enumeration_tag;
  1218.          pd_macro(ID,_,_),                      T = file_to_macro;
  1219.          pd_typedef(ID,_,_),                    T = file_to_typedef;
  1220.          pd_template(ID,_,_,_),                 T = file_to_template
  1221.         ).
  1222.  
  1223. include(CID,ID,T) :-
  1224.         pd_member(CID,ID,_,_),
  1225.         (
  1226.          pd_class(ID,_,class),                  T = class_to_class;
  1227.          pd_class(ID,_,struct),                 T = class_to_struct;
  1228.          pd_class(ID,_,union),                  T = class_to_union;
  1229.          pd_class(ID,_,static_union),                   T = class_to_union;
  1230.          pd_function(ID,_,_,_,_,_,_,_,_,_, _),  T = class_to_function;
  1231.          pd_variable(ID,_,_,_,_,_),             T = class_to_variable;
  1232.          pd_enumeration_tag(ID,_),              T = class_to_enumeration_tag;
  1233.          pd_typedef(ID,_,_),                    T = class_to_typedef;
  1234.          pd_template(ID,_,_,_),                 T = class_to_template
  1235.         ).
  1236.  
  1237. include(TemplateID,ID, template_to_instance) :-
  1238.         pd_instantiated(ID, TemplateID).
  1239.  
  1240. include(EnumID,ID, enumeration_tag_to_enumerator) :-
  1241.         pd_enumerator(ID, _, EnumID).
  1242.  
  1243. include(FuncID,ID,function_to_class) :-
  1244.         nonvar(FuncID),!,
  1245.         pd_function(FuncID,_,_,_,_,_,_,_,_,_, _),
  1246.         local(ID,FuncID),
  1247.         (
  1248.                 pd_class(ID,_,_),
  1249.                 T = function_to_class
  1250.                 ;
  1251.                 pd_variable(ID,_,_,_,_,_),
  1252.                 T = function_to_variable
  1253.         ),
  1254.         \+ pd_member(_,ID,_,_)
  1255.         ;
  1256.         var(FuncID), !,
  1257.         (
  1258.                 pd_class(ID,_,_),
  1259.                 T = function_to_class
  1260.                 ;
  1261.                 pd_variable(ID,_,_,_,_,_),
  1262.                 T = function_to_variable
  1263.         ),
  1264.         \+ pd_member(_,ID,_,_),
  1265.         local(ID,FuncID),
  1266.         pd_function(FuncID,_,_,_,_,_,_,_,_,_, _).
  1267.  
  1268. program_structure_downward2(PID, L, CID, PID, ArcType) :-
  1269.         include(PID, CID, ArcType).
  1270. program_structure_downward2(SID, L, CID, PID, ArcType) :-
  1271.         L > 1,
  1272.         include(SID, SID2, _),
  1273.         L2 is L - 1,
  1274.         program_structure_downward2(SID2, L2, CID, PID, ArcType).
  1275.  
  1276. program_structure_downward_expand(ID, right) :-
  1277.         program_structure_downward2(ID, 1, _, _, _), !.
  1278. program_structure_downward_expand(ID, none).
  1279.  
  1280. % end local
  1281.  
  1282. program_structure_top_root(SID, Name, Expand) :-
  1283.         directory_top_root(SID, Name,_),
  1284.         program_structure_downward_expand(SID, Expand).
  1285.  
  1286. program_structure_downward(SID, L, CID, CName, PID, PName, ArcType, Expand) :-
  1287.         program_structure_downward2(SID, L, CID, PID, ArcType),
  1288.         id_name(CID, CName),
  1289.         id_name(PID, PName),
  1290.         program_structure_downward_expand(CID, Expand).
  1291.  
  1292. %%%%%%% Text Pane
  1293.  
  1294. whatis(InName, OutName, Line, Column, FileID, 0, keyword, use) :-
  1295.         atom(InName),
  1296.         shorten(InName, OutName),
  1297.         system_keyword(OutName),
  1298.         !.
  1299.  
  1300. whatis(_, QName, Line, Column, FileID, ID, Kind, definition) :-
  1301.         defined(ID, FileID, Line, Column),
  1302.         interface_string(ID, QName, Kind).
  1303.  
  1304. whatis(_, QName, Line, Column, FileID, ID, Kind, declaration) :-
  1305.         declared(ID, FileID, Line, Column),
  1306.         interface_string(ID, QName, Kind).
  1307.  
  1308. whatis(_, QName, Line, Column, FileID, ID, Kind, use) :-
  1309.         group(ID,(
  1310.                 (
  1311.                         pd_used(ID,BID,Line,Column)
  1312.                         ;
  1313.                         pd_used_lvalue(ID,BID,Line,Column)
  1314. %                       ;
  1315. %                       pd_used_implicit(ID,BID,Line,Column)
  1316.                 ),
  1317.                 block_in_file(BID, FileID)
  1318.         )),
  1319.         interface_string(ID,QName, Kind).
  1320. whatis(_, QName, Line, Colum, FileID, ID, class_template, use) :-
  1321.         group(ID, (
  1322.                 used(InsID,FileID,Line,Colum),
  1323.                 pd_instantiated(InsID,ID),
  1324.                 pd_template(ID,_,class,QName)
  1325.         )).
  1326. whatis(_, QName, Line, Colum, FileID, ID, function_template, use) :-
  1327.         group(ID, (
  1328.                 used(InsID,FileID,Line,Colum),
  1329.                 pd_instantiated(InsID,ID),
  1330.                 pd_template(ID,_,function,QName)
  1331.         )).
  1332.  
  1333. shorten(InName, OutName) :-
  1334.         name(InName, InNameList),
  1335.         remove_head(InNameList,Tmp),
  1336.         remove_tail(Tmp,OutNameList),
  1337.         name(OutName, OutNameList).
  1338.  
  1339. remove_head([X|I],O) :-
  1340.         punctuation(X), !,
  1341.         remove_head(I,O).
  1342. remove_head(L,L).
  1343.  
  1344. remove_tail([X|I],O) :-
  1345.         punctuation(X), !,
  1346.         remove_tail1(I,O).
  1347. remove_tail([],[]) :- !.
  1348. remove_tail([X|I],[X|O]) :-
  1349.         remove_tail(I,O).
  1350.  
  1351. remove_tail1([],[]) :- !.
  1352. remove_tail1([X|I],O) :-
  1353.         punctuation(X),
  1354.         remove_tail1(I,O).
  1355.  
  1356. punctuation(X) :- punc_char(C), name(C,[X]).
  1357.  
  1358. :- db_define(punc_char/1, [1]).
  1359. punc_char(' ').
  1360. punc_char('     ').   % tab
  1361. punc_char('(').
  1362. punc_char(')').
  1363. punc_char('{').
  1364. punc_char('}').
  1365. punc_char('[').
  1366. punc_char(']').
  1367. punc_char(';').
  1368. punc_char(':').
  1369. punc_char(',').
  1370.  
  1371. % ARM p.7
  1372. :- db_define(system_keyword/1, [1]).
  1373. system_keyword('asm').
  1374. system_keyword('auto').
  1375. system_keyword('break').
  1376. system_keyword('case').
  1377. system_keyword('catch').
  1378. system_keyword('char').
  1379. system_keyword('class').
  1380. system_keyword('const').
  1381. system_keyword('continue').
  1382. system_keyword('default').
  1383. system_keyword('delete').
  1384. system_keyword('do').
  1385. system_keyword('double').
  1386. system_keyword('else').
  1387. system_keyword('enum').
  1388. system_keyword('extern').
  1389. system_keyword('float').
  1390. system_keyword('for').
  1391. system_keyword('friend').
  1392. system_keyword('goto').
  1393. system_keyword('if').
  1394. system_keyword('inline').
  1395. system_keyword('int').
  1396. system_keyword('long').
  1397. system_keyword('new').
  1398. system_keyword('operator').
  1399. system_keyword('private').
  1400. system_keyword('protected').
  1401. system_keyword('public').
  1402. system_keyword('register').
  1403. system_keyword('return').
  1404. system_keyword('short').
  1405. system_keyword('signed').
  1406. system_keyword('sizeof').
  1407. system_keyword('static').
  1408. system_keyword('struct').
  1409. system_keyword('switch').
  1410. system_keyword('template').
  1411. system_keyword('this').
  1412. system_keyword('throw').
  1413. system_keyword('try').
  1414. system_keyword('typedef').
  1415. system_keyword('union').
  1416. system_keyword('unsigned').
  1417. system_keyword('virtual').
  1418. system_keyword('void').
  1419. system_keyword('volatile').
  1420. system_keyword('while').
  1421.  
  1422. %system_keyword('#define').
  1423. %system_keyword('#include').
  1424. %system_keyword('#line').
  1425. %system_keyword('#undef').
  1426. %system_keyword('#if').
  1427. %system_keyword('#ifdef').
  1428. %system_keyword('#ifndef').
  1429. %system_keyword('#elif').
  1430. %system_keyword('#else').
  1431. %system_keyword('#error').
  1432. %system_keyword('#pragma').
  1433. %system_keyword('#').
  1434.  
  1435. %%%
  1436.  
  1437. locate_defined(ID,FileID,Path,Line,Col) :-
  1438.         pd_function(ID,_,_,_,_,_,_,_,_,compiler_generated, _), !, fail.
  1439. locate_defined(ID,FileID,Path,Line,Col) :-
  1440.         defined(ID,FileID,Line,Col),
  1441.         pd_file(FileID,_,Path,_,_,_).
  1442.  
  1443. locate_declared(ID,FileID,Path,Line,Col) :-
  1444.         pd_function(ID,_,_,_,_,_,_,_,_,compiler_generated, _), !, fail.
  1445. locate_declared(ID,FileID,Path,Line,Col) :-
  1446.         declared(ID,FileID,Line,Col),
  1447.         pd_file(FileID,_,Path,_,_,_).
  1448. locate_declared(ID,FileID,Path,Line,Col) :-
  1449.         defined(ID,FileID,Line,Col),
  1450.         pd_file(FileID,_,Path,_,_,_).
  1451.  
  1452. locate_used(ID,FileID,Path,Line,Col) :-
  1453.         group([Line,Col,FileID],(
  1454.                 (
  1455.                         pd_used(ID,BID,Line,Col)
  1456.                         ;
  1457.                         pd_used_lvalue(ID,BID,Line,Col)
  1458.                         ;
  1459.                         pd_used_implicit(ID,BID,Line,Col)
  1460.                 ),
  1461.                 block_in_file(BID, FileID)
  1462.         )),
  1463.         pd_file(FileID,_,Path,_,_,_).
  1464. locate_used(TID,FileID,Path,Line,Col) :-
  1465.         pd_instantiated(ID,TID),
  1466.         used(ID,FileID,Line,Col),
  1467.         pd_file(FileID,_,Path,_,_,_).
  1468. locate_used(ID,FileID,Path,Line,1) :-   % file
  1469.         pd_include(FileID, ID, Line),
  1470.         pd_file(FileID,_,Path,_,_,_).
  1471.  
  1472. locate_contents(FileID,FileID,Path,1,1) :-
  1473.         pd_file(FileID,_,Path,_,_,_).
  1474.  
  1475. locate_all_files(FileID, Path, 1, 1) :-
  1476.         pd_file(FileID,_,Path,_,_,_),
  1477.         \+ pd_source2xcoff(_,FileID,_).
  1478.  
  1479. locate_files(DirID, FileID, Path, 1, 1) :-
  1480.         pd_file(FileID,_,Path,_,_,DirID),
  1481.         \+ pd_source2xcoff(_,FileID,_).
  1482.  
  1483. %%%%%%% generic
  1484.  
  1485. id_name(ID, Name) :-
  1486.         generic1(ID,Name,_,_).
  1487.  
  1488. id_kind(ID,Type) :-
  1489.         generic1(ID, _, _, Type).
  1490.  
  1491. interface_string(ID, Name, Type) :-
  1492.         generic1(ID, N, QN, Type),
  1493.         (
  1494.                 (
  1495.                         Type = directory
  1496.                         ;
  1497.                         Type = file
  1498.                         ;
  1499.                         Type = function
  1500.                         ;
  1501.                         Type = function_template
  1502.                         ;
  1503.                         Type = class_template
  1504.                 ),
  1505.                 Name = QN
  1506.                 ;
  1507.                 (
  1508.                         \+ Type = directory,
  1509.                         \+ Type = file,
  1510.                         \+ Type = function,
  1511.                         \+ Type = function_template,
  1512.                         \+ Type = class_template
  1513.                 ),
  1514.                 Name = N
  1515.         ).
  1516.  
  1517. generic(ID, Name, QualifiedName, Type) :-
  1518.         generic1(ID, Name, QName, Type),
  1519.         make_qname(ID, QName, QualifiedName).
  1520.  
  1521. generic1(ID, Name, QName, directory) :-
  1522.         pd_directory(ID, Name, QName, _).
  1523. generic1(ID, Name, QName, file) :-
  1524.         pd_file(ID, Name, QName, _, _, _),
  1525.         \+ wildcard_match(Name, '*.brs').
  1526. generic1(ID, Name, Name, class) :-
  1527.         pd_class(ID, Name, _).
  1528. generic1(ID, Name, QName, function) :-
  1529.         pd_function(ID, Name, QName, _, _, _, _, _, _, _, _).
  1530. generic1(ID, Name, QName, variable) :-
  1531.         pd_variable(ID, Name, QName, _, _, _).
  1532. generic1(ID, Name, Name, enumeration_tag) :-
  1533.         pd_enumeration_tag(ID, Name).
  1534. generic1(ID, Name, Name, enumerator) :-
  1535.         pd_enumerator(ID, Name,_).
  1536. generic1(ID, Name, Name, macro) :-
  1537.         pd_macro(ID, Name, _).
  1538. generic1(ID, Name, QName, typedef) :-
  1539.         pd_typedef(ID,Name, QName).
  1540. generic1(ID, Name, QName, function_template) :-
  1541.         pd_template(ID, Name, function, QName).
  1542. generic1(ID, Name, QName, class_template) :-
  1543.         pd_template(ID, Name, class, QName).
  1544. generic1(ID, Name, QName, class_template) :-
  1545.         pd_template(ID, Name, struct, QName).
  1546. generic1(ID, Name, QName, class_template) :-
  1547.         pd_template(ID, Name, union, QName).
  1548.  
  1549. % make_qname(+, +, -)
  1550.  
  1551. make_qname(ID, Name, QName) :-
  1552.         pd_member(_, ID, Access, _), !,
  1553.         (
  1554.                 Access = public,    concat('public:    ', Name, QName);
  1555.                 Access = protected, concat('protected: ', Name, QName);
  1556.                 Access = private,   concat('private:   ', Name, QName)
  1557.         )
  1558.         ;
  1559.         Name = QName.
  1560.  
  1561. % end local
  1562.  
  1563. %%% filter
  1564.  
  1565. friend(ID) :-
  1566.         group(ID,pd_friend(_,ID,_,_,_)).
  1567.  
  1568. local(ID) :-
  1569.         group(ID, (
  1570.                 (
  1571.                         pd_defined(ID, BlockID, _, _)
  1572.                         ;
  1573.                         pd_declared(ID, BlockID, _, _)
  1574.                 )
  1575.         )),
  1576.         block_in_function(BlockID, PID).
  1577.  
  1578. member(ID) :-
  1579.         pd_member(_,ID,_, _).
  1580.  
  1581. non_member(ID) :-
  1582.         \+ pd_member(_,ID,_, _).
  1583.  
  1584. global(ID) :-
  1585.         \+ pd_member(_,ID,_, _),
  1586.         \+ local(ID).
  1587.  
  1588. root(ID) :-
  1589.         pd_class(ID,_,_),
  1590.         \+ pd_inherit(ID, _, _, _, _, _),
  1591.         group(ID,pd_inherit(_, ID, _, _, _, _)).
  1592.  
  1593. %%% membership
  1594.  
  1595. is_member(X, [X|_]) :- !.
  1596. is_member(X, [_|Y]) :- is_member(X,Y).
  1597.  
  1598. not_member(X,[X|_]) :- !, fail.
  1599. not_member(X,[_|Y]) :- !, not_member(X,Y).
  1600. not_member(_,[]).
  1601.  
  1602. %%% tree
  1603.  
  1604. insert_member(Item,Var) :-
  1605.         var(Var),!,Var=t(Right,Item,Left).
  1606. insert_member(Item,t(Right,Pivot,Left)) :-
  1607.         Item < Pivot -> insert_member(Item,Right); insert_member(Item,Left).
  1608.  
  1609. lookup_member(Item,Var) :-
  1610.         var(Var), !, fail.
  1611. lookup_member(Item,t(_,Item,_)) :-
  1612.         true, !.
  1613. lookup_member(Item,t(Right,Pivot,Left)) :-
  1614.         Item < Pivot -> lookup_member(Item,Right); lookup_member(Item,Left).
  1615.  
  1616. %%% closure
  1617.  
  1618. block_closure(ID1,ID2) :-
  1619.         nonvar(ID1) ,!,
  1620.         (
  1621.                 ID2 = ID1
  1622.                 ;
  1623.                 pd_defined(ID1,T,_,_),
  1624.                 block_closure(T,ID2)
  1625.         ).
  1626. block_closure(ID1,ID2) :-
  1627.         nonvar(ID2) ,!,
  1628.         (
  1629.                 ID1 = ID2
  1630.                 ;
  1631.                 pd_defined(T,ID2,_,_),
  1632.                 block_closure(ID1,T)
  1633.         ).
  1634.  
  1635. block_in_block(ID1,ID2) :-
  1636.         block_closure(ID1,ID2).
  1637.  
  1638. block_in_function(BID, FID) :-
  1639.         nonvar(FID), !,
  1640.         pd_function(FID,_,_,_, _,_,_,_,_,_, _),
  1641.         block_closure(BID, FID).
  1642. block_in_function(BID, FID) :-
  1643.         var(FID), !,
  1644.         block_closure(BID, FID),
  1645.         pd_function(FID,_,_,_, _,_,_,_,_,_, _).
  1646.  
  1647. block_in_class(BID, CID) :-
  1648.         nonvar(CID), !,
  1649.         pd_class(CID, _,_),
  1650.         block_closure(BID, CID).
  1651. block_in_class(BID, CID) :-
  1652.         var(CID), !,
  1653.         block_closure(BID, CID),
  1654.         pd_class(CID, _,_).
  1655.  
  1656. block_in_file(BID, FID) :-
  1657.         nonvar(FID), !,
  1658.         pd_file(FID, _,_,_,_,_),
  1659.         block_closure(BID, FID).
  1660. block_in_file(BID, FID) :-
  1661.         var(FID), !,
  1662.         block_closure(BID, FID),
  1663.         pd_file(FID, _,_,_,_,_).
  1664.  
  1665. %%% logical operation
  1666.  
  1667. or_op(true , _    , true).
  1668. or_op(_    , true , true).
  1669. or_op(false, false, false).
  1670.  
  1671. and_op(false, _    , false).
  1672. and_op(_    , false, false).
  1673. and_op(true , true , true).
  1674.  
  1675. %%% query optimization
  1676.  
  1677. eval_and_call(G) :-
  1678.         eval_query(G,G1),
  1679.         remove_true(G1,G2),
  1680.         call(G2).
  1681.  
  1682. eval_query(A,A) :- var(A),!.
  1683. eval_query((A=A,B),Y) :- !,
  1684.         eval_query(B,Y).
  1685. eval_query((A,B),(X,Y)) :-  !,
  1686.         eval_query(A,X),
  1687.         eval_query(B,Y).
  1688. eval_query((A=A),true) :- !.
  1689. eval_query((A;B),X) :- !,
  1690.         (
  1691.                 eval_query(A,X)
  1692.                 ;
  1693.                 eval_query(B,X)
  1694.         ).
  1695. eval_query(A,A).
  1696.  
  1697. remove_true(A,C) :-
  1698.         remove_true1(A,B),
  1699.         remove_true2(B,C).
  1700.  
  1701. remove_true1((true,A),X) :- !,
  1702.         remove_true1(A,X).
  1703. remove_true1((A,true),A) :- !.
  1704. remove_true1((A,B),(A,X)) :- !,
  1705.         remove_true1(B,X).
  1706. remove_true1(A,A).
  1707.  
  1708. remove_true2((A,true),A) :- !.
  1709. remove_true2((A,B),(A,X)) :- !,
  1710.         remove_true2(B,X).
  1711. remove_true2(A,A).
  1712.  
  1713.  
  1714. load_pdinterface(done).
  1715.  
  1716.