From 58555d598b65f2e82f9009fda0b83ed9060daca4 Mon Sep 17 00:00:00 2001 From: Paulo Moura Date: Tue, 18 May 2021 18:08:30 +0100 Subject: [PATCH] Add rename_file/2 predicate to the files library --- src/clause_types.rs | 3 +++ src/lib/files.pl | 7 +++++++ src/machine/system_calls.rs | 12 ++++++++++++ 3 files changed, 22 insertions(+) diff --git a/src/clause_types.rs b/src/clause_types.rs index 4ceda2f0..1b35f05d 100644 --- a/src/clause_types.rs +++ b/src/clause_types.rs @@ -175,6 +175,7 @@ pub(crate) enum SystemClauseType { MakeDirectory, MakeDirectoryPath, DeleteFile, + RenameFile, DeleteDirectory, WorkingDirectory, PathCanonical, @@ -338,6 +339,7 @@ impl SystemClauseType { &SystemClauseType::MakeDirectory => clause_name!("$make_directory"), &SystemClauseType::MakeDirectoryPath => clause_name!("$make_directory_path"), &SystemClauseType::DeleteFile => clause_name!("$delete_file"), + &SystemClauseType::RenameFile => clause_name!("$rename_file"), &SystemClauseType::DeleteDirectory => clause_name!("$delete_directory"), &SystemClauseType::WorkingDirectory => clause_name!("$working_directory"), &SystemClauseType::PathCanonical => clause_name!("$path_canonical"), @@ -749,6 +751,7 @@ impl SystemClauseType { ("$make_directory", 1) => Some(SystemClauseType::MakeDirectory), ("$make_directory_path", 1) => Some(SystemClauseType::MakeDirectoryPath), ("$delete_file", 1) => Some(SystemClauseType::DeleteFile), + ("$rename_file", 2) => Some(SystemClauseType::RenameFile), ("$delete_directory", 1) => Some(SystemClauseType::DeleteDirectory), ("$working_directory", 2) => Some(SystemClauseType::WorkingDirectory), ("$path_canonical", 2) => Some(SystemClauseType::PathCanonical), diff --git a/src/lib/files.pl b/src/lib/files.pl index 1d9841c9..6989cb46 100644 --- a/src/lib/files.pl +++ b/src/lib/files.pl @@ -51,6 +51,7 @@ file_exists/1, directory_exists/1, delete_file/1, + rename_file/2, delete_directory/1, make_directory/1, make_directory_path/1, @@ -101,6 +102,12 @@ delete_file(File) :- list_of_chars(File), '$delete_file'(File). +rename_file(File, Renamed) :- + file_must_exist(File, rename_file/2), + list_of_chars(File), + list_of_chars(Renamed), + '$rename_file'(File, Renamed). + delete_directory(Directory) :- directory_must_exist(Directory, delete_directory/1), list_of_chars(Directory), diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index fbe76bdf..3fe7900a 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -900,6 +900,18 @@ impl MachineState { } } } + &SystemClauseType::RenameFile => { + let file = self.heap_pstr_iter(self[temp_v!(1)]).to_string(); + let renamed = self.heap_pstr_iter(self[temp_v!(2)]).to_string(); + + match fs::rename(file, renamed) { + Ok(_) => {} + _ => { + self.fail = true; + return Ok(()); + } + } + } &SystemClauseType::DeleteDirectory => { let directory = self.heap_pstr_iter(self[temp_v!(1)]).to_string(); -- 2.54.0