some fixes for hedu #64

Merged
PlexSheep merged 15 commits from devel into master 2024-01-18 13:45:27 +01:00
1 changed files with 29 additions and 18 deletions
Showing only changes of commit f4a7aeaf87 - Show all commits

View File

@ -13,6 +13,7 @@ use std::io::{prelude::*, Read, SeekFrom};
const BYTES_PER_LINE: usize = 16; const BYTES_PER_LINE: usize = 16;
const LINE_SEP_HORIZ: char = '─'; const LINE_SEP_HORIZ: char = '─';
const LINE_SEP_VERT: char = '│'; const LINE_SEP_VERT: char = '│';
const CHAR_BORDER: &'static str = "|";
#[derive(Debug)] #[derive(Debug)]
pub struct HeduConfig { pub struct HeduConfig {
@ -26,6 +27,7 @@ pub struct HeduConfig {
rd_counter: usize, rd_counter: usize,
buf: [[u8; BYTES_PER_LINE]; 2], buf: [[u8; BYTES_PER_LINE]; 2],
alt_buf: usize, alt_buf: usize,
display_buf: String,
} }
impl HeduConfig { impl HeduConfig {
@ -41,8 +43,14 @@ impl HeduConfig {
rd_counter: usize::MIN, rd_counter: usize::MIN,
buf: [[0; BYTES_PER_LINE]; 2], buf: [[0; BYTES_PER_LINE]; 2],
alt_buf: 0, alt_buf: 0,
display_buf: String::new(),
} }
} }
#[inline]
fn display(&mut self) {
println!("{}", self.display_buf);
self.display_buf = String::new();
}
} }
pub trait DataSource: Read { pub trait DataSource: Read {
@ -74,44 +82,46 @@ pub fn dump(data: &mut dyn DataSource, mut config: HeduConfig) -> Result<()> {
} }
// print the head // print the head
print!("DATA IDX {LINE_SEP_VERT} DATA AS HEX"); config.display_buf += &format!("DATA IDX {LINE_SEP_VERT} DATA AS HEX");
if config.chars { if config.chars {
print!("{:width$} {LINE_SEP_VERT} FOO", "", width = 37); config.display_buf += &format!("{:width$} {LINE_SEP_VERT}", "", width = 37);
} }
println!(); config.display();
if config.chars { if config.chars {
println!("{}", format!("{LINE_SEP_HORIZ}").repeat(80)); config.display_buf += &format!("{LINE_SEP_HORIZ}").repeat(80);
} else { } else {
println!("{}", format!("{LINE_SEP_HORIZ}").repeat(59)); config.display_buf += &format!("{LINE_SEP_HORIZ}").repeat(59);
} }
config.display();
// data dump loop // data dump loop
rd_data(data, &mut config)?; rd_data(data, &mut config)?;
while config.len > 0 { while config.len > 0 {
print!("{:08X} {LINE_SEP_VERT} ", config.data_idx); config.display_buf += &format!("{:08X} {LINE_SEP_VERT} ", config.data_idx);
for i in 0..config.len { for i in 0..config.len {
if i as usize % BYTES_PER_LINE == BYTES_PER_LINE / 2 { if i as usize % BYTES_PER_LINE == BYTES_PER_LINE / 2 {
print!(" "); config.display_buf += " ";
} }
print!("{:02X} ", config.buf[config.alt_buf][i]); config.display_buf += &format!("{:02X} ", config.buf[config.alt_buf][i]);
} }
if config.len == BYTES_PER_LINE / 2 { if config.len == BYTES_PER_LINE / 2 {
print!(" ") config.display_buf += " "
} }
for i in 0..(BYTES_PER_LINE - config.len) { for i in 0..(BYTES_PER_LINE - config.len) {
if i as usize % BYTES_PER_LINE == BYTES_PER_LINE / 2 { if i as usize % BYTES_PER_LINE == BYTES_PER_LINE / 2 {
print!(" "); config.display_buf += " ";
} }
print!(" "); config.display_buf += " ";
} }
if config.chars { if config.chars {
print!("{LINE_SEP_VERT} |"); config.display_buf += &format!("{LINE_SEP_VERT} |");
for i in 0..config.len { for i in 0..config.len {
print!("{}", mask_chars(config.buf[config.alt_buf][i] as char)); config.display_buf +=
&format!("{}", mask_chars(config.buf[config.alt_buf][i] as char));
} }
print!("|"); config.display_buf += CHAR_BORDER;
} }
println!(); config.display();
// loop breaker logic // loop breaker logic
if config.stop { if config.stop {
@ -130,12 +140,13 @@ pub fn dump(data: &mut dyn DataSource, mut config: HeduConfig) -> Result<()> {
let start_line = config.data_idx; let start_line = config.data_idx;
while config.buf[0] == config.buf[1] && config.len == BYTES_PER_LINE { while config.buf[0] == config.buf[1] && config.len == BYTES_PER_LINE {
rd_data(data, &mut config)?; rd_data(data, &mut config)?;
config.data_idx += BYTES_PER_LINE; config.data_idx += BYTES_PER_LINE; // FIXME: incorrect logic #59
} }
println!( config.display_buf += &format!(
"^^^^^^^^ {LINE_SEP_VERT} (repeats {} lines)", "^^^^^^^^ {LINE_SEP_VERT} (repeats {} lines)",
config.data_idx - start_line (config.data_idx - start_line) / (BYTES_PER_LINE * 2)
); );
config.display();
} }
// switch to the second half of the buf, the original half is stored the old buffer // switch to the second half of the buf, the original half is stored the old buffer
// We detect duplicate lines with this // We detect duplicate lines with this