From c5f5d20ed60f950d748a52b8a67d830428df4562 Mon Sep 17 00:00:00 2001 From: ascendforever Date: Sun, 13 Oct 2024 16:22:10 -0400 Subject: [PATCH] file comparison code cleaned u & related function signatures more logical --- src/main.rs | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1dc97dd..8bcfcc0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -259,7 +259,7 @@ fn run(paths: Vec, cfg: &Config) { let f1 = &files[i]; for j in (0..i).rev() { let f2 = &files[j]; - if !are_hardlinked(f1, f2) && cmp(f1, f2) { + if !are_hardlinked(f1, f2) && cmp(f1, f2).unwrap_or(false) { if !cfg.dry_run { if let Err(msg) = hardlink(f1, f2) { eprintln!("{}: {}", msg, format_pair(f1, f2, cfg)); @@ -374,33 +374,27 @@ fn are_hardlinked(f1: &PathBuf, f2: &PathBuf) -> bool { /// check equality of contents of two paths to files -fn cmp(f1: &PathBuf, f2: &PathBuf) -> bool { +fn cmp(f1: &PathBuf, f2: &PathBuf) -> std::io::Result { if let (Ok(mut f1), Ok(mut f2)) = (std::fs::File::open(f1), std::fs::File::open(f2)) { cmp_files(&mut f1, &mut f2) - } else { false } + } else { Ok(false) } } /// check equality of contents of two open files -fn cmp_files(f1: &mut std::fs::File, f2: &mut std::fs::File) -> bool { - let buff1: &mut[u8] = &mut [0; 1024]; - let buff2: &mut[u8] = &mut [0; 1024]; +fn cmp_files(f1: &mut std::fs::File, f2: &mut std::fs::File) -> std::io::Result { + let buff1: &mut [u8] = &mut [0; 1024]; + let buff2: &mut [u8] = &mut [0; 1024]; loop { - match f1.read(buff1) { - Err(_) => return false, - Ok(readlen1) => match f2.read(buff2) { - Err(_) => return false, - Ok(readlen2) => { - if readlen1 != readlen2 { - return false; - } - if readlen1 == 0 { - return true; - } - if &buff1[0..readlen1] != &buff2[0..readlen2] { - return false; - } - } - } + let l1 = f1.read(buff1)?; + let l2 = f2.read(buff2)?; + if l1 != l2 { // different sizes + return Ok(false); + } + if l1 == 0 { // end of both files + return Ok(true); + } + if &buff1[0..l1] != &buff2[0..l2] { // compare data + return Ok(false); } } }