mirror of
https://github.com/encounter/decomp-toolkit.git
synced 2025-12-12 06:45:09 +00:00
Update all dependencies
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
use std::{borrow::Cow, ffi::CStr};
|
||||
|
||||
use zerocopy::{big_endian::*, AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{big_endian::*, FromBytes, Immutable, IntoBytes, KnownLayout};
|
||||
|
||||
use crate::static_assert;
|
||||
|
||||
pub const RARC_MAGIC: [u8; 4] = *b"RARC";
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Copy, Clone, Debug, PartialEq, FromBytes, IntoBytes, Immutable, KnownLayout)]
|
||||
#[repr(C, align(4))]
|
||||
pub struct RarcHeader {
|
||||
/// Magic identifier. (Always "RARC")
|
||||
@@ -40,7 +40,7 @@ impl RarcHeader {
|
||||
pub fn data_len(&self) -> u32 { self.data_len.get() }
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Copy, Clone, Debug, PartialEq, FromBytes, IntoBytes, Immutable, KnownLayout)]
|
||||
#[repr(C, align(4))]
|
||||
struct RarcInfo {
|
||||
/// Number of directories in the directory table.
|
||||
@@ -63,7 +63,7 @@ struct RarcInfo {
|
||||
|
||||
static_assert!(size_of::<RarcInfo>() == 0x20);
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Copy, Clone, Debug, PartialEq, FromBytes, IntoBytes, Immutable, KnownLayout)]
|
||||
#[repr(C, align(4))]
|
||||
pub struct RarcNode {
|
||||
/// Index of the node. (0xFFFF for directories)
|
||||
@@ -104,7 +104,7 @@ impl RarcNode {
|
||||
pub fn data_length(&self) -> u32 { self.data_length.get() }
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Copy, Clone, Debug, PartialEq, FromBytes, IntoBytes, Immutable, KnownLayout)]
|
||||
#[repr(C, align(4))]
|
||||
pub struct RarcDirectory {
|
||||
/// Identifier of the directory.
|
||||
@@ -149,7 +149,7 @@ pub struct RarcView<'a> {
|
||||
impl<'a> RarcView<'a> {
|
||||
/// Create a new RARC view from a buffer.
|
||||
pub fn new(buf: &'a [u8]) -> Result<Self, &'static str> {
|
||||
let Some(header) = RarcHeader::ref_from_prefix(buf) else {
|
||||
let Ok((header, remaining)) = RarcHeader::ref_from_prefix(buf) else {
|
||||
return Err("Buffer not large enough for RARC header");
|
||||
};
|
||||
if header.magic != RARC_MAGIC {
|
||||
@@ -161,32 +161,32 @@ impl<'a> RarcView<'a> {
|
||||
|
||||
// All offsets are relative to the _end_ of the header, so we can
|
||||
// just trim the header from the buffer and use the offsets as is.
|
||||
let buf = &buf[size_of::<RarcHeader>()..];
|
||||
let Some(info) = RarcInfo::ref_from_prefix(buf) else {
|
||||
let Ok((info, _)) = RarcInfo::ref_from_prefix(remaining) else {
|
||||
return Err("Buffer not large enough for RARC info");
|
||||
};
|
||||
|
||||
let directory_table_offset = info.directory_offset.get() as usize;
|
||||
let directory_table_size = info.directory_count.get() as usize * size_of::<RarcDirectory>();
|
||||
let directories_buf = buf
|
||||
let directories_buf = remaining
|
||||
.get(directory_table_offset..directory_table_offset + directory_table_size)
|
||||
.ok_or("RARC directory table out of bounds")?;
|
||||
let directories =
|
||||
RarcDirectory::slice_from(directories_buf).ok_or("RARC directory table not aligned")?;
|
||||
let directories = <[RarcDirectory]>::ref_from_bytes(directories_buf)
|
||||
.map_err(|_| "RARC directory table not aligned")?;
|
||||
if directories.is_empty() || directories[0].identifier != *b"ROOT" {
|
||||
return Err("RARC root directory not found");
|
||||
}
|
||||
|
||||
let node_table_offset = info.node_offset.get() as usize;
|
||||
let node_table_size = info.node_count.get() as usize * size_of::<RarcNode>();
|
||||
let nodes_buf = buf
|
||||
let nodes_buf = remaining
|
||||
.get(node_table_offset..node_table_offset + node_table_size)
|
||||
.ok_or("RARC node table out of bounds")?;
|
||||
let nodes = RarcNode::slice_from(nodes_buf).ok_or("RARC node table not aligned")?;
|
||||
let nodes =
|
||||
<[RarcNode]>::ref_from_bytes(nodes_buf).map_err(|_| "RARC node table not aligned")?;
|
||||
|
||||
let string_table_offset = info.string_table_offset.get() as usize;
|
||||
let string_table_size = info.string_table_len.get() as usize;
|
||||
let string_table = buf
|
||||
let string_table = remaining
|
||||
.get(string_table_offset..string_table_offset + string_table_size)
|
||||
.ok_or("RARC string table out of bounds")?;
|
||||
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
use std::{borrow::Cow, ffi::CStr, mem::size_of};
|
||||
|
||||
use anyhow::Result;
|
||||
use zerocopy::{big_endian::U32, AsBytes, FromBytes, FromZeroes};
|
||||
use zerocopy::{big_endian::U32, FromBytes, Immutable, IntoBytes, KnownLayout};
|
||||
|
||||
use crate::static_assert;
|
||||
|
||||
pub const U8_MAGIC: [u8; 4] = [0x55, 0xAA, 0x38, 0x2D];
|
||||
|
||||
/// U8 archive header.
|
||||
#[derive(Clone, Debug, PartialEq, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Clone, Debug, PartialEq, FromBytes, IntoBytes, Immutable, KnownLayout)]
|
||||
#[repr(C, align(4))]
|
||||
pub struct U8Header {
|
||||
magic: [u8; 4],
|
||||
@@ -32,7 +32,7 @@ pub enum U8NodeKind {
|
||||
}
|
||||
|
||||
/// An individual file system node.
|
||||
#[derive(Copy, Clone, Debug, PartialEq, FromBytes, FromZeroes, AsBytes)]
|
||||
#[derive(Copy, Clone, Debug, PartialEq, FromBytes, IntoBytes, Immutable, KnownLayout)]
|
||||
#[repr(C, align(4))]
|
||||
pub struct U8Node {
|
||||
kind: u8,
|
||||
@@ -91,7 +91,7 @@ pub struct U8View<'a> {
|
||||
impl<'a> U8View<'a> {
|
||||
/// Create a new U8 view from a buffer.
|
||||
pub fn new(buf: &'a [u8]) -> Result<Self, &'static str> {
|
||||
let Some(header) = U8Header::ref_from_prefix(buf) else {
|
||||
let Ok((header, _)) = U8Header::ref_from_prefix(buf) else {
|
||||
return Err("Buffer not large enough for U8 header");
|
||||
};
|
||||
if header.magic != U8_MAGIC {
|
||||
@@ -101,7 +101,8 @@ impl<'a> U8View<'a> {
|
||||
let nodes_buf = buf
|
||||
.get(node_table_offset..node_table_offset + header.node_table_size.get() as usize)
|
||||
.ok_or("U8 node table out of bounds")?;
|
||||
let root_node = U8Node::ref_from_prefix(nodes_buf).ok_or("U8 root node not aligned")?;
|
||||
let (root_node, _) =
|
||||
U8Node::ref_from_prefix(nodes_buf).map_err(|_| "U8 root node not aligned")?;
|
||||
if root_node.kind() != U8NodeKind::Directory {
|
||||
return Err("U8 root node is not a directory");
|
||||
}
|
||||
@@ -113,7 +114,8 @@ impl<'a> U8View<'a> {
|
||||
return Err("U8 node table size mismatch");
|
||||
}
|
||||
let (nodes_buf, string_table) = nodes_buf.split_at(node_count * size_of::<U8Node>());
|
||||
let nodes = U8Node::slice_from(nodes_buf).ok_or("U8 node table not aligned")?;
|
||||
let nodes =
|
||||
<[U8Node]>::ref_from_bytes(nodes_buf).map_err(|_| "U8 node table not aligned")?;
|
||||
Ok(Self { header, nodes, string_table })
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user