update_copyrights revision e85ffb301b294d70ddc1d90234788403666bb944
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein#!/usr/local/bin/perl -w
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein#
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# Copyright (C) 1998-2000 Internet Software Consortium.
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein#
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# Permission to use, copy, modify, and distribute this software for any
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# purpose with or without fee is hereby granted, provided that the above
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# copyright notice and this permission notice appear in all copies.
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein#
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# SOFTWARE.
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# $Id: update_copyrights,v 1.14 2000/06/22 22:24:05 tale Exp $
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein
b0fb330a8581c8bfab5e523084f9f39264a52b12gsteinrequire 5.002;
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# Map copyright owners to the files containing copyright messages.
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# The first line of the copyright message is not in the file;
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# it is constructed by this script.
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein
b0fb330a8581c8bfab5e523084f9f39264a52b12gsteinmy %owner2filename = (
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein "" => "util/COPYRIGHT",
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein "NAI" => "util/COPYRIGHT.NAI",
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein "BRIEF" => "util/COPYRIGHT.BRIEF",
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein "PORTION" => "util/COPYRIGHT.PORTION",
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein);
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# Map each copyright owner name to a reference to an array containing
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein# the lines of the copyright message.
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein
b0fb330a8581c8bfab5e523084f9f39264a52b12gsteinmy %owner2text = ();
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein
b0fb330a8581c8bfab5e523084f9f39264a52b12gsteinforeach $owner (keys %owner2filename) {
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein my $f = $owner2filename{$owner};
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein open(COPYRIGHT, "<$f") || die "can't open $f: $!";
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein @copyright_text = <COPYRIGHT>;
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein close(COPYRIGHT);
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein $owner2text{$owner} = [ @copyright_text ];
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein}
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein
b0fb330a8581c8bfab5e523084f9f39264a52b12gsteinwhile (<>) {
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein ($file, $typeandowner, $years_list) = split(/\s+/);
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein @years = split(/,/, $years_list);
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein if ( ! -f $file ) {
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein print "$file: missing\n";
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein next;
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein my ($type, $owner) = split(/\./, $typeandowner);
b0fb330a8581c8bfab5e523084f9f39264a52b12gstein $owner = "" if !defined $owner;
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein $textp = $owner2text{$owner};
f4c310fd2555c6faca1f980f00b161eadb089023gstein if (!defined $textp) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein print "$file: unknown copyright owner $owner\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein next;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein next if $type eq "X";
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein $before_copyright = "";
252e2478cb56afb5ca8585b50bc2ffb780d2efb6gstein $c_comment = 0;
ba8574a7fe6f1c3405982bb856591b5f13fe205agstein $shell_comment = 0;
ba8574a7fe6f1c3405982bb856591b5f13fe205agstein $m4_comment = 0;
252e2478cb56afb5ca8585b50bc2ffb780d2efb6gstein $html_comment = 0;
cbc2cc2d42811fc0d836b1cfd0c52121d8359e86gstein $zone_comment = 0;
f4c310fd2555c6faca1f980f00b161eadb089023gstein $man_comment = 0;
f4c310fd2555c6faca1f980f00b161eadb089023gstein $start_comment = "";
4aa38ff502b8639820dd007b9095e0229bcd3311gstein $end_comment = "";
f4c310fd2555c6faca1f980f00b161eadb089023gstein $first = "";
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($type =~ /^(C|YACC|CONF-C)/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $c_comment = 1;
f4c310fd2555c6faca1f980f00b161eadb089023gstein $start_comment = "/*\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein $prefix = " * ";
f4c310fd2555c6faca1f980f00b161eadb089023gstein $end_comment = " */\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein } elsif ($type =~ /^(SH|PERL|MAKE|CONF-SH)/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $shell_comment = 1;
f4c310fd2555c6faca1f980f00b161eadb089023gstein $prefix = "# ";
f4c310fd2555c6faca1f980f00b161eadb089023gstein } elsif ($type eq "ZONE") {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $zone_comment = 1;
f4c310fd2555c6faca1f980f00b161eadb089023gstein $prefix = "; ";
f4c310fd2555c6faca1f980f00b161eadb089023gstein } elsif ($type eq "MAN") {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $man_comment = 1;
f4c310fd2555c6faca1f980f00b161eadb089023gstein $prefix = ".\\\" ";
f4c310fd2555c6faca1f980f00b161eadb089023gstein } elsif ($type eq "M4") {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $m4_comment = 1;
f4c310fd2555c6faca1f980f00b161eadb089023gstein $prefix = "dnl ";
f4c310fd2555c6faca1f980f00b161eadb089023gstein } elsif ($type eq "HTML") {
06cb1a83b6a1cfbe9c7815569e6c1d1408966ff7gstein $html_comment = 1;
f4c310fd2555c6faca1f980f00b161eadb089023gstein $start_comment = "<!--\n";
06cb1a83b6a1cfbe9c7815569e6c1d1408966ff7gstein $prefix = " - ";
f4c310fd2555c6faca1f980f00b161eadb089023gstein $end_comment = "-->\n";
06cb1a83b6a1cfbe9c7815569e6c1d1408966ff7gstein } elsif ($type eq "TXT") {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $prefix = "";
06cb1a83b6a1cfbe9c7815569e6c1d1408966ff7gstein } else {
f4c310fd2555c6faca1f980f00b161eadb089023gstein print "$file: type '$type' not supported yet; skipping\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein next;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein open(SOURCE, "<$file") || die "can't open $file: $!";
f4c310fd2555c6faca1f980f00b161eadb089023gstein $_ = <SOURCE>;
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($type eq "YACC") {
f4c310fd2555c6faca1f980f00b161eadb089023gstein unless ($_ eq "%{\n") {
f4c310fd2555c6faca1f980f00b161eadb089023gstein print "$file: unexpected yacc file start (expected \"%{\\n\")\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein close(SOURCE);
f4c310fd2555c6faca1f980f00b161eadb089023gstein next;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein $before_copyright = "$_";
f4c310fd2555c6faca1f980f00b161eadb089023gstein $_ = <SOURCE>;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($c_comment && /^\/\*/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $_ = <SOURCE>;
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($_ !~ /[Cc]opyright/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein print "$file: non-copyright comment\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein close(SOURCE);
f4c310fd2555c6faca1f980f00b161eadb089023gstein next;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($_ !~ /\*\//) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein while (<SOURCE>) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($_ =~ /\*\//) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein last;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein } elsif ($shell_comment) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein if (/^\#\!/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $before_copyright = "$_#\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein $_ = <SOURCE>;
f4c310fd2555c6faca1f980f00b161eadb089023gstein $_ = <SOURCE> if $_ eq "#\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein if (/^\#/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($_ !~ /[Cc]opyright/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein print "$file: non-copyright comment\n";
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm close(SOURCE);
f4c310fd2555c6faca1f980f00b161eadb089023gstein next;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein while (<SOURCE>) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($_ !~ /^\#/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $first = $_;
f4c310fd2555c6faca1f980f00b161eadb089023gstein last;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein } else {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $first = $_;
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm }
f4c310fd2555c6faca1f980f00b161eadb089023gstein } elsif (($m4_comment || $zone_comment || $man_comment) &&
f4c310fd2555c6faca1f980f00b161eadb089023gstein /^\Q$prefix\E/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein ($nonspaceprefix = $prefix) =~ s/\s+$//;
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein while (/^\Q$nonspaceprefix\E\s*$/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $_ = <SOURCE>;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($_ !~ /[Cc]opyright/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein print "$file: non-copyright comment\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein close(SOURCE);
f4c310fd2555c6faca1f980f00b161eadb089023gstein next;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein while (<SOURCE>) {
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm if ($_ !~ /^\Q$prefix\E/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $first = $_;
f4c310fd2555c6faca1f980f00b161eadb089023gstein last;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein } elsif ($html_comment) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein if (/^<!DOCTYPE/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $before_copyright = $_;
f4c310fd2555c6faca1f980f00b161eadb089023gstein $_ = <SOURCE>;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein if (/^<!/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $_ = <SOURCE> if $_ eq "<!--\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($_ !~ /[Cc]opyright/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein print "$file: non-copyright comment\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein close(SOURCE);
f4c310fd2555c6faca1f980f00b161eadb089023gstein next;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein while (defined($_)) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein last if s/.*-->//;
f4c310fd2555c6faca1f980f00b161eadb089023gstein $_ = <SOURCE>;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein print "$file: unterminated comment\n" unless defined($_);
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($_ ne "\n") {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $first = $_;
f4c310fd2555c6faca1f980f00b161eadb089023gstein } else {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $first = <SOURCE>;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein } else {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $first = $_;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein } elsif ($type eq "TXT") {
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($_ =~ /[Cc]opyright/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $/ = ""; # paragraph at a time
f4c310fd2555c6faca1f980f00b161eadb089023gstein while (<SOURCE>) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein # Not very maintainable, but suitable enough for now.
f4c310fd2555c6faca1f980f00b161eadb089023gstein last unless
f4c310fd2555c6faca1f980f00b161eadb089023gstein /See COPYRIGHT in the source root/ ||
f4c310fd2555c6faca1f980f00b161eadb089023gstein /Permission to use, copy, modify, and distribute / ||
f4c310fd2555c6faca1f980f00b161eadb089023gstein /THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET /;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein $/ = "\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein $first = $_;
f4c310fd2555c6faca1f980f00b161eadb089023gstein } else {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $first = $_;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein $first = "" if ! defined($first);
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein open(TARGET, ">$file.new") || die "can't open $file.new: $!";
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($before_copyright ne "") {
f4c310fd2555c6faca1f980f00b161eadb089023gstein print TARGET $before_copyright;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($start_comment) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein print TARGET $start_comment;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein $years = "";
f4c310fd2555c6faca1f980f00b161eadb089023gstein $last_year = 0;
f4c310fd2555c6faca1f980f00b161eadb089023gstein $anchor_year = 0;
f4c310fd2555c6faca1f980f00b161eadb089023gstein foreach $year (@years) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($last_year != 0 && $year == $last_year + 1) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($year > $anchor_year + 1) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein substr($years, $anchor_end) = "-$year";
f4c310fd2555c6faca1f980f00b161eadb089023gstein } else {
709df1e1c2e1710570f8cb4209497e88662829c3gstein $years .= ", $year";
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein } else {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $years .= $last_year == 0 ? "$year" : ", $year";
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($anchor_year != 0) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein print "$file: noncontiguous year: $year != $last_year + 1\n";
709df1e1c2e1710570f8cb4209497e88662829c3gstein }
709df1e1c2e1710570f8cb4209497e88662829c3gstein $anchor_year = $year;
709df1e1c2e1710570f8cb4209497e88662829c3gstein $anchor_end = length($years);
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein $last_year = $year;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein ($firstline, @otherlines) = @$textp;
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein $firstline =~ s/\@YEARS\@/$years/;
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein print TARGET "$prefix$firstline";
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein foreach $_ (@otherlines) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein print TARGET "${prefix}$_";
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($end_comment) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein print TARGET $end_comment;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($first eq "") {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $first = <SOURCE>;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein if (defined($first)) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein print TARGET "\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein undef $/;
f4c310fd2555c6faca1f980f00b161eadb089023gstein $_ = <SOURCE>;
f4c310fd2555c6faca1f980f00b161eadb089023gstein $/ = "\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein my $pat = '\$(Id|Revision):.*\$';
f4c310fd2555c6faca1f980f00b161eadb089023gstein my ($start, $end);
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($start_comment ne "") {
f4c310fd2555c6faca1f980f00b161eadb089023gstein ($start = $start_comment) =~ s/\s*\n/ /;
f4c310fd2555c6faca1f980f00b161eadb089023gstein ($end = $end_comment) =~ s/^\s*(.*)\n/ $1\n/;
f4c310fd2555c6faca1f980f00b161eadb089023gstein } elsif ($prefix ne "") {
f4c310fd2555c6faca1f980f00b161eadb089023gstein ($start = $prefix) =~ s/\s*\n//;
f4c310fd2555c6faca1f980f00b161eadb089023gstein $end = "\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein } else {
f4c310fd2555c6faca1f980f00b161eadb089023gstein $start = "";
f4c310fd2555c6faca1f980f00b161eadb089023gstein $end = "\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein if ($first !~ /$pat/ && $_ !~ /$pat/) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein print TARGET "$start\$";
f4c310fd2555c6faca1f980f00b161eadb089023gstein print TARGET "Id: ";
f4c310fd2555c6faca1f980f00b161eadb089023gstein print TARGET "\$$end\n";
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein print TARGET $first if $first !~ /^\s*$/;
f4c310fd2555c6faca1f980f00b161eadb089023gstein print TARGET $_;
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein close(TARGET);
f4c310fd2555c6faca1f980f00b161eadb089023gstein close(SOURCE);
f4c310fd2555c6faca1f980f00b161eadb089023gstein $mode = (stat $file)[2]&511;
f4c310fd2555c6faca1f980f00b161eadb089023gstein chmod $mode, "$file.new";
f4c310fd2555c6faca1f980f00b161eadb089023gstein
f4c310fd2555c6faca1f980f00b161eadb089023gstein if (system("cmp -s $file.new $file") == 0) {
f4c310fd2555c6faca1f980f00b161eadb089023gstein unlink("$file.new");
f4c310fd2555c6faca1f980f00b161eadb089023gstein } else {
f4c310fd2555c6faca1f980f00b161eadb089023gstein rename("$file", "$file.bak") || die "rename($file, $file.bak): $!";
f4c310fd2555c6faca1f980f00b161eadb089023gstein rename("$file.new", "$file") || die "rename($file.new, $file): $!";
f4c310fd2555c6faca1f980f00b161eadb089023gstein }
f4c310fd2555c6faca1f980f00b161eadb089023gstein}
f4c310fd2555c6faca1f980f00b161eadb089023gstein