From c1df7ead1a7001615cf82d0db1cd87425516e0eb Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 10 May 2020 14:50:17 -0600 Subject: [PATCH] set past end of stream, set Byte to -1, Char and Code to end_of_file, at end of stream (#479) --- src/prolog/machine/streams.rs | 8 +++- src/prolog/machine/system_calls.rs | 60 ++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/prolog/machine/streams.rs b/src/prolog/machine/streams.rs index 7542bec9..1eefe581 100644 --- a/src/prolog/machine/streams.rs +++ b/src/prolog/machine/streams.rs @@ -59,7 +59,7 @@ pub enum EOFAction { Reset, } -#[derive(Debug)] +#[derive(Debug, PartialEq)] pub enum AtEndOfStream { Not, At, @@ -328,6 +328,12 @@ impl Stream { self.stream_inst.0.borrow_mut().0 } + #[inline] + pub(crate) + fn at_end_of_stream(&mut self) -> bool { + self.position_relative_to_end() == AtEndOfStream::At + } + #[inline] pub(crate) fn set_past_end_of_stream(&mut self) { diff --git a/src/prolog/machine/system_calls.rs b/src/prolog/machine/system_calls.rs index 0f02d141..b1abfdd2 100644 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@ -1190,6 +1190,12 @@ impl MachineState { } } + if stream.at_end_of_stream() { + stream.set_past_end_of_stream(); + self.unify(self[temp_v!(2)], Addr::Fixnum(-1)); + return return_from_clause!(self.last_call, self); + } + let addr = match self.store(self.deref(self[temp_v!(2)])) { addr if addr.is_ref() => { @@ -1287,6 +1293,18 @@ impl MachineState { } } + if stream.at_end_of_stream() { + let end_of_file = clause_name!("end_of_file"); + let end_of_file = self.heap.to_unifiable( + HeapCellValue::Atom(end_of_file, None), + ); + + stream.set_past_end_of_stream(); + + self.unify(self[temp_v!(2)], end_of_file); + return return_from_clause!(self.last_call, self); + } + let addr = match self.store(self.deref(self[temp_v!(2)])) { addr if addr.is_ref() => { @@ -1385,6 +1403,18 @@ impl MachineState { } } + if stream.at_end_of_stream() { + let end_of_file = clause_name!("end_of_file"); + let end_of_file = self.heap.to_unifiable( + HeapCellValue::Atom(end_of_file, None), + ); + + stream.set_past_end_of_stream(); + + self.unify(self[temp_v!(2)], end_of_file); + return return_from_clause!(self.last_call, self); + } + let addr = match self.store(self.deref(self[temp_v!(2)])) { addr if addr.is_ref() => { @@ -2076,6 +2106,12 @@ impl MachineState { } } + if stream.at_end_of_stream() { + stream.set_past_end_of_stream(); + self.unify(self[temp_v!(2)], Addr::Fixnum(-1)); + return return_from_clause!(self.last_call, self); + } + let addr = match self.store(self.deref(self[temp_v!(2)])) { addr if addr.is_ref() => { @@ -2171,6 +2207,18 @@ impl MachineState { } } + if stream.at_end_of_stream() { + let end_of_file = clause_name!("end_of_file"); + let end_of_file = self.heap.to_unifiable( + HeapCellValue::Atom(end_of_file, None), + ); + + stream.set_past_end_of_stream(); + + self.unify(self[temp_v!(2)], end_of_file); + return return_from_clause!(self.last_call, self); + } + let mut iter = self.open_parsing_stream( stream.clone(), "get_char", @@ -2273,6 +2321,18 @@ impl MachineState { } } + if stream.at_end_of_stream() { + let end_of_file = clause_name!("end_of_file"); + let end_of_file = self.heap.to_unifiable( + HeapCellValue::Atom(end_of_file, None), + ); + + stream.set_past_end_of_stream(); + + self.unify(self[temp_v!(2)], end_of_file); + return return_from_clause!(self.last_call, self); + } + let addr = match self.store(self.deref(self[temp_v!(2)])) { addr if addr.is_ref() => { -- 2.54.0