diff options
| author | Rubens Brandao <git@rubens.io> | 2024-04-22 14:11:36 -0300 |
|---|---|---|
| committer | Kyle Martin <krm504@nyu.edu> | 2024-05-09 13:31:52 -0400 |
| commit | 48d440abf796c31897883842b83c37ae1a0f1f41 (patch) | |
| tree | 4373d42e39a1f3901c3b6ab57d13a2b2fc502364 /rust/src | |
| parent | 29b62677dad48aa4d55ad2dae5d176d9880216bd (diff) | |
add StructureBuilder missing python methods
Diffstat (limited to 'rust/src')
| -rw-r--r-- | rust/src/types.rs | 72 |
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>, |
