#! /usr/bin/perl use strict; use warnings; @ARGV==2 or die; sub readfile($) { my($fname)=@_; local *F; open F,$fname or die $fname; my $F=do { local $/; ; }; defined $F or die $fname; close F or die $fname; return $F; } sub writefile($$) { my($fname,$content)=@_; local *F; open F,">$fname" or die $fname; print F $content or die $fname; close F or die $fname; } sub strip($$$) { my($dst,$src,$locref)=@_; my $f=readfile $src; $f=~s{^LOC (.*)$}{push @$locref,$1;"LOC";}egm; writefile $dst,$f; } my $t="/tmp/locdiff.$$"; my($a,$b)=("$t.a","$t.b"); my(@a,@b); strip $a,$ARGV[0],\@a; strip $b,$ARGV[1],\@b; my $f=readfile "diff -U-1 $a $b||true|"; die if 2!=unlink "$a","$b"; $f=~s{^([-+ ])LOC$}{ my $l; if ($1 eq "-") { $l=shift @a; } elsif ($1 eq "+") { $l=shift @b; } else { die if $1 ne " "; $l=shift @a; my $r=shift @b; $l="$r ($l)" if $l ne $r; } "$1LOC $l"; }egm; 1 while $f=~s{^ LOC .*\n(?: .*?\n)*?(.LOC )}{$1}gm; print $f;