X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=src%2Fio%2Fbyteio.rs;h=9b93e10afbb3fe7fead59cbfca92409c69696152;hb=eb71d98ffafe7cc00bab4c3b7c9c97f813eca6c4;hp=6232223a41878e3f4666c24516472249edcfab1a;hpb=794364cf6dc794ccc73f97056ee52199b88769a5;p=nihav.git diff --git a/src/io/byteio.rs b/src/io/byteio.rs index 6232223..9b93e10 100644 --- a/src/io/byteio.rs +++ b/src/io/byteio.rs @@ -17,6 +17,7 @@ type ByteIOResult = Result; pub trait ByteIO { fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult; + fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult; fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult; fn read_byte(&mut self) -> ByteIOResult; fn peek_byte(&mut self) -> ByteIOResult; @@ -64,12 +65,16 @@ macro_rules! peek_int { } impl<'a> ByteReader<'a> { - pub fn new(io: &'a mut ByteIO) -> ByteReader { ByteReader { io: io } } + pub fn new(io: &'a mut ByteIO) -> Self { ByteReader { io: io } } pub fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult { self.io.read_buf(buf) } + pub fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult { + self.io.read_buf_some(buf) + } + pub fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult { self.io.peek_buf(buf) } @@ -224,6 +229,13 @@ impl<'a> ByteIO for MemoryReader<'a> { } fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult { + 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 { 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 { + 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 { let res = self.file.read(buf); if let Err(_) = res { return Err(ByteIOError::ReadError); } let sz = res.unwrap();