rabbitizer/
opereand_type.rs

1/* SPDX-FileCopyrightText: © 2022-2024 Decompollaborate */
2/* SPDX-License-Identifier: MIT */
3
4use crate::{instruction, operand_type_enum, utils};
5
6extern "C" {
7    fn RabbitizerOperandType_getBufferSize(
8        operand: operand_type_enum::OperandType,
9        instr: *const instruction::Instruction,
10        immOverrideLength: utils::SizeT,
11    ) -> utils::SizeT;
12
13    fn RabbitizerOperandType_disassemble(
14        operand: operand_type_enum::OperandType,
15        instr: *const instruction::Instruction,
16        dst: *mut core::ffi::c_char,
17        immOverride: *const core::ffi::c_char,
18        immOverrideLength: utils::SizeT,
19    ) -> utils::SizeT;
20}
21
22impl operand_type_enum::OperandType {
23    pub fn disassemble(
24        &self,
25        instr: &instruction::Instruction,
26        imm_override: Option<&str>,
27    ) -> String {
28        let (imm_override_ptr, imm_override_len) = utils::c_string_from_str(imm_override);
29
30        unsafe {
31            let buffer_size = RabbitizerOperandType_getBufferSize(*self, instr, imm_override_len);
32
33            let mut buffer: Vec<u8> = vec![0; buffer_size + 1];
34            let disassembled_size = RabbitizerOperandType_disassemble(
35                *self,
36                instr,
37                buffer.as_mut_ptr() as *mut core::ffi::c_char,
38                imm_override_ptr,
39                imm_override_len,
40            );
41            buffer.truncate(disassembled_size);
42
43            String::from_utf8(buffer).unwrap()
44        }
45    }
46}