diff options
| -rw-r--r-- | binaryninjaapi.h | 130 | ||||
| -rw-r--r-- | binaryninjacore.h | 6 | ||||
| -rw-r--r-- | relocationhandler.cpp | 3 | ||||
| -rw-r--r-- | type.cpp | 235 |
4 files changed, 293 insertions, 81 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 678caa06..475cede6 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -644,53 +644,6 @@ namespace BinaryNinja std::string GetUniqueIdentifierString(); - class QualifiedName - { - std::vector<std::string> m_name; - - public: - QualifiedName(); - QualifiedName(const std::string& name); - QualifiedName(const std::vector<std::string>& name); - QualifiedName(const QualifiedName& name); - - QualifiedName& operator=(const std::string& name); - QualifiedName& operator=(const std::vector<std::string>& name); - QualifiedName& operator=(const QualifiedName& name); - - bool operator==(const QualifiedName& other) const; - bool operator!=(const QualifiedName& other) const; - bool operator<(const QualifiedName& other) const; - - QualifiedName operator+(const QualifiedName& other) const; - - std::string& operator[](size_t i); - const std::string& operator[](size_t i) const; - std::vector<std::string>::iterator begin(); - std::vector<std::string>::iterator end(); - std::vector<std::string>::const_iterator begin() const; - std::vector<std::string>::const_iterator end() const; - std::string& front(); - const std::string& front() const; - std::string& back(); - const std::string& back() const; - void insert(std::vector<std::string>::iterator loc, const std::string& name); - void insert(std::vector<std::string>::iterator loc, std::vector<std::string>::iterator b, - std::vector<std::string>::iterator e); - void erase(std::vector<std::string>::iterator i); - void clear(); - void push_back(const std::string& name); - // Returns count of names - size_t size() const; - // Returns size of output string - size_t StringSize() const; - std::string GetString() const; - - BNQualifiedName GetAPIObject() const; - static void FreeAPIObject(BNQualifiedName* name); - static QualifiedName FromAPIObject(BNQualifiedName* name); - }; - class DataBuffer { BNDataBuffer* m_buffer; @@ -2097,6 +2050,89 @@ namespace BinaryNinja Variable location; }; + class NameList + { + protected: + std::string m_join; + std::vector<std::string> m_name; + public: + NameList(const std::string& join); + NameList(const std::string& name, const std::string& join); + NameList(const std::vector<std::string>& name, const std::string& join); + NameList(const NameList& name, const std::string& join); + + virtual NameList& operator=(const std::string& name); + virtual NameList& operator=(const std::vector<std::string>& name); + virtual NameList& operator=(const NameList& name); + + virtual bool operator==(const NameList& other) const; + virtual bool operator!=(const NameList& other) const; + virtual bool operator<(const NameList& other) const; + + virtual NameList operator+(const NameList& other) const; + + virtual std::string& operator[](size_t i); + virtual const std::string& operator[](size_t i) const; + virtual std::vector<std::string>::iterator begin(); + virtual std::vector<std::string>::iterator end(); + virtual std::vector<std::string>::const_iterator begin() const; + virtual std::vector<std::string>::const_iterator end() const; + virtual std::string& front(); + virtual const std::string& front() const; + virtual std::string& back(); + virtual const std::string& back() const; + virtual void insert(std::vector<std::string>::iterator loc, const std::string& name); + virtual void insert(std::vector<std::string>::iterator loc, std::vector<std::string>::iterator b, + std::vector<std::string>::iterator e); + virtual void erase(std::vector<std::string>::iterator i); + virtual void clear(); + virtual void push_back(const std::string& name); + virtual size_t size() const; + virtual size_t StringSize() const; + + virtual std::string GetString() const; + + BNNameList GetAPIObject() const; + static void FreeAPIObject(BNNameList* name); + static NameList FromAPIObject(BNNameList* name); + }; + + class QualifiedName: public NameList + { + public: + QualifiedName(); + QualifiedName(const std::string& name); + QualifiedName(const std::vector<std::string>& name); + QualifiedName(const QualifiedName& name); + + virtual QualifiedName& operator=(const std::string& name); + virtual QualifiedName& operator=(const std::vector<std::string>& name); + virtual QualifiedName& operator=(const QualifiedName& name); + virtual QualifiedName operator+(const QualifiedName& other) const; + + BNQualifiedName GetAPIObject() const; + static void FreeAPIObject(BNQualifiedName* name); + static QualifiedName FromAPIObject(BNQualifiedName* name); + }; + + class NameSpace: public NameList + { + public: + NameSpace(); + NameSpace(const std::string& name); + NameSpace(const std::vector<std::string>& name); + NameSpace(const NameSpace& name); + + virtual NameSpace& operator=(const std::string& name); + virtual NameSpace& operator=(const std::vector<std::string>& name); + virtual NameSpace& operator=(const NameSpace& name); + virtual NameSpace operator+(const NameSpace& other) const; + + BNNameSpace GetAPIObject() const; + static void FreeAPIObject(BNNameSpace* name); + static NameSpace FromAPIObject(BNNameSpace* name); + }; + struct QualifiedNameAndType { QualifiedName name; diff --git a/binaryninjacore.h b/binaryninjacore.h index cf84fdc5..c7bcb187 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -997,12 +997,16 @@ extern "C" bool (*navigate)(void* ctxt, const char* view, uint64_t offset); }; - struct BNQualifiedName + struct BNNameList { char** name; + char* join; size_t nameCount; }; + typedef BNNameList BNQualifiedName; + typedef BNNameList BNNameSpace; + struct BNBinaryDataNotification { void* context; diff --git a/relocationhandler.cpp b/relocationhandler.cpp index 2f0cbbde..cda9bf0d 100644 --- a/relocationhandler.cpp +++ b/relocationhandler.cpp @@ -79,6 +79,9 @@ bool RelocationHandler::ApplyRelocationCallback(void* ctxt, BNBinaryView* view, bool RelocationHandler::GetRelocationInfo(Ref<BinaryView> view, Ref<Architecture> arch, std::vector<BNRelocationInfo>& result) { + (void)view; + (void)arch; + (void)result; return false; } @@ -24,180 +24,180 @@ using namespace BinaryNinja; using namespace std; -QualifiedName::QualifiedName() +NameList::NameList(const string& join): m_join(join) { } -QualifiedName::QualifiedName(const string& name) +NameList::NameList(const string& name, const string& join): m_join(join) { m_name.push_back(name); } -QualifiedName::QualifiedName(const vector<string>& name): m_name(name) +NameList::NameList(const vector<string>& name, const string& join): m_join(join), m_name(name) { } -QualifiedName::QualifiedName(const QualifiedName& name): m_name(name.m_name) +NameList::NameList(const NameList& name, const string& join): m_join(join), m_name(name.m_name) { } -QualifiedName& QualifiedName::operator=(const string& name) +NameList& NameList::operator=(const string& name) { m_name = vector<string>{name}; return *this; } -QualifiedName& QualifiedName::operator=(const vector<string>& name) +NameList& NameList::operator=(const vector<string>& name) { m_name = name; return *this; } -QualifiedName& QualifiedName::operator=(const QualifiedName& name) +NameList& NameList::operator=(const NameList& name) { m_name = name.m_name; return *this; } -bool QualifiedName::operator==(const QualifiedName& other) const +bool NameList::operator==(const NameList& other) const { return m_name == other.m_name; } -bool QualifiedName::operator!=(const QualifiedName& other) const +bool NameList::operator!=(const NameList& other) const { return m_name != other.m_name; } -bool QualifiedName::operator<(const QualifiedName& other) const +bool NameList::operator<(const NameList& other) const { return m_name < other.m_name; } -QualifiedName QualifiedName::operator+(const QualifiedName& other) const +NameList NameList::operator+(const NameList& other) const { - QualifiedName result(*this); + NameList result(*this); result.m_name.insert(result.m_name.end(), other.m_name.begin(), other.m_name.end()); return result; } -string& QualifiedName::operator[](size_t i) +string& NameList::operator[](size_t i) { return m_name[i]; } -const string& QualifiedName::operator[](size_t i) const +const string& NameList::operator[](size_t i) const { return m_name[i]; } -vector<string>::iterator QualifiedName::begin() +vector<string>::iterator NameList::begin() { return m_name.begin(); } -vector<string>::iterator QualifiedName::end() +vector<string>::iterator NameList::end() { return m_name.end(); } -vector<string>::const_iterator QualifiedName::begin() const +vector<string>::const_iterator NameList::begin() const { return m_name.begin(); } -vector<string>::const_iterator QualifiedName::end() const +vector<string>::const_iterator NameList::end() const { return m_name.end(); } -string& QualifiedName::front() +string& NameList::front() { return m_name.front(); } -const string& QualifiedName::front() const +const string& NameList::front() const { return m_name.front(); } -string& QualifiedName::back() +string& NameList::back() { return m_name.back(); } -const string& QualifiedName::back() const +const string& NameList::back() const { return m_name.back(); } -void QualifiedName::insert(vector<string>::iterator loc, const string& name) +void NameList::insert(vector<string>::iterator loc, const string& name) { m_name.insert(loc, name); } -void QualifiedName::insert(vector<string>::iterator loc, vector<string>::iterator b, vector<string>::iterator e) +void NameList::insert(vector<string>::iterator loc, vector<string>::iterator b, vector<string>::iterator e) { m_name.insert(loc, b, e); } -void QualifiedName::erase(vector<string>::iterator i) +void NameList::erase(vector<string>::iterator i) { m_name.erase(i); } -void QualifiedName::clear() +void NameList::clear() { m_name.clear(); } -void QualifiedName::push_back(const string& name) +void NameList::push_back(const string& name) { m_name.push_back(name); } -size_t QualifiedName::size() const +size_t NameList::size() const { return m_name.size(); } -size_t QualifiedName::StringSize() const +size_t NameList::StringSize() const { size_t size = 0; for (auto& name : m_name) - size += name.size() + 2; - return size - 2; + size += name.size() + m_join.size(); + return size - m_join.size(); } -string QualifiedName::GetString() const +string NameList::GetString() const { bool first = true; string out; @@ -205,7 +205,7 @@ string QualifiedName::GetString() const { if (!first) { - out += "::" + name; + out = m_join + name; } else { @@ -218,10 +218,95 @@ string QualifiedName::GetString() const } +BNNameList NameList::GetAPIObject() const +{ + BNNameList result; + result.nameCount = m_name.size(); + result.join = BNAllocString(m_join.c_str()); + result.name = new char*[m_name.size()]; + for (size_t i = 0; i < m_name.size(); i++) + result.name[i] = BNAllocString(m_name[i].c_str()); + return result; +} + + +void NameList::FreeAPIObject(BNNameList* name) +{ + for (size_t i = 0; i < name->nameCount; i++) + BNFreeString(name->name[i]); + BNFreeString(name->join); + delete[] name->name; +} + + +NameList NameList::FromAPIObject(BNNameList* name) +{ + NameList result(name->join); + for (size_t i = 0; i < name->nameCount; i++) + result.push_back(name->name[i]); + return result; +} + + + +QualifiedName::QualifiedName(): NameList("::") +{ +} + + +QualifiedName::QualifiedName(const string& name): NameList(name, "::") +{ +} + + +QualifiedName::QualifiedName(const vector<string>& name): NameList(name, "::") +{ +} + + +QualifiedName::QualifiedName(const QualifiedName& name): NameList(name.m_name, "::") +{ +} + + +QualifiedName& QualifiedName::operator=(const string& name) +{ + m_name = vector<string>{name}; + m_join = "::"; + return *this; +} + + +QualifiedName& QualifiedName::operator=(const vector<string>& name) +{ + m_name = name; + m_join = "::"; + return *this; +} + + +QualifiedName& QualifiedName::operator=(const QualifiedName& name) +{ + m_name = name.m_name; + m_join = "::"; + return *this; +} + + +QualifiedName QualifiedName::operator+(const QualifiedName& other) const +{ + QualifiedName result(*this); + result.m_join = "::"; + result.m_name.insert(result.m_name.end(), other.m_name.begin(), other.m_name.end()); + return result; +} + + BNQualifiedName QualifiedName::GetAPIObject() const { BNQualifiedName result; result.nameCount = m_name.size(); + result.join = BNAllocString(m_join.c_str()); result.name = new char*[m_name.size()]; for (size_t i = 0; i < m_name.size(); i++) result.name[i] = BNAllocString(m_name[i].c_str()); @@ -233,6 +318,7 @@ void QualifiedName::FreeAPIObject(BNQualifiedName* name) { for (size_t i = 0; i < name->nameCount; i++) BNFreeString(name->name[i]); + BNFreeString(name->join); delete[] name->name; } @@ -246,6 +332,89 @@ QualifiedName QualifiedName::FromAPIObject(BNQualifiedName* name) } +NameSpace::NameSpace(): NameList("::") +{ +} + + +NameSpace::NameSpace(const string& name): NameList(name, "::") +{ +} + + +NameSpace::NameSpace(const vector<string>& name): NameList(name, "::") +{ +} + + +NameSpace::NameSpace(const NameSpace& name): NameList(name.m_name, "::") +{ +} + + +NameSpace& NameSpace::operator=(const string& name) +{ + m_name = vector<string>{name}; + m_join = "::"; + return *this; +} + + +NameSpace& NameSpace::operator=(const vector<string>& name) +{ + m_name = name; + m_join = "::"; + return *this; +} + + +NameSpace& NameSpace::operator=(const NameSpace& name) +{ + m_name = name.m_name; + m_join = "::"; + return *this; +} + + +NameSpace NameSpace::operator+(const NameSpace& other) const +{ + NameSpace result(*this); + result.m_join = "::"; + result.m_name.insert(result.m_name.end(), other.m_name.begin(), other.m_name.end()); + return result; +} + + +BNNameSpace NameSpace::GetAPIObject() const +{ + BNNameSpace result; + result.nameCount = m_name.size(); + result.join = BNAllocString(m_join.c_str()); + result.name = new char*[m_name.size()]; + for (size_t i = 0; i < m_name.size(); i++) + result.name[i] = BNAllocString(m_name[i].c_str()); + return result; +} + + +void NameSpace::FreeAPIObject(BNNameSpace* name) +{ + for (size_t i = 0; i < name->nameCount; i++) + BNFreeString(name->name[i]); + BNFreeString(name->join); + delete[] name->name; +} + + +NameSpace NameSpace::FromAPIObject(BNNameSpace* name) +{ + NameSpace result; + for (size_t i = 0; i < name->nameCount; i++) + result.push_back(name->name[i]); + return result; +} + + Type::Type(BNType* type) { m_object = type; |
