cb77f0d623ff3 (Kamil Rytarowski 2017-05-07 23:25:26 +0200 1) #!/usr/bin/env perl
b24413180f560 (Greg Kroah-Hartman 2017-11-01 15:07:57 +0100 2) # SPDX-License-Identifier: GPL-2.0
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 3) #
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 4) # Clean a patch file -- or directory of patch files -- of stealth whitespace.
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 5) # WARNING: this can be a highly destructive operation. Use with caution.
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 6) #
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 7)
cb77f0d623ff3 (Kamil Rytarowski 2017-05-07 23:25:26 +0200 8) use warnings;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 9) use bytes;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 10) use File::Basename;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 11)
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 12) # Default options
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 13) $max_width = 79;
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 14)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 15) # Clean up space-tab sequences, either by removing spaces or
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 16) # replacing them with tabs.
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 17) sub clean_space_tabs($)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 18) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 19) no bytes; # Tab alignment depends on characters
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 20)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 21) my($li) = @_;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 22) my($lo) = '';
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 23) my $pos = 0;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 24) my $nsp = 0;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 25) my($i, $c);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 26)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 27) for ($i = 0; $i < length($li); $i++) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 28) $c = substr($li, $i, 1);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 29) if ($c eq "\t") {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 30) my $npos = ($pos+$nsp+8) & ~7;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 31) my $ntab = ($npos >> 3) - ($pos >> 3);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 32) $lo .= "\t" x $ntab;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 33) $pos = $npos;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 34) $nsp = 0;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 35) } elsif ($c eq "\n" || $c eq "\r") {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 36) $lo .= " " x $nsp;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 37) $pos += $nsp;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 38) $nsp = 0;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 39) $lo .= $c;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 40) $pos = 0;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 41) } elsif ($c eq " ") {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 42) $nsp++;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 43) } else {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 44) $lo .= " " x $nsp;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 45) $pos += $nsp;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 46) $nsp = 0;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 47) $lo .= $c;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 48) $pos++;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 49) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 50) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 51) $lo .= " " x $nsp;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 52) return $lo;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 53) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 54)
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 55) # Compute the visual width of a string
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 56) sub strwidth($) {
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 57) no bytes; # Tab alignment depends on characters
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 58)
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 59) my($li) = @_;
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 60) my($c, $i);
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 61) my $pos = 0;
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 62) my $mlen = 0;
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 63)
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 64) for ($i = 0; $i < length($li); $i++) {
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 65) $c = substr($li,$i,1);
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 66) if ($c eq "\t") {
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 67) $pos = ($pos+8) & ~7;
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 68) } elsif ($c eq "\n") {
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 69) $mlen = $pos if ($pos > $mlen);
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 70) $pos = 0;
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 71) } else {
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 72) $pos++;
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 73) }
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 74) }
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 75)
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 76) $mlen = $pos if ($pos > $mlen);
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 77) return $mlen;
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 78) }
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 79)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 80) $name = basename($0);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 81)
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 82) @files = ();
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 83)
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 84) while (defined($a = shift(@ARGV))) {
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 85) if ($a =~ /^-/) {
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 86) if ($a eq '-width' || $a eq '-w') {
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 87) $max_width = shift(@ARGV)+0;
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 88) } else {
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 89) print STDERR "Usage: $name [-width #] files...\n";
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 90) exit 1;
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 91) }
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 92) } else {
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 93) push(@files, $a);
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 94) }
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 95) }
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 96)
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 97) foreach $f ( @files ) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 98) print STDERR "$name: $f\n";
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 99)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 100) if (! -f $f) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 101) print STDERR "$f: not a file\n";
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 102) next;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 103) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 104)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 105) if (!open(FILE, '+<', $f)) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 106) print STDERR "$name: Cannot open file: $f: $!\n";
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 107) next;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 108) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 109)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 110) binmode FILE;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 111)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 112) # First, verify that it is not a binary file; consider any file
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 113) # with a zero byte to be a binary file. Is there any better, or
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 114) # additional, heuristic that should be applied?
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 115) $is_binary = 0;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 116)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 117) while (read(FILE, $data, 65536) > 0) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 118) if ($data =~ /\0/) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 119) $is_binary = 1;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 120) last;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 121) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 122) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 123)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 124) if ($is_binary) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 125) print STDERR "$name: $f: binary file\n";
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 126) next;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 127) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 128)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 129) seek(FILE, 0, 0);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 130)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 131) $in_bytes = 0;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 132) $out_bytes = 0;
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 133) $lineno = 0;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 134)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 135) @lines = ();
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 136)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 137) $in_hunk = 0;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 138) $err = 0;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 139)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 140) while ( defined($line = <FILE>) ) {
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 141) $lineno++;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 142) $in_bytes += length($line);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 143)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 144) if (!$in_hunk) {
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 145) if ($line =~
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 146) /^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+),([0-9]+)\s\@\@/) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 147) $minus_lines = $2;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 148) $plus_lines = $4;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 149) if ($minus_lines || $plus_lines) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 150) $in_hunk = 1;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 151) @hunk_lines = ($line);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 152) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 153) } else {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 154) push(@lines, $line);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 155) $out_bytes += length($line);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 156) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 157) } else {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 158) # We're in a hunk
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 159)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 160) if ($line =~ /^\+/) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 161) $plus_lines--;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 162)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 163) $text = substr($line, 1);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 164) $text =~ s/[ \t\r]*$//; # Remove trailing spaces
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 165) $text = clean_space_tabs($text);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 166)
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 167) $l_width = strwidth($text);
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 168) if ($max_width && $l_width > $max_width) {
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 169) print STDERR
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 170) "$f:$lineno: adds line exceeds $max_width ",
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 171) "characters ($l_width)\n";
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 172) }
cb3ed5b7e09c6 (H. Peter Anvin 2007-05-25 17:58:26 -0700 173)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 174) push(@hunk_lines, '+'.$text);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 175) } elsif ($line =~ /^\-/) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 176) $minus_lines--;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 177) push(@hunk_lines, $line);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 178) } elsif ($line =~ /^ /) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 179) $plus_lines--;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 180) $minus_lines--;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 181) push(@hunk_lines, $line);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 182) } else {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 183) print STDERR "$name: $f: malformed patch\n";
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 184) $err = 1;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 185) last;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 186) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 187)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 188) if ($plus_lines < 0 || $minus_lines < 0) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 189) print STDERR "$name: $f: malformed patch\n";
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 190) $err = 1;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 191) last;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 192) } elsif ($plus_lines == 0 && $minus_lines == 0) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 193) # End of a hunk. Process this hunk.
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 194) my $i;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 195) my $l;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 196) my @h = ();
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 197) my $adj = 0;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 198) my $done = 0;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 199)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 200) for ($i = scalar(@hunk_lines)-1; $i > 0; $i--) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 201) $l = $hunk_lines[$i];
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 202) if (!$done && $l eq "+\n") {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 203) $adj++; # Skip this line
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 204) } elsif ($l =~ /^[ +]/) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 205) $done = 1;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 206) unshift(@h, $l);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 207) } else {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 208) unshift(@h, $l);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 209) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 210) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 211)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 212) $l = $hunk_lines[0]; # Hunk header
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 213) undef @hunk_lines; # Free memory
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 214)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 215) if ($adj) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 216) die unless
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 217) ($l =~ /^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+),([0-9]+)\s\@\@(.*)$/);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 218) my $mstart = $1;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 219) my $mlin = $2;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 220) my $pstart = $3;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 221) my $plin = $4;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 222) my $tail = $5; # doesn't include the final newline
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 223)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 224) $l = sprintf("@@ -%d,%d +%d,%d @@%s\n",
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 225) $mstart, $mlin, $pstart, $plin-$adj,
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 226) $tail);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 227) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 228) unshift(@h, $l);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 229)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 230) # Transfer to the output array
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 231) foreach $l (@h) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 232) $out_bytes += length($l);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 233) push(@lines, $l);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 234) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 235)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 236) $in_hunk = 0;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 237) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 238) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 239) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 240)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 241) if ($in_hunk) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 242) print STDERR "$name: $f: malformed patch\n";
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 243) $err = 1;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 244) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 245)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 246) if (!$err) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 247) if ($in_bytes != $out_bytes) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 248) # Only write to the file if changed
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 249) seek(FILE, 0, 0);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 250) print FILE @lines;
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 251)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 252) if ( !defined($where = tell(FILE)) ||
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 253) !truncate(FILE, $where) ) {
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 254) die "$name: Failed to truncate modified file: $f: $!\n";
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 255) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 256) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 257) }
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 258)
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 259) close(FILE);
6e019b001d27c (H. Peter Anvin 2007-03-16 14:45:06 -0700 260) }