diff options
| author | Jon Palmisciano <jp@jonpalmisc.com> | 2021-07-29 17:14:57 -0400 |
|---|---|---|
| committer | Jon Palmisciano <jp@jonpalmisc.com> | 2021-07-30 13:36:31 -0400 |
| commit | 3e0c457f6067e3360e96b9dbae2665705221a2c5 (patch) | |
| tree | c5b2e307f6861e8917735f6b8a13d9730e0bf093 /datarenderer.cpp | |
| parent | ea8f992f355a9152e0a77fa861d01f39081d9670 (diff) | |
DataRenderer: Create binding for `RenderLinesForData`
Diffstat (limited to 'datarenderer.cpp')
| -rw-r--r-- | datarenderer.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/datarenderer.cpp b/datarenderer.cpp index 18cc8d31..4d3b38ae 100644 --- a/datarenderer.cpp +++ b/datarenderer.cpp @@ -143,6 +143,47 @@ vector<DisassemblyTextLine> DataRenderer::GetLinesForData(BinaryView* data, uint } +vector<DisassemblyTextLine> DataRenderer::RenderLinesForData(BinaryView* data, uint64_t addr, Type* type, + const std::vector<InstructionTextToken>& prefix, size_t width, vector<pair<Type*, size_t>>& context) +{ + BNInstructionTextToken* prefixes = InstructionTextToken::CreateInstructionTextTokenList(prefix); + BNTypeContext* typeCtx = new BNTypeContext[context.size()]; + for (size_t i = 0; i < context.size(); i++) + { + typeCtx[i].type = context[i].first->GetObject(); + typeCtx[i].offset = context[i].second; + } + size_t count = 0; + BNDisassemblyTextLine* lines = BNRenderLinesForData(data->GetObject(), addr, type->GetObject(), prefixes, + prefix.size(), width, &count, typeCtx, context.size()); + + delete[] typeCtx; + for (size_t i = 0; i < prefix.size(); i++) + { + BNFreeString(prefixes[i].text); + for (size_t j = 0; j < prefixes[j].namesCount; j++) + BNFreeString(prefixes[i].typeNames[j]); + delete[] prefixes[i].typeNames; + } + delete[] prefixes; + + vector<DisassemblyTextLine> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + DisassemblyTextLine line; + line.addr = lines[i].addr; + line.instrIndex = lines[i].instrIndex; + line.highlight = lines[i].highlight; + line.tokens = InstructionTextToken::ConvertAndFreeInstructionTextTokenList(lines[i].tokens, lines[i].count); + line.tags = Tag::ConvertAndFreeTagList(lines[i].tags, lines[i].tagCount); + result.push_back(line); + } + + return result; +} + + void DataRendererContainer::RegisterGenericDataRenderer(DataRenderer* renderer) { BNRegisterGenericDataRenderer(BNGetDataRendererContainer(), renderer->GetObject()); |
