make read_buf() always read proper sizes
[nihav.git] / src / io / byteio.rs
index acd67d4d36c2d14616680e7be2a92369991a52e4..9b93e10afbb3fe7fead59cbfca92409c69696152 100644 (file)
@@ -17,6 +17,7 @@ type ByteIOResult<T> = Result<T, ByteIOError>;
 
 pub trait ByteIO {
     fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize>;
+    fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize>;
     fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize>;
     fn read_byte(&mut self) -> ByteIOResult<u8>;
     fn peek_byte(&mut self) -> ByteIOResult<u8>;
@@ -70,6 +71,10 @@ impl<'a> ByteReader<'a> {
         self.io.read_buf(buf)
     }
 
+    pub fn read_buf_some(&mut self, buf: &mut [u8])  -> ByteIOResult<usize> {
+        self.io.read_buf_some(buf)
+    }
+
     pub fn peek_buf(&mut self, buf: &mut [u8])  -> ByteIOResult<usize> {
         self.io.peek_buf(buf)
     }
@@ -224,6 +229,13 @@ impl<'a> ByteIO for MemoryReader<'a> {
     }
 
     fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
+        let read_size = self.peek_buf(buf)?;
+        if read_size < buf.len() { return Err(ByteIOError::EOF); }
+        self.pos += read_size;
+        Ok(read_size)
+    }
+
+    fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
         let read_size = self.peek_buf(buf)?;
         self.pos += read_size;
         Ok(read_size)
@@ -281,6 +293,14 @@ impl<'a> ByteIO for FileReader<'a> {
     }
 
     fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
+        let res = self.file.read(buf);
+        if let Err(_) = res { return Err(ByteIOError::ReadError); }
+        let sz = res.unwrap();
+        if sz < buf.len() { self.eof = true; return Err(ByteIOError::EOF); }
+        Ok(sz)
+    }
+
+    fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
         let res = self.file.read(buf);
         if let Err(_) = res { return Err(ByteIOError::ReadError); }
         let sz = res.unwrap();