summaryrefslogtreecommitdiff
path: root/binaryview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'binaryview.cpp')
-rw-r--r--binaryview.cpp75
1 files changed, 74 insertions, 1 deletions
diff --git a/binaryview.cpp b/binaryview.cpp
index 21a37bee..35097619 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -3039,7 +3039,11 @@ bool BinaryView::ParseTypeString(const string& source, map<QualifiedName, Ref<Ty
i++;
}
- bool ok = BNParseTypesString(m_object, source.c_str(), &result, &errorStr, &typesList);
+ vector<const char*> options;
+ vector<const char*> includeDirs;
+
+ bool ok = BNParseTypesString(m_object, source.c_str(), options.data(), options.size(),
+ includeDirs.data(), includeDirs.size(), &result, &errorStr, &typesList);
if (errorStr)
{
errors = errorStr;
@@ -3068,6 +3072,75 @@ bool BinaryView::ParseTypeString(const string& source, map<QualifiedName, Ref<Ty
}
+bool BinaryView::ParseTypesFromSource(const string& source, const vector<string>& options, const vector<string>& includeDirs,
+ TypeParserResult& result, string& errors, const std::set<QualifiedName>& typesAllowRedefinition)
+{
+ BNQualifiedNameList typesList;
+ typesList.count = typesAllowRedefinition.size();
+ typesList.names = new BNQualifiedName[typesList.count];
+ size_t i = 0;
+ for (auto& type : typesAllowRedefinition)
+ {
+ typesList.names[i] = type.GetAPIObject();
+ i++;
+ }
+
+ vector<const char*> coreOptions;
+ for (auto& option : options)
+ coreOptions.push_back(option.c_str());
+
+ vector<const char*> coreIncludeDirs;
+ for (auto& includeDir : includeDirs)
+ coreIncludeDirs.push_back(includeDir.c_str());
+
+ BNTypeParserResult apiResult;
+ char* errorStr = nullptr;
+
+ bool ok = BNParseTypesString(m_object, source.c_str(), coreOptions.data(), coreOptions.size(),
+ coreIncludeDirs.data(), coreIncludeDirs.size(), &apiResult, &errorStr, &typesList);
+ if (errorStr)
+ {
+ errors = errorStr;
+ BNFreeString(errorStr);
+ }
+ if (!ok)
+ return false;
+
+ result.types.clear();
+ for (size_t j = 0; j < apiResult.typeCount; ++j)
+ {
+ result.types.push_back({
+ QualifiedName::FromAPIObject(&apiResult.types[j].name),
+ new Type(BNNewTypeReference(apiResult.types[j].type)),
+ apiResult.types[j].isUser
+ });
+ }
+
+ result.variables.clear();
+ for (size_t j = 0; j < apiResult.variableCount; ++j)
+ {
+ result.variables.push_back({
+ QualifiedName::FromAPIObject(&apiResult.variables[j].name),
+ new Type(BNNewTypeReference(apiResult.variables[j].type)),
+ apiResult.types[j].isUser
+ });
+ }
+
+ result.functions.clear();
+ for (size_t j = 0; j < apiResult.functionCount; ++j)
+ {
+ result.functions.push_back({
+ QualifiedName::FromAPIObject(&apiResult.functions[j].name),
+ new Type(BNNewTypeReference(apiResult.functions[j].type)),
+ apiResult.types[j].isUser
+ });
+ }
+
+ BNFreeTypeParserResult(&apiResult);
+ return true;
+}
+
+
map<QualifiedName, Ref<Type>> BinaryView::GetTypes()
{
size_t count;