Skip to main content

ms_pdb/utils/
io.rs

1#![allow(missing_docs)]
2
3use std::io::{Read, Seek, SeekFrom, Write};
4use sync_file::ReadAt;
5use zerocopy::{FromBytes, FromZeros, IntoBytes};
6
7pub fn read_struct_at<T: FromBytes + IntoBytes, R: ReadAt>(
8    r: &R,
9    offset: u64,
10) -> std::io::Result<T> {
11    let mut value = T::new_zeroed();
12    r.read_exact_at(value.as_mut_bytes(), offset)?;
13    Ok(value)
14}
15
16pub fn read_struct<T: FromBytes + IntoBytes, R: Read>(r: &mut R) -> std::io::Result<T> {
17    let mut value: T = T::new_zeroed();
18    let value_bytes = value.as_mut_bytes();
19    r.read_exact(value_bytes)?;
20    Ok(value)
21}
22
23pub fn read_boxed_slice<T: FromBytes + IntoBytes, R: Read>(
24    r: &mut R,
25    n: usize,
26) -> std::io::Result<Box<[T]>> {
27    let mut value = <[T]>::new_box_zeroed_with_elems(n).unwrap();
28    r.read_exact(value.as_mut_bytes())?;
29    Ok(value)
30}
31
32pub fn read_boxed_slice_at<T: FromBytes + IntoBytes, R: ReadAt>(
33    r: &mut R,
34    offset: u64,
35    n: usize,
36) -> std::io::Result<Box<[T]>> {
37    let mut value = <[T]>::new_box_zeroed_with_elems(n).unwrap();
38    r.read_exact_at(value.as_mut_bytes(), offset)?;
39    Ok(value)
40}
41
42pub fn write_at<W: Write + Seek>(w: &mut W, pos: u64, data: &[u8]) -> std::io::Result<()> {
43    w.seek(SeekFrom::Start(pos))?;
44    w.write_all(data)
45}