From 47706908232270dd4a3d65354a3122ca611d8cef Mon Sep 17 00:00:00 2001 From: Wim Hueskes Date: Mon, 25 Jul 2016 14:17:45 +0200 Subject: [PATCH] od: suppress duplicates --- src/od/od.rs | 27 ++++++++++++++++++++++----- tests/test_od.rs | 24 ++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/od/od.rs b/src/od/od.rs index db82177e4..29f68c637 100644 --- a/src/od/od.rs +++ b/src/od/od.rs @@ -237,14 +237,20 @@ pub fn uumain(args: Vec) -> i32 { line_bytes = min_bytes; } - odfunc(line_bytes, &input_offset_base, &inputs, &formats[..]) + let output_duplicates = matches.opt_present("v"); + + odfunc(line_bytes, &input_offset_base, &inputs, &formats[..], output_duplicates) } -fn odfunc(line_bytes: usize, input_offset_base: &Radix, fnames: &[InputSource], formats: &[OdFormat]) -> i32 { +fn odfunc(line_bytes: usize, input_offset_base: &Radix, + fnames: &[InputSource], formats: &[OdFormat], output_duplicates: bool) -> i32 { let mut mf = MultifileReader::new(fnames); let mut addr = 0; let mut bytes: Vec = vec![b'\x00'; line_bytes]; + let mut previous_bytes = Vec::::with_capacity(line_bytes); + let mut duplicate_line = false; + loop { // print each line data (or multi-format raster of several lines describing the same data). @@ -261,9 +267,20 @@ fn odfunc(line_bytes: usize, input_offset_base: &Radix, fnames: &[InputSource], bytes[i] = 0; } } - - print_bytes(&bytes, n, &print_with_radix(input_offset_base, addr), formats); - + + if !output_duplicates && previous_bytes == bytes && n == line_bytes { + if !duplicate_line { + duplicate_line = true; + println!("*"); + } + } + else { + duplicate_line = false; + previous_bytes.clone_from(&bytes); + + print_bytes(&bytes, n, &print_with_radix(input_offset_base, addr), formats); + } + addr += n; } Err(_) => { diff --git a/tests/test_od.rs b/tests/test_od.rs index 651e85c65..b8d2d2198 100644 --- a/tests/test_od.rs +++ b/tests/test_od.rs @@ -266,7 +266,7 @@ fn test_width(){ 0000010 "); - let result = new_ucmd!().arg("-w4").run_piped_stdin(&input[..]); + let result = new_ucmd!().arg("-w4").arg("-v").run_piped_stdin(&input[..]); assert_empty_stderr!(result); assert!(result.success); @@ -283,7 +283,7 @@ fn test_invalid_width(){ 0000004 "); - let result = new_ucmd!().arg("-w5").run_piped_stdin(&input[..]); + let result = new_ucmd!().arg("-w5").arg("-v").run_piped_stdin(&input[..]); assert_eq!(result.stderr, "od: warning: invalid width 5; using 2 instead\n"); assert!(result.success); @@ -306,3 +306,23 @@ fn test_width_without_value(){ assert!(result.success); assert_eq!(result.stdout, expected_output); } + +#[test] +fn test_suppress_duplicates(){ + + let input = [0u8 ; 41]; + let expected_output = unindent(" + 0000000 000000000000 + 0000 0000 + * + 0000050 000000000000 + 0000 + 0000051 + "); + + let result = new_ucmd!().arg("-w4").arg("-O").arg("-x").run_piped_stdin(&input[..]); + + assert_empty_stderr!(result); + assert!(result.success); + assert_eq!(result.stdout, expected_output); +}