use capstone_sys::*;
use capstone_sys::cs_arch::*;
use capstone_sys::cs_opt_value::*;
use std::convert::From;
macro_rules! define_cs_enum_wrapper {
( [
$( #[$enum_attr:meta] )*
=> $rust_enum:ident = $cs_enum:ty
]
$( $( #[$attr:meta] )*
=> $rust_variant:ident = $cs_variant:tt; )* ) => {
$( #[$enum_attr] )*
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq)]
pub enum $rust_enum {
$(
$( #[$attr] )*
$rust_variant,
)*
}
impl ::std::convert::From<$rust_enum> for $cs_enum {
fn from(other: $rust_enum) -> Self {
match other {
$(
$rust_enum::$rust_variant => $cs_variant,
)*
}
}
}
}
}
define_cs_enum_wrapper!(
[
=> Arch = cs_arch
]
=> ARM = CS_ARCH_ARM;
=> ARM64 = CS_ARCH_ARM64;
=> MIPS = CS_ARCH_MIPS;
=> X86 = CS_ARCH_X86;
=> PPC = CS_ARCH_PPC;
=> SPARC = CS_ARCH_SPARC;
=> SYSZ = CS_ARCH_SYSZ;
=> XCORE = CS_ARCH_XCORE;
);
define_cs_enum_wrapper!(
[
=> Mode = cs_mode
]
=> Arm = CS_MODE_ARM;
=> Mode16 = CS_MODE_16;
=> Mode32 = CS_MODE_32;
=> Mode64 = CS_MODE_64;
=> Thumb = CS_MODE_THUMB;
=> Mips3 = CS_MODE_MIPS3;
=> Mips32R6 = CS_MODE_MIPS32R6;
=> MipsGP64 = CS_MODE_MIPSGP64;
=> V9 = CS_MODE_V9;
=> Default = CS_MODE_LITTLE_ENDIAN;
);
define_cs_enum_wrapper!(
[
=> ExtraMode = cs_mode
]
=> MClass = CS_MODE_MCLASS;
=> V8 = CS_MODE_V8;
=> Micro = CS_MODE_MICRO;
);
define_cs_enum_wrapper!(
[
=> Endian = cs_mode
]
=> Little = CS_MODE_LITTLE_ENDIAN;
=> Big = CS_MODE_BIG_ENDIAN;
);
define_cs_enum_wrapper!(
[
=> Syntax = cs_opt_value::Type
]
=> Intel = CS_OPT_SYNTAX_INTEL;
=> Att = CS_OPT_SYNTAX_ATT;
=> NoRegName = CS_OPT_SYNTAX_NOREGNAME;
);
pub(crate) struct OptValue(pub cs_opt_value::Type);
impl From<bool> for OptValue {
fn from(value: bool) -> Self {
if value {
OptValue(cs_opt_value::CS_OPT_ON)
} else {
OptValue(cs_opt_value::CS_OPT_OFF)
}
}
}