diff --git a/src/clause_types.rs b/src/clause_types.rs index 56ce7e6c..4ceda2f0 100644 --- a/src/clause_types.rs +++ b/src/clause_types.rs @@ -173,6 +173,7 @@ pub(crate) enum SystemClauseType { DirectoryExists, DirectorySeparator, MakeDirectory, + MakeDirectoryPath, DeleteFile, DeleteDirectory, WorkingDirectory, @@ -335,6 +336,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::DeleteDirectory => clause_name!("$delete_directory"), &SystemClauseType::WorkingDirectory => clause_name!("$working_directory"), @@ -745,6 +747,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), ("$delete_directory", 1) => Some(SystemClauseType::DeleteDirectory), ("$working_directory", 2) => Some(SystemClauseType::WorkingDirectory), diff --git a/src/lib/files.pl b/src/lib/files.pl index 35dacf09..1d9841c9 100644 --- a/src/lib/files.pl +++ b/src/lib/files.pl @@ -53,6 +53,7 @@ delete_file/1, delete_directory/1, make_directory/1, + make_directory_path/1, working_directory/2, path_canonical/2, path_segments/2, @@ -91,6 +92,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 aefaf864..fbe76bdf 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();