This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/docs/scan
2015-09-21 17:05:36 -05:00

100 lines
1.7 KiB
Plaintext

:- yap_flag( double_quotes, string ).
:- yap_flag( write_strings, on ).
:- style_check( all ).
:- use_module(library(lists)).
:- use_module(library(readutil)).
:- use_module(library(system)).
:- use_module(library(maplist)).
:- initialization(main).
:- dynamic owner/5.
main :-
unix( argv( [] ) ), !,
maplist( owner, ['.'] ),
open( 'exports.yap', write, Es ),
dump( Es ),
close( Es ).
main :-
unix( argv(Args) ),
maplist( owner, Args ),
open( 'exports.yap', write, Es ),
dump( Es ),
close( Es ).
owner( D ) :-
file_property( D, type( P ) ),
owner( D, P ).
owner( P, directory ) :-
directory_files( P , L),
member( F, L ),
F \= '.',
F \= '..',
F \= '.git',
F \= 'pltotex.pl',
atom_concat( [P, '/', F], FF),
owner( FF ),
fail.
owner( File, regular ) :-
scan( File ),
fail.
owner( _, _).
scan( OF ) :-
file_base_name( OF, B ),
( sub_atom( B, Len, _, 0, '.yap' )
->
true
;
sub_atom( B, Len, _, 0, '.pl' )
->
true
;
sub_atom( B, Len, _, 0, '.P' )
->
true
;
sub_atom( B, Len, _, 0, '.prolog' )
->
true
;
sub_atom( B, Len, _, 0, '.bp' )
->
true
),
sub_atom( B, 0, Len, _, Base ),
open( OF, read, Fs ),
repeat,
(
catch( read( Fs, ( :- Cmd ) ), _, fail )
->
Cmd = module( Mod, Exports ),
maplist( declare(Mod, Base, OF), Exports)
;
!, close( Fs ), fail
).
declare(Mod, Base, File, N/A) :-
absolute_file_name( File, OF, []),
( owner( OOF, Base, Mod, N, _A), OOF \= OF
->
format( user_error, 'conflict: ~a in ~a and ~a~n',[N, OF, OOF])
;
true
),
assert( owner( OF, Base, Mod, N, A) ).
declare(_Mod, _B, _File, op(_,_,_)).
dump( S ) :-
owner( OF, Base, Mod, N, A),
format( S , ':- file( ~q, ~q, ~q, ~a, ~d ).~n',[ OF, Base, Mod, N, A ]),
fail.
dump( _ ).