Add predicate copy_file/2 in library(files)
This commit is contained in:
@@ -262,6 +262,8 @@ enum SystemClauseType {
|
|||||||
DeleteFile,
|
DeleteFile,
|
||||||
#[strum_discriminants(strum(props(Arity = "2", Name = "$rename_file")))]
|
#[strum_discriminants(strum(props(Arity = "2", Name = "$rename_file")))]
|
||||||
RenameFile,
|
RenameFile,
|
||||||
|
#[strum_discriminants(strum(props(Arity = "2", Name = "$copy_file")))]
|
||||||
|
CopyFile,
|
||||||
#[strum_discriminants(strum(props(Arity = "2", Name = "$working_directory")))]
|
#[strum_discriminants(strum(props(Arity = "2", Name = "$working_directory")))]
|
||||||
WorkingDirectory,
|
WorkingDirectory,
|
||||||
#[strum_discriminants(strum(props(Arity = "1", Name = "$delete_directory")))]
|
#[strum_discriminants(strum(props(Arity = "1", Name = "$delete_directory")))]
|
||||||
@@ -1611,6 +1613,7 @@ fn generate_instruction_preface() -> TokenStream {
|
|||||||
&Instruction::CallMakeDirectoryPath(_) |
|
&Instruction::CallMakeDirectoryPath(_) |
|
||||||
&Instruction::CallDeleteFile(_) |
|
&Instruction::CallDeleteFile(_) |
|
||||||
&Instruction::CallRenameFile(_) |
|
&Instruction::CallRenameFile(_) |
|
||||||
|
&Instruction::CallCopyFile(_) |
|
||||||
&Instruction::CallWorkingDirectory(_) |
|
&Instruction::CallWorkingDirectory(_) |
|
||||||
&Instruction::CallDeleteDirectory(_) |
|
&Instruction::CallDeleteDirectory(_) |
|
||||||
&Instruction::CallPathCanonical(_) |
|
&Instruction::CallPathCanonical(_) |
|
||||||
@@ -1825,6 +1828,7 @@ fn generate_instruction_preface() -> TokenStream {
|
|||||||
&Instruction::ExecuteMakeDirectoryPath(_) |
|
&Instruction::ExecuteMakeDirectoryPath(_) |
|
||||||
&Instruction::ExecuteDeleteFile(_) |
|
&Instruction::ExecuteDeleteFile(_) |
|
||||||
&Instruction::ExecuteRenameFile(_) |
|
&Instruction::ExecuteRenameFile(_) |
|
||||||
|
&Instruction::ExecuteCopyFile(_) |
|
||||||
&Instruction::ExecuteWorkingDirectory(_) |
|
&Instruction::ExecuteWorkingDirectory(_) |
|
||||||
&Instruction::ExecuteDeleteDirectory(_) |
|
&Instruction::ExecuteDeleteDirectory(_) |
|
||||||
&Instruction::ExecutePathCanonical(_) |
|
&Instruction::ExecutePathCanonical(_) |
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ In this library, directories and files are represented as
|
|||||||
directory_exists/1,
|
directory_exists/1,
|
||||||
delete_file/1,
|
delete_file/1,
|
||||||
rename_file/2,
|
rename_file/2,
|
||||||
|
copy_file/2,
|
||||||
delete_directory/1,
|
delete_directory/1,
|
||||||
make_directory/1,
|
make_directory/1,
|
||||||
make_directory_path/1,
|
make_directory_path/1,
|
||||||
@@ -150,6 +151,11 @@ rename_file(File, Renamed) :-
|
|||||||
must_be(chars, Renamed),
|
must_be(chars, Renamed),
|
||||||
'$rename_file'(File, Renamed).
|
'$rename_file'(File, Renamed).
|
||||||
|
|
||||||
|
copy_file(File, Copied) :-
|
||||||
|
file_must_exist(File, copy_file/2),
|
||||||
|
must_be(chars, Copied),
|
||||||
|
'$copy_file'(File, Copied).
|
||||||
|
|
||||||
%% delete_directory(+Directory).
|
%% delete_directory(+Directory).
|
||||||
%
|
%
|
||||||
% Succeeds if Directory is deleted from the current system.
|
% Succeeds if Directory is deleted from the current system.
|
||||||
|
|||||||
@@ -3533,6 +3533,14 @@ impl Machine {
|
|||||||
self.rename_file();
|
self.rename_file();
|
||||||
step_or_fail!(self, self.machine_st.p = self.machine_st.cp);
|
step_or_fail!(self, self.machine_st.p = self.machine_st.cp);
|
||||||
}
|
}
|
||||||
|
&Instruction::CallCopyFile(_) => {
|
||||||
|
self.copy_file();
|
||||||
|
step_or_fail!(self, self.machine_st.p += 1);
|
||||||
|
}
|
||||||
|
&Instruction::ExecuteCopyFile(_) => {
|
||||||
|
self.copy_file();
|
||||||
|
step_or_fail!(self, self.machine_st.p = self.machine_st.cp);
|
||||||
|
}
|
||||||
&Instruction::CallWorkingDirectory(_) => {
|
&Instruction::CallWorkingDirectory(_) => {
|
||||||
try_or_throw!(self.machine_st, self.working_directory());
|
try_or_throw!(self.machine_st, self.working_directory());
|
||||||
step_or_fail!(self, self.machine_st.p += 1);
|
step_or_fail!(self, self.machine_st.p += 1);
|
||||||
|
|||||||
@@ -1653,6 +1653,19 @@ impl Machine {
|
|||||||
self.machine_st.fail = true;
|
self.machine_st.fail = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub(crate) fn copy_file(&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)]
|
#[inline(always)]
|
||||||
pub(crate) fn delete_directory(&mut self) {
|
pub(crate) fn delete_directory(&mut self) {
|
||||||
if let Some(dir) = self.machine_st.value_to_str_like(self.machine_st.registers[1]) {
|
if let Some(dir) = self.machine_st.value_to_str_like(self.machine_st.registers[1]) {
|
||||||
|
|||||||
Reference in New Issue
Block a user