#include "ffi.h" #include "binaryninjaapi.h" using namespace BinaryNinja; using namespace std; char BN_API_PTR* BinaryNinja::AllocApiString(const char* string) { return strdup(string); } void BinaryNinja::AllocApiString(const char* string, char BN_API_PTR** output) { *output = AllocApiString(string); } char BN_API_PTR* BinaryNinja::AllocApiString(const string& string) { return AllocApiString(string.c_str()); } void BinaryNinja::AllocApiString(const string& string, char BN_API_PTR** output) { AllocApiString(string.c_str(), output); } char BN_API_PTR* BN_API_PTR* BinaryNinja::AllocApiStringList(const char* const* stringList, size_t count) { char BN_API_PTR* BN_API_PTR* result = new char*[count]; for (size_t i = 0; i < count; i++) { result[i] = AllocApiString(stringList[i]); } return result; } void BinaryNinja::AllocApiStringList(const char* const* stringList, size_t count, char BN_API_PTR* BN_API_PTR** output) { *output = AllocApiStringList(stringList, count); } char BN_API_PTR* BN_API_PTR* BinaryNinja::AllocApiStringList(const vector& stringList, size_t* count) { *count = stringList.size(); vector intermediate; intermediate.reserve(*count); for (const auto& string: stringList) { intermediate.push_back(string.c_str()); } return AllocApiStringList(intermediate.data(), *count); } void BinaryNinja::AllocApiStringList(const vector& stringList, char BN_API_PTR* BN_API_PTR** output, size_t* count) { *count = stringList.size(); vector intermediate; intermediate.reserve(*count); for (const auto& string: stringList) { intermediate.push_back(string.c_str()); } AllocApiStringList(intermediate.data(), *count, output); } char BN_API_PTR* BN_API_PTR* BinaryNinja::AllocApiStringList(const set& stringList, size_t* count) { *count = stringList.size(); vector intermediate; intermediate.reserve(*count); for (const auto& string: stringList) { intermediate.push_back(string.c_str()); } return AllocApiStringList(intermediate.data(), *count); } void BinaryNinja::AllocApiStringList(const set& stringList, char BN_API_PTR* BN_API_PTR** output, size_t* count) { *count = stringList.size(); vector intermediate; intermediate.reserve(*count); for (const auto& string: stringList) { intermediate.push_back(string.c_str()); } AllocApiStringList(intermediate.data(), *count, output); } char BN_API_PTR* BN_API_PTR* BinaryNinja::AllocApiStringList(const unordered_set& stringList, size_t* count) { *count = stringList.size(); vector intermediate; intermediate.reserve(*count); for (const auto& string: stringList) { intermediate.push_back(string.c_str()); } return AllocApiStringList(intermediate.data(), *count); } void BinaryNinja::AllocApiStringList(const unordered_set& stringList, char BN_API_PTR* BN_API_PTR** output, size_t* count) { *count = stringList.size(); vector intermediate; intermediate.reserve(*count); for (const auto& string: stringList) { intermediate.push_back(string.c_str()); } AllocApiStringList(intermediate.data(), *count, output); } void BinaryNinja::AllocApiStringPairList(const vector>& stringPairList, char BN_API_PTR* BN_API_PTR** outputKeys, char BN_API_PTR* BN_API_PTR** outputValues, size_t* count) { *count = stringPairList.size(); vector intermediateKeys; vector intermediateValues; intermediateKeys.reserve(*count); intermediateValues.reserve(*count); for (const auto& pair: stringPairList) { intermediateKeys.push_back(pair.first.c_str()); intermediateValues.push_back(pair.second.c_str()); } AllocApiStringList(intermediateKeys.data(), *count, outputKeys); AllocApiStringList(intermediateValues.data(), *count, outputValues); } void BinaryNinja::AllocApiStringPairList(const map& stringPairList, char BN_API_PTR* BN_API_PTR** outputKeys, char BN_API_PTR* BN_API_PTR** outputValues, size_t* count) { *count = stringPairList.size(); vector intermediateKeys; vector intermediateValues; intermediateKeys.reserve(*count); intermediateValues.reserve(*count); for (const auto& pair: stringPairList) { intermediateKeys.push_back(pair.first.c_str()); intermediateValues.push_back(pair.second.c_str()); } AllocApiStringList(intermediateKeys.data(), *count, outputKeys); AllocApiStringList(intermediateValues.data(), *count, outputValues); } void BinaryNinja::AllocApiStringPairList(const unordered_map& stringPairList, char BN_API_PTR* BN_API_PTR** outputKeys, char BN_API_PTR* BN_API_PTR** outputValues, size_t* count) { *count = stringPairList.size(); vector intermediateKeys; vector intermediateValues; intermediateKeys.reserve(*count); intermediateValues.reserve(*count); for (const auto& pair: stringPairList) { intermediateKeys.push_back(pair.first.c_str()); intermediateValues.push_back(pair.second.c_str()); } AllocApiStringList(intermediateKeys.data(), *count, outputKeys); AllocApiStringList(intermediateValues.data(), *count, outputValues); } string BinaryNinja::ParseString(const char* string) { return string; } vector BinaryNinja::ParseStringList(const char* const* stringList, size_t count) { vector result; result.reserve(count); for (size_t i = 0; i < count; i ++) { result.push_back(stringList[i]); } return result; } set BinaryNinja::ParseStringSet(const char* const* stringList, size_t count) { set result; for (size_t i = 0; i < count; i ++) { result.insert(stringList[i]); } return result; } unordered_set BinaryNinja::ParseStringUnorderedSet(const char* const* stringList, size_t count) { unordered_set result; result.reserve(count); for (size_t i = 0; i < count; i ++) { result.insert(stringList[i]); } return result; } vector> BinaryNinja::ParseStringPairList(const char* const* keys, const char* const* values, size_t count) { vector> result; result.reserve(count); for (size_t i = 0; i < count; i ++) { result.push_back({keys[i], values[i]}); } return result; } map BinaryNinja::ParseStringMap(const char* const* keys, const char* const* values, size_t count) { map result; for (size_t i = 0; i < count; i ++) { result.insert({keys[i], values[i]}); } return result; } unordered_map BinaryNinja::ParseStringUnorderedMap(const char* const* keys, const char* const* values, size_t count) { unordered_map result; result.reserve(count); for (size_t i = 0; i < count; i ++) { result.insert({keys[i], values[i]}); } return result; } void BinaryNinja::FreeApiString(char BN_API_PTR* string) { // Allocated with strdup() free(string); } void BinaryNinja::FreeApiStringList(char BN_API_PTR* BN_API_PTR* stringList, size_t count) { for (size_t i = 0; i < count; i++) { FreeApiString(stringList[i]); } delete[] stringList; } void BinaryNinja::FreeApiStringPairList(char BN_API_PTR* BN_API_PTR* keys, char BN_API_PTR* BN_API_PTR* values, size_t count) { FreeApiStringList(keys, count); FreeApiStringList(values, count); } void BinaryNinja::FreeCoreString(char BN_CORE_PTR* string) { BNFreeString(string); } void BinaryNinja::FreeCoreStringList(char BN_CORE_PTR* BN_CORE_PTR* stringList, size_t count) { BNFreeStringList(stringList, count); } void BinaryNinja::FreeCoreStringPairList(char BN_CORE_PTR* BN_CORE_PTR* keys, char BN_CORE_PTR* BN_CORE_PTR* values, size_t count) { FreeCoreStringList(keys, count); FreeCoreStringList(values, count); }