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