Merge pull request #636 from triska/path_segments
ADDED: path_segments/2 for portable reasoning about path components.
This commit is contained in:
@@ -175,6 +175,7 @@ pub enum SystemClauseType {
|
|||||||
FileSize,
|
FileSize,
|
||||||
FileExists,
|
FileExists,
|
||||||
DirectoryExists,
|
DirectoryExists,
|
||||||
|
DirectorySeparator,
|
||||||
MakeDirectory,
|
MakeDirectory,
|
||||||
DeleteFile,
|
DeleteFile,
|
||||||
WorkingDirectory,
|
WorkingDirectory,
|
||||||
@@ -344,6 +345,7 @@ impl SystemClauseType {
|
|||||||
&SystemClauseType::FileSize => clause_name!("$file_size"),
|
&SystemClauseType::FileSize => clause_name!("$file_size"),
|
||||||
&SystemClauseType::FileExists => clause_name!("$file_exists"),
|
&SystemClauseType::FileExists => clause_name!("$file_exists"),
|
||||||
&SystemClauseType::DirectoryExists => clause_name!("$directory_exists"),
|
&SystemClauseType::DirectoryExists => clause_name!("$directory_exists"),
|
||||||
|
&SystemClauseType::DirectorySeparator => clause_name!("$directory_separator"),
|
||||||
&SystemClauseType::MakeDirectory => clause_name!("$make_directory"),
|
&SystemClauseType::MakeDirectory => clause_name!("$make_directory"),
|
||||||
&SystemClauseType::DeleteFile => clause_name!("$delete_file"),
|
&SystemClauseType::DeleteFile => clause_name!("$delete_file"),
|
||||||
&SystemClauseType::WorkingDirectory => clause_name!("$working_directory"),
|
&SystemClauseType::WorkingDirectory => clause_name!("$working_directory"),
|
||||||
@@ -682,6 +684,7 @@ impl SystemClauseType {
|
|||||||
("$file_size", 2) => Some(SystemClauseType::FileSize),
|
("$file_size", 2) => Some(SystemClauseType::FileSize),
|
||||||
("$file_exists", 1) => Some(SystemClauseType::FileExists),
|
("$file_exists", 1) => Some(SystemClauseType::FileExists),
|
||||||
("$directory_exists", 1) => Some(SystemClauseType::DirectoryExists),
|
("$directory_exists", 1) => Some(SystemClauseType::DirectoryExists),
|
||||||
|
("$directory_separator", 1) => Some(SystemClauseType::DirectorySeparator),
|
||||||
("$make_directory", 1) => Some(SystemClauseType::MakeDirectory),
|
("$make_directory", 1) => Some(SystemClauseType::MakeDirectory),
|
||||||
("$delete_file", 1) => Some(SystemClauseType::DeleteFile),
|
("$delete_file", 1) => Some(SystemClauseType::DeleteFile),
|
||||||
("$working_directory", 2) => Some(SystemClauseType::WorkingDirectory),
|
("$working_directory", 2) => Some(SystemClauseType::WorkingDirectory),
|
||||||
|
|||||||
@@ -54,6 +54,7 @@
|
|||||||
make_directory/1,
|
make_directory/1,
|
||||||
working_directory/2,
|
working_directory/2,
|
||||||
path_canonical/2,
|
path_canonical/2,
|
||||||
|
path_segments/2,
|
||||||
file_modification_time/2,
|
file_modification_time/2,
|
||||||
file_creation_time/2,
|
file_creation_time/2,
|
||||||
file_access_time/2]).
|
file_access_time/2]).
|
||||||
@@ -143,3 +144,57 @@ file_creation_time(File, T) :-
|
|||||||
file_time_(File, Which, T) :-
|
file_time_(File, Which, T) :-
|
||||||
'$file_time'(File, Which, T0),
|
'$file_time'(File, Which, T0),
|
||||||
read_term_from_chars(T0, T).
|
read_term_from_chars(T0, T).
|
||||||
|
|
||||||
|
|
||||||
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
path_segments(Ps, Segments): True iff Segments are the segments of Ps.
|
||||||
|
|
||||||
|
Segments is the list of components of the path Ps that are
|
||||||
|
separated by the platform-specific directory separator. Each
|
||||||
|
segment is a list of characters.
|
||||||
|
|
||||||
|
At least one of the arguments must be instantiated.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
?- path_segments("/hello/there", Segments).
|
||||||
|
Segments = [[],"hello","there"]
|
||||||
|
; false.
|
||||||
|
|
||||||
|
?- path_segments(Path, ["hello","there"]).
|
||||||
|
Path = "hello/there"
|
||||||
|
; false.
|
||||||
|
|
||||||
|
|
||||||
|
To obtain the platform-specific directory separator, you can use:
|
||||||
|
|
||||||
|
?- path_segments(Separator, ["",""]).
|
||||||
|
Separator = "/"
|
||||||
|
; false.
|
||||||
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||||
|
|
||||||
|
path_segments(Path, Segments) :-
|
||||||
|
'$directory_separator'(Sep),
|
||||||
|
( var(Path) ->
|
||||||
|
must_be(list, Segments),
|
||||||
|
maplist(list_of_chars, Segments),
|
||||||
|
append_with_separator(Segments, Sep, Path)
|
||||||
|
; list_of_chars(Path),
|
||||||
|
path_to_segments(Path, Sep, Segments)
|
||||||
|
).
|
||||||
|
|
||||||
|
append_with_separator([], _, []).
|
||||||
|
append_with_separator([Segment|Segments], Sep, Path) :-
|
||||||
|
append_with_separator_(Segments, Segment, Sep, Path).
|
||||||
|
|
||||||
|
append_with_separator_([], Segment, _, Segment).
|
||||||
|
append_with_separator_([Segment|Segments], Prev, Sep, Path) :-
|
||||||
|
append(Prev, [Sep|Rest], Path),
|
||||||
|
append_with_separator_(Segments, Segment, Sep, Rest).
|
||||||
|
|
||||||
|
path_to_segments(Path, Sep, Segments) :-
|
||||||
|
( append(Front, [Sep|Ps], Path) ->
|
||||||
|
Segments = [Front|Rest],
|
||||||
|
path_to_segments(Ps, Sep, Rest)
|
||||||
|
; Segments = [Path]
|
||||||
|
).
|
||||||
|
|||||||
@@ -870,6 +870,10 @@ impl MachineState {
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
&SystemClauseType::DirectorySeparator => {
|
||||||
|
let addr = self.heap.put_constant(Constant::Char(std::path::MAIN_SEPARATOR));
|
||||||
|
self.unify(self[temp_v!(1)], addr);
|
||||||
|
}
|
||||||
&SystemClauseType::MakeDirectory => {
|
&SystemClauseType::MakeDirectory => {
|
||||||
let directory = self.heap_pstr_iter(self[temp_v!(1)]).to_string();
|
let directory = self.heap_pstr_iter(self[temp_v!(1)]).to_string();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user