summaryrefslogtreecommitdiff
path: root/type.cpp
diff options
context:
space:
mode:
authorXusheng <xusheng@vector35.com>2021-05-05 17:23:49 +0800
committerXusheng <xusheng@vector35.com>2021-05-26 17:46:13 +0800
commit7c9ada78241e08bf36bd04d989f742a6de721575 (patch)
tree4134fd2f12a504ab17cc0b9acc1fb8d27552490f /type.cpp
parentfd1974b407be042fd84f0267a328a5adabce28e1 (diff)
Add the ability to automatically create struct members
Diffstat (limited to 'type.cpp')
-rw-r--r--type.cpp37
1 files changed, 33 insertions, 4 deletions
diff --git a/type.cpp b/type.cpp
index 08597f1a..bf7f83bd 100644
--- a/type.cpp
+++ b/type.cpp
@@ -19,6 +19,7 @@
// IN THE SOFTWARE.
#include "binaryninjaapi.h"
+#include <inttypes.h>
using namespace BinaryNinja;
using namespace std;
@@ -1000,6 +1001,33 @@ bool Type::AddTypeMemberTokens(BinaryView* data, vector<InstructionTextToken>& t
}
+string Type::GetSizeSuffix(size_t size)
+{
+ char sizeStr[32];
+
+ switch (size)
+ {
+ case 0:
+ return "";
+ case 1:
+ return ".b";
+ case 2:
+ return ".w";
+ case 4:
+ return ".d";
+ case 8:
+ return ".q";
+ case 10:
+ return ".t";
+ case 16:
+ return ".o";
+ default:
+ sprintf(sizeStr, ".%" PRIuPTR, size);
+ return sizeStr;
+ }
+}
+
+
TypeBuilder::TypeBuilder()
{
m_object = BNCreateVoidTypeBuilder();
@@ -1919,12 +1947,13 @@ StructureBuilder& StructureBuilder::AddMember(const Confidence<Ref<Type>>& type,
}
-StructureBuilder& StructureBuilder::AddMemberAtOffset(const Confidence<Ref<Type>>& type, const string& name, uint64_t offset)
+StructureBuilder& StructureBuilder::AddMemberAtOffset(const Confidence<Ref<Type>>& type,
+ const string& name, uint64_t offset, bool overwriteExisting)
{
BNTypeWithConfidence tc;
tc.type = type->GetObject();
tc.confidence = type.GetConfidence();
- BNAddStructureBuilderMemberAtOffset(m_object, &tc, name.c_str(), offset);
+ BNAddStructureBuilderMemberAtOffset(m_object, &tc, name.c_str(), offset, overwriteExisting);
return *this;
}
@@ -1936,12 +1965,12 @@ StructureBuilder& StructureBuilder::RemoveMember(size_t idx)
}
-StructureBuilder& StructureBuilder::ReplaceMember(size_t idx, const Confidence<Ref<Type>>& type, const std::string& name)
+StructureBuilder& StructureBuilder::ReplaceMember(size_t idx, const Confidence<Ref<Type>>& type, const std::string& name, bool overwriteExisting)
{
BNTypeWithConfidence tc;
tc.type = type->GetObject();
tc.confidence = type.GetConfidence();
- BNReplaceStructureBuilderMember(m_object, idx, &tc, name.c_str());
+ BNReplaceStructureBuilderMember(m_object, idx, &tc, name.c_str(), overwriteExisting);
return *this;
}