kr580 1.1.0

Desktop KR580VM80 / Intel 8080 emulator.
Documentation
use crate::devices::decode_oem_text;

const COLUMNS_PER_LINE: usize = 80;

pub(super) fn printer_lines(spool: &[u8]) -> Vec<String> {
    let text = decode_oem_text(spool).replace('\t', "    ");
    let mut lines = Vec::new();
    for logical_line in text.split('\n') {
        let characters = logical_line.chars().collect::<Vec<_>>();
        if characters.is_empty() {
            lines.push(String::new());
            continue;
        }
        lines.extend(
            characters
                .chunks(COLUMNS_PER_LINE)
                .map(|chunk| chunk.iter().collect()),
        );
    }
    if lines.is_empty() {
        lines.push(String::new());
    }
    lines
}

#[cfg(test)]
mod tests {
    use super::printer_lines;

    #[test]
    fn printer_lines_preserve_blank_lines_and_wrap_at_eighty_columns() {
        let source = format!("{}\r\n\r\nB", "A".repeat(81));
        let lines = printer_lines(source.as_bytes());

        assert_eq!(lines[0], "A".repeat(80));
        assert_eq!(lines[1], "A");
        assert_eq!(lines[2], "");
        assert_eq!(lines[3], "B");
    }
}