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

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