update_copyrights revision 499b34cea04a46823d003d4c0520c8b03e8513cb
1c57c3f79db0bf0358bbe6d7b5ad650c0c852f4bTinderbox User#!/usr/local/bin/perl -w
1c57c3f79db0bf0358bbe6d7b5ad650c0c852f4bTinderbox User#
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox User# Copyright (C) 1998-2001 Internet Software Consortium.
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox User#
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox User# Permission to use, copy, modify, and distribute this software for any
1c57c3f79db0bf0358bbe6d7b5ad650c0c852f4bTinderbox User# purpose with or without fee is hereby granted, provided that the above
1c57c3f79db0bf0358bbe6d7b5ad650c0c852f4bTinderbox User# copyright notice and this permission notice appear in all copies.
1c57c3f79db0bf0358bbe6d7b5ad650c0c852f4bTinderbox User#
1c57c3f79db0bf0358bbe6d7b5ad650c0c852f4bTinderbox User# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
1c57c3f79db0bf0358bbe6d7b5ad650c0c852f4bTinderbox User# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
1c57c3f79db0bf0358bbe6d7b5ad650c0c852f4bTinderbox User# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User# INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
1c57c3f79db0bf0358bbe6d7b5ad650c0c852f4bTinderbox User# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
f9ce6280cec79deb16ff6d9807aa493ff23e10d9Tinderbox User# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
1700442a7751c2bbdafe2d039cebbd8316496957Tinderbox User# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
f9ce6280cec79deb16ff6d9807aa493ff23e10d9Tinderbox User
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# $Id: update_copyrights,v 1.22 2001/01/09 22:01:04 bwelling Exp $
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox Userrequire 5.002;
46472a450e043434d78fa18edc73bca8c47f3981Tinderbox User
46472a450e043434d78fa18edc73bca8c47f3981Tinderbox User# Map copyright owners to the files containing copyright messages.
e285c11870c6263cd79b418e104c7eb3e2d96952Tinderbox User# The first line of the copyright message is not in the file;
46472a450e043434d78fa18edc73bca8c47f3981Tinderbox User# it is constructed by this script.
46472a450e043434d78fa18edc73bca8c47f3981Tinderbox User
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntmy %owner2filename = (
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User "" => "util/COPYRIGHT",
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User "NAI" => "util/COPYRIGHT.NAI",
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt "BSDI" => "util/COPYRIGHT.BSDI",
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt "BRIEF" => "util/COPYRIGHT.BRIEF",
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User "PORTION" => "util/COPYRIGHT.PORTION",
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt);
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# Map each copyright owner name to a reference to an array containing
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# the lines of the copyright message.
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntmy %owner2text = ();
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox Userforeach $owner (keys %owner2filename) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt my $f = $owner2filename{$owner};
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User open(COPYRIGHT, "<$f") || die "can't open $f: $!";
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User @copyright_text = <COPYRIGHT>;
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User close(COPYRIGHT);
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User $owner2text{$owner} = [ @copyright_text ];
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User}
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox Userwhile (<>) {
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User ($file, $typeandowner, $years_list) = split(/\s+/);
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User @years = split(/,/, $years_list);
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User if ( ! -f $file ) {
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User print "$file: missing\n";
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User next;
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User }
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User my ($type, $owner) = split(/\./, $typeandowner);
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User $owner = "" if !defined $owner;
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User $textp = $owner2text{$owner};
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User if (!defined $textp) {
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User print "$file: unknown copyright owner $owner\n";
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User next;
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User }
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User next if $type eq "X";
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User $before_copyright = "";
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User $c_comment = 0;
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User $shell_comment = 0;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $m4_comment = 0;
6b7cba2b10d6cb5363d94b434b0d22ecfb33a6f3Tinderbox User $html_comment = 0;
1700442a7751c2bbdafe2d039cebbd8316496957Tinderbox User $zone_comment = 0;
e2f974003e61b59321a99f01a6f43576d9b76231Tinderbox User $man_comment = 0;
e2f974003e61b59321a99f01a6f43576d9b76231Tinderbox User $start_comment = "";
576bce9d7331498ca5453f8743f94ed8e2e59d9fTinderbox User $end_comment = "";
576bce9d7331498ca5453f8743f94ed8e2e59d9fTinderbox User $first = "";
6b7cba2b10d6cb5363d94b434b0d22ecfb33a6f3Tinderbox User if ($type =~ /^(C|YACC|CONF-C)$/) {
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User $c_comment = 1;
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User $start_comment = "/*\n";
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $prefix = " * ";
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $end_comment = " */\n";
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User } elsif ($type =~ /^(SH|PERL|TCL|MAKE|CONF-SH)$/) {
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User $shell_comment = 1;
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User $prefix = "# ";
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User } elsif ($type eq "ZONE") {
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User $zone_comment = 1;
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User $prefix = "; ";
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User } elsif ($type eq "MAN") {
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User $man_comment = 1;
1ffe3f29e3cd0d8355500e9fd34de918ad9b4a01Tinderbox User $prefix = ".\\\" ";
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User } elsif ($type eq "M4") {
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User $m4_comment = 1;
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User $prefix = "dnl ";
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User } elsif ($type eq "HTML") {
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User $html_comment = 1;
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User $start_comment = "<!--\n";
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User $prefix = " - ";
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User $end_comment = "-->\n";
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User } elsif ($type eq "TXT") {
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User $prefix = "";
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User } else {
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User print "$file: type '$type' not supported yet; skipping\n";
1ffe3f29e3cd0d8355500e9fd34de918ad9b4a01Tinderbox User next;
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User }
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User ($nonspaceprefix = $prefix) =~ s/\s+$//;
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User open(SOURCE, "<$file") || die "can't open $file: $!";
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User $_ = <SOURCE>;
1ffe3f29e3cd0d8355500e9fd34de918ad9b4a01Tinderbox User if ($type eq "YACC") {
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User unless ($_ eq "%{\n") {
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User print "$file: unexpected yacc file start ",
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User "(expected \"%{\\n\")\n";
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User close(SOURCE);
260e8e04b0dc24cb884c789b5d9eb046457f264eTinderbox User next;
3ba1f79ade054aa6a0dc5032502bcdcf357cd7bdTinderbox User }
3ba1f79ade054aa6a0dc5032502bcdcf357cd7bdTinderbox User $before_copyright = "$_";
3ba1f79ade054aa6a0dc5032502bcdcf357cd7bdTinderbox User $_ = <SOURCE>;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt }
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User if ($c_comment && /^\/\*/) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $_ = <SOURCE>;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if ($_ !~ /[Cc]opyright/) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt print "$file: non-copyright comment\n";
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt close(SOURCE);
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt next;
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if ($_ !~ /\*\//) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt while (<SOURCE>) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt last if $_ =~ /\*\//;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt } elsif ($shell_comment) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if (/^\#\!/) {
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User $before_copyright = "$_#\n";
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $_ = <SOURCE>;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $_ = <SOURCE> if $_ eq "#\n";
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if (/^\#/) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if ($_ !~ /[Cc]opyright/) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt print "$file: non-copyright comment\n";
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User close(SOURCE);
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt next;
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt while (<SOURCE>) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if ($_ !~ /^\#/) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $first = $_;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt last;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt }
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt } else {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $first = $_;
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User }
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User } elsif (($m4_comment || $zone_comment || $man_comment) &&
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt /^\Q$nonspaceprefix\E/) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt while (/^\Q$nonspaceprefix\E\s*$/) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $_ = <SOURCE>;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if ($_ !~ /[Cc]opyright/) {
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User print "$file: non-copyright comment\n";
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User close(SOURCE);
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt next;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt while (<SOURCE>) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if ($_ !~ /^\Q$nonspaceprefix\E/) {
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User $first = $_;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt last;
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt } elsif ($html_comment) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if (/^<!DOCTYPE/) {
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User $before_copyright = $_;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $_ = <SOURCE>;
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if (/^<!/) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $_ = <SOURCE> if $_ eq "<!--\n";
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if ($_ !~ /[Cc]opyright/) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt print "$file: non-copyright comment\n";
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt close(SOURCE);
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User next;
9d557856c2a19ec95ee73245f60a92f8675cf5baTinderbox User }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt while (defined($_)) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt last if s/.*-->//;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $_ = <SOURCE>;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt }
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User print "$file: unterminated comment\n"
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt unless defined($_);
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if ($_ ne "\n") {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $first = $_;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt } else {
76cf91b5df7a1bc450afcb9ce7585c61bb87de68Tinderbox User $first = <SOURCE>;
1700442a7751c2bbdafe2d039cebbd8316496957Tinderbox User }
1700442a7751c2bbdafe2d039cebbd8316496957Tinderbox User } else {
1700442a7751c2bbdafe2d039cebbd8316496957Tinderbox User $first = $_;
1700442a7751c2bbdafe2d039cebbd8316496957Tinderbox User }
1700442a7751c2bbdafe2d039cebbd8316496957Tinderbox User } elsif ($type eq "TXT") {
1700442a7751c2bbdafe2d039cebbd8316496957Tinderbox User if ($_ =~ /[Cc]opyright/) {
1700442a7751c2bbdafe2d039cebbd8316496957Tinderbox User $/ = ""; # paragraph at a time
1700442a7751c2bbdafe2d039cebbd8316496957Tinderbox User while (<SOURCE>) {
1700442a7751c2bbdafe2d039cebbd8316496957Tinderbox User # Not very maintainable, but ok enough for now.
1700442a7751c2bbdafe2d039cebbd8316496957Tinderbox User last unless
1700442a7751c2bbdafe2d039cebbd8316496957Tinderbox User /See COPYRIGHT in the source root/ ||
1700442a7751c2bbdafe2d039cebbd8316496957Tinderbox User /Permission to use, copy, modify, and / ||
1700442a7751c2bbdafe2d039cebbd8316496957Tinderbox User /THE SOFTWARE IS PROVIDED "AS IS" AND /;
76cf91b5df7a1bc450afcb9ce7585c61bb87de68Tinderbox User }
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User $/ = "\n";
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt }
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User $first = $_;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt } else {
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User $first = $_;
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User }
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $first = "" if ! defined($first);
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt open(TARGET, ">$file.new") || die "can't open $file.new: $!";
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt print TARGET $before_copyright if $before_copyright;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt print TARGET $start_comment if $start_comment;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $years = "";
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User $last_year = 0;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $anchor_year = 0;
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User foreach $year (@years) {
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User if ($last_year != 0 && $year == $last_year + 1) {
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User if ($year > $anchor_year + 1) {
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User substr($years, $anchor_end) = "-$year";
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User } else {
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User $years .= ", $year";
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User }
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User } else {
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User $years .= $last_year == 0 ? "$year" : ", $year";
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User if ($anchor_year != 0) {
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User print "$file: noncontiguous year: ",
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User "$year != $last_year + 1\n";
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User }
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User $anchor_year = $year;
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User $anchor_end = length($years);
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User }
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User $last_year = $year;
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User }
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User ($firstline, @otherlines) = @$textp;
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User $firstline =~ s/\@YEARS\@/$years/;
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User print TARGET "$prefix$firstline";
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User foreach $_ (@otherlines) {
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User print TARGET (/^$/ ? $nonspaceprefix : $prefix);
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User print TARGET "$_";
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User }
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User print TARGET $end_comment if $end_comment;
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User
a1ff871f78b7d907d6fc3a382beea2a640fe8423Tinderbox User if ($first eq "") {
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User $first = <SOURCE>;
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User }
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User if (defined($first)) {
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User print TARGET "\n";
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User
3241ddcf9354c5ab50f4df5a656e72a5c68e172bTinderbox User undef $/;
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User $_ = <SOURCE>;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $/ = "\n";
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt my $pat = '\$(Id|Revision):.*\$';
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt my ($start, $end);
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if ($start_comment ne "") {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt ($start = $start_comment) =~ s/\s*\n/ /;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt ($end = $end_comment) =~ s/^\s*(.*)\n/ $1\n/;
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User } elsif ($prefix ne "") {
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User ($start = $prefix) =~ s/\s*\n//;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $end = "\n";
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt } else {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $start = "";
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $end = "\n";
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt }
8a48b6b9b6fa8486f24b22d1972b2b6ebb36a4a4Tinderbox User
e2b184f84e846bbcb764b6f0aef5dcd583d3d7a1Tinderbox User if ($first !~ /$pat/ && $_ !~ /$pat/) {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt print TARGET "$start\$";
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User print TARGET "Id: ";
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User print TARGET "\$$end\n";
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt print TARGET $first if $first !~ /^\s*$/;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt print TARGET $_;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt close(TARGET);
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt close(SOURCE);
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $mode = (stat $file)[2]&511;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt chmod $mode, "$file.new";
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User if (system("cmp -s $file.new $file") == 0) {
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User unlink("$file.new");
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt } else {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt rename("$file.new", "$file")
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt or die "rename($file.new, $file): $!";
6b7cba2b10d6cb5363d94b434b0d22ecfb33a6f3Tinderbox User }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt}
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt