diff --git a/src/uu/dd/src/dd.rs b/src/uu/dd/src/dd.rs index 06e1f399b..b300dff2d 100644 --- a/src/uu/dd/src/dd.rs +++ b/src/uu/dd/src/dd.rs @@ -40,7 +40,6 @@ use std::path::Path; use std::sync::mpsc; #[cfg(target_os = "linux")] use std::sync::{atomic::AtomicUsize, atomic::Ordering, Arc}; -use std::sync::mpsc; use std::thread; use std::time; @@ -48,11 +47,8 @@ const ABOUT: &str = "copy, and optionally convert, a file system resource"; const BUF_INIT_BYTE: u8 = 0xDD; const RTN_SUCCESS: i32 = 0; const RTN_FAILURE: i32 = 1; -const SYSTEM_NEWLINE: &[u8] = if cfg!(target_os = "windows") { - b"\r\n" -} else { - b"\n" -}; +const NEWLINE: u8 = b'\n'; +const SPACE: u8 = b' '; struct Input { src: R, @@ -495,29 +491,20 @@ impl Output { /// Expects ascii encoded data fn block(buf: Vec, cbs: usize, rstat: &mut ReadStat) -> Vec> { let mut blocks = buf - .split(|&e| e == b'\n') - .map(|split| { - if cfg!(target_os = "windows") { - // Since newlines are LF ('\n') in Unix and CR+LF ("\r\n") on Windows, - // the split above will leave a trailing CR on Windows. - // This must be removed before proceeding. - split[..split.len() - 1].to_vec() - } else { - split.to_vec() - } - }) + .split(|&e| e == NEWLINE) + .map(|split| split.to_vec()) .fold(Vec::new(), |mut blocks, mut split| { if split.len() > cbs { rstat.records_truncated += 1; } - split.resize(cbs, b' '); + split.resize(cbs, SPACE); blocks.push(split); blocks }); if let Some(last) = blocks.last() { - if last.iter().all(|&e| e == b' ') { + if last.iter().all(|&e| e == SPACE) { blocks.pop(); } } @@ -530,12 +517,12 @@ fn block(buf: Vec, cbs: usize, rstat: &mut ReadStat) -> Vec> { /// Expects ascii encoded data fn unblock(buf: Vec, cbs: usize) -> Vec { buf.chunks(cbs).fold(Vec::new(), |mut acc, block| { - if let Some(last_char_idx) = block.iter().rposition(|&e| e != b' ') { + if let Some(last_char_idx) = block.iter().rposition(|&e| e != SPACE) { // Include text up to last space. acc.extend(&block[..=last_char_idx]); } - acc.extend(SYSTEM_NEWLINE); + acc.push(NEWLINE); acc }) } diff --git a/src/uu/dd/src/dd_unit_tests/block_unblock_tests.rs b/src/uu/dd/src/dd_unit_tests/block_unblock_tests.rs index 457322b25..96ecc2394 100644 --- a/src/uu/dd/src/dd_unit_tests/block_unblock_tests.rs +++ b/src/uu/dd/src/dd_unit_tests/block_unblock_tests.rs @@ -2,9 +2,6 @@ use super::*; -const NL: u8 = b'\n'; -const SPACE: u8 = b' '; - macro_rules! make_block_test ( ( $test_id:ident, $test_name:expr, $src:expr, $block:expr, $spec:expr ) => { @@ -97,7 +94,7 @@ fn block_test_no_nl_trunc() { fn block_test_nl_gt_cbs_trunc() { let mut rs = ReadStat::default(); let buf = vec![ - 0u8, 1u8, 2u8, 3u8, 4u8, NL, 0u8, 1u8, 2u8, 3u8, 4u8, NL, 5u8, 6u8, 7u8, 8u8, + 0u8, 1u8, 2u8, 3u8, 4u8, NEWLINE, 0u8, 1u8, 2u8, 3u8, 4u8, NEWLINE, 5u8, 6u8, 7u8, 8u8, ]; let res = block(buf, 4, &mut rs); @@ -118,7 +115,7 @@ fn block_test_nl_gt_cbs_trunc() { #[test] fn block_test_surrounded_nl() { let mut rs = ReadStat::default(); - let buf = vec![0u8, 1u8, 2u8, 3u8, NL, 4u8, 5u8, 6u8, 7u8, 8u8]; + let buf = vec![0u8, 1u8, 2u8, 3u8, NEWLINE, 4u8, 5u8, 6u8, 7u8, 8u8]; let res = block(buf, 8, &mut rs); assert_eq!( @@ -133,7 +130,9 @@ fn block_test_surrounded_nl() { #[test] fn block_test_multiple_nl_same_cbs_block() { let mut rs = ReadStat::default(); - let buf = vec![0u8, 1u8, 2u8, 3u8, NL, 4u8, NL, 5u8, 6u8, 7u8, 8u8, 9u8]; + let buf = vec![ + 0u8, 1u8, 2u8, 3u8, NEWLINE, 4u8, NEWLINE, 5u8, 6u8, 7u8, 8u8, 9u8, + ]; let res = block(buf, 8, &mut rs); assert_eq!( @@ -149,7 +148,9 @@ fn block_test_multiple_nl_same_cbs_block() { #[test] fn block_test_multiple_nl_diff_cbs_block() { let mut rs = ReadStat::default(); - let buf = vec![0u8, 1u8, 2u8, 3u8, NL, 4u8, 5u8, 6u8, 7u8, NL, 8u8, 9u8]; + let buf = vec![ + 0u8, 1u8, 2u8, 3u8, NEWLINE, 4u8, 5u8, 6u8, 7u8, NEWLINE, 8u8, 9u8, + ]; let res = block(buf, 8, &mut rs); assert_eq!( @@ -165,7 +166,7 @@ fn block_test_multiple_nl_diff_cbs_block() { #[test] fn block_test_end_nl_diff_cbs_block() { let mut rs = ReadStat::default(); - let buf = vec![0u8, 1u8, 2u8, 3u8, NL]; + let buf = vec![0u8, 1u8, 2u8, 3u8, NEWLINE]; let res = block(buf, 4, &mut rs); assert_eq!(res, vec![vec![0u8, 1u8, 2u8, 3u8],]); @@ -174,7 +175,7 @@ fn block_test_end_nl_diff_cbs_block() { #[test] fn block_test_end_nl_same_cbs_block() { let mut rs = ReadStat::default(); - let buf = vec![0u8, 1u8, 2u8, NL]; + let buf = vec![0u8, 1u8, 2u8, NEWLINE]; let res = block(buf, 4, &mut rs); assert_eq!(res, vec![vec![0u8, 1u8, 2u8, SPACE]]); @@ -183,7 +184,7 @@ fn block_test_end_nl_same_cbs_block() { #[test] fn block_test_double_end_nl() { let mut rs = ReadStat::default(); - let buf = vec![0u8, 1u8, 2u8, NL, NL]; + let buf = vec![0u8, 1u8, 2u8, NEWLINE, NEWLINE]; let res = block(buf, 4, &mut rs); assert_eq!( @@ -195,7 +196,7 @@ fn block_test_double_end_nl() { #[test] fn block_test_start_nl() { let mut rs = ReadStat::default(); - let buf = vec![NL, 0u8, 1u8, 2u8, 3u8]; + let buf = vec![NEWLINE, 0u8, 1u8, 2u8, 3u8]; let res = block(buf, 4, &mut rs); assert_eq!( @@ -207,7 +208,7 @@ fn block_test_start_nl() { #[test] fn block_test_double_surrounded_nl_no_trunc() { let mut rs = ReadStat::default(); - let buf = vec![0u8, 1u8, 2u8, 3u8, NL, NL, 4u8, 5u8, 6u8, 7u8]; + let buf = vec![0u8, 1u8, 2u8, 3u8, NEWLINE, NEWLINE, 4u8, 5u8, 6u8, 7u8]; let res = block(buf, 8, &mut rs); assert_eq!( @@ -223,7 +224,9 @@ fn block_test_double_surrounded_nl_no_trunc() { #[test] fn block_test_double_surrounded_nl_double_trunc() { let mut rs = ReadStat::default(); - let buf = vec![0u8, 1u8, 2u8, 3u8, NL, NL, 4u8, 5u8, 6u8, 7u8, 8u8]; + let buf = vec![ + 0u8, 1u8, 2u8, 3u8, NEWLINE, NEWLINE, 4u8, 5u8, 6u8, 7u8, 8u8, + ]; let res = block(buf, 4, &mut rs); assert_eq!( @@ -238,38 +241,29 @@ fn block_test_double_surrounded_nl_double_trunc() { assert_eq!(rs.records_truncated, 1); } +#[cfg(unix)] make_block_test!( block_cbs16, "block-cbs-16", - if cfg!(unix) { - File::open("./test-resources/dd-block-cbs16.test").unwrap() - } else { - File::open("./test-resources/dd-block-cbs16-win.test").unwrap() - }, + File::open("./test-resources/dd-block-cbs16.test").unwrap(), Some(16), File::open("./test-resources/dd-block-cbs16.spec").unwrap() ); +#[cfg(unix)] make_block_test!( block_cbs16_as_cbs8, "block-cbs-16-as-cbs8", - if cfg!(unix) { - File::open("./test-resources/dd-block-cbs16.test").unwrap() - } else { - File::open("./test-resources/dd-block-cbs16-win.test").unwrap() - }, + File::open("./test-resources/dd-block-cbs16.test").unwrap(), Some(8), File::open("./test-resources/dd-block-cbs8.spec").unwrap() ); +#[cfg(unix)] make_block_test!( block_consecutive_nl, "block-consecutive-nl", - if cfg!(unix) { - File::open("./test-resources/dd-block-consecutive-nl.test").unwrap() - } else { - File::open("./test-resources/dd-block-consecutive-nl-win.test").unwrap() - }, + File::open("./test-resources/dd-block-consecutive-nl.test").unwrap(), Some(16), File::open("./test-resources/dd-block-consecutive-nl-cbs16.spec").unwrap() ); @@ -279,7 +273,7 @@ fn unblock_test_full_cbs() { let buf = vec![0u8, 1u8, 2u8, 3u8, 4u8, 5u8, 6u8, 7u8]; let res = unblock(buf, 8); - assert_eq!(res, vec![0u8, 1u8, 2u8, 3u8, 4u8, 5u8, 6u8, 7u8, NL],); + assert_eq!(res, vec![0u8, 1u8, 2u8, 3u8, 4u8, 5u8, 6u8, 7u8, NEWLINE],); } #[test] @@ -287,7 +281,7 @@ fn unblock_test_all_space() { let buf = vec![SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE]; let res = unblock(buf, 8); - assert_eq!(res, vec![NL],); + assert_eq!(res, vec![NEWLINE],); } #[test] @@ -297,7 +291,7 @@ fn unblock_test_decoy_spaces() { assert_eq!( res, - vec![0u8, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, 7u8, NL], + vec![0u8, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, 7u8, NEWLINE], ); } @@ -306,7 +300,7 @@ fn unblock_test_strip_single_cbs() { let buf = vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE]; let res = unblock(buf, 8); - assert_eq!(res, vec![0u8, 1u8, 2u8, 3u8, NL],); + assert_eq!(res, vec![0u8, 1u8, 2u8, 3u8, NEWLINE],); } #[test] @@ -324,10 +318,10 @@ fn unblock_test_strip_multi_cbs() { let res = unblock(buf, 8); let exp = vec![ - vec![0u8, NL], - vec![0u8, 1u8, NL], - vec![0u8, 1u8, 2u8, NL], - vec![0u8, 1u8, 2u8, 3u8, NL], + vec![0u8, NEWLINE], + vec![0u8, 1u8, NEWLINE], + vec![0u8, 1u8, 2u8, NEWLINE], + vec![0u8, 1u8, 2u8, 3u8, NEWLINE], ] .into_iter() .flatten() @@ -336,26 +330,20 @@ fn unblock_test_strip_multi_cbs() { assert_eq!(res, exp); } +#[cfg(unix)] make_unblock_test!( unblock_multi_16, "unblock-multi-16", File::open("./test-resources/dd-unblock-cbs16.test").unwrap(), Some(16), - if cfg!(unix) { - File::open("./test-resources/dd-unblock-cbs16.spec").unwrap() - } else { - File::open("./test-resources/dd-unblock-cbs16-win.spec").unwrap() - } + File::open("./test-resources/dd-unblock-cbs16.spec").unwrap() ); +#[cfg(unix)] make_unblock_test!( unblock_multi_16_as_8, "unblock-multi-16-as-8", File::open("./test-resources/dd-unblock-cbs16.test").unwrap(), Some(8), - if cfg!(unix) { - File::open("./test-resources/dd-unblock-cbs8.spec").unwrap() - } else { - File::open("./test-resources/dd-unblock-cbs8-win.spec").unwrap() - } + File::open("./test-resources/dd-unblock-cbs8.spec").unwrap() );