let magic: [u8; 4] = read_bytes(r)?;
let magic: Magic = magic.try_into().map_err(|_| Error::NotASystemFile)?;
- let eye_catcher = RawString(read_slice(r, 60)?);
+ let eye_catcher = RawString(read_vec(r, 60)?);
let layout_code: [u8; 4] = read_bytes(r)?;
let endian = Endian::identify_u32(2, layout_code)
.or_else(|| Endian::identify_u32(2, layout_code))
let bias: f64 = endian.parse(read_bytes(r)?);
- let creation_date = RawString(read_slice(r, 9)?);
- let creation_time = RawString(read_slice(r, 8)?);
- let file_label = RawString(read_slice(r, 64)?);
+ let creation_date = RawString(read_vec(r, 9)?);
+ let creation_time = RawString(read_vec(r, 8)?);
+ let file_label = RawString(read_vec(r, 64)?);
let _: [u8; 3] = read_bytes(r)?;
Ok(HeaderRecord {
}
fn decode<'a>(&self, input: &'a RawString) -> Cow<'a, str> {
- self.decode_slice(input.as_slice())
+ self.decode_slice(input.0.as_slice())
}
pub fn decode_identifier(&self, input: &RawString) -> Result<Identifier, IdError> {
let missing_value_code: i32 = endian.parse(read_bytes(r)?);
let print_format = Spec(endian.parse(read_bytes(r)?));
let write_format = Spec(endian.parse(read_bytes(r)?));
- let name = RawString(read_slice(r, 8)?);
+ let name = RawString(read_vec(r, 8)?);
let label = match has_variable_label {
0 => None,
1 => {
let len: u32 = endian.parse(read_bytes(r)?);
let read_len = len.min(65535) as usize;
- let label = RawString(read_slice(r, read_len)?);
+ let label = RawString(read_vec(r, read_len)?);
let padding_bytes = Integer::next_multiple_of(&len, &4) - len;
- let _ = read_slice(r, padding_bytes as usize)?;
+ let _ = read_vec(r, padding_bytes as usize)?;
Some(label)
}
}
#[derive(Clone, PartialEq, Default, Eq, PartialOrd, Ord, Hash)]
-pub struct RawString(pub Box<[u8]>);
+pub struct RawString(pub Vec<u8>);
impl RawString {
pub fn spaces(n: usize) -> Self {
pub fn as_encoded(&self, encoding: &'static Encoding) -> EncodedStr<'_> {
EncodedStr::new(&self.0, encoding)
}
- pub fn as_slice(&self) -> &[u8] {
- &*self.0
- }
- pub fn resize(&mut self, len: usize) {
- let mut vec = take(&mut self.0).into_vec();
- vec.resize(len, b' ');
- self.0 = vec.into_boxed_slice();
- }
}
impl From<Cow<'_, [u8]>> for RawString {
fn from(value: Cow<'_, [u8]>) -> Self {
- Self(value.into_owned().into_boxed_slice())
+ Self(value.into_owned())
}
}
impl From<Vec<u8>> for RawString {
fn from(source: Vec<u8>) -> Self {
- Self(source.into_boxed_slice())
- }
-}
-
-impl From<Box<[u8]>> for RawString {
- fn from(source: Box<[u8]>) -> Self {
Self(source)
}
}
impl Debug for RawString {
fn fmt(&self, f: &mut Formatter) -> FmtResult {
- write!(f, "{:?}", default_decode(self.as_slice()))
+ write!(f, "{:?}", default_decode(self.0.as_slice()))
}
}
let value = UntypedValue(read_bytes(r)?);
let label_len: u8 = endian.parse(read_bytes(r)?);
let label_len = label_len as usize;
+ let padded_len = Integer::next_multiple_of(&(label_len + 1), &8);
- let mut label = read_slice(r, label_len)?;
- let padding_len = Integer::next_multiple_of(&(label_len + 1), &8) - (label_len + 1);
- read_slice(r, padding_len)?;
+ let mut label = read_vec(r, padded_len - 1)?;
+ label.truncate(label_len);
labels.push((value, RawString(label)));
}
ext.check_size::<Self>()?;
Ok(Record::Encoding(EncodingRecord(
- String::from_utf8(ext.data.clone().into_vec()).map_err(|_| {
- Warning::BadEncodingName {
- offset: ext.offsets.start,
- }
+ String::from_utf8(ext.data.clone()).map_err(|_| Warning::BadEncodingName {
+ offset: ext.offsets.start,
})?,
)))
}
pub count: u32,
/// `size * count` bytes of data.
- pub data: Box<[u8]>,
+ pub data: Vec<u8>,
}
impl Extension {
});
};
let start_offset = r.stream_position()?;
- let data = read_slice(r, product as usize)?;
+ let data = read_vec(r, product as usize)?;
let end_offset = start_offset + product as u64;
let extension = Extension {
offsets: start_offset..end_offset,
Ok(buf)
}
-fn read_slice<R: Read>(r: &mut R, n: usize) -> Result<Box<[u8]>, IoError> {
- let mut data = vec![0; n].into_boxed_slice();
- r.read_exact(&mut data)?;
- Ok(data)
+fn read_vec<R: Read>(r: &mut R, n: usize) -> Result<Vec<u8>, IoError> {
+ let mut vec = vec![0; n];
+ r.read_exact(&mut vec)?;
+ Ok(vec)
}
fn read_string<R: Read>(r: &mut R, endian: Endian) -> Result<RawString, IoError> {
let length: u32 = endian.parse(read_bytes(r)?);
- Ok(read_slice(r, length as usize)?.into())
+ Ok(read_vec(r, length as usize)?.into())
}
#[derive(Clone, Debug)]