Merge pull request #1658 from aarroyoc/copy_file

Add predicate file_copy/2 in library(files)
This commit is contained in:
Mark Thom
2022-12-18 21:22:25 +01:00
committed by GitHub
4 changed files with 36 additions and 2 deletions

View File

@@ -262,6 +262,8 @@ enum SystemClauseType {
DeleteFile,
#[strum_discriminants(strum(props(Arity = "2", Name = "$rename_file")))]
RenameFile,
#[strum_discriminants(strum(props(Arity = "2", Name = "$file_copy")))]
FileCopy,
#[strum_discriminants(strum(props(Arity = "2", Name = "$working_directory")))]
WorkingDirectory,
#[strum_discriminants(strum(props(Arity = "1", Name = "$delete_directory")))]
@@ -1607,6 +1609,7 @@ fn generate_instruction_preface() -> TokenStream {
&Instruction::CallMakeDirectoryPath(_) |
&Instruction::CallDeleteFile(_) |
&Instruction::CallRenameFile(_) |
&Instruction::CallFileCopy(_) |
&Instruction::CallWorkingDirectory(_) |
&Instruction::CallDeleteDirectory(_) |
&Instruction::CallPathCanonical(_) |
@@ -1819,6 +1822,7 @@ fn generate_instruction_preface() -> TokenStream {
&Instruction::ExecuteMakeDirectoryPath(_) |
&Instruction::ExecuteDeleteFile(_) |
&Instruction::ExecuteRenameFile(_) |
&Instruction::ExecuteFileCopy(_) |
&Instruction::ExecuteWorkingDirectory(_) |
&Instruction::ExecuteDeleteDirectory(_) |
&Instruction::ExecutePathCanonical(_) |

View File

@@ -70,8 +70,9 @@ In this library, directories and files are represented as
file_exists/1,
directory_exists/1,
delete_file/1,
rename_file/2,
delete_directory/1,
rename_file/2,
file_copy/2,
delete_directory/1,
make_directory/1,
make_directory_path/1,
working_directory/2,
@@ -150,6 +151,14 @@ rename_file(File, Renamed) :-
must_be(chars, Renamed),
'$rename_file'(File, Renamed).
%% file_copy(+File, +Copied).
%
% Succeeds if File is copied to Copied
file_copy(File, Copied) :-
file_must_exist(File, file_copy/2),
must_be(chars, Copied),
'$file_copy'(File, Copied).
%% delete_directory(+Directory).
%
% Succeeds if Directory is deleted from the current system.

View File

@@ -3533,6 +3533,14 @@ impl Machine {
self.rename_file();
step_or_fail!(self, self.machine_st.p = self.machine_st.cp);
}
&Instruction::CallFileCopy(_) => {
self.file_copy();
step_or_fail!(self, self.machine_st.p += 1);
}
&Instruction::ExecuteFileCopy(_) => {
self.file_copy();
step_or_fail!(self, self.machine_st.p = self.machine_st.cp);
}
&Instruction::CallWorkingDirectory(_) => {
try_or_throw!(self.machine_st, self.working_directory());
step_or_fail!(self, self.machine_st.p += 1);

View File

@@ -1653,6 +1653,19 @@ impl Machine {
self.machine_st.fail = true;
}
#[inline(always)]
pub(crate) fn file_copy(&mut self) {
if let Some(file) = self.machine_st.value_to_str_like(self.machine_st.registers[1]) {
if let Some(copied) = self.machine_st.value_to_str_like(self.machine_st.registers[2]) {
if fs::copy(file.as_str(), copied.as_str()).is_ok() {
return;
}
}
}
self.machine_st.fail = true;
}
#[inline(always)]
pub(crate) fn delete_directory(&mut self) {
if let Some(dir) = self.machine_st.value_to_str_like(self.machine_st.registers[1]) {