summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binaryninjaapi.h130
-rw-r--r--binaryninjacore.h6
-rw-r--r--relocationhandler.cpp3
-rw-r--r--type.cpp235
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;
}
diff --git a/type.cpp b/type.cpp
index 85961a3e..81d2ec26 100644
--- a/type.cpp
+++ b/type.cpp
@@ -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;