diff --git a/src/elements/mod.rs b/src/elements/mod.rs index c273d4b..62be0e3 100644 --- a/src/elements/mod.rs +++ b/src/elements/mod.rs @@ -4,9 +4,9 @@ use std::error; use std::fmt; use std::io; +mod primitives; mod module; mod section; -mod primitives; mod types; mod import_entry; mod export_entry; diff --git a/src/elements/primitives.rs b/src/elements/primitives.rs index c200b23..b550691 100644 --- a/src/elements/primitives.rs +++ b/src/elements/primitives.rs @@ -2,6 +2,23 @@ use std::io; use byteorder::{LittleEndian, ByteOrder}; use super::{Error, Deserialize, Serialize}; +macro_rules! buffered_read { + ($buffer_size: expr, $length: expr, $reader: expr) => { + { + let mut vec_buf = Vec::new(); + let mut total_read = 0; + let mut buf = [0u8; $buffer_size]; + while total_read < $length { + let next_to_read = if $length - total_read > $buffer_size { $buffer_size } else { $length - total_read }; + $reader.read_exact(&mut buf[0..next_to_read])?; + vec_buf.extend_from_slice(&buf[0..next_to_read]); + total_read += next_to_read; + } + vec_buf + } + } +} + /// Unsigned variable-length integer, limited to 32 bits, /// represented by at most 5 bytes that may contain padding 0x80 bytes. #[derive(Debug, Copy, Clone)] @@ -494,18 +511,7 @@ impl Deserialize for String { fn deserialize(reader: &mut R) -> Result { let length = u32::from(VarUint32::deserialize(reader)?) as usize; if length > 0 { - let mut str_buf = Vec::new(); - - let mut total_read = 0; - let mut buf = [0u8; 65536]; - while total_read < length { - let next_to_read = if length - total_read > 65536 { 65536 } else { length - total_read }; - reader.read_exact(&mut buf[0..next_to_read])?; - str_buf.extend_from_slice(&buf[0..next_to_read]); - total_read += next_to_read; - } - - String::from_utf8(str_buf).map_err(|_| Error::NonUtf8String) + String::from_utf8(buffered_read!(1024, length, reader)).map_err(|_| Error::NonUtf8String) } else { Ok(String::new()) @@ -609,6 +615,7 @@ impl, T: IntoIterator> Serialize f } } + #[cfg(test)] mod tests {