summaryrefslogtreecommitdiff
path: root/view/bintxt/src/lib.rs
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2025-02-13 13:36:54 -0500
committerBrian Potchik <brian@vector35.com>2025-02-13 13:36:54 -0500
commitc99986fc66366ff205783add30401d341517b0e0 (patch)
tree18cdf2392fc376221a7be39f947cd917e9a186cd /view/bintxt/src/lib.rs
parent3434b6a83ef7a424998b9bc1f95fc484dbf8d2de (diff)
Remove bintxt.
Diffstat (limited to 'view/bintxt/src/lib.rs')
-rw-r--r--view/bintxt/src/lib.rs133
1 files changed, 0 insertions, 133 deletions
diff --git a/view/bintxt/src/lib.rs b/view/bintxt/src/lib.rs
deleted file mode 100644
index 4627c654..00000000
--- a/view/bintxt/src/lib.rs
+++ /dev/null
@@ -1,133 +0,0 @@
-mod ihex;
-mod srec;
-mod titxt;
-
-use binaryninja::segment::SegmentBuilder;
-use ihex::*;
-use srec::*;
-use titxt::*;
-
-use binaryninja::logger::Logger;
-use log::LevelFilter;
-use std::ops::Range;
-
-#[no_mangle]
-#[allow(non_snake_case)]
-pub extern "C" fn CorePluginInit() -> bool {
- Logger::new("BINTXT").with_level(LevelFilter::Info).init();
-
- binaryninja::custom_binary_view::register_view_type(c"ti-txt", c"TI-TXT", |core| {
- TiTxtViewConstructor { core }
- });
-
- binaryninja::custom_binary_view::register_view_type(c"srec", c"Motorola S-record", |core| {
- SRecViewConstructor { core }
- });
-
- binaryninja::custom_binary_view::register_view_type(c"ihex", c"Intel HEX", |core| {
- IHexViewConstructor { core }
- });
-
- true
-}
-
-struct UnmergedSegment {
- address: u64,
- data: Vec<u8>,
-}
-
-impl UnmergedSegment {
- fn end(&self) -> u64 {
- self.address + u64::try_from(self.data.len()).unwrap()
- }
-}
-
-#[derive(Clone, Copy, Debug)]
-pub struct MergedSegment {
- address: u64,
- len: u64,
- data_offset: u64,
-}
-
-impl MergedSegment {
- fn address_range(&self) -> Range<u64> {
- self.address..self.end()
- }
-
- fn data_range(&self) -> Range<u64> {
- self.data_offset..self.data_offset + self.len
- }
-
- fn end(&self) -> u64 {
- self.address + self.len
- }
-}
-
-impl From<MergedSegment> for SegmentBuilder {
- fn from(segment: MergedSegment) -> Self {
- SegmentBuilder::new(segment.address_range()).parent_backing(segment.data_range())
- }
-}
-
-struct MergedSegments {
- data: Vec<u8>,
- segments: Vec<MergedSegment>,
-}
-
-fn sort_and_merge_segments(mut unmerged_data: Vec<UnmergedSegment>) -> Result<MergedSegments, ()> {
- // sort segments by address and len, so we can detect overlaps
- unmerged_data.sort_unstable_by_key(|segment| (segment.address, segment.data.len()));
-
- let mut data: Vec<u8> =
- Vec::with_capacity(unmerged_data.iter().map(|sector| sector.data.len()).sum());
- let mut segments: Vec<MergedSegment> = Vec::with_capacity(unmerged_data.len());
- for segment in unmerged_data.into_iter() {
- // add the data to the data poll
- let data_offset = u64::try_from(data.len()).unwrap();
- let segment_len = u64::try_from(segment.data.len()).unwrap();
- data.extend(segment.data);
- match segments.last_mut() {
- // if have a last segment and the current chunk just extend it, merge both
- Some(last) if segment.address == last.end() => last.len += segment_len,
- // the same sector overlap, then the data was defined multiple times.
- Some(last) if segment.address < last.end() => {
- log::error!("Chunks of data overlap");
- return Err(());
- }
- // otherwise just create a new segment
- _ => segments.push(MergedSegment {
- address: segment.address,
- len: segment_len,
- data_offset,
- }),
- }
- }
-
- Ok(MergedSegments { data, segments })
-}
-
-fn segment_from_address(segments: &[MergedSegment], offset: u64) -> Option<&MergedSegment> {
- segments
- .binary_search_by(|segment| {
- let range = segment.address_range();
- if range.contains(&offset) {
- return core::cmp::Ordering::Equal;
- }
- offset.cmp(&range.start)
- })
- .ok()
- .map(|idx| &segments[idx])
-}
-
-fn segment_after_address(segments: &[MergedSegment], offset: u64) -> u64 {
- let sector = segments.iter().find_map(|sector| {
- if sector.address >= offset {
- Some(sector.address)
- } else if sector.end() < offset {
- Some(offset)
- } else {
- None
- }
- });
- sector.unwrap_or(offset).into()
-}