summaryrefslogtreecommitdiff
path: root/binaryview.cpp
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2022-05-20 20:42:12 -0400
committerGlenn Smith <glenn@vector35.com>2022-05-25 14:22:45 -0400
commit0569365d79aaeb74aa134f52db13aa54f9619c56 (patch)
treeaaf8f0d9913c08336b761e1130418368bd930ee4 /binaryview.cpp
parentf5715d76bb50fbaaaad450aecf9c192e8450e0d9 (diff)
Add BinaryView::ParseTypesFromSource for clang+typelibs
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;