@@ -1,4 +1,5 @@
11use std::io::{self, Write};
2+use std::mem::swap;
23
34use app::Config;
45use assets::HighlightingAssets;
@@ -6,6 +7,7 @@ use errors::*;
67use inputfile::{InputFile, InputFileReader};
78use line_range::{LineRanges, RangeCheckResult};
89use output::OutputType;
10+use preprocessor::replace_nonprintable;
911use printer::{InteractivePrinter, Printer, SimplePrinter};
1012
1113pub struct Controller<'a> {
@@ -64,7 +66,14 @@ impl<'b> Controller<'b> {
6466 input_file: InputFile<'a>,
6567 ) -> Result<()> {
6668 printer.print_header(writer, input_file)?;
67− self.print_file_ranges(printer, writer, reader, &self.config.line_ranges)?;
69+ self.print_file_ranges(
70+ printer,
71+ writer,
72+ reader,
73+ &self.config.line_ranges,
74+ self.config.show_nonprintable,
75+ self.config.tab_width,
76+ )?;
6877 printer.print_footer(writer)?;
6978
7079 Ok(())
@@ -76,12 +85,20 @@ impl<'b> Controller<'b> {
7685 writer: &mut Write,
7786 mut reader: InputFileReader,
7887 line_ranges: &LineRanges,
88+ show_nonprintable: bool,
89+ tab_width: usize,
7990 ) -> Result<()> {
8091 let mut line_buffer = Vec::new();
92+ let mut line_buffer_processed = Vec::new();
8193
8294 let mut line_number: usize = 1;
8395
8496 while reader.read_line(&mut line_buffer)? {
97+ if show_nonprintable {
98+ replace_nonprintable(&mut line_buffer, &mut line_buffer_processed, tab_width);
99+ swap(&mut line_buffer, &mut line_buffer_processed);
100+ }
101+
85102 match line_ranges.check(line_number) {
86103 RangeCheckResult::OutsideRange => {
87104 // Call the printer in case we need to call the syntax highlighter