]> Repositorios git - scryer-prolog.git/commitdiff
fix bugs in PausedPrologStream (#661)
authorMark Thom <[email protected]>
Sat, 8 Aug 2020 19:11:09 +0000 (13:11 -0600)
committerMark Thom <[email protected]>
Sat, 8 Aug 2020 19:11:09 +0000 (13:11 -0600)
src/machine/streams.rs

index 7e07067a5e1e6e5af6f1279cf1a3cf38db0437f7..1375cb65f8ecbf0c8297456820be525ab8b5354a 100644 (file)
@@ -6,7 +6,7 @@ use crate::machine::machine_errors::*;
 use crate::machine::machine_indices::*;
 use crate::machine::machine_state::*;
 
-use std::cmp::{min, Ordering};
+use std::cmp::Ordering;
 use std::cell::RefCell;
 use std::error::Error;
 use std::fmt;
@@ -110,7 +110,7 @@ fn parser_top_to_bytes(mut buf: Vec<io::Result<char>>) -> io::Result<Vec<u8>> {
 
 /* all these streams are closed automatically when the instance is
  * dropped. */
-pub enum StreamInstance {
+enum StreamInstance {
     Bytes(Cursor<Vec<u8>>),
     InputFile(ClauseName, File),
     OutputFile(ClauseName, File, bool), // File, append.
@@ -129,16 +129,20 @@ impl StreamInstance {
             StreamInstance::PausedPrologStream(ref mut put_back, ref mut stream) => {
                 let mut index = 0;
 
-                while index < min(buf.len(), put_back.len()) {
-                    let b = put_back.pop().unwrap();
-                    buf[index] = b;
-                    index += 1;
+                while index < buf.len() {
+                    if let Some(b) = put_back.pop() {
+                        buf[index] = b;
+                        index += 1;
+                    } else {
+                        break;
+                    }
                 }
 
                 if index == buf.len() {
                     Ok(buf.len())
                 } else {
                     stream.read(&mut buf[index ..])
+                          .map(|bytes_read| bytes_read + index)
                 }
             }
             StreamInstance::InputFile(_, ref mut file) => {