Werner's Miscellanea
Sign in or create your account | Project List | Help
Werner's Miscellanea Git Source Tree
Root/
Source at commit e0063a90c557863e7733660a44065c4c75874221 created 9 years 8 months ago. By Werner Almesberger, ircstat/ML: update for 2014-05 | |
---|---|
1 | #!/usr/bin/perl |
2 | # |
3 | # pidiff - Position-independent diff filter |
4 | # |
5 | # Copyright 2012 by Werner Almesberger |
6 | # |
7 | # This program is free software; you can redistribute it and/or modify |
8 | # it under the terms of the GNU General Public License as published by |
9 | # the Free Software Foundation; either version 2 of the License, or |
10 | # (at your option) any later version. |
11 | # |
12 | |
13 | |
14 | sub usage |
15 | { |
16 | print STDERR <<'EOF' |
17 | usage: diff -u ... | $0 [-n] [-D] |
18 | |
19 | -n print line numbers |
20 | -D print debug output |
21 | EOF |
22 | ; |
23 | exit(1); |
24 | } |
25 | |
26 | |
27 | while ($ARGV[0] =~ /^-/) { |
28 | if ($ARGV[0] eq "-n") { |
29 | $num = 1; |
30 | } elsif ($ARGV[0] eq "-D") { |
31 | $debug = 1; |
32 | } else { |
33 | &usage; |
34 | } |
35 | shift @ARGV; |
36 | } |
37 | |
38 | $n = 0; |
39 | while (<>) { |
40 | $n++; |
41 | next unless /^[-+]/; |
42 | if (/^-/) { |
43 | push @{ $m{$'} }, $n; |
44 | } else { |
45 | push @{ $p{$'} }, $n; |
46 | } |
47 | } |
48 | for $k (keys %p) { |
49 | undef $bm, $mp; |
50 | undef $bd; |
51 | $em = $#{ $m{$k} }; |
52 | $ep = $#{ $p{$k} }; |
53 | $m = 0; |
54 | $p = 0; |
55 | while ($m <= $em && $p <= $ep) { |
56 | $d = abs($m{$k}[$m]-$p{$k}[$p]); |
57 | ($bm, $bp, $bd) = ($m, $p, $d) |
58 | unless $d > $bd && defined $bd; |
59 | if ($m{$k}[$m] <= $p{$k}[$p] && $m < $em) { |
60 | $m++; |
61 | } else { |
62 | $p++; |
63 | } |
64 | } |
65 | # older variant, less efficient |
66 | # for $m (0..$#{ $m{$k} }) { |
67 | # for $p (0..$#{ $m{$k} }) { |
68 | # $d = abs($m{$k}[$m]-$p{$k}[$p]); |
69 | # ($bm, $bp, $bd) = ($m, $p, $d) |
70 | # unless $d > $bd && defined $bd; |
71 | # } |
72 | # } |
73 | next unless defined $bd; |
74 | if ($debug) { |
75 | chop($kk = $k); |
76 | print STDERR |
77 | "$kk: del m at $bm ($m{$k}[$bm]) p at $bp ($p{$k}[$bp])\n"; |
78 | } |
79 | splice(@{ $m{$k} }, $bm, 1); |
80 | splice(@{ $p{$k} }, $bp, 1); |
81 | redo; |
82 | } |
83 | |
84 | for $k (keys %m) { |
85 | for (@{ $m{$k} }) { |
86 | $l{$_} = "-$k"; |
87 | } |
88 | } |
89 | for $k (keys %p) { |
90 | for (@{ $p{$k} }) { |
91 | $l{$_} = "+$k"; |
92 | } |
93 | } |
94 | for (sort { $a <=> $b } keys %l) { |
95 | print "$_: " if $num; |
96 | print $l{$_}; |
97 | } |
98 |
Branches:
master