From: Paulo Moura Date: Mon, 17 May 2021 23:21:11 +0000 (+0100) Subject: Add make_directory_path/1 predicate to the files library X-Git-Tag: v0.9.0~61^2 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=bdebc7f32e97e298a124beda71aa6a6cc45db7cc;p=scryer-prolog.git Add make_directory_path/1 predicate to the files library --- diff --git a/src/clause_types.rs b/src/clause_types.rs index 7820a9fd..15d14c30 100644 --- a/src/clause_types.rs +++ b/src/clause_types.rs @@ -173,6 +173,7 @@ pub(crate) enum SystemClauseType { DirectoryExists, DirectorySeparator, MakeDirectory, + MakeDirectoryPath, DeleteFile, WorkingDirectory, PathCanonical, @@ -334,6 +335,7 @@ impl SystemClauseType { &SystemClauseType::DirectoryExists => clause_name!("$directory_exists"), &SystemClauseType::DirectorySeparator => clause_name!("$directory_separator"), &SystemClauseType::MakeDirectory => clause_name!("$make_directory"), + &SystemClauseType::MakeDirectoryPath => clause_name!("$make_directory_path"), &SystemClauseType::DeleteFile => clause_name!("$delete_file"), &SystemClauseType::WorkingDirectory => clause_name!("$working_directory"), &SystemClauseType::PathCanonical => clause_name!("$path_canonical"), @@ -743,6 +745,7 @@ impl SystemClauseType { ("$directory_exists", 1) => Some(SystemClauseType::DirectoryExists), ("$directory_separator", 1) => Some(SystemClauseType::DirectorySeparator), ("$make_directory", 1) => Some(SystemClauseType::MakeDirectory), + ("$make_directory_path", 1) => Some(SystemClauseType::MakeDirectoryPath), ("$delete_file", 1) => Some(SystemClauseType::DeleteFile), ("$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 e88f53a2..812ab361 100644 --- a/src/lib/files.pl +++ b/src/lib/files.pl @@ -52,6 +52,7 @@ directory_exists/1, delete_file/1, make_directory/1, + make_directory_path/1, working_directory/2, path_canonical/2, path_segments/2, @@ -90,6 +91,10 @@ make_directory(Directory) :- list_of_chars(Directory), '$make_directory'(Directory). +make_directory_path(Directory) :- + list_of_chars(Directory), + '$make_directory_path'(Directory). + delete_file(File) :- file_must_exist(File, delete_file/1), list_of_chars(File), diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index 6e54145d..2075bbab 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -878,6 +878,17 @@ impl MachineState { } } } + &SystemClauseType::MakeDirectoryPath => { + let directory = self.heap_pstr_iter(self[temp_v!(1)]).to_string(); + + match fs::create_dir_all(directory) { + Ok(_) => {} + _ => { + self.fail = true; + return Ok(()); + } + } + } &SystemClauseType::DeleteFile => { let file = self.heap_pstr_iter(self[temp_v!(1)]).to_string();