]> Repositorios git - scryer-prolog.git/commitdiff
correct peek_byte/2 bugs (#1882)
authorMark <[email protected]>
Thu, 13 Jul 2023 18:23:20 +0000 (12:23 -0600)
committerMark <[email protected]>
Thu, 13 Jul 2023 18:23:20 +0000 (12:23 -0600)
src/machine/streams.rs
src/machine/system_calls.rs
src/parser/char_reader.rs

index 90f927c40f132afb7b1f82ebeef2719ed342367a..c1b4678ec4d7680bdaebd0edf0abf0b8ce378969 100644 (file)
@@ -1268,12 +1268,9 @@ impl Stream {
                 }
             }
             Stream::InputFile(ref mut file) => {
-                let mut b = [0u8; 1];
-
-                match file.read(&mut b)? {
-                    1 => {
-                        file.stream.get_mut().file.seek(SeekFrom::Current(-1))?;
-                        Ok(b[0])
+                match file.peek_byte() {
+                    Some(result) => {
+                        Ok(result?)
                     }
                     _ => Err(std::io::Error::new(
                         ErrorKind::UnexpectedEof,
index 7045eff0f63e312dfc22f28dc695b2fae63ffcb1..ba67067dff40356f521d907abcad651ec783cece 100644 (file)
@@ -2444,7 +2444,11 @@ impl Machine {
                 addr,
             );
 
-            return Ok(());
+            if !self.machine_st.fail {
+                return Ok(());
+            } else {
+                self.machine_st.fail = false;
+            }
         }
 
         let addr = match addr {
index 32854b072ef0031fad0e2eaaee2d61442a4ad3b8..2a1db29f594645a1cd2538ad176e27d283f3cd6f 100644 (file)
@@ -128,6 +128,19 @@ impl<R: Read> CharReader<R> {
 
         Ok(&self.buf[self.pos..])
     }
+
+    pub fn peek_byte(&mut self) -> Option<io::Result<u8>> {
+        match self.refresh_buffer() {
+            Ok(_buf) => {}
+            Err(e) => return Some(Err(e)),
+        }
+
+        return if let Some(b) = self.buf.get(0).cloned() {
+            Some(Ok(b))
+        } else {
+            None
+        };
+    }
 }
 
 impl<R: Read> CharRead for CharReader<R> {