From 5134e64cae6a2e2167e2189de1cb3fd7596c1632 Mon Sep 17 00:00:00 2001 From: Markus Triska Date: Tue, 14 Jul 2020 22:16:15 +0200 Subject: [PATCH 1/2] ADDED: delete_file/1, addressing a remaining aspect of #511 --- src/clause_types.rs | 3 +++ src/lib/files.pl | 5 +++++ src/machine/system_calls.rs | 10 ++++++++++ 3 files changed, 18 insertions(+) diff --git a/src/clause_types.rs b/src/clause_types.rs index 09cab2bb..a2608d05 100644 --- a/src/clause_types.rs +++ b/src/clause_types.rs @@ -176,6 +176,7 @@ pub enum SystemClauseType { FileExists, DirectoryExists, MakeDirectory, + DeleteFile, DeleteAttribute, DeleteHeadAttribute, DynamicModuleResolution(usize), @@ -341,6 +342,7 @@ impl SystemClauseType { &SystemClauseType::FileExists => clause_name!("$file_exists"), &SystemClauseType::DirectoryExists => clause_name!("$directory_exists"), &SystemClauseType::MakeDirectory => clause_name!("$make_directory"), + &SystemClauseType::DeleteFile => clause_name!("$delete_file"), &SystemClauseType::REPL(REPLCodePtr::CompileBatch) => clause_name!("$compile_batch"), &SystemClauseType::REPL(REPLCodePtr::UseModule) => clause_name!("$use_module"), &SystemClauseType::REPL(REPLCodePtr::UseQualifiedModule) => { @@ -675,6 +677,7 @@ impl SystemClauseType { ("$file_exists", 1) => Some(SystemClauseType::FileExists), ("$directory_exists", 1) => Some(SystemClauseType::DirectoryExists), ("$make_directory", 1) => Some(SystemClauseType::MakeDirectory), + ("$delete_file", 1) => Some(SystemClauseType::DeleteFile), ("$use_module", 1) => Some(SystemClauseType::REPL(REPLCodePtr::UseModule)), ("$use_module_from_file", 1) => Some(SystemClauseType::REPL(REPLCodePtr::UseModuleFromFile)), diff --git a/src/lib/files.pl b/src/lib/files.pl index b53b9bbb..be83ae6c 100644 --- a/src/lib/files.pl +++ b/src/lib/files.pl @@ -50,6 +50,7 @@ file_size/2, file_exists/1, directory_exists/1, + delete_file/1, make_directory/1]). :- use_module(library(error)). @@ -80,3 +81,7 @@ directory_exists(Directory) :- make_directory(Directory) :- list_of_chars(Directory), '$make_directory'(Directory). + +delete_file(File) :- + list_of_chars(File), + '$delete_file'(File). diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index 20bf70e4..7a6bc9c6 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -880,6 +880,16 @@ impl MachineState { } } } + &SystemClauseType::DeleteFile => { + let file = self.heap_pstr_iter(self[temp_v!(1)]).to_string(); + + match fs::remove_file(file) { + Ok(_) => { } + _ => { self.fail = true; + return Ok(()); + } + } + } &SystemClauseType::AtEndOfExpansion => { if self.cp == LocalCodePtr::TopLevel(0, 0) { self.at_end_of_expansion = true; From 94e9e17c79f269b2654d7b7ad37da1fccfe574c8 Mon Sep 17 00:00:00 2001 From: Markus Triska Date: Tue, 14 Jul 2020 22:37:05 +0200 Subject: [PATCH 2/2] ADDED: working_directory/2, addressing a remaining aspect of #511 --- src/clause_types.rs | 3 +++ src/lib/files.pl | 8 +++++++- src/machine/system_calls.rs | 28 ++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/clause_types.rs b/src/clause_types.rs index a2608d05..89e4d00d 100644 --- a/src/clause_types.rs +++ b/src/clause_types.rs @@ -177,6 +177,7 @@ pub enum SystemClauseType { DirectoryExists, MakeDirectory, DeleteFile, + WorkingDirectory, DeleteAttribute, DeleteHeadAttribute, DynamicModuleResolution(usize), @@ -343,6 +344,7 @@ impl SystemClauseType { &SystemClauseType::DirectoryExists => clause_name!("$directory_exists"), &SystemClauseType::MakeDirectory => clause_name!("$make_directory"), &SystemClauseType::DeleteFile => clause_name!("$delete_file"), + &SystemClauseType::WorkingDirectory => clause_name!("$working_directory"), &SystemClauseType::REPL(REPLCodePtr::CompileBatch) => clause_name!("$compile_batch"), &SystemClauseType::REPL(REPLCodePtr::UseModule) => clause_name!("$use_module"), &SystemClauseType::REPL(REPLCodePtr::UseQualifiedModule) => { @@ -678,6 +680,7 @@ impl SystemClauseType { ("$directory_exists", 1) => Some(SystemClauseType::DirectoryExists), ("$make_directory", 1) => Some(SystemClauseType::MakeDirectory), ("$delete_file", 1) => Some(SystemClauseType::DeleteFile), + ("$working_directory", 2) => Some(SystemClauseType::WorkingDirectory), ("$use_module", 1) => Some(SystemClauseType::REPL(REPLCodePtr::UseModule)), ("$use_module_from_file", 1) => Some(SystemClauseType::REPL(REPLCodePtr::UseModuleFromFile)), diff --git a/src/lib/files.pl b/src/lib/files.pl index be83ae6c..9e54bf33 100644 --- a/src/lib/files.pl +++ b/src/lib/files.pl @@ -51,7 +51,8 @@ file_exists/1, directory_exists/1, delete_file/1, - make_directory/1]). + make_directory/1, + working_directory/2]). :- use_module(library(error)). :- use_module(library(lists)). @@ -85,3 +86,8 @@ make_directory(Directory) :- delete_file(File) :- list_of_chars(File), '$delete_file'(File). + +working_directory(Dir0, Dir) :- + can_be(list, Dir0), + can_be(list, Dir), + '$working_directory'(Dir0, Dir). diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index 7a6bc9c6..77ef1366 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -890,6 +890,34 @@ impl MachineState { } } } + &SystemClauseType::WorkingDirectory => { + if let Ok(dir) = env::current_dir() { + let current = + match dir.to_str() { + Some(d) => { d } + _ => { let stub = MachineError::functor_stub(clause_name!("working_directory"), 2); + let err = MachineError::representation_error(RepFlag::Character); + let err = self.error_form(err, stub); + + return Err(err); + } + }; + let chars = self.heap.put_complete_string(current); + self.unify(self[temp_v!(1)], chars); + + let next = self.heap_pstr_iter(self[temp_v!(2)]).to_string(); + + match env::set_current_dir(std::path::Path::new(&next)) { + Ok(_) => { } + _ => { self.fail = true; + return Ok(()); + } + } + } else { + self.fail = true; + return Ok(()); + } + } &SystemClauseType::AtEndOfExpansion => { if self.cp == LocalCodePtr::TopLevel(0, 0) { self.at_end_of_expansion = true;