use binaryninjacore_sys::BNLlvmServicesDisasmInstruction;
use std::ffi::{CStr, CString};
use std::os::raw::{c_char, c_int};
pub fn disas_instruction(triplet: &str, data: &[u8], address64: u64) -> Option<(usize, String)> {
unsafe {
let triplet = CString::new(triplet).ok()?;
let mut src = data.to_vec();
let mut buf = vec![0u8; 256];
let instr_len = BNLlvmServicesDisasmInstruction(
triplet.as_ptr(),
src.as_mut_ptr(),
src.len() as c_int,
address64,
buf.as_mut_ptr() as *mut c_char,
buf.len(),
);
if instr_len > 0 {
if let Some(z) = buf.iter().position(|&b| b == 0) {
let s = CStr::from_bytes_with_nul(&buf[..=z])
.unwrap()
.to_string_lossy()
.into_owned();
Some((instr_len as usize, s))
} else {
Some((instr_len as usize, String::new()))
}
} else {
None
}
}
}