1#![allow(non_camel_case_types)]
2#![allow(improper_ctypes)]
3extern crate libc;
4
5pub use api::*;
6pub use itab::*;
7pub use types::*;
8
9mod api;
10mod itab;
11mod types;
12
13#[cfg(test)]
14mod tests {
15 use std::ffi::CStr;
16 use std::mem;
17 use super::*;
18
19 #[test]
20 fn it_works() {
21 let data = [
22 0x8B, 0x04, 0xB2,
24 0x90,
26 ];
27
28 unsafe {
29 let mut object = mem::zeroed();
30 ud_init(&mut object);
31 ud_set_input_buffer(&mut object, data.as_ptr(), data.len());
32 ud_set_mode(&mut object, 32);
33 ud_set_syntax(&mut object, Some(ud_translate_intel));
34
35 assert_eq!(ud_disassemble(&mut object), 3);
36
37 let operand = ud_insn_opr(&object, 0).as_ref().unwrap();
38 assert_eq!(operand.otype, ud_type::UD_OP_REG);
39 assert_eq!(operand.base, ud_type::UD_R_EAX);
40
41 let operand = ud_insn_opr(&object, 1).as_ref().unwrap();
42 assert_eq!(operand.otype, ud_type::UD_OP_MEM);
43 assert_eq!(operand.base, ud_type::UD_R_EDX);
44 assert_eq!(operand.index, ud_type::UD_R_ESI);
45 assert_eq!(operand.scale, 4);
46
47 assert_eq!(ud_disassemble(&mut object), 1);
48 let instruction = ud_insn_asm(&mut object);
49 assert_eq!(CStr::from_ptr(instruction).to_string_lossy(), "nop");
50 }
51 }
52}