summaryrefslogtreecommitdiff
path: root/rust/src
diff options
context:
space:
mode:
authorRubens Brandao <git@rubens.io>2024-04-22 14:11:36 -0300
committerKyle Martin <krm504@nyu.edu>2024-05-09 13:31:52 -0400
commit48d440abf796c31897883842b83c37ae1a0f1f41 (patch)
tree4373d42e39a1f3901c3b6ab57d13a2b2fc502364 /rust/src
parent29b62677dad48aa4d55ad2dae5d176d9880216bd (diff)
add StructureBuilder missing python methods
Diffstat (limited to 'rust/src')
-rw-r--r--rust/src/types.rs72
1 files changed, 71 insertions, 1 deletions
diff --git a/rust/src/types.rs b/rust/src/types.rs
index 75c8fb36..08fcf089 100644
--- a/rust/src/types.rs
+++ b/rust/src/types.rs
@@ -1860,7 +1860,58 @@ impl StructureBuilder {
}
}
- // TODO : The other methods in the python version (type, members, remove, replace, etc)
+ pub fn members(&self) -> Array<StructureMember> {
+ let mut count = 0;
+ let members_raw = unsafe { BNGetStructureBuilderMembers(self.handle, &mut count) };
+ unsafe { Array::new(members_raw, count, ()) }
+ }
+
+ pub fn index_by_name(&self, name: &str) -> Option<usize> {
+ self.members().iter().position(|member| member.name == name)
+ }
+
+ pub fn index_by_offset(&self, offset: u64) -> Option<usize> {
+ self.members()
+ .iter()
+ .position(|member| member.offset == offset)
+ }
+
+ // Setters
+
+ pub fn clear_members(&self) {
+ let len = self.members().len();
+ for idx in (0..len).rev() {
+ self.remove(idx)
+ }
+ }
+
+ pub fn add_members<'a>(&self, members: impl IntoIterator<Item = &'a StructureMember>) {
+ for member in members {
+ self.append(&member.ty, &member.name, member.access, member.scope);
+ }
+ }
+
+ pub fn set_members<'a>(&self, members: impl IntoIterator<Item = &'a StructureMember>) {
+ self.clear_members();
+ self.add_members(members);
+ }
+
+ pub fn remove(&self, index: usize) {
+ unsafe { BNRemoveStructureBuilderMember(self.handle, index) }
+ }
+
+ pub fn replace(&self, index: usize, type_: Conf<&Type>, name: &str, overwrite: bool) {
+ let name = name.into_bytes_with_nul();
+ let name_ptr = name.as_ptr() as *const _;
+
+ let raw_type_ = BNTypeWithConfidence {
+ type_: type_.contents as *const Type as *mut _,
+ confidence: type_.confidence,
+ };
+ unsafe {
+ BNReplaceStructureBuilderMember(self.handle, index, &raw_type_, name_ptr, overwrite)
+ }
+ }
}
impl From<&Structure> for StructureBuilder {
@@ -2042,6 +2093,25 @@ impl StructureMember {
}
}
+impl CoreArrayProvider for StructureMember {
+ type Raw = BNStructureMember;
+ type Context = ();
+}
+
+unsafe impl CoreOwnedArrayProvider for StructureMember {
+ unsafe fn free(raw: *mut Self::Raw, count: usize, _context: &Self::Context) {
+ BNFreeStructureMemberList(raw, count)
+ }
+}
+
+unsafe impl<'a> CoreArrayWrapper<'a> for StructureMember {
+ type Wrapped = Guard<'a, StructureMember>;
+
+ unsafe fn wrap_raw(raw: &'a Self::Raw, _context: &'a Self::Context) -> Self::Wrapped {
+ Guard::new(StructureMember::from_raw(*raw), &())
+ }
+}
+
#[derive(Debug, Clone)]
pub struct InheritedStructureMember {
pub base: Ref<NamedTypeReference>,