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