use capstone_sys::*;
use capstone_sys::cs_arch::*;
use capstone_sys::cs_mode::*;
use std::convert::From;
macro_rules! define_cs_enum_wrapper {
( [
$( #[$enum_attr:meta] )*
=> $rust_enum:ident = $cs_enum:ident,
$( #[$cs_to_rust_attrs:meta] )*
,
$( #[$rust_to_cs_attrs:meta] )*
]
$( $( #[$attr:meta] )*
=> $rust_variant:ident = $cs_variant:tt; )* ) => {
$( #[$enum_attr] )*
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq)]
pub enum $rust_enum {
$(
$( #[$attr] )*
$rust_variant,
)*
}
$( #[$cs_to_rust_attrs] )*
impl From<$cs_enum> for $rust_enum {
fn from(other: $cs_enum) -> Self {
match other {
$(
$cs_enum::$cs_variant => $rust_enum::$rust_variant,
)*
}
}
}
$( #[$rust_to_cs_attrs] )*
impl 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;
=> MAX = CS_ARCH_MAX;
=> ALL = CS_ARCH_ALL;
);
define_cs_enum_wrapper!(
[
=> Mode = cs_mode,
#[cfg(other)]
,
]
=> LittleEndian = CS_MODE_LITTLE_ENDIAN;
=> Arm32 = CS_MODE_ARM;
=> Mode16 = CS_MODE_16;
=> Mode32 = CS_MODE_32;
=> Mode64 = CS_MODE_64;
=> Thumb = CS_MODE_THUMB;
=> MClass = CS_MODE_MCLASS;
=> V8 = CS_MODE_V8;
=> Micro = CS_MODE_MICRO;
=> Mips3 = CS_MODE_MIPS3;
=> Mips32R6 = CS_MODE_MIPS32R6;
=> MipsGP64 = CS_MODE_MIPSGP64;
=> V9 = CS_MODE_V9;
=> BigEndian = CS_MODE_BIG_ENDIAN;
=> Mips32 = CS_MODE_MIPS32;
=> Mips64 = CS_MODE_MIPS64;
);
pub(crate) struct OptValue(pub cs_opt_value);
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)
}
}
}