summaryrefslogtreecommitdiff
path: root/architecture.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2015-09-04 20:12:16 -0400
committerRusty Wagner <rusty@vector35.com>2015-09-04 20:12:16 -0400
commit78ffcbed6e9153efccb85564a911e4ed90ffb634 (patch)
treeed95d97e1016a59471aba0b6841e295d57501c9e /architecture.cpp
parentfd5865d110b484e7841713a679024c78ca4105c9 (diff)
Add type classes to Python API
Diffstat (limited to 'architecture.cpp')
-rw-r--r--architecture.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/architecture.cpp b/architecture.cpp
index 14e5b780..98e53b5c 100644
--- a/architecture.cpp
+++ b/architecture.cpp
@@ -556,6 +556,73 @@ void Architecture::SetBinaryViewTypeConstant(const string& type, const string& n
}
+bool Architecture::ParseTypesFromSource(const string& source, const string& fileName,
+ map<string, Ref<Type>>& types, map<string, Ref<Type>>& variables,
+ map<string, Ref<Type>>& functions, string& errors,
+ const vector<string>& includeDirs)
+{
+ BNTypeParserResult result;
+ char* errorStr;
+ const char** includeDirList = new const char*[includeDirs.size()];
+
+ for (size_t i = 0; i < includeDirs.size(); i++)
+ includeDirList[i] = includeDirs[i].c_str();
+
+ types.clear();
+ variables.clear();
+ functions.clear();
+
+ bool ok = BNParseTypesFromSource(m_arch, source.c_str(), fileName.c_str(), &result,
+ &errorStr, includeDirList, includeDirs.size());
+ errors = errorStr;
+ BNFreeString(errorStr);
+ if (!ok)
+ return false;
+
+ for (size_t i = 0; i < result.typeCount; i++)
+ types[result.types[i].name] = new Type(BNNewTypeReference(result.types[i].type));
+ for (size_t i = 0; i < result.variableCount; i++)
+ types[result.variables[i].name] = new Type(BNNewTypeReference(result.variables[i].type));
+ for (size_t i = 0; i < result.functionCount; i++)
+ types[result.functions[i].name] = new Type(BNNewTypeReference(result.functions[i].type));
+ BNFreeTypeParserResult(&result);
+ return true;
+}
+
+
+bool Architecture::ParseTypesFromSourceFile(const string& fileName, map<string, Ref<Type>>& types,
+ map<string, Ref<Type>>& variables, map<string, Ref<Type>>& functions,
+ string& errors, const vector<string>& includeDirs)
+{
+ BNTypeParserResult result;
+ char* errorStr;
+ const char** includeDirList = new const char*[includeDirs.size()];
+
+ for (size_t i = 0; i < includeDirs.size(); i++)
+ includeDirList[i] = includeDirs[i].c_str();
+
+ types.clear();
+ variables.clear();
+ functions.clear();
+
+ bool ok = BNParseTypesFromSourceFile(m_arch, fileName.c_str(), &result, &errorStr,
+ includeDirList, includeDirs.size());
+ errors = errorStr;
+ BNFreeString(errorStr);
+ if (!ok)
+ return false;
+
+ for (size_t i = 0; i < result.typeCount; i++)
+ types[result.types[i].name] = new Type(BNNewTypeReference(result.types[i].type));
+ for (size_t i = 0; i < result.variableCount; i++)
+ variables[result.variables[i].name] = new Type(BNNewTypeReference(result.variables[i].type));
+ for (size_t i = 0; i < result.functionCount; i++)
+ functions[result.functions[i].name] = new Type(BNNewTypeReference(result.functions[i].type));
+ BNFreeTypeParserResult(&result);
+ return true;
+}
+
+
CoreArchitecture::CoreArchitecture(BNArchitecture* arch): Architecture(arch)
{
}