use lief_ffi as ffi;
use crate::common::FromFFI;
use crate::pdb::types::PdbType;
use std::marker::PhantomData;
pub struct Simple<'a> {
ptr: cxx::UniquePtr<ffi::PDB_types_Simple>,
_owner: PhantomData<&'a ()>,
}
impl FromFFI<ffi::PDB_types_Simple> for Simple<'_> {
fn from_ffi(cmd: cxx::UniquePtr<ffi::PDB_types_Simple>) -> Self {
Self {
ptr: cmd,
_owner: PhantomData,
}
}
}
#[allow(non_camel_case_types)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum SimpleType {
VOID,
SCHAR,
UCHAR,
RCHAR,
WCHAR,
CHAR16,
CHAR32,
CHAR8,
SBYTE,
UBYTE,
SSHORT,
USHORT,
SINT16,
UINT16,
SLONG,
ULONG,
SINT32,
UINT32,
SQUAD,
UQUAD,
SINT64,
UINT64,
SOCTA,
UOCTA,
SINT128,
UINT128,
FLOAT16,
FLOAT32,
FLOAT32_PARTIAL_PRECISION,
FLOAT48,
FLOAT64,
FLOAT80,
FLOAT128,
COMPLEX16,
COMPLEX32,
COMPLEX32_PARTIAL_PRECISION,
COMPLEX48,
COMPLEX64,
COMPLEX80,
COMPLEX128,
BOOL8,
BOOL16,
BOOL32,
BOOL64,
BOOL128,
UNKNOWN(u32),
}
impl From<u32> for SimpleType {
fn from(value: u32) -> Self {
match value {
0x0003 => SimpleType::VOID,
0x0010 => SimpleType::SCHAR,
0x0020 => SimpleType::UCHAR,
0x0070 => SimpleType::RCHAR,
0x0071 => SimpleType::WCHAR,
0x007a => SimpleType::CHAR16,
0x007b => SimpleType::CHAR32,
0x007c => SimpleType::CHAR8,
0x0068 => SimpleType::SBYTE,
0x0069 => SimpleType::UBYTE,
0x0011 => SimpleType::SSHORT,
0x0021 => SimpleType::USHORT,
0x0072 => SimpleType::SINT16,
0x0073 => SimpleType::UINT16,
0x0012 => SimpleType::SLONG,
0x0022 => SimpleType::ULONG,
0x0074 => SimpleType::SINT32,
0x0075 => SimpleType::UINT32,
0x0013 => SimpleType::SQUAD,
0x0023 => SimpleType::UQUAD,
0x0076 => SimpleType::SINT64,
0x0077 => SimpleType::UINT64,
0x0014 => SimpleType::SOCTA,
0x0024 => SimpleType::UOCTA,
0x0078 => SimpleType::SINT128,
0x0079 => SimpleType::UINT128,
0x0046 => SimpleType::FLOAT16,
0x0040 => SimpleType::FLOAT32,
0x0045 => SimpleType::FLOAT32_PARTIAL_PRECISION,
0x0044 => SimpleType::FLOAT48,
0x0041 => SimpleType::FLOAT64,
0x0042 => SimpleType::FLOAT80,
0x0043 => SimpleType::FLOAT128,
0x0056 => SimpleType::COMPLEX16,
0x0050 => SimpleType::COMPLEX32,
0x0055 => SimpleType::COMPLEX32_PARTIAL_PRECISION,
0x0054 => SimpleType::COMPLEX48,
0x0051 => SimpleType::COMPLEX64,
0x0052 => SimpleType::COMPLEX80,
0x0053 => SimpleType::COMPLEX128,
0x0030 => SimpleType::BOOL8,
0x0031 => SimpleType::BOOL16,
0x0032 => SimpleType::BOOL32,
0x0033 => SimpleType::BOOL64,
0x0034 => SimpleType::BOOL128,
_ => SimpleType::UNKNOWN(value),
}
}
}
impl From<SimpleType> for u32 {
fn from(value: SimpleType) -> u32 {
match value {
SimpleType::VOID => 0x0003,
SimpleType::SCHAR => 0x0010,
SimpleType::UCHAR => 0x0020,
SimpleType::RCHAR => 0x0070,
SimpleType::WCHAR => 0x0071,
SimpleType::CHAR16 => 0x007a,
SimpleType::CHAR32 => 0x007b,
SimpleType::CHAR8 => 0x007c,
SimpleType::SBYTE => 0x0068,
SimpleType::UBYTE => 0x0069,
SimpleType::SSHORT => 0x0011,
SimpleType::USHORT => 0x0021,
SimpleType::SINT16 => 0x0072,
SimpleType::UINT16 => 0x0073,
SimpleType::SLONG => 0x0012,
SimpleType::ULONG => 0x0022,
SimpleType::SINT32 => 0x0074,
SimpleType::UINT32 => 0x0075,
SimpleType::SQUAD => 0x0013,
SimpleType::UQUAD => 0x0023,
SimpleType::SINT64 => 0x0076,
SimpleType::UINT64 => 0x0077,
SimpleType::SOCTA => 0x0014,
SimpleType::UOCTA => 0x0024,
SimpleType::SINT128 => 0x0078,
SimpleType::UINT128 => 0x0079,
SimpleType::FLOAT16 => 0x0046,
SimpleType::FLOAT32 => 0x0040,
SimpleType::FLOAT32_PARTIAL_PRECISION => 0x0045,
SimpleType::FLOAT48 => 0x0044,
SimpleType::FLOAT64 => 0x0041,
SimpleType::FLOAT80 => 0x0042,
SimpleType::FLOAT128 => 0x0043,
SimpleType::COMPLEX16 => 0x0056,
SimpleType::COMPLEX32 => 0x0050,
SimpleType::COMPLEX32_PARTIAL_PRECISION => 0x0055,
SimpleType::COMPLEX48 => 0x0054,
SimpleType::COMPLEX64 => 0x0051,
SimpleType::COMPLEX80 => 0x0052,
SimpleType::COMPLEX128 => 0x0053,
SimpleType::BOOL8 => 0x0030,
SimpleType::BOOL16 => 0x0031,
SimpleType::BOOL32 => 0x0032,
SimpleType::BOOL64 => 0x0033,
SimpleType::BOOL128 => 0x0034,
SimpleType::UNKNOWN(v) => v,
}
}
}
#[allow(non_camel_case_types)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum SimpleMode {
DIRECT,
FAR_POINTER,
HUGE_POINTER,
NEAR_POINTER32,
FAR_POINTER32,
NEAR_POINTER64,
NEAR_POINTER128,
UNKNOWN(u32),
}
impl From<u32> for SimpleMode {
fn from(value: u32) -> Self {
match value {
0x00000000 => SimpleMode::DIRECT,
0x00000200 => SimpleMode::FAR_POINTER,
0x00000300 => SimpleMode::HUGE_POINTER,
0x00000400 => SimpleMode::NEAR_POINTER32,
0x00000500 => SimpleMode::FAR_POINTER32,
0x00000600 => SimpleMode::NEAR_POINTER64,
0x00000700 => SimpleMode::NEAR_POINTER128,
_ => SimpleMode::UNKNOWN(value),
}
}
}
impl From<SimpleMode> for u32 {
fn from(value: SimpleMode) -> u32 {
match value {
SimpleMode::DIRECT => 0x00000000,
SimpleMode::FAR_POINTER => 0x00000200,
SimpleMode::HUGE_POINTER => 0x00000300,
SimpleMode::NEAR_POINTER32 => 0x00000400,
SimpleMode::FAR_POINTER32 => 0x00000500,
SimpleMode::NEAR_POINTER64 => 0x00000600,
SimpleMode::NEAR_POINTER128 => 0x00000700,
SimpleMode::UNKNOWN(v) => v,
}
}
}
impl Simple<'_> {
pub fn is_pointer(&self) -> bool {
self.ptr.is_pointer()
}
pub fn is_signed(&self) -> bool {
self.ptr.is_signed()
}
pub fn get_type(&self) -> SimpleType {
SimpleType::from(self.ptr.get_type())
}
pub fn modes(&self) -> SimpleMode {
SimpleMode::from(self.ptr.modes())
}
}
impl PdbType for Simple<'_> {
fn get_base(&self) -> &ffi::PDB_Type {
self.ptr.as_ref().unwrap().as_ref()
}
}