From: Jan Dubois Date: Fri, 26 Feb 1999 21:56:09 +0000 (+0100) Subject: allow custom comparison function in File::Compare::compare_text() X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=167e09eb0e64de17f14240586bc87f0d35b1ce11;p=p5sagit%2Fp5-mst-13.2.git allow custom comparison function in File::Compare::compare_text() Message-ID: <36db0838.8805651@smtp1.ibm.net> Subject: Re: PodParser 1.07 (was: RE: C vs stuff()) p4raw-id: //depot/perl@3061 --- diff --git a/lib/File/Compare.pm b/lib/File/Compare.pm index 0ee84bd..dce78e2 100644 --- a/lib/File/Compare.pm +++ b/lib/File/Compare.pm @@ -23,7 +23,7 @@ sub compare { unless(@_ == 2 || @_ == 3); my ($from,$to,$size) = @_; - my $text_mode = defined($size) && $size < 0; + my $text_mode = defined($size) && (ref($size) eq 'CODE' || $size < 0); my ($fromsize,$closefrom,$closeto); local (*FROM, *TO); @@ -65,8 +65,12 @@ sub compare { local $/ = "\n"; my ($fline,$tline); while (defined($fline = )) { - unless (defined($tline = ) && $fline eq $tline) { - goto fail_inner; + goto fail_inner unless defined($tline = ); + if (ref $size) { + # $size contains ref to comparison function + goto fail_inner if &$size($fline, $tline); + } else { + goto fail_inner if $fline ne $tline; } } goto fail_inner if defined($tline = ); @@ -113,8 +117,17 @@ sub compare { *cmp = \&compare; -# Using a negative buffer size puts compare into text_mode -sub compare_text { compare(@_[0..1], -1) } +sub compare_text { + my ($from,$to,$cmp) = @_; + croak("Usage: compare_text( file1, file2 [, cmp-function])") + unless @_ == 2 || @_ == 3; + croak("Third arg to compare_text() function must be a code reference") + if @_ == 3 && ref($cmp) ne 'CODE'; + + # Using a negative buffer size puts compare into text_mode too + $cmp = -1 unless defined $cmp; + compare($from, $to, $cmp); +} 1; @@ -142,7 +155,16 @@ File::Compare::cmp is a synonym for File::Compare::compare. It is exported from File::Compare only by request. File::Compare::compare_text does a line by line comparison of the two -files. It stops as soon as a difference is detected. +files. It stops as soon as a difference is detected. compare_text() +accepts an optional third argument: This must be a CODE reference to +a line comparison function, which returns 0 when both lines are considered +equal. For example: + + compare_text($file1, $file2) + +is basically equivalent to + + compare_text($file1, $file2, sub {$_[0] ne $_[1]} ) =head1 RETURN