set past end of stream, set Byte to -1, Char and Code to end_of_file, at end of stream (#479)

This commit is contained in:
Mark Thom
2020-05-10 14:50:17 -06:00
parent d170c807e3
commit c1df7ead1a
2 changed files with 67 additions and 1 deletions

View File

@@ -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) {

View File

@@ -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() => {