]> Repositorios git - scryer-prolog.git/commitdiff
set past end of stream, set Byte to -1, Char and Code to end_of_file, at end of strea...
authorMark Thom <[email protected]>
Sun, 10 May 2020 20:50:17 +0000 (14:50 -0600)
committerMark Thom <[email protected]>
Sun, 10 May 2020 20:50:17 +0000 (14:50 -0600)
src/prolog/machine/streams.rs
src/prolog/machine/system_calls.rs

index 7542bec9791f8cdec8564913d66cc0dcfc353d7d..1eefe58172aec9bad275cd19c8bf50936bc8e643 100644 (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) {
index 0f02d1413a65c454d3ce11109371ea498b647d58..b1abfdd2dc6c36476ba9bafc63a8e90e37f3998e 100644 (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() => {