From bbfa7f9a5d262d13c825005f89410f464148fd1d Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 9 Apr 2012 16:18:21 -0400 Subject: [PATCH] combine: Avoid reading files twice, to support data coming from pipes. Closes: #667960 Thanks, Carsten Hey --- combine | 29 ++++++++++++++++++++++++++--- debian/changelog | 2 ++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/combine b/combine index a695935..13fc2e4 100755 --- a/combine +++ b/combine @@ -104,9 +104,32 @@ sub compare_or { sub compare_xor { my ($file1, $file2) = @_; - - compare_not($file1, $file2); - compare_not($file2, $file1); + + my ($lines2, $seen2) = ([], {}); + filemap $file2, + sub { + push @$lines2, $_; + $seen2->{$_} = 1; + }; + + filemap $file1, + sub { + # Print all lines in file1 that are not in file2, + # and mark lines that are in both files by setting + # their value in %seen2 to 0. + if (exists $seen2->{$_}) { + $seen2->{$_} = 0; + } + else { + print "$_\n"; + } + }; + + foreach (@$lines2) { + # Print all lines that are in file2 but not in file1. + # The value of these lines in seen2 is set to 1. + print "$_\n" if $seen2->{$_}; + } } sub compare_not { diff --git a/debian/changelog b/debian/changelog index 13822c1..cd406ff 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,8 @@ moreutils (0.46) UNRELEASED; urgency=low * Typo. Closes: #649158 + * combine: Avoid reading files twice, to support data coming from + pipes. Closes: #667960 Thanks, Carsten Hey -- Joey Hess Fri, 18 Nov 2011 13:37:10 -0400 -- 2.11.4.GIT