use std::ffi::{c_char, c_int, c_void};
use crate::Address;
pub const IDAKIT_NONE: u32 = 0xFFFF_FFFF;
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct CaseDesc {
pub values: *const u64,
pub nvalues: usize,
pub body: u32,
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct LocPiece {
pub atype: u32,
pub reg: u32,
pub sval: i64,
pub off: u32,
pub size: u32,
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct LvarLoc {
pub atype: u32,
pub reg1: u32,
pub reg2: u32,
pub sval: i64,
pub pieces: *const LocPiece,
pub npieces: u32,
}
#[repr(C)]
pub struct EmitVtbl {
pub e_num: unsafe extern "C" fn(*mut c_void, Address, u64, u32) -> u32,
pub e_fnum: unsafe extern "C" fn(*mut c_void, Address, f64, u32) -> u32,
pub e_obj:
unsafe extern "C" fn(*mut c_void, Address, Address, *const c_char, usize, u32) -> u32,
pub e_var: unsafe extern "C" fn(*mut c_void, Address, u32, u32) -> u32,
pub e_str: unsafe extern "C" fn(*mut c_void, Address, *const c_char, usize, u32) -> u32,
pub e_helper: unsafe extern "C" fn(*mut c_void, Address, *const c_char, usize, u32) -> u32,
pub e_call: unsafe extern "C" fn(*mut c_void, Address, u32, *const u32, usize, u32) -> u32,
pub e_memref: unsafe extern "C" fn(*mut c_void, Address, u32, u32, u32) -> u32,
pub e_memptr: unsafe extern "C" fn(*mut c_void, Address, u32, u32, u32) -> u32,
pub e_deref: unsafe extern "C" fn(*mut c_void, Address, u32, u32, u32) -> u32,
pub e_op: unsafe extern "C" fn(*mut c_void, Address, u32, u32, u32, u32, u32) -> u32,
pub s_block: unsafe extern "C" fn(*mut c_void, Address, *const u32, usize) -> u32,
pub s_expr: unsafe extern "C" fn(*mut c_void, Address, u32) -> u32,
pub s_if: unsafe extern "C" fn(*mut c_void, Address, u32, u32, u32) -> u32,
pub s_for: unsafe extern "C" fn(*mut c_void, Address, u32, u32, u32, u32) -> u32,
pub s_while: unsafe extern "C" fn(*mut c_void, Address, u32, u32) -> u32,
pub s_do: unsafe extern "C" fn(*mut c_void, Address, u32, u32) -> u32,
pub s_switch: unsafe extern "C" fn(*mut c_void, Address, u32, *const CaseDesc, usize) -> u32,
pub s_break: unsafe extern "C" fn(*mut c_void, Address) -> u32,
pub s_continue: unsafe extern "C" fn(*mut c_void, Address) -> u32,
pub s_return: unsafe extern "C" fn(*mut c_void, Address, u32) -> u32,
pub s_goto: unsafe extern "C" fn(*mut c_void, Address, i32) -> u32,
pub s_asm: unsafe extern "C" fn(*mut c_void, Address, *const u64, usize) -> u32,
pub s_try: unsafe extern "C" fn(*mut c_void, Address, u32, *const u32, usize) -> u32,
pub s_throw: unsafe extern "C" fn(*mut c_void, Address, u32) -> u32,
pub s_empty: unsafe extern "C" fn(*mut c_void, Address) -> u32,
pub l_lvar: unsafe extern "C" fn(
*mut c_void,
*const c_char,
usize,
u32,
u32,
u32,
*const c_char,
usize,
*const LvarLoc,
),
}
unsafe extern "C" {
pub fn idakit_hexrays_init() -> c_int;
pub fn idakit_cfunc_walk_ctree(
cfunc: *mut c_void,
vtbl: *const EmitVtbl,
ctx: *mut c_void,
visitor: *mut c_void,
root: *mut u32,
) -> c_int;
}