From: Mark Thom Date: Sun, 10 May 2020 20:50:17 +0000 (-0600) Subject: set past end of stream, set Byte to -1, Char and Code to end_of_file, at end of strea... X-Git-Tag: v0.8.123~45 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=c1df7ead1a7001615cf82d0db1cd87425516e0eb;p=scryer-prolog.git set past end of stream, set Byte to -1, Char and Code to end_of_file, at end of stream (#479) --- 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() => {