From 09c85a868bad7e6e1b1b117eefc2c2aa9aaef4be Mon Sep 17 00:00:00 2001 From: Glenn Smith Date: Wed, 16 Feb 2022 17:54:15 -0500 Subject: Clang+TypeParser APIs --- binaryview.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'binaryview.cpp') diff --git a/binaryview.cpp b/binaryview.cpp index d5390ddc..78b653a0 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -3171,6 +3171,64 @@ void BinaryView::DefineUserType(const QualifiedName& name, Ref type) } +struct ProgressCallback +{ + std::function func; +}; + + +void BinaryView::DefineTypes(const vector& types, std::function progress) +{ + BNQualifiedNameAndType* apiTypes = new BNQualifiedNameAndType[types.size()]; + for (size_t i = 0; i < types.size(); i++) + { + apiTypes[i].name = types[i].name.GetAPIObject(); + apiTypes[i].type = types[i].type->GetObject(); + } + + ProgressCallback cb; + cb.func = progress; + BNDefineAnalysisTypes(m_object, apiTypes, types.size(), [](void* ctxt, size_t cur, size_t total) { + ProgressCallback* cb = (ProgressCallback*)ctxt; + if (cb->func) + return cb->func(cur, total); + return true; + }, &cb); + + for (size_t i = 0; i < types.size(); i++) + { + QualifiedName::FreeAPIObject(&apiTypes[i].name); + } + delete [] apiTypes; +} + + +void BinaryView::DefineUserTypes(const vector& types, std::function progress) +{ + BNQualifiedNameAndType* apiTypes = new BNQualifiedNameAndType[types.size()]; + for (size_t i = 0; i < types.size(); i++) + { + apiTypes[i].name = types[i].name.GetAPIObject(); + apiTypes[i].type = types[i].type->GetObject(); + } + + ProgressCallback cb; + cb.func = progress; + BNDefineUserAnalysisTypes(m_object, apiTypes, types.size(), [](void* ctxt, size_t cur, size_t total) { + ProgressCallback* cb = (ProgressCallback*)ctxt; + if (cb->func) + return cb->func(cur, total); + return true; + }, &cb); + + for (size_t i = 0; i < types.size(); i++) + { + QualifiedName::FreeAPIObject(&apiTypes[i].name); + } + delete [] apiTypes; +} + + void BinaryView::UndefineType(const string& id) { BNUndefineAnalysisType(m_object, id.c_str()); -- cgit v1.3.1