]> git.nihav.org Git - nihav.git/blame - nihav-core/src/io/byteio.rs
avimux: do not record palette change chunks in OpenDML index
[nihav.git] / nihav-core / src / io / byteio.rs
CommitLineData
28884194 1//! Bytestream reading/writing functionality.
37f2396b 2pub use std::io::SeekFrom;
90aa4e6b 3use std::io::prelude::*;
e243ceb4 4use std::ptr;
90aa4e6b 5
28884194 6/// A list specifying general bytestream reading and writing errors.
90aa4e6b
KS
7#[derive(Debug)]
8pub enum ByteIOError {
28884194 9 /// End of stream.
90aa4e6b 10 EOF,
28884194 11 /// Wrong seek position was provided.
90aa4e6b 12 WrongRange,
28884194 13 /// Tried to call read() on bytestream writer or write() on bytestream reader.
90aa4e6b 14 WrongIOMode,
28884194 15 /// Functionality is not implemented.
90aa4e6b 16 NotImplemented,
28884194 17 /// Read error.
90aa4e6b 18 ReadError,
28884194 19 /// Write error.
90aa4e6b 20 WriteError,
28884194 21 /// Seeking failed.
90aa4e6b
KS
22 SeekError,
23}
24
28884194 25/// A specialised `Result` type for bytestream operations.
296d86b2 26pub type ByteIOResult<T> = Result<T, ByteIOError>;
90aa4e6b 27
28884194 28/// Common trait for bytestream operations.
90aa4e6b 29pub trait ByteIO {
28884194 30 /// Reads data into provided buffer. Fails if it cannot fill whole buffer.
90aa4e6b 31 fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize>;
28884194 32 /// Reads data into provided buffer. Partial read is treated as success.
89de616c 33 fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize>;
28884194 34 /// Reads data into provided buffer but does not advance read position.
794364cf 35 fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize>;
28884194 36 /// Reads single byte from the stream.
90aa4e6b 37 fn read_byte(&mut self) -> ByteIOResult<u8>;
28884194 38 /// Returns the next byte value in the stream without advancing read position.
794364cf 39 fn peek_byte(&mut self) -> ByteIOResult<u8>;
28884194 40 /// Writes buffer to the stream.
d532000c 41 fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()>;
28884194 42 /// Returns current read or write position.
90aa4e6b 43 fn tell(&mut self) -> u64;
28884194 44 /// Seeks to the provided position.
90aa4e6b 45 fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64>;
28884194 46 /// Tells whether this is end of stream.
e243ceb4 47 fn is_eof(&self) -> bool;
28884194 48 /// Reports whether stream is seekable or not.
90aa4e6b 49 fn is_seekable(&mut self) -> bool;
28884194 50 /// Returns stream size or -1 if it is not known.
d532000c 51 fn size(&mut self) -> i64;
cf095d56
KS
52 /// Flushes output if possible.
53 fn flush(&mut self) -> ByteIOResult<()>;
90aa4e6b
KS
54}
55
28884194
KS
56/// High-level bytestream reader.
57///
58/// User is supposed to create some reader implementing [`ByteIO`] trait e.g. [`MemoryReader`] and use it to create `ByteReader` which can be used for reading e.g. various integer types.
59///
60/// # Examples
61///
62/// ````
63/// use nihav_core::io::byteio::{MemoryReader,ByteReader};
64/// # use nihav_core::io::byteio::ByteIOResult;
65///
66/// # fn foo() -> ByteIOResult<()> {
67/// let memory: [u8; 4] = [ 0, 42, 42, 0 ];
68/// let mut mr = MemoryReader::new_read(&memory);
69/// let mut br = ByteReader::new(&mut mr);
70/// let val = br.read_u16be()?; // read 16-bit big-endian integer, should be 42
71/// let val = br.read_u16le()?; // read 16-bit little-endian integer, should be 42 as well
72/// # Ok(())
73/// # }
74/// ````
75///
76/// [`ByteIO`]: ./trait.ByteIO.html
77/// [`MemoryReader`]: ./struct.MemoryReader.html
90aa4e6b
KS
78#[allow(dead_code)]
79pub struct ByteReader<'a> {
ac818eac 80 io: &'a mut dyn ByteIO,
90aa4e6b
KS
81}
82
28884194 83/// Bytestream reader from memory.
90aa4e6b
KS
84pub struct MemoryReader<'a> {
85 buf: &'a [u8],
90aa4e6b 86 pos: usize,
90aa4e6b
KS
87}
88
789354a8
KS
89/// Bytestream reader from anything implementing `std::io::Read` and `std::io::Seek`.
90pub struct FileReader<T: Read+Seek> {
91 file: Box<T>,
90aa4e6b
KS
92 eof: bool,
93}
94
a91a8367
KS
95/// Bytestream reader from anything implementing `std::io::Read` and `std::io::Seek` that operates only on a part of the input.
96pub struct BoundedFileReader<T: Read+Seek> {
97 file: Box<T>,
98 start: u64,
99 end: Option<u64>,
100 eof: bool,
101}
102
90aa4e6b
KS
103macro_rules! read_int {
104 ($s: ident, $inttype: ty, $size: expr, $which: ident) => ({
90aa4e6b 105 unsafe {
e243ceb4
KS
106 let mut buf: $inttype = 0;
107 $s.read_buf(&mut *(&mut buf as *mut $inttype as *mut [u8; $size]))?;
108 Ok(buf.$which())
90aa4e6b
KS
109 }
110 })
111}
112
794364cf
KS
113macro_rules! peek_int {
114 ($s: ident, $inttype: ty, $size: expr, $which: ident) => ({
794364cf 115 unsafe {
e243ceb4
KS
116 let mut buf: $inttype = 0;
117 $s.peek_buf(&mut *(&mut buf as *mut $inttype as *mut [u8; $size]))?;
118 Ok(buf.$which())
794364cf
KS
119 }
120 })
121}
122
95058bc1
KS
123macro_rules! read_int_func {
124 ($s: ident, $inttype: ty, $size: expr, $which: ident) => {
28884194 125/// Reads integer of certain size and endianness.
95058bc1
KS
126 pub fn $s(src: &[u8]) -> ByteIOResult<$inttype> {
127 if src.len() < $size { return Err(ByteIOError::ReadError); }
128 unsafe {
e243ceb4 129 let mut buf: $inttype = 0;
c9087a4c 130 ptr::copy_nonoverlapping(src.as_ptr(), &mut buf as *mut $inttype as *mut u8, std::mem::size_of::<$inttype>());
e243ceb4 131 Ok(buf.$which())
95058bc1
KS
132 }
133 }
134 }
135}
136
137read_int_func!(read_u16be, u16, 2, to_be);
138read_int_func!(read_u16le, u16, 2, to_le);
139read_int_func!(read_u32be, u32, 4, to_be);
140read_int_func!(read_u32le, u32, 4, to_le);
141read_int_func!(read_u64be, u64, 8, to_be);
142read_int_func!(read_u64le, u64, 8, to_le);
143
28884194
KS
144/// Reads 24-bit big-endian integer.
145///
146/// # Example
147///
148/// ````
149/// use nihav_core::io::byteio::read_u24be;
150/// # use nihav_core::io::byteio::ByteIOResult;
151///
152/// # fn foo() -> ByteIOResult<()> {
153/// let src: [u8; 3] = [ 1, 2, 3];
154/// let value = read_u24be(&src)?; // should return 0x010203
155/// # Ok(())
156/// # }
157/// ````
95058bc1
KS
158pub fn read_u24be(src: &[u8]) -> ByteIOResult<u32> {
159 if src.len() < 3 { return Err(ByteIOError::ReadError); }
e243ceb4 160 Ok((u32::from(src[0]) << 16) | (u32::from(src[1]) << 8) | u32::from(src[2]))
95058bc1 161}
28884194 162/// Reads 24-bit little-endian integer.
95058bc1
KS
163pub fn read_u24le(src: &[u8]) -> ByteIOResult<u32> {
164 if src.len() < 3 { return Err(ByteIOError::ReadError); }
e243ceb4 165 Ok((u32::from(src[2]) << 16) | (u32::from(src[1]) << 8) | u32::from(src[0]))
95058bc1 166}
28884194 167/// Reads 32-bit big-endian floating point number.
02a5bdaf 168pub fn read_f32be(src: &[u8]) -> ByteIOResult<f32> { Ok(f32::from_bits(read_u32be(src)?)) }
28884194 169/// Reads 32-bit little-endian floating point number.
02a5bdaf 170pub fn read_f32le(src: &[u8]) -> ByteIOResult<f32> { Ok(f32::from_bits(read_u32le(src)?)) }
28884194 171/// Reads 64-bit big-endian floating point number.
02a5bdaf 172pub fn read_f64be(src: &[u8]) -> ByteIOResult<f64> { Ok(f64::from_bits(read_u64be(src)?)) }
28884194 173/// Reads 64-bit little-endian floating point number.
02a5bdaf 174pub fn read_f64le(src: &[u8]) -> ByteIOResult<f64> { Ok(f64::from_bits(read_u64le(src)?)) }
95058bc1 175
95c7f2f6
KS
176macro_rules! write_int_func {
177 ($s: ident, $inttype: ty, $size: expr, $which: ident) => {
28884194 178/// Writes integer of certain size and endianness into byte buffer.
95c7f2f6
KS
179 pub fn $s(dst: &mut [u8], val: $inttype) -> ByteIOResult<()> {
180 if dst.len() < $size { return Err(ByteIOError::WriteError); }
181 unsafe {
182 let val = val.$which();
183 ptr::copy_nonoverlapping(&val as *const $inttype as *const u8, dst.as_mut_ptr(), std::mem::size_of::<$inttype>());
184 }
185 Ok(())
186 }
187 }
188}
189
190write_int_func!(write_u16be, u16, 2, to_be);
191write_int_func!(write_u16le, u16, 2, to_le);
192write_int_func!(write_u32be, u32, 4, to_be);
193write_int_func!(write_u32le, u32, 4, to_le);
194write_int_func!(write_u64be, u64, 8, to_be);
195write_int_func!(write_u64le, u64, 8, to_le);
196
28884194
KS
197/// Writes 24-bit big-endian integer to the provided buffer.
198///
199/// # Example
200///
201/// ````
202/// use nihav_core::io::byteio::write_u24be;
203/// # use nihav_core::io::byteio::ByteIOResult;
204///
205/// # fn foo() -> ByteIOResult<()> {
206/// let mut dst = [0u8; 3];
207/// write_u24be(&mut dst, 0x010203)?;
208/// // dst should contain [ 1, 2, 3] now
209/// # Ok(())
210/// # }
211/// ````
b36f412c 212#[allow(clippy::identity_op)]
95c7f2f6
KS
213pub fn write_u24be(dst: &mut [u8], val: u32) -> ByteIOResult<()> {
214 if dst.len() < 3 { return Err(ByteIOError::WriteError); }
215 dst[0] = (val >> 16) as u8;
216 dst[1] = (val >> 8) as u8;
217 dst[2] = (val >> 0) as u8;
218 Ok(())
219}
28884194 220/// Writes 24-bit little-endian integer to the provided buffer.
b36f412c 221#[allow(clippy::identity_op)]
95c7f2f6
KS
222pub fn write_u24le(dst: &mut [u8], val: u32) -> ByteIOResult<()> {
223 if dst.len() < 3 { return Err(ByteIOError::WriteError); }
224 dst[0] = (val >> 0) as u8;
225 dst[1] = (val >> 8) as u8;
226 dst[2] = (val >> 16) as u8;
227 Ok(())
228}
28884194 229/// Writes 32-bit big-endian floating point number to the provided buffer.
02a5bdaf 230pub fn write_f32be(dst: &mut [u8], val: f32) -> ByteIOResult<()> { write_u32be(dst, val.to_bits()) }
28884194 231/// Writes 32-bit little-endian floating point number to the provided buffer.
02a5bdaf 232pub fn write_f32le(dst: &mut [u8], val: f32) -> ByteIOResult<()> { write_u32le(dst, val.to_bits()) }
28884194 233/// Writes 64-bit big-endian floating point number to the provided buffer.
02a5bdaf 234pub fn write_f64be(dst: &mut [u8], val: f64) -> ByteIOResult<()> { write_u64be(dst, val.to_bits()) }
28884194 235/// Writes 64-bit little-endian floating point number to the provided buffer.
02a5bdaf 236pub fn write_f64le(dst: &mut [u8], val: f64) -> ByteIOResult<()> { write_u64le(dst, val.to_bits()) }
95c7f2f6 237
90aa4e6b 238impl<'a> ByteReader<'a> {
28884194
KS
239 /// Constructs a new instance of bytestream reader.
240 ///
241 /// # Examples
242 ///
243 /// ````
244 /// use nihav_core::io::byteio::{MemoryReader,ByteReader};
245 /// # use nihav_core::io::byteio::ByteIOResult;
246 ///
247 /// # fn foo() -> ByteIOResult<()> {
248 /// let memory: [u8; 4] = [ 0, 42, 42, 0 ];
249 /// let mut mr = MemoryReader::new_read(&memory);
250 /// let mut br = ByteReader::new(&mut mr);
251 /// # Ok(())
252 /// # }
253 /// ````
ac818eac 254 pub fn new(io: &'a mut dyn ByteIO) -> Self { ByteReader { io } }
90aa4e6b 255
28884194 256 /// Reads data into provided buffer. Partial read is treated as success.
90aa4e6b
KS
257 pub fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
258 self.io.read_buf(buf)
259 }
260
28884194 261 /// Reads data into provided buffer. Partial read is treated as success.
89de616c
KS
262 pub fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
263 self.io.read_buf_some(buf)
264 }
265
28884194 266 /// Reads data into provided buffer but does not advance read position.
794364cf
KS
267 pub fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
268 self.io.peek_buf(buf)
269 }
270
28884194 271 /// Reads single byte from the stream.
90aa4e6b
KS
272 pub fn read_byte(&mut self) -> ByteIOResult<u8> {
273 self.io.read_byte()
274 }
275
28884194 276 /// Returns the next byte value in the stream without advancing read position.
794364cf
KS
277 pub fn peek_byte(&mut self) -> ByteIOResult<u8> {
278 self.io.peek_byte()
279 }
280
943d7b14
KS
281 /// Reads four-byte array from the stream.
282 pub fn read_tag(&mut self) -> ByteIOResult<[u8; 4]> {
283 let mut buf = [0u8; 4];
284 self.io.read_buf(&mut buf)?;
285 Ok(buf)
286 }
287
288 /// Reads four-byte array from the stream without advancing read position.
289 pub fn peek_tag(&mut self) -> ByteIOResult<[u8; 4]> {
290 let mut buf = [0u8; 4];
291 self.io.peek_buf(&mut buf)?;
292 Ok(buf)
293 }
294
28884194 295 /// Reads 16-bit big-endian integer from the stream.
90aa4e6b
KS
296 pub fn read_u16be(&mut self) -> ByteIOResult<u16> {
297 read_int!(self, u16, 2, to_be)
298 }
299
28884194 300 /// Reads 16-bit big-endian integer from the stream without advancing read position.
794364cf
KS
301 pub fn peek_u16be(&mut self) -> ByteIOResult<u16> {
302 peek_int!(self, u16, 2, to_be)
303 }
304
28884194 305 /// Reads 24-bit big-endian integer from the stream.
90aa4e6b 306 pub fn read_u24be(&mut self) -> ByteIOResult<u32> {
794364cf
KS
307 let p16 = self.read_u16be()?;
308 let p8 = self.read_byte()?;
e243ceb4 309 Ok((u32::from(p16) << 8) | u32::from(p8))
794364cf
KS
310 }
311
28884194 312 /// Reads 24-bit big-endian integer from the stream without advancing read position.
794364cf
KS
313 pub fn peek_u24be(&mut self) -> ByteIOResult<u32> {
314 let mut src: [u8; 3] = [0; 3];
315 self.peek_buf(&mut src)?;
e243ceb4 316 Ok((u32::from(src[0]) << 16) | (u32::from(src[1]) << 8) | u32::from(src[2]))
90aa4e6b
KS
317 }
318
28884194 319 /// Reads 32-bit big-endian integer from the stream.
90aa4e6b
KS
320 pub fn read_u32be(&mut self) -> ByteIOResult<u32> {
321 read_int!(self, u32, 4, to_be)
322 }
323
28884194 324 /// Reads 32-bit big-endian integer from the stream without advancing read position.
794364cf
KS
325 pub fn peek_u32be(&mut self) -> ByteIOResult<u32> {
326 peek_int!(self, u32, 4, to_be)
327 }
328
28884194 329 /// Reads 64-bit big-endian integer from the stream.
90aa4e6b
KS
330 pub fn read_u64be(&mut self) -> ByteIOResult<u64> {
331 read_int!(self, u64, 8, to_be)
332 }
333
28884194 334 /// Reads 64-bit big-endian integer from the stream without advancing read position.
794364cf
KS
335 pub fn peek_u64be(&mut self) -> ByteIOResult<u64> {
336 peek_int!(self, u64, 8, to_be)
337 }
338
28884194 339 /// Reads 32-bit big-endian floating point number from the stream.
02a5bdaf
KS
340 pub fn read_f32be(&mut self) -> ByteIOResult<f32> {
341 Ok(f32::from_bits(self.read_u32be()?))
342 }
343
28884194 344 /// Reads 32-bit big-endian floating point number from the stream without advancing read position.
02a5bdaf
KS
345 pub fn peek_f32be(&mut self) -> ByteIOResult<f32> {
346 Ok(f32::from_bits(self.peek_u32be()?))
347 }
348
28884194 349 /// Reads 64-bit big-endian floating point number from the stream.
02a5bdaf
KS
350 pub fn read_f64be(&mut self) -> ByteIOResult<f64> {
351 Ok(f64::from_bits(self.read_u64be()?))
352 }
353
28884194 354 /// Reads 64-bit big-endian floating point number from the stream without advancing read position.
02a5bdaf
KS
355 pub fn peek_f64be(&mut self) -> ByteIOResult<f64> {
356 Ok(f64::from_bits(self.peek_u64be()?))
357 }
358
28884194 359 /// Reads 16-bit little-endian integer from the stream.
90aa4e6b
KS
360 pub fn read_u16le(&mut self) -> ByteIOResult<u16> {
361 read_int!(self, u16, 2, to_le)
362 }
363
28884194 364 /// Reads 16-bit little-endian integer from the stream without advancing read position.
794364cf
KS
365 pub fn peek_u16le(&mut self) -> ByteIOResult<u16> {
366 peek_int!(self, u16, 2, to_le)
367 }
368
28884194 369 /// Reads 24-bit little-endian integer from the stream.
90aa4e6b 370 pub fn read_u24le(&mut self) -> ByteIOResult<u32> {
794364cf
KS
371 let p8 = self.read_byte()?;
372 let p16 = self.read_u16le()?;
e243ceb4 373 Ok((u32::from(p16) << 8) | u32::from(p8))
794364cf
KS
374 }
375
28884194 376 /// Reads 24-bit little-endian integer from the stream without advancing read position.
794364cf
KS
377 pub fn peek_u24le(&mut self) -> ByteIOResult<u32> {
378 let mut src: [u8; 3] = [0; 3];
379 self.peek_buf(&mut src)?;
e243ceb4 380 Ok(u32::from(src[0]) | (u32::from(src[1]) << 8) | (u32::from(src[2]) << 16))
90aa4e6b
KS
381 }
382
28884194 383 /// Reads 32-bit little-endian integer from the stream.
90aa4e6b
KS
384 pub fn read_u32le(&mut self) -> ByteIOResult<u32> {
385 read_int!(self, u32, 4, to_le)
386 }
387
28884194 388 /// Reads 32-bit little-endian integer from the stream without advancing read position.
794364cf
KS
389 pub fn peek_u32le(&mut self) -> ByteIOResult<u32> {
390 peek_int!(self, u32, 4, to_le)
391 }
392
28884194 393 /// Reads 64-bit little-endian integer from the stream.
90aa4e6b
KS
394 pub fn read_u64le(&mut self) -> ByteIOResult<u64> {
395 read_int!(self, u64, 8, to_le)
396 }
397
28884194 398 /// Reads 64-bit little-endian integer from the stream without advancing read position.
794364cf
KS
399 pub fn peek_u64le(&mut self) -> ByteIOResult<u64> {
400 peek_int!(self, u64, 8, to_le)
401 }
402
28884194 403 /// Reads 32-bit little-endian floating point number from the stream.
02a5bdaf
KS
404 pub fn read_f32le(&mut self) -> ByteIOResult<f32> {
405 Ok(f32::from_bits(self.read_u32le()?))
406 }
407
28884194 408 /// Reads 32-bit little-endian floating point number from the stream without advancing read position.
02a5bdaf
KS
409 pub fn peek_f32le(&mut self) -> ByteIOResult<f32> {
410 Ok(f32::from_bits(self.peek_u32le()?))
411 }
412
28884194 413 /// Reads 64-bit little-endian floating point number from the stream.
02a5bdaf
KS
414 pub fn read_f64le(&mut self) -> ByteIOResult<f64> {
415 Ok(f64::from_bits(self.read_u64le()?))
416 }
417
28884194 418 /// Reads 64-bit little-endian floating point number from the stream without advancing read position.
02a5bdaf
KS
419 pub fn peek_f64le(&mut self) -> ByteIOResult<f64> {
420 Ok(f64::from_bits(self.peek_u64le()?))
421 }
422
28884194 423 /// Skips requested number of bytes.
6b167b0c 424 pub fn read_skip(&mut self, len: usize) -> ByteIOResult<()> {
90aa4e6b
KS
425 if self.io.is_seekable() {
426 self.io.seek(SeekFrom::Current(len as i64))?;
427 } else {
428 let mut ssize = len;
429 let mut buf : [u8; 16] = [0; 16];
9037cf6b 430 let bref = &mut buf;
90aa4e6b
KS
431 while ssize > bref.len() {
432 self.io.read_buf(bref)?;
433 ssize -= bref.len();
434 }
435 while ssize > 0 {
436 self.io.read_byte()?;
e243ceb4 437 ssize -= 1;
90aa4e6b
KS
438 }
439 }
6b167b0c 440 Ok(())
90aa4e6b
KS
441 }
442
28884194 443 /// Returns current read position.
90aa4e6b
KS
444 pub fn tell(&mut self) -> u64 {
445 self.io.tell()
446 }
447
28884194 448 /// Seeks to the provided position.
90aa4e6b
KS
449 pub fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> {
450 self.io.seek(pos)
451 }
452
28884194 453 /// Tells whether this is end of stream.
e243ceb4 454 pub fn is_eof(&self) -> bool {
90aa4e6b
KS
455 self.io.is_eof()
456 }
96c6be97 457
28884194 458 /// Returns stream size or -1 if it is not known.
96c6be97
KS
459 pub fn size(&mut self) -> i64 {
460 self.io.size()
461 }
462
28884194 463 /// Reports number of bytes left in the stream.
96c6be97
KS
464 pub fn left(&mut self) -> i64 {
465 let size = self.io.size();
466 if size == -1 { return -1; }
e243ceb4 467 size - (self.io.tell() as i64)
96c6be97 468 }
90aa4e6b
KS
469}
470
471impl<'a> MemoryReader<'a> {
28884194 472 /// Constructs a new instance of `MemoryReader`.
90aa4e6b 473 pub fn new_read(buf: &'a [u8]) -> Self {
1be85e00 474 MemoryReader { buf, pos: 0 }
90aa4e6b
KS
475 }
476
477 fn real_seek(&mut self, pos: i64) -> ByteIOResult<u64> {
1be85e00 478 if pos < 0 || (pos as usize) > self.buf.len() {
e243ceb4 479 return Err(ByteIOError::WrongRange);
90aa4e6b
KS
480 }
481 self.pos = pos as usize;
482 Ok(pos as u64)
483 }
90aa4e6b
KS
484}
485
486impl<'a> ByteIO for MemoryReader<'a> {
487 fn read_byte(&mut self) -> ByteIOResult<u8> {
90aa4e6b
KS
488 if self.is_eof() { return Err(ByteIOError::EOF); }
489 let res = self.buf[self.pos];
e243ceb4 490 self.pos += 1;
90aa4e6b
KS
491 Ok(res)
492 }
493
794364cf
KS
494 fn peek_byte(&mut self) -> ByteIOResult<u8> {
495 if self.is_eof() { return Err(ByteIOError::EOF); }
496 Ok(self.buf[self.pos])
497 }
498
499 fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
b2939bd8 500 let copy_size = if self.buf.len() - self.pos < buf.len() { self.buf.len() - self.pos } else { buf.len() };
90aa4e6b 501 if copy_size == 0 { return Err(ByteIOError::EOF); }
e243ceb4
KS
502 let dst = &mut buf[0..copy_size];
503 dst.copy_from_slice(&self.buf[self.pos..][..copy_size]);
90aa4e6b
KS
504 Ok(copy_size)
505 }
506
794364cf 507 fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
89de616c
KS
508 let read_size = self.peek_buf(buf)?;
509 if read_size < buf.len() { return Err(ByteIOError::EOF); }
510 self.pos += read_size;
511 Ok(read_size)
512 }
513
514 fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
794364cf
KS
515 let read_size = self.peek_buf(buf)?;
516 self.pos += read_size;
517 Ok(read_size)
518 }
519
1ff7036b 520 fn write_buf(&mut self, _buf: &[u8]) -> ByteIOResult<()> {
90aa4e6b
KS
521 Err(ByteIOError::NotImplemented)
522 }
523
524 fn tell(&mut self) -> u64 {
525 self.pos as u64
526 }
527
528 fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> {
1be85e00
KS
529 let cur_pos = self.pos as i64;
530 let cur_size = self.buf.len() as i64;
90aa4e6b
KS
531 match pos {
532 SeekFrom::Start(x) => self.real_seek(x as i64),
533 SeekFrom::Current(x) => self.real_seek(cur_pos + x),
534 SeekFrom::End(x) => self.real_seek(cur_size + x),
535 }
536 }
537
e243ceb4 538 fn is_eof(&self) -> bool {
1be85e00 539 self.pos >= self.buf.len()
90aa4e6b
KS
540 }
541
542 fn is_seekable(&mut self) -> bool {
543 true
544 }
d532000c
KS
545
546 fn size(&mut self) -> i64 {
547 self.buf.len() as i64
548 }
cf095d56
KS
549
550 fn flush(&mut self) -> ByteIOResult<()> { Ok(()) }
90aa4e6b
KS
551}
552
789354a8 553impl<T: Read+Seek> FileReader<T> {
90aa4e6b 554
28884194 555 /// Constructs a new instance of `FileReader`.
789354a8
KS
556 pub fn new_read(file: T) -> Self {
557 FileReader { file: Box::new(file), eof : false }
90aa4e6b 558 }
dee2d2f1
KS
559 /// Constructs a new instance of `FileReader` using a boxed resource.
560 pub fn new_read_boxed(file: Box<T>) -> Self {
561 FileReader { file, eof : false }
562 }
563 /// Destroys the reader and releases the reader resource for a further use.
564 pub fn finish(self) -> Box<T> { self.file }
90aa4e6b
KS
565}
566
789354a8 567impl<T: Read+Seek> ByteIO for FileReader<T> {
90aa4e6b
KS
568 fn read_byte(&mut self) -> ByteIOResult<u8> {
569 let mut byte : [u8; 1] = [0];
e243ceb4
KS
570 let ret = self.file.read(&mut byte);
571 if ret.is_err() { return Err(ByteIOError::ReadError); }
572 let sz = ret.unwrap();
90aa4e6b
KS
573 if sz == 0 { self.eof = true; return Err(ByteIOError::EOF); }
574 Ok (byte[0])
575 }
576
794364cf
KS
577 fn peek_byte(&mut self) -> ByteIOResult<u8> {
578 let b = self.read_byte()?;
579 self.seek(SeekFrom::Current(-1))?;
580 Ok(b)
581 }
582
90aa4e6b 583 fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
6c0356da
KS
584 match self.file.read_exact(buf) {
585 Ok(()) => Ok(buf.len()),
586 Err(err) => {
587 if err.kind() == std::io::ErrorKind::UnexpectedEof {
588 self.eof = true;
589 Err(ByteIOError::EOF)
590 } else {
591 Err(ByteIOError::ReadError)
592 }
593 },
594 }
89de616c
KS
595 }
596
597 fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
e243ceb4
KS
598 let ret = self.file.read(buf);
599 if ret.is_err() { return Err(ByteIOError::ReadError); }
600 let sz = ret.unwrap();
6c0356da 601 if sz < buf.len() {
f88724a8 602 if let Err(_err) = self.file.read_exact(&mut buf[sz..][..1]) {
6c0356da 603 self.eof = true;
f88724a8
KS
604 if sz == 0 {
605 return Err(ByteIOError::EOF);
606 }
6c0356da
KS
607 } else {
608 return Ok(sz + 1);
609 }
610 }
90aa4e6b
KS
611 Ok(sz)
612 }
613
794364cf
KS
614 fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
615 let size = self.read_buf(buf)?;
616 self.seek(SeekFrom::Current(-(size as i64)))?;
617 Ok(size)
618 }
619
1ff7036b 620 fn write_buf(&mut self, _buf: &[u8]) -> ByteIOResult<()> {
90aa4e6b
KS
621 Err(ByteIOError::NotImplemented)
622 }
623
624 fn tell(&mut self) -> u64 {
e6aaad5c 625 self.file.stream_position().unwrap()
90aa4e6b
KS
626 }
627
628 fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> {
629 let res = self.file.seek(pos);
630 match res {
631 Ok(r) => Ok(r),
632 Err(_) => Err(ByteIOError::SeekError),
633 }
634 }
635
e243ceb4 636 fn is_eof(&self) -> bool {
90aa4e6b
KS
637 self.eof
638 }
639
640 fn is_seekable(&mut self) -> bool {
641 true
642 }
d532000c
KS
643
644 fn size(&mut self) -> i64 {
645 -1
646 }
cf095d56
KS
647
648 fn flush(&mut self) -> ByteIOResult<()> { Ok(()) }
d532000c
KS
649}
650
a91a8367
KS
651
652impl<T: Read+Seek> BoundedFileReader<T> {
653
654 /// Constructs a new instance of `BoundedFileReader`. The reader pretends that data before `start` and after `end` (if set) does not exist.
655 pub fn new_read(file: T, start: u64, end: Option<u64>) -> ByteIOResult<Self> {
656 let mut file = Box::new(file);
657 if let Some(epos) = end {
658 if start > epos {
659 return Err(ByteIOError::WrongRange);
660 }
661 }
662 if start > 0 && file.seek(SeekFrom::Start(start)).is_err() {
663 return Err(ByteIOError::SeekError);
664 }
665 Ok(Self { file, start, end, eof : false })
666 }
667 /// Constructs a new instance of `BoundedFileReader` using a boxed resource. The reader pretends that data before `start` and after `end` (if set) does not exist.
668 pub fn new_read_boxed(mut file: Box<T>, start: u64, end: Option<u64>) -> ByteIOResult<Self> {
669 if let Some(epos) = end {
670 if start > epos {
671 return Err(ByteIOError::WrongRange);
672 }
673 }
674 if start > 0 && file.seek(SeekFrom::Start(start)).is_err() {
675 return Err(ByteIOError::SeekError);
676 }
677 Ok(Self { file, start, end, eof : false })
678 }
679 /// Destroys the reader and releases the reader resource for a further use.
680 pub fn finish(self) -> Box<T> { self.file }
681 fn real_tell(&mut self) -> u64 {
e6aaad5c 682 self.file.stream_position().unwrap()
a91a8367
KS
683 }
684 fn max_read_len(&mut self, len: usize) -> usize {
685 if let Some(epos) = self.end {
686 (len as u64).min(epos - self.real_tell()) as usize
687 } else {
688 len
689 }
690 }
691}
692
693impl<T: Read+Seek> ByteIO for BoundedFileReader<T> {
694 fn read_byte(&mut self) -> ByteIOResult<u8> {
695 if let Some(epos) = self.end {
696 if self.real_tell() >= epos {
697 self.eof = true;
698 return Err(ByteIOError::EOF);
699 }
700 }
701 let mut byte : [u8; 1] = [0];
702 let ret = self.file.read(&mut byte);
703 if ret.is_err() { return Err(ByteIOError::ReadError); }
704 let sz = ret.unwrap();
705 if sz == 0 { self.eof = true; return Err(ByteIOError::EOF); }
706 Ok (byte[0])
707 }
708
709 fn peek_byte(&mut self) -> ByteIOResult<u8> {
710 let b = self.read_byte()?;
711 if self.file.seek(SeekFrom::Current(-1)).is_err() {
712 return Err(ByteIOError::SeekError);
713 }
714 Ok(b)
715 }
716
717 fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
52f954a3
KS
718 if let Some(epos) = self.end {
719 if self.real_tell() >= epos {
720 self.eof = true;
721 return Err(ByteIOError::EOF);
722 }
723 }
a91a8367
KS
724 let len = self.max_read_len(buf.len());
725 match self.file.read_exact(&mut buf[..len]) {
726 Ok(()) if len == buf.len() => Ok(buf.len()),
727 Ok(()) => {
728 self.eof = true;
729 Err(ByteIOError::EOF)
730 },
731 Err(err) => {
732 if err.kind() == std::io::ErrorKind::UnexpectedEof {
733 self.eof = true;
734 Err(ByteIOError::EOF)
735 } else {
736 Err(ByteIOError::ReadError)
737 }
738 },
739 }
740 }
741
742 fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
52f954a3
KS
743 if let Some(epos) = self.end {
744 if self.real_tell() >= epos {
745 self.eof = true;
746 return Err(ByteIOError::EOF);
747 }
748 }
a91a8367
KS
749 let len = self.max_read_len(buf.len());
750 let ret = self.file.read(&mut buf[..len]);
751 if ret.is_err() { return Err(ByteIOError::ReadError); }
752 let sz = ret.unwrap();
753 if sz < len {
6a97ae3a 754 if let Ok(1) = self.file.read(&mut buf[sz..][..1]) {
a91a8367
KS
755 return Ok(sz + 1);
756 }
6a97ae3a
KS
757 self.eof = true;
758 if sz == 0 {
759 return Err(ByteIOError::EOF);
760 }
a91a8367
KS
761 }
762 Ok(sz)
763 }
764
765 fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
766 let len = self.max_read_len(buf.len());
767 let size = self.read_buf(&mut buf[..len])?;
768 if self.file.seek(SeekFrom::Current(-(size as i64))).is_err() {
769 return Err(ByteIOError::SeekError);
770 }
771 Ok(size)
772 }
773
1ff7036b 774 fn write_buf(&mut self, _buf: &[u8]) -> ByteIOResult<()> {
a91a8367
KS
775 Err(ByteIOError::NotImplemented)
776 }
777
778 fn tell(&mut self) -> u64 {
e6aaad5c 779 self.file.stream_position().unwrap() - self.start
a91a8367
KS
780 }
781
782 fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> {
783 let res = match pos {
784 SeekFrom::Start(off) => {
785 let dpos = self.start + off;
786 if let Some(epos) = self.end {
787 if dpos > epos {
788 return Err(ByteIOError::WrongRange);
789 }
790 }
791 self.file.seek(SeekFrom::Start(dpos))
792 },
793 SeekFrom::Current(off) => {
794 let dpos = (self.real_tell() as i64) + off;
795 let end = self.end.unwrap_or(dpos as u64);
796 if dpos < 0 || ((dpos as u64) < self.start) || ((dpos as u64) > end) {
797 return Err(ByteIOError::WrongRange);
798 }
799 self.file.seek(pos)
800 },
801 SeekFrom::End(off) => {
802 if let Some(epos) = self.end {
803 let dpos = (epos as i64) + off;
804 if dpos < (self.start as i64) || ((dpos as u64) > epos) {
805 return Err(ByteIOError::WrongRange);
806 }
807 self.file.seek(SeekFrom::Start(dpos as u64))
808 } else {
809 self.file.seek(pos)
810 }
811 },
812 };
813 match res {
814 Ok(r) => Ok(r),
815 Err(_) => Err(ByteIOError::SeekError),
816 }
817 }
818
819 fn is_eof(&self) -> bool {
820 self.eof
821 }
822
823 fn is_seekable(&mut self) -> bool {
824 true
825 }
826
827 fn size(&mut self) -> i64 {
828 -1
829 }
830
831 fn flush(&mut self) -> ByteIOResult<()> { Ok(()) }
832}
833
834
28884194
KS
835/// High-level bytestream writer.
836///
837/// User is supposed to create some writer implementing [`ByteIO`] trait e.g. [`MemoryWriter`] and use it to create `ByteWriter` which can be used for writing e.g. various integer types.
838///
839/// # Examples
840///
841/// ````
842/// use nihav_core::io::byteio::{MemoryWriter,ByteWriter};
843/// # use nihav_core::io::byteio::ByteIOResult;
844///
845/// # fn foo() -> ByteIOResult<()> {
846/// let mut memory = [0u8; 4];
847/// let mut mw = MemoryWriter::new_write(&mut memory);
848/// let mut bw = ByteWriter::new(&mut mw);
849/// let val = bw.write_u16be(42)?; // memory should be [ 0, 42, 0, 0 ]
850/// let val = bw.write_u16le(42)?; // memory should be [ 0, 42, 42, 0 ]
851/// # Ok(())
852/// # }
853/// ````
854///
855/// [`ByteIO`]: ./trait.ByteIO.html
856/// [`MemoryWriter`]: ./struct.MemoryWriter.html
d532000c
KS
857#[allow(dead_code)]
858pub struct ByteWriter<'a> {
ac818eac 859 io: &'a mut dyn ByteIO,
d532000c
KS
860}
861
28884194 862/// Bytestream writer to memory.
d532000c
KS
863pub struct MemoryWriter<'a> {
864 buf: &'a mut [u8],
d532000c
KS
865 pos: usize,
866}
867
789354a8
KS
868/// Bytestream writer to anything implementing `std::io::Write` and `std::io::Seek`.
869pub struct FileWriter<T: Write+Seek> {
870 file: Box<T>,
d532000c
KS
871}
872
422e87e4
KS
873/// Bytestream writer to memory.
874///
875/// Unlike [`MemoryWriter`] which writes to an array of fixed size, `GrowableMemoryWriter` grows output size when output size exceeds capacity.
876///
877/// [`MemoryWriter`]: ./struct.MemoryWriter.html
878pub struct GrowableMemoryWriter<'a> {
879 buf: &'a mut Vec<u8>,
880 pos: usize,
881}
882
d532000c 883impl<'a> ByteWriter<'a> {
28884194 884 /// Constructs a new instance of `ByteWriter`.
ac818eac 885 pub fn new(io: &'a mut dyn ByteIO) -> Self { ByteWriter { io } }
d532000c 886
28884194 887 /// Writes byte array to the output.
d532000c
KS
888 pub fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()> {
889 self.io.write_buf(buf)
890 }
891
28884194 892 /// Writes single byte to the output.
d532000c
KS
893 pub fn write_byte(&mut self, val: u8) -> ByteIOResult<()> {
894 let buf: [u8; 1] = [val];
895 self.io.write_buf(&buf)
896 }
897
28884194 898 /// Writes 16-bit big-endian integer to the output.
d532000c
KS
899 pub fn write_u16be(&mut self, val: u16) -> ByteIOResult<()> {
900 let buf: [u8; 2] = [((val >> 8) & 0xFF) as u8, (val & 0xFF) as u8];
901 self.io.write_buf(&buf)
902 }
903
28884194 904 /// Writes 16-bit little-endian integer to the output.
d532000c
KS
905 pub fn write_u16le(&mut self, val: u16) -> ByteIOResult<()> {
906 let buf: [u8; 2] = [(val & 0xFF) as u8, ((val >> 8) & 0xFF) as u8];
907 self.io.write_buf(&buf)
908 }
909
28884194 910 /// Writes 24-bit big-endian integer to the output.
d532000c
KS
911 pub fn write_u24be(&mut self, val: u32) -> ByteIOResult<()> {
912 let buf: [u8; 3] = [((val >> 16) & 0xFF) as u8, ((val >> 8) & 0xFF) as u8, (val & 0xFF) as u8];
913 self.write_buf(&buf)
914 }
915
28884194 916 /// Writes 24-bit little-endian integer to the output.
d532000c
KS
917 pub fn write_u24le(&mut self, val: u32) -> ByteIOResult<()> {
918 let buf: [u8; 3] = [(val & 0xFF) as u8, ((val >> 8) & 0xFF) as u8, ((val >> 16) & 0xFF) as u8];
919 self.write_buf(&buf)
920 }
921
28884194 922 /// Writes 32-bit big-endian integer to the output.
d532000c
KS
923 pub fn write_u32be(&mut self, val: u32) -> ByteIOResult<()> {
924 self.write_u16be(((val >> 16) & 0xFFFF) as u16)?;
925 self.write_u16be((val & 0xFFFF) as u16)
926 }
927
28884194 928 /// Writes 32-bit little-endian integer to the output.
d532000c
KS
929 pub fn write_u32le(&mut self, val: u32) -> ByteIOResult<()> {
930 self.write_u16le((val & 0xFFFF) as u16)?;
931 self.write_u16le(((val >> 16) & 0xFFFF) as u16)
932 }
933
28884194 934 /// Writes 64-bit big-endian integer to the output.
d532000c 935 pub fn write_u64be(&mut self, val: u64) -> ByteIOResult<()> {
e243ceb4
KS
936 self.write_u32be((val >> 32) as u32)?;
937 self.write_u32be(val as u32)
d532000c
KS
938 }
939
28884194 940 /// Writes 64-bit little-endian integer to the output.
d532000c 941 pub fn write_u64le(&mut self, val: u64) -> ByteIOResult<()> {
e243ceb4
KS
942 self.write_u32le(val as u32)?;
943 self.write_u32le((val >> 32) as u32)
d532000c
KS
944 }
945
28884194 946 /// Writes 32-bit big-endian floating point number to the output.
02a5bdaf
KS
947 pub fn write_f32be(&mut self, val: f32) -> ByteIOResult<()> {
948 self.write_u32be(val.to_bits())
949 }
950
28884194 951 /// Writes 32-bit little-endian floating point number to the output.
02a5bdaf
KS
952 pub fn write_f32le(&mut self, val: f32) -> ByteIOResult<()> {
953 self.write_u32le(val.to_bits())
954 }
955
28884194 956 /// Writes 64-bit big-endian floating point number to the output.
02a5bdaf
KS
957 pub fn write_f64be(&mut self, val: f64) -> ByteIOResult<()> {
958 self.write_u64be(val.to_bits())
959 }
960
28884194 961 /// Writes 64-bit little-endian floating point number to the output.
02a5bdaf
KS
962 pub fn write_f64le(&mut self, val: f64) -> ByteIOResult<()> {
963 self.write_u64le(val.to_bits())
964 }
965
28884194 966 /// Reports the current write position.
d532000c
KS
967 pub fn tell(&mut self) -> u64 {
968 self.io.tell()
969 }
970
28884194 971 /// Seeks to the requested position.
d532000c
KS
972 pub fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> {
973 self.io.seek(pos)
974 }
975
28884194 976 /// Reports the amount of bytes the writer can still write (-1 if unknown).
d532000c
KS
977 pub fn size_left(&mut self) -> i64 {
978 let sz = self.io.size();
979 if sz == -1 { return -1; }
980 sz - (self.tell() as i64)
981 }
cf095d56
KS
982
983 /// Flushes output stream if possible.
984 pub fn flush(&mut self) -> ByteIOResult<()> {
985 self.io.flush()
986 }
d532000c
KS
987}
988
989impl<'a> MemoryWriter<'a> {
990
28884194 991 /// Constructs a new instance of `MemoryWriter`.
d532000c 992 pub fn new_write(buf: &'a mut [u8]) -> Self {
1be85e00 993 MemoryWriter { buf, pos: 0 }
d532000c
KS
994 }
995
996 fn real_seek(&mut self, pos: i64) -> ByteIOResult<u64> {
1be85e00 997 if pos < 0 || (pos as usize) > self.buf.len() {
d532000c
KS
998 return Err(ByteIOError::WrongRange)
999 }
1000 self.pos = pos as usize;
1001 Ok(pos as u64)
1002 }
1003}
1004
1005impl<'a> ByteIO for MemoryWriter<'a> {
d532000c
KS
1006 fn read_byte(&mut self) -> ByteIOResult<u8> {
1007 Err(ByteIOError::NotImplemented)
1008 }
1009
d532000c
KS
1010 fn peek_byte(&mut self) -> ByteIOResult<u8> {
1011 Err(ByteIOError::NotImplemented)
1012 }
1013
1ff7036b 1014 fn read_buf(&mut self, _buf: &mut [u8]) -> ByteIOResult<usize> {
d532000c
KS
1015 Err(ByteIOError::NotImplemented)
1016 }
1017
1ff7036b 1018 fn read_buf_some(&mut self, _buf: &mut [u8]) -> ByteIOResult<usize> {
d532000c
KS
1019 Err(ByteIOError::NotImplemented)
1020 }
1021
1ff7036b 1022 fn peek_buf(&mut self, _buf: &mut [u8]) -> ByteIOResult<usize> {
d532000c
KS
1023 Err(ByteIOError::NotImplemented)
1024 }
1025
1026 fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()> {
1be85e00 1027 if self.pos + buf.len() > self.buf.len() { return Err(ByteIOError::WriteError); }
b36f412c 1028 self.buf[self.pos..][..buf.len()].copy_from_slice(buf);
d532000c
KS
1029 self.pos += buf.len();
1030 Ok(())
1031 }
1032
1033 fn tell(&mut self) -> u64 {
1034 self.pos as u64
1035 }
1036
1037 fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> {
422e87e4
KS
1038 let cur_pos = self.pos as i64;
1039 let cur_size = self.buf.len() as i64;
1040 match pos {
1041 SeekFrom::Start(x) => self.real_seek(x as i64),
1042 SeekFrom::Current(x) => self.real_seek(cur_pos + x),
1043 SeekFrom::End(x) => self.real_seek(cur_size + x),
1044 }
1045 }
1046
1047 fn is_eof(&self) -> bool {
1048 self.pos >= self.buf.len()
1049 }
1050
1051 fn is_seekable(&mut self) -> bool {
1052 true
1053 }
1054
1055 fn size(&mut self) -> i64 {
1056 self.buf.len() as i64
1057 }
cf095d56
KS
1058
1059 fn flush(&mut self) -> ByteIOResult<()> { Ok(()) }
422e87e4
KS
1060}
1061
1062impl<'a> GrowableMemoryWriter<'a> {
1063
1064 /// Constructs a new instance of `GrowableMemoryWriter`.
1065 pub fn new_write(buf: &'a mut Vec<u8>) -> Self {
1066 GrowableMemoryWriter { buf, pos: 0 }
1067 }
1068
1069 fn real_seek(&mut self, pos: i64) -> ByteIOResult<u64> {
1070 if pos < 0 || (pos as usize) > self.buf.len() {
1071 return Err(ByteIOError::WrongRange)
1072 }
1073 self.pos = pos as usize;
1074 Ok(pos as u64)
1075 }
1076}
1077
1078impl<'a> ByteIO for GrowableMemoryWriter<'a> {
422e87e4
KS
1079 fn read_byte(&mut self) -> ByteIOResult<u8> {
1080 Err(ByteIOError::NotImplemented)
1081 }
1082
422e87e4
KS
1083 fn peek_byte(&mut self) -> ByteIOResult<u8> {
1084 Err(ByteIOError::NotImplemented)
1085 }
1086
1ff7036b 1087 fn read_buf(&mut self, _buf: &mut [u8]) -> ByteIOResult<usize> {
422e87e4
KS
1088 Err(ByteIOError::NotImplemented)
1089 }
1090
1ff7036b 1091 fn read_buf_some(&mut self, _buf: &mut [u8]) -> ByteIOResult<usize> {
422e87e4
KS
1092 Err(ByteIOError::NotImplemented)
1093 }
1094
1ff7036b 1095 fn peek_buf(&mut self, _buf: &mut [u8]) -> ByteIOResult<usize> {
422e87e4
KS
1096 Err(ByteIOError::NotImplemented)
1097 }
1098
1099 fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()> {
1100 if self.pos + buf.len() > self.buf.len() {
1101 self.buf.resize(self.pos + buf.len(), 0);
1102 }
b36f412c 1103 self.buf[self.pos..][..buf.len()].copy_from_slice(buf);
422e87e4
KS
1104 self.pos += buf.len();
1105 Ok(())
1106 }
1107
1108 fn tell(&mut self) -> u64 {
1109 self.pos as u64
1110 }
1111
1112 fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> {
1be85e00
KS
1113 let cur_pos = self.pos as i64;
1114 let cur_size = self.buf.len() as i64;
d532000c
KS
1115 match pos {
1116 SeekFrom::Start(x) => self.real_seek(x as i64),
1117 SeekFrom::Current(x) => self.real_seek(cur_pos + x),
1118 SeekFrom::End(x) => self.real_seek(cur_size + x),
1119 }
1120 }
1121
e243ceb4 1122 fn is_eof(&self) -> bool {
1be85e00 1123 self.pos >= self.buf.len()
d532000c
KS
1124 }
1125
1126 fn is_seekable(&mut self) -> bool {
1127 true
1128 }
1129
1130 fn size(&mut self) -> i64 {
1131 self.buf.len() as i64
1132 }
cf095d56
KS
1133
1134 fn flush(&mut self) -> ByteIOResult<()> { Ok(()) }
d532000c
KS
1135}
1136
789354a8 1137impl<T: Write+Seek> FileWriter<T> {
28884194 1138 /// Constructs a new instance of `FileWriter`.
789354a8
KS
1139 pub fn new_write(file: T) -> Self {
1140 FileWriter { file: Box::new(file) }
d532000c
KS
1141 }
1142}
1143
789354a8 1144impl<T: Write+Seek> ByteIO for FileWriter<T> {
d532000c
KS
1145 fn read_byte(&mut self) -> ByteIOResult<u8> {
1146 Err(ByteIOError::NotImplemented)
1147 }
1148
d532000c
KS
1149 fn peek_byte(&mut self) -> ByteIOResult<u8> {
1150 Err(ByteIOError::NotImplemented)
1151 }
1152
1ff7036b 1153 fn read_buf(&mut self, _buf: &mut [u8]) -> ByteIOResult<usize> {
d532000c
KS
1154 Err(ByteIOError::NotImplemented)
1155 }
1156
1ff7036b 1157 fn read_buf_some(&mut self, _buf: &mut [u8]) -> ByteIOResult<usize> {
d532000c
KS
1158 Err(ByteIOError::NotImplemented)
1159 }
1160
1ff7036b 1161 fn peek_buf(&mut self, _buf: &mut [u8]) -> ByteIOResult<usize> {
d532000c
KS
1162 Err(ByteIOError::NotImplemented)
1163 }
1164
1165 fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()> {
1166 match self.file.write_all(buf) {
1167 Ok(()) => Ok(()),
1168 Err(_) => Err(ByteIOError::WriteError),
1169 }
1170 }
1171
1172 fn tell(&mut self) -> u64 {
e6aaad5c 1173 self.file.stream_position().unwrap()
d532000c
KS
1174 }
1175
1176 fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> {
1177 let res = self.file.seek(pos);
1178 match res {
1179 Ok(r) => Ok(r),
1180 Err(_) => Err(ByteIOError::SeekError),
1181 }
1182 }
1183
e243ceb4 1184 fn is_eof(&self) -> bool {
d532000c
KS
1185 false
1186 }
1187
1188 fn is_seekable(&mut self) -> bool {
1189 true
1190 }
1191
1192 fn size(&mut self) -> i64 {
1193 -1
1194 }
cf095d56
KS
1195
1196 fn flush(&mut self) -> ByteIOResult<()> {
1197 match self.file.flush() {
1198 Ok(()) => Ok(()),
1199 Err(_) => Err(ByteIOError::WriteError),
1200 }
1201 }
90aa4e6b
KS
1202}
1203
1204#[cfg(test)]
1205mod test {
1206 use super::*;
1207 use std::fs::File;
1208
1209 #[test]
1210 fn test_read() {
1211 //const DATA : &'static [u8] = include_bytes!("../../assets/file");
1212 let buf: [u8; 64] = [1; 64];
1213 let mut mr = MemoryReader::new_read(&buf);
1214 let mut reader = ByteReader::new(&mut mr);
1215 assert_eq!(reader.read_byte().unwrap(), 0x01u8);
1216 assert_eq!(reader.read_u16le().unwrap(), 0x0101u16);
1217 assert_eq!(reader.read_u24le().unwrap(), 0x010101u32);
1218 assert_eq!(reader.read_u32le().unwrap(), 0x01010101u32);
1219 assert_eq!(reader.read_u64le().unwrap(), 0x0101010101010101u64);
1678d59a 1220 let mut file = File::open("assets/Misc/MaoMacha.asx").unwrap();
90aa4e6b
KS
1221 let mut fr = FileReader::new_read(&mut file);
1222 let mut br2 = ByteReader::new(&mut fr);
1223 assert_eq!(br2.read_byte().unwrap(), 0x30);
1224 assert_eq!(br2.read_u24be().unwrap(), 0x26B275);
1225 assert_eq!(br2.read_u24le().unwrap(), 0xCF668E);
1226 assert_eq!(br2.read_u32be().unwrap(), 0x11A6D900);
1227 assert_eq!(br2.read_u32le().unwrap(), 0xCE6200AA);
1228 }
1229 #[test]
1230 fn test_write() {
d532000c
KS
1231 let mut buf: [u8; 64] = [0; 64];
1232 {
1233 let mut mw = MemoryWriter::new_write(&mut buf);
1234 let mut bw = ByteWriter::new(&mut mw);
1235 bw.write_byte(0x00).unwrap();
1236 bw.write_u16be(0x0102).unwrap();
1237 bw.write_u24be(0x030405).unwrap();
1238 bw.write_u32be(0x06070809).unwrap();
1239 bw.write_u64be(0x0A0B0C0D0E0F1011).unwrap();
1240 bw.write_byte(0x00).unwrap();
1241 bw.write_u16le(0x0201).unwrap();
1242 bw.write_u24le(0x050403).unwrap();
1243 bw.write_u32le(0x09080706).unwrap();
1244 bw.write_u64le(0x11100F0E0D0C0B0A).unwrap();
1245 assert_eq!(bw.size_left(), 28);
1246 }
1247 for i in 0..0x12 {
1248 assert_eq!(buf[(i + 0x00) as usize], i);
1249 assert_eq!(buf[(i + 0x12) as usize], i);
1250 }
90aa4e6b
KS
1251 }
1252}