DeleteFile,
WorkingDirectory,
PathCanonical,
+ FileModificationTime,
DeleteAttribute,
DeleteHeadAttribute,
DynamicModuleResolution(usize),
&SystemClauseType::DeleteFile => clause_name!("$delete_file"),
&SystemClauseType::WorkingDirectory => clause_name!("$working_directory"),
&SystemClauseType::PathCanonical => clause_name!("$path_canonical"),
+ &SystemClauseType::FileModificationTime => clause_name!("$file_modification_time"),
&SystemClauseType::REPL(REPLCodePtr::CompileBatch) => clause_name!("$compile_batch"),
&SystemClauseType::REPL(REPLCodePtr::UseModule) => clause_name!("$use_module"),
&SystemClauseType::REPL(REPLCodePtr::UseQualifiedModule) => {
("$delete_file", 1) => Some(SystemClauseType::DeleteFile),
("$working_directory", 2) => Some(SystemClauseType::WorkingDirectory),
("$path_canonical", 2) => Some(SystemClauseType::PathCanonical),
+ ("$file_modification_time", 2) => Some(SystemClauseType::FileModificationTime),
("$use_module", 1) => Some(SystemClauseType::REPL(REPLCodePtr::UseModule)),
("$use_module_from_file", 1) =>
Some(SystemClauseType::REPL(REPLCodePtr::UseModuleFromFile)),
delete_file/1,
make_directory/1,
working_directory/2,
- path_canonical/2]).
+ path_canonical/2,
+ file_modification_time/2]).
:- use_module(library(error)).
:- use_module(library(lists)).
+:- use_module(library(charsio)).
list_of_chars(Cs) :-
must_be(list, Cs),
maplist(must_be(character), Ps),
can_be(list, Cs),
'$path_canonical'(Ps, Cs).
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ T is the modification time of File.
+ T is a time stamp, suitable for use in format_time//2 in library(time).
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+file_modification_time(File, T) :-
+ '$file_modification_time'(File, T0),
+ read_term_from_chars(T0, T).
}
}
}
+ &SystemClauseType::FileModificationTime => {
+ let file = self.heap_pstr_iter(self[temp_v!(1)]).to_string();
+
+ if let Ok(md) = fs::metadata(file) {
+ if let Ok(time) = md.modified() {
+ let chars = self.systemtime_to_timestamp(time);
+ self.unify(self[temp_v!(2)], chars);
+ } else {
+ 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;
self.unify(a1, addr);
}
&SystemClauseType::CurrentTime => {
- let system_time = SystemTime::now();
- let datetime: DateTime<Local> = system_time.into();
-
- let mut fstr = "[".to_string();
- let specifiers = vec!["d","m","Y","y","H","M","S","b","B","a","A","w","u","U","W","j","D","x","v"];
- for spec in specifiers {
- fstr.push_str(&format!("'{}'=\"%{}\", ", spec, spec).to_string());
- }
- fstr.push_str("finis].");
- let str = { let s = datetime.format(&fstr).to_string();
- self.heap.put_complete_string(&s)
- };
+ let str = self.systemtime_to_timestamp(SystemTime::now());
self.unify(self[temp_v!(1)], str);
}
&SystemClauseType::OpDeclaration => {
return_from_clause!(self.last_call, self)
}
+ pub(super)
+ fn systemtime_to_timestamp(
+ &mut self,
+ system_time: SystemTime
+ ) -> Addr {
+ let datetime: DateTime<Local> = system_time.into();
+
+ let mut fstr = "[".to_string();
+ let specifiers = vec!["d","m","Y","y","H","M","S","b","B","a","A","w","u","U","W","j","D","x","v"];
+ for spec in specifiers {
+ fstr.push_str(&format!("'{}'=\"%{}\", ", spec, spec).to_string());
+ }
+ fstr.push_str("finis].");
+ let s = datetime.format(&fstr).to_string();
+ self.heap.put_complete_string(&s)
+ }
+
pub(super)
fn string_encoding_bytes(
&mut self,