From 4538fd8e7dfa4259fc3e460c54a6ccb13ca71349 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Tue, 23 Jul 2019 21:52:04 -0400 Subject: Add API to process tokens for integer display types, comments, etc. --- architecture.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) (limited to 'architecture.cpp') diff --git a/architecture.cpp b/architecture.cpp index 5ce21e99..ae665e08 100644 --- a/architecture.cpp +++ b/architecture.cpp @@ -2252,17 +2252,62 @@ void DisassemblyTextRenderer::GetInstructionAnnotations(vector& tokens, uint64_t& displayAddr) + vector& lines) { - BNInstructionTextToken* outTokens = nullptr; + BNDisassemblyTextLine* result = nullptr; size_t count = 0; - if (!BNGetDisassemblyTextRendererInstructionText(m_object, addr, &len, &outTokens, &count, &displayAddr)) + if (!BNGetDisassemblyTextRendererInstructionText(m_object, addr, &len, &result, &count)) return false; - tokens = InstructionTextToken::ConvertAndFreeInstructionTextTokenList(outTokens, count); + + for (size_t i = 0; i < count; i++) + { + DisassemblyTextLine line; + line.addr = result[i].addr; + line.instrIndex = result[i].instrIndex; + line.highlight = result[i].highlight; + line.tokens = InstructionTextToken::ConvertAndFreeInstructionTextTokenList(result[i].tokens, result[i].count); + lines.push_back(line); + } + + BNFreeDisassemblyTextLines(result, count); return true; } +vector DisassemblyTextRenderer::PostProcessInstructionTextLines(uint64_t addr, + size_t len, const vector& lines) +{ + BNDisassemblyTextLine* inLines = new BNDisassemblyTextLine[lines.size()]; + for (size_t i = 0; i < lines.size(); i++) + { + inLines[i].addr = lines[i].addr; + inLines[i].instrIndex = lines[i].instrIndex; + inLines[i].highlight = lines[i].highlight; + inLines[i].tokens = InstructionTextToken::CreateInstructionTextTokenList(lines[i].tokens); + inLines[i].count = lines[i].tokens.size(); + } + + BNDisassemblyTextLine* result = nullptr; + size_t count = 0; + result = BNPostProcessDisassemblyTextRendererLines(m_object, addr, len, inLines, lines.size(), &count); + BNFreeDisassemblyTextLines(inLines, lines.size()); + + vector outLines; + for (size_t i = 0; i < count; i++) + { + DisassemblyTextLine line; + line.addr = result[i].addr; + line.instrIndex = result[i].instrIndex; + line.highlight = result[i].highlight; + line.tokens = InstructionTextToken::ConvertAndFreeInstructionTextTokenList(result[i].tokens, result[i].count); + outLines.push_back(line); + } + + BNFreeDisassemblyTextLines(result, count); + return outLines; +} + + bool DisassemblyTextRenderer::GetDisassemblyText(uint64_t addr, size_t& len, vector& lines) { BNDisassemblyTextLine* result = nullptr; -- cgit v1.3.1