Encoding - columns are specified per byte of input

This commit is contained in:
Nathan Fisher 2025-01-21 23:50:40 -05:00
parent 29172fb5f9
commit 53bbe41856

View file

@ -52,7 +52,13 @@ impl<R: Read, W: Write> Encoder<R, W> {
break; break;
} }
if n_bytes == 0 { if n_bytes == 0 {
if let Some(w) = self.wrap {
if total % w != 0 {
writeln!(self.writer)?; writeln!(self.writer)?;
}
} else {
writeln!(self.writer)?;
}
break; break;
} }
let mut idx = usize::from(ibuf[0] & 0b1111); let mut idx = usize::from(ibuf[0] & 0b1111);
@ -62,36 +68,34 @@ impl<R: Read, W: Write> Encoder<R, W> {
match self.style { match self.style {
Style::Plain => { Style::Plain => {
if let Some(w) = self.wrap { if let Some(w) = self.wrap {
if total > 0 && total % w < 2 { if total > 0 && total % w == 0 {
writeln!(self.writer)?; writeln!(self.writer)?;
} }
} }
self.writer.write_all(&obuf)?; self.writer.write_all(&obuf)?;
total += 2;
} }
Style::Spaces => { Style::Spaces => {
if let Some(w) = self.wrap { if let Some(w) = self.wrap {
if total % w < 3 { if total > 0 && total % w == 0 {
writeln!(self.writer)?; writeln!(self.writer)?;
} else if total > 0 { } else if total > 0 {
write!(self.writer, " ")?; write!(self.writer, " ")?;
} }
} }
self.writer.write_all(&obuf)?; self.writer.write_all(&obuf)?;
total += 3;
} }
Style::SpacesWithHex => { Style::SpacesWithHex => {
if let Some(w) = self.wrap { if let Some(w) = self.wrap {
if total % w < 5 { if total > 0 && total % w == 0 {
writeln!(self.writer)?; writeln!(self.writer)?;
} else if total > 0 { } else if total > 0 {
write!(self.writer, " ")?; write!(self.writer, " ")?;
} }
} }
write!(self.writer, "0x{}{}", obuf[0], obuf[1])?; write!(self.writer, "0x{}{}", obuf[0], obuf[1])?;
total += 5;
} }
} }
total += 1;
} }
Ok(()) Ok(())
} }
@ -124,7 +128,7 @@ mod tests {
let infile = File::open("testdata/lorem.txt").unwrap(); let infile = File::open("testdata/lorem.txt").unwrap();
let reader = BufReader::new(infile); let reader = BufReader::new(infile);
let outfile = fs::read_to_string("testdata/lorem_b16.txt").unwrap(); let outfile = fs::read_to_string("testdata/lorem_b16.txt").unwrap();
let mut encoder = Encoder::new(reader, vec![], None, Some(76)); let mut encoder = Encoder::new(reader, vec![], None, Some(38));
encoder.encode().unwrap(); encoder.encode().unwrap();
assert_eq!(encoder.writer, outfile.as_bytes()); assert_eq!(encoder.writer, outfile.as_bytes());
} }