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