#![allow(missing_docs)]
use crate::endian::{BigEndian as BE, U16, U32};
use crate::pod::Pod;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct HeaderRecord64 {
pub ptv: [u8; 3],
pub reserved1: [u8; 45],
pub archlvl: U32<BE>,
pub reserved2: [u8; 28],
}
pub const SIZEOF_ESD_DATA: usize = 8;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct SymbolRecord64 {
pub ptv: [u8; 3],
pub symboltype: SymbolType,
pub esdid: U32<BE>,
pub parentesdid: U32<BE>,
pub reserved1: U32<BE>,
pub offset: U32<BE>,
pub reserved2: U32<BE>,
pub length: U32<BE>,
pub eaesdid: U32<BE>,
pub eadataoffset: U32<BE>,
pub reserved3: U32<BE>,
pub namespaceid: u8,
pub symflags: u8,
pub fillbytevalue: u8,
pub reserved4: u8,
pub adaesdid: U32<BE>,
pub priority: U32<BE>,
pub reserved5: [u8; 8],
pub behavioralattributes: [u8; 10],
pub namelength: U16<BE>,
pub name: [u8; SIZEOF_ESD_DATA],
}
pub const SIZEOF_TXT_DATA: usize = 56;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct TextRecord64 {
pub ptv: [u8; 3],
pub recordstyle: u8,
pub elementesdid: U32<BE>,
pub reserved1: U32<BE>,
pub offset: U32<BE>,
pub truelength: U32<BE>,
pub textencoding: U16<BE>,
pub datalength: U16<BE>,
pub data: [u8; SIZEOF_TXT_DATA],
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct RelocationRecord64 {
pub ptv: [u8; 3],
pub reserved: u8,
pub length: U16<BE>,
pub data: [u8; 74],
}
pub const SIZEOF_CONTINUATION_RECORD_DATA: usize = 77;
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct ContinuationRecord64 {
pub ptv: [u8; 3],
pub data: [u8; SIZEOF_CONTINUATION_RECORD_DATA],
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct EndRecord64 {
pub ptv: [u8; 3],
pub flags: u8,
pub amode: u8,
pub reserved1: [u8; 3],
pub recordcnt: U32<BE>,
pub esdid: U32<BE>,
pub reserved2: [u8; 64],
}
pub const RECORD_LEN: u64 = 80;
newtype!(
struct FileFlags(u8);
);
newtype_flag_names!(NAMES_F_FLAGS: FileFlags(u8) = {
F_NO_ENTRY_POINT = 0x00,
F_ENTRY_BY_OFFSET = 0x01,
F_ENTRY_BY_NAME = 0x02,
F_ENTRY_RESERVED = 0x03,
});
pub const F_ENTRY_MASK: u8 = 0x03;
newtype!(
struct RecordType(u8);
);
newtype_flag_names!(NAMES_RECORD_TYPE: RecordType(u8) = {
RT_ESD = 0x00,
RT_TXT = 0x10,
RT_RLD = 0x20,
RT_LEN = 0x30,
RT_END = 0x40,
RT_HDR = 0xF0,
});
pub const GOFF_PREFIX: u8 = 0x03;
pub const GOFF_VERSION: u8 = 0x00;
pub const GOFF_HDR_BYTES: [u8; 3] = [GOFF_PREFIX, RT_HDR.0, GOFF_VERSION];
pub const GOFF_ESD_BYTES: [u8; 3] = [GOFF_PREFIX, RT_ESD.0, GOFF_VERSION];
pub const GOFF_TXT_BYTES: [u8; 3] = [GOFF_PREFIX, RT_TXT.0, GOFF_VERSION];
pub const GOFF_RLD_BYTES: [u8; 3] = [GOFF_PREFIX, RT_RLD.0, GOFF_VERSION];
pub const GOFF_LEN_BYTES: [u8; 3] = [GOFF_PREFIX, RT_LEN.0, GOFF_VERSION];
pub const GOFF_END_BYTES: [u8; 3] = [GOFF_PREFIX, RT_END.0, GOFF_VERSION];
newtype!(
struct SymbolType(u8);
);
newtype_flag_names!(NAMES_SYMBOL_TYPE: SymbolType(u8) = {
ESD_SYMTYPE_SD = 0,
ESD_SYMTYPE_ED = 1,
ESD_SYMTYPE_LD = 2,
ESD_SYMTYPE_PR = 3,
ESD_SYMTYPE_ER = 4,
});
newtype!(
struct EsdNameSpace(u8);
);
newtype_flag_names!(NAMES_ESD_NAMSPACE: EsdNameSpace(u8) = {
ESD_NS_PROGRAM_MANAGEMENT_BINDER = 0,
ESD_NS_NORMAL_NAME = 1,
ESD_NS_PSEUDO_REGISTER = 2,
ESD_NS_PARTS = 3,
});
newtype!(
struct TxtRecordStyle(u8);
);
newtype_flag_names!(NAMES_TXT_RECORD: TxtRecordStyle(u8) = {
TXT_RS_BYTE = 0,
TXT_RS_STRUCTURED = 1,
TXT_RS_UNSTRUCTURED = 2,
});
unsafe_impl_pod!(
HeaderRecord64,
SymbolRecord64,
TextRecord64,
RelocationRecord64,
ContinuationRecord64,
EndRecord64,
);