summaryrefslogtreecommitdiff
path: root/binaryview.cpp
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2020-06-12 16:27:36 -0400
committerPeter LaFosse <peter@vector35.com>2020-06-23 09:02:48 -0400
commite0fbcc712f8ca31914d2f1e04b7f8b16eff44d66 (patch)
tree1c79e6e76f4d0bdf6dfc09c3cd3036dbf96c56f2 /binaryview.cpp
parent4ffa5187aa0c9589dffac5bf00f3a7dd423578e8 (diff)
Add BinaryView.parse_types_from_string to the python API and update how the underlying BNParseTypesString works
Diffstat (limited to 'binaryview.cpp')
-rw-r--r--binaryview.cpp38
1 files changed, 25 insertions, 13 deletions
diff --git a/binaryview.cpp b/binaryview.cpp
index 0dfd0a8d..287dc94b 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -2466,26 +2466,38 @@ bool BinaryView::ParseTypeString(const string& text, QualifiedNameAndType& resul
}
-bool BinaryView::ParseTypeString(const string& text, std::map<QualifiedName, Ref<Type>>& result, string& errors)
+bool BinaryView::ParseTypeString(const string& source, map<QualifiedName, Ref<Type>>& types,
+ map<QualifiedName, Ref<Type>>& variables, map<QualifiedName, Ref<Type>>& functions, string& errors)
{
- BNQualifiedNameAndType* nt;
+ BNTypeParserResult result;
char* errorStr;
- size_t count;
- if (!BNParseTypesString(m_object, text.c_str(), &nt, &count, &errorStr))
- {
- errors = errorStr;
- BNFreeString(errorStr);
+ types.clear();
+ variables.clear();
+ functions.clear();
+
+ bool ok = BNParseTypesString(m_object, source.c_str(), &result, &errorStr);
+ errors = errorStr;
+ BNFreeString(errorStr);
+ if (!ok)
return false;
- }
- for(size_t i = 0; i < count; i++)
+ for (size_t i = 0; i < result.typeCount; i++)
{
- result[QualifiedName::FromAPIObject(&nt[i].name)] = new Type(BNNewTypeReference(nt[i].type));
+ QualifiedName name = QualifiedName::FromAPIObject(&result.types[i].name);
+ types[name] = new Type(BNNewTypeReference(result.types[i].type));
}
- BNFreeQualifiedNameAndTypeArray(nt, count);
-
- errors = "";
+ for (size_t i = 0; i < result.variableCount; i++)
+ {
+ QualifiedName name = QualifiedName::FromAPIObject(&result.variables[i].name);
+ variables[name] = new Type(BNNewTypeReference(result.variables[i].type));
+ }
+ for (size_t i = 0; i < result.functionCount; i++)
+ {
+ QualifiedName name = QualifiedName::FromAPIObject(&result.functions[i].name);
+ functions[name] = new Type(BNNewTypeReference(result.functions[i].type));
+ }
+ BNFreeTypeParserResult(&result);
return true;
}