From ca50cc4e629488e60cb4d1457c37f01873119ea6 Mon Sep 17 00:00:00 2001 From: Jaby Date: Tue, 11 Jul 2023 19:00:59 +0200 Subject: [PATCH] Collect highest address --- src/Tools/psxreadmap/readmap/src/lib.rs | 28 +++++++++++-------- src/Tools/psxreadmap/readmap/src/types/mod.rs | 5 ++++ src/Tools/psxreadmap/src/lib.rs | 4 +-- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/Tools/psxreadmap/readmap/src/lib.rs b/src/Tools/psxreadmap/readmap/src/lib.rs index abde9b95..cc0be234 100644 --- a/src/Tools/psxreadmap/readmap/src/lib.rs +++ b/src/Tools/psxreadmap/readmap/src/lib.rs @@ -2,20 +2,22 @@ pub mod types; use tool_helper::{Error, Input}; use std::io::BufRead; -use types::{Content, Section}; +use types::{Content, MemoryMapInfo, Section}; -pub fn scan(input: Input) -> Result, Error> { - let sections = process(input.lines().map(|l| l.unwrap()).into_iter())?; +pub fn scan(input: Input) -> Result { + let (sections, highest_address) = process(input.lines().map(|l| l.unwrap()).into_iter())?; - Ok(sections) + Ok(MemoryMapInfo{sections, highest_address: highest_address}) } -fn process>(mut line_iter:F) -> Result, Error> { - let mut sections = Vec::new(); +fn process>(mut line_iter:F) -> Result<(Vec
, u64), Error> { + let mut sections = Vec::new(); + let mut highest_address = 0u64; + while let Some(mut line) = line_iter.next() { loop { if line.starts_with(".") { - let (new_line, new_section) = process_section(line, &mut line_iter)?; + let (new_line, new_section) = process_section(&mut highest_address, line, &mut line_iter)?; sections.push(new_section); line = new_line; @@ -30,19 +32,19 @@ fn process>(mut line_iter:F) -> Result>(line: String, line_iter:&mut F) -> Result<(String, Section), Error> { +fn process_section>(highest_address: &mut u64, line: String, line_iter:&mut F) -> Result<(String, Section), Error> { let mut next_line_closure = || { line_iter.next().ok_or(Error::from_str("Unexpected end of file")) }; let (mut section, line) = read_section(line, &mut next_line_closure)?; - Ok((process_subsection(&mut section, line, &mut next_line_closure)?, section)) + Ok((process_subsection(&mut section, highest_address, line, &mut next_line_closure)?, section)) } -fn process_subsection Result>(section: &mut Section, line: Option, next_line: &mut F) -> Result { +fn process_subsection Result>(section: &mut Section, highest_address: &mut u64, line: Option, next_line: &mut F) -> Result { fn push_sub_section(section: &mut Section, sub_section: Option
) { if let Some(sub_section) = sub_section { section.content.push(Content::Section(sub_section)); @@ -105,6 +107,10 @@ fn process_subsection Result>(section: &mut Section, else if line.starts_with(" 0x") { if let Some(symbol) = parse_symbol(read_symbol(line)?) { + if symbol.adr > *highest_address { + *highest_address = symbol.adr; + } + sub_section = add_element(sub_section, section, symbol, |section, symbol| { section.content.push(Content::Symbol(symbol)); }); diff --git a/src/Tools/psxreadmap/readmap/src/types/mod.rs b/src/Tools/psxreadmap/readmap/src/types/mod.rs index 8d4b1493..962c2db7 100644 --- a/src/Tools/psxreadmap/readmap/src/types/mod.rs +++ b/src/Tools/psxreadmap/readmap/src/types/mod.rs @@ -1,5 +1,10 @@ use std::default::Default; +pub struct MemoryMapInfo { + pub sections: Vec
, + pub highest_address: u64, +} + #[derive(Default)] pub struct Section { pub name: String, diff --git a/src/Tools/psxreadmap/src/lib.rs b/src/Tools/psxreadmap/src/lib.rs index 4da0477e..8ebdc101 100644 --- a/src/Tools/psxreadmap/src/lib.rs +++ b/src/Tools/psxreadmap/src/lib.rs @@ -1,5 +1,5 @@ use crossterm::event::KeyCode; -use readmap::types::Section; +use readmap::types::MemoryMapInfo; use std::path::PathBuf; use tool_helper::Error; use tui::{ @@ -211,6 +211,6 @@ impl ConsoleUI { } } -pub fn load_memory_map(file_path: Option) -> Result, Error> { +pub fn load_memory_map(file_path: Option) -> Result { readmap::scan(tool_helper::open_input(file_path)?) } \ No newline at end of file