fix glob and multiple solutions support; hopefully the code is still readable.

This commit is contained in:
Vítor Santos Costa 2016-02-19 11:37:11 +00:00
parent 083d374e02
commit 24bf4088d7

View File

@ -143,6 +143,7 @@ swapped, thus the call
is valid as well. is valid as well.
*/ */
absolute_file_name(File,TrueFileName,Opts) :- absolute_file_name(File,TrueFileName,Opts) :-
( var(TrueFileName) -> ( var(TrueFileName) ->
true ; true ;
@ -181,44 +182,37 @@ absolute_file_name(File0,File) :-
set_prolog_flag( verbose_file_search, Verbose ), set_prolog_flag( verbose_file_search, Verbose ),
get_abs_file_parameter( file_errors, Opts, FErrors ), get_abs_file_parameter( file_errors, Opts, FErrors ),
get_abs_file_parameter( solutions, Opts, First ), get_abs_file_parameter( solutions, Opts, First ),
( FErrors == fail -> ( FErrors == fail -> FileErrors = false ; FileErrors = true ),
set_prolog_flag( fileerrors, false ) set_prolog_flag( fileerrors, FileErrors ),
;
set_prolog_flag( fileerrors, true )
),
set_prolog_flag(file_name_variables, Expand), set_prolog_flag(file_name_variables, Expand),
'$absf_trace'(File), '$absf_trace'(File),
'$absf_trace_options'(LOpts), '$absf_trace_options'(LOpts),
'$find_in_path'(File, Opts,TrueFileName), HasSol = t(no),
( (
First == first % look for solutions
-> '$find_in_path'(File, Opts,TrueFileName),
'$absf_trace'(' |------- got first ~a', [TrueFileName]), ( (First == first -> ! ; nb_setarg(1, HasSol, yes) ),
set_prolog_flag( fileerrors, PreviousFileErrors ), set_prolog_flag( fileerrors, PreviousFileErrors ),
set_prolog_flag( open_expands_filename, OldF), set_prolog_flag( open_expands_filename, OldF),
set_prolog_flag( verbose_file_search, PreviousVerbose ), set_prolog_flag( verbose_file_search, PreviousVerbose ),
! '$absf_trace'(' |------- found ~a', [TrueFileName])
; ;
( set_prolog_flag( fileerrors, FileErrors ),
'$absf_trace'(' +------- found match ~a.', [TrueFileName]), set_prolog_flag( verbose_file_search, Verbose ),
set_prolog_flag( fileerrors, PreviousFileErrors ), set_prolog_flag( file_name_variables, Expand ),
set_prolog_flag( file_name_variables, OldF), '$absf_trace'(' |------- restarted search for ~a', [File]),
set_prolog_flag( verbose_file_search, PreviousVerbose ) fail
; )
'$absf_trace'(' -------- no more solutions.', []), ;
set_prolog_flag( verbose_file_search, Verbose ), % finished
get_abs_file_parameter( file_errors, Opts, FErrors ),
set_prolog_flag(file_name_variables, Expand),
fail
)
;
% no solution
% stop_low_level_trace, % stop_low_level_trace,
'$absf_trace'(' !------- failed.', []), '$absf_trace'(' !------- failed.', []),
set_prolog_flag( fileerrors, PreviousFileErrors ), set_prolog_flag( fileerrors, PreviousFileErrors ),
set_prolog_flag( verbose_file_search, PreviousVerbose ), set_prolog_flag( verbose_file_search, PreviousVerbose ),
set_prolog_flag(file_name_variables, OldF), set_prolog_flag(file_name_variables, OldF),
get_abs_file_parameter( file_errors, Opts, error ), % check if no solution
arg(1,HasSol,no),
get_abs_file_parameter( file_errors, Opts, error ),
'$do_error'(existence_error(file,File),G) '$do_error'(existence_error(file,File),G)
). ).
@ -245,16 +239,15 @@ absolute_file_name(File0,File) :-
'$absf_trace'(' after prefix expansion: ~s', [Path]), '$absf_trace'(' after prefix expansion: ~s', [Path]),
atom_codes( APath, Path ), atom_codes( APath, Path ),
( (
Expand = true Expand = true
-> ->
expand_file_name( APath, EPaths), expand_file_name( APath, EPaths),
'$absf_trace'(' after shell globbing: ~w', [EPaths]), '$absf_trace'(' after shell globbing: ~w', [EPaths]),
lists:member(EPath, EPaths) lists:member(EPath, EPaths)
; ;
EPath = APath EPath = APath
), ),
real_path( EPath, File),
real_path( EPath, File),
'$absf_trace'(' after canonical path name: ~a', [File]), '$absf_trace'(' after canonical path name: ~a', [File]),
'$check_file'( File, Type, Access ), '$check_file'( File, Type, Access ),
'$absf_trace'(' after testing ~a for ~a and ~a', [File,Type,Access]). '$absf_trace'(' after testing ~a for ~a and ~a', [File,Type,Access]).
@ -368,6 +361,7 @@ real_path( EPath, File),
G \= '', G \= '',
atom_codes( G, Gs ) atom_codes( G, Gs )
}, },
!,
'$dir', '$dir',
Gs. Gs.
'$glob'(_Opts) --> '$glob'(_Opts) -->
@ -726,5 +720,4 @@ user:file_search_path(path, C) :-
lists:member(C, B) lists:member(C, B)
). ).
%% @} %% @}