diff options
| author | Rusty Wagner <rusty@vector35.com> | 2015-09-04 20:12:16 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2015-09-04 20:12:16 -0400 |
| commit | 78ffcbed6e9153efccb85564a911e4ed90ffb634 (patch) | |
| tree | ed95d97e1016a59471aba0b6841e295d57501c9e /architecture.cpp | |
| parent | fd5865d110b484e7841713a679024c78ca4105c9 (diff) | |
Add type classes to Python API
Diffstat (limited to 'architecture.cpp')
| -rw-r--r-- | architecture.cpp | 67 |
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) { } |
