From 048d2212945f43eb88889feaffdcce75633d94ec Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Sun, 20 Jan 2019 15:06:09 -0500 Subject: Add API for parsing multiple types with BinaryView context --- binaryninjaapi.h | 1 + binaryninjacore.h | 3 +++ binaryview.cpp | 24 ++++++++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index f5a59cc0..138d82c1 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -1421,6 +1421,7 @@ namespace BinaryNinja DisassemblySettings* settings); bool ParseTypeString(const std::string& text, QualifiedNameAndType& result, std::string& errors); + bool ParseTypeString(const std::string& text, std::map>& result, std::string& errors); std::map> GetTypes(); Ref GetTypeByName(const QualifiedName& name); diff --git a/binaryninjacore.h b/binaryninjacore.h index 781b1619..ea7803b6 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -2740,7 +2740,10 @@ extern "C" BINARYNINJACOREAPI bool BNParseTypeString(BNBinaryView* view, const char* text, BNQualifiedNameAndType* result, char** errors); + BINARYNINJACOREAPI bool BNParseTypesString(BNBinaryView* view, const char* text, + BNQualifiedNameAndType** result, size_t* count, char** errors); BINARYNINJACOREAPI void BNFreeQualifiedNameAndType(BNQualifiedNameAndType* obj); + BINARYNINJACOREAPI void BNFreeQualifiedNameAndTypeArray(BNQualifiedNameAndType* obj, size_t count); BINARYNINJACOREAPI BNQualifiedNameAndType* BNGetAnalysisTypeList(BNBinaryView* view, size_t* count); BINARYNINJACOREAPI void BNFreeTypeList(BNQualifiedNameAndType* types, size_t count); diff --git a/binaryview.cpp b/binaryview.cpp index 6bd04672..8479c7d0 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -1842,6 +1842,30 @@ bool BinaryView::ParseTypeString(const string& text, QualifiedNameAndType& resul } +bool BinaryView::ParseTypeString(const string& text, std::map>& result, string& errors) +{ + BNQualifiedNameAndType* nt; + char* errorStr; + size_t count; + + if (!BNParseTypesString(m_object, text.c_str(), &nt, &count, &errorStr)) + { + errors = errorStr; + BNFreeString(errorStr); + return false; + } + + for(size_t i = 0; i < count; i++) + { + result[QualifiedName::FromAPIObject(&nt[i].name)] = new Type(BNNewTypeReference(nt[i].type)); + } + BNFreeQualifiedNameAndTypeArray(nt, count); + + errors = ""; + return true; +} + + map> BinaryView::GetTypes() { size_t count; -- cgit v1.3.1