update_copyrights revision 30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#!/usr/local/bin/perl -w
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# Copyright (C) 2004-2010, 2012-2015 Internet Systems Consortium, Inc. ("ISC")
13c6532dc104d23061e6901783ceb1ff8872c206Timo Sirainen# Copyright (C) 1998-2001 Internet Software Consortium.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# Permission to use, copy, modify, and/or distribute this software for any
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# purpose with or without fee is hereby granted, provided that the above
920b9f0fdfa5a5d7763e05736601a31bcb291a53Timo Sirainen# copyright notice and this permission notice appear in all copies.
920b9f0fdfa5a5d7763e05736601a31bcb291a53Timo Sirainen#
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainen# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
f0ff961282e618945dfe997dc45ff95d656e5790Timo Sirainen# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# PERFORMANCE OF THIS SOFTWARE.
f0ff961282e618945dfe997dc45ff95d656e5790Timo Sirainen
f0ff961282e618945dfe997dc45ff95d656e5790Timo Sirainenrequire 5.002;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# Map copyright owners to the files containing copyright messages.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# The first line of the copyright message is not in the file;
1a21e7049796c98d6d998fcf7a438d7a97193dc4Timo Sirainen# it is constructed by this script.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
abb83d133dd082527d500916fca66a72fbbbaa8dTimo Sirainen# Usage:
abb83d133dd082527d500916fca66a72fbbbaa8dTimo Sirainen#
abb83d133dd082527d500916fca66a72fbbbaa8dTimo Sirainen# perl util/update_copyrights <util/copyrights
abb83d133dd082527d500916fca66a72fbbbaa8dTimo Sirainen
330d54e9e3bf076efe91f101c562d1268160b128Timo Sirainenmy %owner2filename = (
330d54e9e3bf076efe91f101c562d1268160b128Timo Sirainen "" => "util/COPYRIGHT",
330d54e9e3bf076efe91f101c562d1268160b128Timo Sirainen "NAI" => "util/COPYRIGHT.NAI",
763f83d3cc47bce05cbc396419c4db2b71dd8e68Timo Sirainen "NOM" => "util/COPYRIGHT.NOM",
3f5b0dcbdc4f804a99935b648b34540bd2dc9c08Timo Sirainen "BSDI" => "util/COPYRIGHT.BSDI",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "BRIEF" => "util/COPYRIGHT.BRIEF",
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen "PORTION" => "util/COPYRIGHT.PORTION",
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen);
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# Map each copyright owner name to a reference to an array containing
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainen# the lines of the copyright message.
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainen
920b9f0fdfa5a5d7763e05736601a31bcb291a53Timo Sirainenmy %owner2text = ();
811f2e26d9782d9cb99fdf82e18ffa0a77564fe2Timo Sirainen
920b9f0fdfa5a5d7763e05736601a31bcb291a53Timo Sirainenmy $keyword_pat = '\$(Id:.*|Revision:.*|Id|Revision)\$';
920b9f0fdfa5a5d7763e05736601a31bcb291a53Timo Sirainen
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainenforeach $owner (keys %owner2filename) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen my $f = $owner2filename{$owner};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen open(COPYRIGHT, "<$f") || die "can't open $f: $!";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen @copyright_text = <COPYRIGHT>;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen close(COPYRIGHT);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen $owner2text{$owner} = [ @copyright_text ];
f0ff961282e618945dfe997dc45ff95d656e5790Timo Sirainen}
f0ff961282e618945dfe997dc45ff95d656e5790Timo Sirainen
f0ff961282e618945dfe997dc45ff95d656e5790Timo Sirainenmy %file_types = ();
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainenmy %file_years = ();
f0ff961282e618945dfe997dc45ff95d656e5790Timo Sirainenmy $years_list;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenmy $parent;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen($dummy,$dummy,$dummy,$dummy,$this_month,$this_year,$dummy,$dummy,$dummy) = localtime(time());
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen$this_year += 1900;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenwhile (<>) {
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen chomp;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen ($file, $type, $years) = split(/\s+/);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen $file_types{$file} = $type;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen $file_years{$file} = $years;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen}
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainensub getyears {
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen $parent = $_[0];
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen $parent =~ s/PARENT://;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen $years_list = $file_years{$parent};
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen if (defined($years_list) && $years_list =~ /^PARENT:/) {
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen print "BAD PARENT:$parent\n";
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen undefine($years_list);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen }
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen}
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainensub docbook {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen $parent = $_[0];
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen $parent =~ s/\.[^.]*$/.docbook/;
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen $years_list = $file_years{$parent};
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen}
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainensub copyright {
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen my $holder = shift;
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen my $result = "";
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen return $result unless (@_);
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen $result = "$result <copyright>\n";
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen $result = "$result <year>$_</year>\n" foreach (@_);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen $result = "$result <holder>$holder</holder>\n";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen $result = "$result </copyright>\n";
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainen return $result;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainensub copyrights {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen my $a = copyright("Internet Systems Consortium, Inc. (\"ISC\")",
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen grep({ $_ >= 2004} @_));
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen my $b = copyright("Internet Software Consortium.",
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen grep({ $_ < 2004} @_));
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen return "$a$b";
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen}
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainenforeach $file (keys %file_types) {
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen $typeandowner = $file_types{$file};
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen $years_list = $file_years{$file};
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen if ( ! -f $file ) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen print "$file: missing\n";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen next;
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # print "Doing: $file";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ($years_list =~ /PARENT:/) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen getyears($years_list);
2131ef7a3390f15ea6a958256ea54908f1096350Timo Sirainen if (!defined $years_list) {
2131ef7a3390f15ea6a958256ea54908f1096350Timo Sirainen print "$file: has bad parent $parent\n";
2131ef7a3390f15ea6a958256ea54908f1096350Timo Sirainen next;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
18d92dbbb752c79dc461514e52f7ef11847e636bTimo Sirainen }
18d92dbbb752c79dc461514e52f7ef11847e636bTimo Sirainen
18d92dbbb752c79dc461514e52f7ef11847e636bTimo Sirainen # copyright notice is now generated from the source.
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen next if ($years_list eq "DOCBOOK");
18d92dbbb752c79dc461514e52f7ef11847e636bTimo Sirainen
18d92dbbb752c79dc461514e52f7ef11847e636bTimo Sirainen if ($years_list eq "DOCBOOK") {
18d92dbbb752c79dc461514e52f7ef11847e636bTimo Sirainen docbook($file);
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen if (!defined $years_list) {
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen print "$file: has bad parent $parent\n";
13c6532dc104d23061e6901783ceb1ff8872c206Timo Sirainen next;
13c6532dc104d23061e6901783ceb1ff8872c206Timo Sirainen }
13c6532dc104d23061e6901783ceb1ff8872c206Timo Sirainen }
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen @years = split(/,/, $years_list);
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen my ($type, $owner) = split(/\./, $typeandowner);
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen $owner = "" if !defined $owner;
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen $textp = $owner2text{$owner};
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen if (!defined $textp) {
f501ad38c51cf1d8f4f84313922c785e6ae6e81fTimo Sirainen print "$file: unknown copyright owner $owner\n";
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen next;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen if ($file eq "./CHANGES" || $file eq "./EXCLUDED" ||
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen $file eq "./CHANGES.SE")
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen {
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainen open(SOURCE, "<$file") || die "can't open $file: $!";
6e235046e1d8e9d89fc948f5c623676c20421a28Timo Sirainen my $body = "";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while (<SOURCE>) {
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen # Process leading white space.
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen # Remove 1-7 spaces followed by a tab into a single
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen # tab if at start of line or proceeded by tabs.
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen s/^(\t*) {1,7}\t/$1\t/ while (/^\t* {1,7}\t/);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen s/^(\s{0,3}\d*\.)\s(\[\w{1,5}\])\s+(\S+)/$1\t$2\t\t$3/;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen s/^(\s{0,3}\d*\.)\s(\[\w{6,}\])\s+(\S+)/$1\t$2\t$3/;
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen # Convert 8 spaces into tabs if at start of line
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen # or preceeded by tabs.
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen s/^(\t*) /$1\t/ while (/^\t* /);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen # Remove trailing white space.
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen s/[ \t]*$//;
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen $body = "$body$_";
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen }
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen $_ = $body;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen open(TARGET, ">$file.new") || die "can't open $file.new: $!";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen print TARGET $_;
d6693dac50e4fb547d8dc61b85820f1761a33575Timo Sirainen close(TARGET);
d6693dac50e4fb547d8dc61b85820f1761a33575Timo Sirainen close(SOURCE);
d6693dac50e4fb547d8dc61b85820f1761a33575Timo Sirainen if (system("cmp -s $file.new $file") == 0) {
d6693dac50e4fb547d8dc61b85820f1761a33575Timo Sirainen unlink("$file.new");
d6693dac50e4fb547d8dc61b85820f1761a33575Timo Sirainen } else {
d6693dac50e4fb547d8dc61b85820f1761a33575Timo Sirainen rename("$file.new", "$file")
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen or die "rename($file.new, $file): $!";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen next if $type eq "X" or $type eq "BAT";
ca316aeb7648d3f1bcf45231f73ddeb1b67a6961Timo Sirainen
ca316aeb7648d3f1bcf45231f73ddeb1b67a6961Timo Sirainen $before_copyright = "";
d6693dac50e4fb547d8dc61b85820f1761a33575Timo Sirainen $c_comment = 0;
58febed28f2af78b2d8a281c851d9b67160c4bd3Timo Sirainen $shell_comment = 0;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen $m4_comment = 0;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen $sgml_comment = 0;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen $mkd_comment = 0;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen $zone_comment = 0;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen $man_comment = 0;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen $python_comment = 0;
8fa86f7ef06aa6cf0239c7ca2eb98889691d40d4Timo Sirainen $start_comment = "";
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen $end_comment = "";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen $first = "";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ($type =~ /^(C|YACC|CONF-C)$/) {
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen $c_comment = 1;
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen $start_comment = "/*\n";
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen $prefix = " * ";
8ac66221e8fdc2c5523cff1893e0d1c5de25fa49Timo Sirainen $end_comment = " */\n";
8ac66221e8fdc2c5523cff1893e0d1c5de25fa49Timo Sirainen } elsif ($type =~ /^(SH|PERL|TCL|MAKE|CONF-SH|RNC)$/) {
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen $shell_comment = 1;
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen $prefix = "# ";
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen } elsif ($type =~ /^PYTHON$/) {
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen $python_comment = 1;
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen $start_comment = "############################################################################\n";
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen $prefix = "# ";
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen $end_comment = "############################################################################\n"
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen } elsif ($type eq "ZONE" || $type eq "MC") {
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen $zone_comment = 1;
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen $prefix = "; ";
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen } elsif ($type eq "MAN") {
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen $man_comment = 1;
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen $prefix = ".\\\" ";
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen } elsif ($type eq "M4") {
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen $m4_comment = 1;
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen $prefix = "dnl ";
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen } elsif ($type eq "HTML" || $type eq "SGML") {
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen $sgml_comment = 1;
ca316aeb7648d3f1bcf45231f73ddeb1b67a6961Timo Sirainen $start_comment = "<!--\n";
84da9c6d6e162b064608cbfa9a47e0d60553c593Timo Sirainen $prefix = " - ";
84da9c6d6e162b064608cbfa9a47e0d60553c593Timo Sirainen $end_comment = "-->\n";
ab70f55bb8d824ca1ed7c74196f2f502edd29cc7Timo Sirainen } elsif ($type eq "MKD") {
d0bbbc7057aa33b52ee378196dee7d773437468fTimo Sirainen $mkd_comment = 1;
a817fdcc43aedf423e2134091d5f83f91d64bcc9Timo Sirainen $start_comment = "<!---\n";
a817fdcc43aedf423e2134091d5f83f91d64bcc9Timo Sirainen $prefix = " - ";
72cbf33ae81fde08384d30c779ff540752d9256cTimo Sirainen $end_comment = "--->";
dbd9604da561399cc6255289d5b6f6f662ab2d00Timo Sirainen } elsif ($type eq "TXT") {
dbd9604da561399cc6255289d5b6f6f662ab2d00Timo Sirainen $prefix = "";
289064eb21595d3e4460439eccdc48232d13f5e1Timo Sirainen } else {
131b073bdc3650083b00616dc778dd3017c2bbb5Timo Sirainen print "$file: type '$type' not supported yet; skipping\n";
dbd9604da561399cc6255289d5b6f6f662ab2d00Timo Sirainen next;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen }
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen ($nonspaceprefix = $prefix) =~ s/\s+$//;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen open(SOURCE, "<$file") || die "can't open $file: $!";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen $_ = <SOURCE>;
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen if ($type eq "YACC") {
6a7f64562ddd0dd2fec755ec4e9c9afde8e85cf1Timo Sirainen unless ($_ eq "%{\n") {
fcfb528483369975066c6adf1c55c16e6fb6e91fTimo Sirainen print "$file: unexpected yacc file start ",
fcfb528483369975066c6adf1c55c16e6fb6e91fTimo Sirainen "(expected \"%{\\n\")\n";
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen close(SOURCE);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen next;
d6693dac50e4fb547d8dc61b85820f1761a33575Timo Sirainen }
d6693dac50e4fb547d8dc61b85820f1761a33575Timo Sirainen $before_copyright = "$_";
d6693dac50e4fb547d8dc61b85820f1761a33575Timo Sirainen $_ = <SOURCE>;
d6693dac50e4fb547d8dc61b85820f1761a33575Timo Sirainen }
d6693dac50e4fb547d8dc61b85820f1761a33575Timo Sirainen if ($c_comment && /^\/\*/) {
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen $_ = <SOURCE>;
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen if ($_ !~ /[Cc]opyright/) {
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen print "$file: non-copyright comment\n";
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen close(SOURCE);
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen next;
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen }
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen if ($_ !~ /\*\//) {
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen while (<SOURCE>) {
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen last if $_ =~ /\*\//;
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen }
d33fc6c584718efd46159e1d8f46488b9dfc66f5Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } elsif ($shell_comment) {
82ed69779f49bd71ef1b570ce8aca67d357dbee8Timo Sirainen if (/^\#\!/) {
82ed69779f49bd71ef1b570ce8aca67d357dbee8Timo Sirainen $before_copyright = "$_#\n";
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen $_ = <SOURCE>;
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen $_ = <SOURCE> if $_ eq "#\n";
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen }
0beb5d6c661ee68130a954ed0f31a34c19195fb7Timo Sirainen if (/^\#/) {
0beb5d6c661ee68130a954ed0f31a34c19195fb7Timo Sirainen if ($_ !~ /[Cc]opyright/) {
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen print "$file: non-copyright comment\n";
1b97a59edb073e9a89ac43a21a9abe5d590d4a56Timo Sirainen close(SOURCE);
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen next;
6931e77051716370803d2d69bdeb6c7dff7d559dTimo Sirainen }
da5d50534cfca45d0aaaf0bdac17b287b4588809Timo Sirainen while (<SOURCE>) {
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen if ($_ !~ /^\#/) {
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainen $first = $_;
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainen last;
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } else {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen $first = $_;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
} elsif ($python_comment) {
if (/^\#\!/) {
$before_copyright = "$_";
$_ = <SOURCE>;
$_ = <SOURCE> if $_ eq "#\n";
$_ = <SOURCE> if $_ eq "############################################################################\n";
}
if (/^\#/) {
if ($_ !~ /[Cc]opyright/) {
print "$file: non-copyright comment\n";
close(SOURCE);
next;
}
while (<SOURCE>) {
if ($_ !~ /^\#/) {
$first = $_;
last;
}
}
} else {
$first = $_;
}
} elsif (($m4_comment || $zone_comment || $man_comment) &&
/^\Q$nonspaceprefix\E/) {
while (/^\Q$nonspaceprefix\E\s*$/) {
$_ = <SOURCE>;
}
if ($_ !~ /[Cc]opyright/) {
print "$file: non-copyright comment\n";
close(SOURCE);
next;
}
while (<SOURCE>) {
if ($_ !~ /^\Q$nonspaceprefix\E/ ||
$_ =~ /$keyword_pat/) {
$first = $_;
last;
}
}
} elsif ($sgml_comment) {
$before_copyright = "";
while (/^<!DOCTYPE/ || /^<!ENTITY/ || /^<\?xml-stylesheet/ || /^<\?xml /) {
# print "SGML: $_";
$before_copyright = "$before_copyright$_";
if (/\]>$/ ) {
$_ = <SOURCE>;
close(SOURCE) if (eof(SOURCE));
next;
}
if (/^<!DOCTYPE.*\[$/) {
while (!eof(SOURCE)) {
$_ = <SOURCE>;
next if (eof(SOURCE));
$before_copyright =
"$before_copyright$_";
if (/]>$/) {
$_ = <SOURCE>;
last;
}
}
close(SOURCE) if (eof(SOURCE));
next;
}
if (/>$/ ) {
$_ = <SOURCE>;
close(SOURCE) if (eof(SOURCE));
next;
}
$_ = <SOURCE>;
while (!eof(SOURCE) && ! /^<!/ ) {
$before_copyright = "$before_copyright$_";
$_ = <SOURCE>;
}
if (eof(SOURCE)) {
close(SOURCE);
next;
}
}
if (/^<!--/) {
$_ = <SOURCE> if $_ eq "<!--\n";
if ($_ !~ /[Cc]opyright/) {
print "$file: non-copyright comment\n";
close(SOURCE);
next;
}
while (defined($_)) {
last if s/.*-->//;
$_ = <SOURCE>;
}
print "$file: unterminated comment\n"
unless defined($_);
if ($_ ne "\n") {
$first = $_;
} else {
$first = <SOURCE>;
}
} else {
$first = $_;
}
} elsif ($mkd_comment) {
$before_copyright = "";
if (/^<!/) {
$_ = <SOURCE> if $_ eq "<!---\n";
if ($_ !~ /[Cc]opyright/) {
print "$file: non-copyright comment\n";
close(SOURCE);
next;
}
while (defined($_)) {
last if s/.*--->//;
$_ = <SOURCE>;
}
print "$file: unterminated comment\n"
unless defined($_);
if ($_ ne "\n") {
$first = $_;
} else {
$first = <SOURCE>;
}
} else {
$first = $_;
}
} elsif ($type eq "TXT") {
if ($_ =~ /[Cc]opyright/) {
$/ = ""; # paragraph at a time
while (<SOURCE>) {
# Not very maintainable, but ok enough for now.
last if /Portions of this code/;
last unless
/[Cc]opyright/ ||
/See COPYRIGHT in the source root/ ||
/Permission to use, copy, modify, and / ||
/THE SOFTWARE IS PROVIDED "AS IS" AND /;
}
$/ = "\n";
}
$first = $_;
} else {
$first = $_;
}
$first = "" if ! defined($first);
open(TARGET, ">$file.new") || die "can't open $file.new: $!";
print TARGET $before_copyright if $before_copyright;
print TARGET $start_comment if $start_comment;
$sysyears = "";
$sftyears = "";
$nomyears = "";
#
# Internet Software Consortium: up to 2003
#
$last_year = 0;
$anchor_year = 0;
$years = "";
foreach $year (@years) {
if ($year >= 2004) { next; }
if ($last_year != 0 && $year == $last_year + 1) {
if ($year > $anchor_year + 1) {
substr($years, $anchor_end) = "-$year";
} else {
$years .= ", $year";
}
} else {
$years .= $last_year == 0 ? "$year" : ", $year";
#if ($anchor_year != 0) {
# print "$file: noncontiguous year: ",
# "$year != $last_year + 1\n";
#}
$anchor_year = $year;
$anchor_end = length($years);
}
$last_year = $year;
}
$sftyears = $years;
#
# Nominum: up to 2001.
#
$last_year = 0;
$anchor_year = 0;
$years = "";
foreach $year (@years) {
if ($year >= 2002) { next; }
if ($last_year != 0 && $year == $last_year + 1) {
if ($year > $anchor_year + 1) {
substr($years, $anchor_end) = "-$year";
} else {
$years .= ", $year";
}
} else {
$years .= $last_year == 0 ? "$year" : ", $year";
#if ($anchor_year != 0) {
# print "$file: noncontiguous year: ",
# "$year != $last_year + 1\n";
#}
$anchor_year = $year;
$anchor_end = length($years);
}
$last_year = $year;
}
$nomyears = $years;
#
# Internet Systems Consortium: 2004 onwards.
#
$last_year = 0;
$anchor_year = 0;
$years = "";
$anchor_end = length($years);
my $andor = 0;
my $noid = 0;
foreach $year (@years) {
if ($year < 2004) { next; }
$andor = 1 if ($year >= 2007);
$noid = 1 if ($year > 2012 || ($year == 2012 && $this_month >= 5) );
if ($last_year != 0 && $year == $last_year + 1) {
if ($year > $anchor_year + 1) {
substr($years, $anchor_end) = "-$year";
} else {
$years .= ", $year";
}
} else {
$years .= $last_year == 0 ? "$year" : ", $year";
#if ($anchor_year != 0) {
# print "$file: noncontiguous year: ",
# "$year != $last_year + 1\n";
#}
$anchor_year = $year;
$anchor_end = length($years);
}
$last_year = $year;
}
$sysyears = $years;
($firstline, $secondline, @otherlines) = @$textp;
$firstline =~ s/\@SYSYEARS\@/$sysyears/;
$secondline =~ s/\@SFTYEARS\@/$sftyears/;
print TARGET "$prefix$firstline";
if ($sftyears ne "" ) {
print TARGET $secondline =~ /^$/ ? $nonspaceprefix : $prefix;
print TARGET "$secondline";
}
foreach $_ (@otherlines) {
s:modify, and distribute:modify, and/or distribute: if ($andor);
print TARGET (/^$/ ? $nonspaceprefix : $prefix);
s/\@NOMYEARS\@/$nomyears/;
print TARGET "$_";
}
print TARGET $end_comment if $end_comment;
if ($first eq "") {
$first = <SOURCE>;
}
if (defined($first)) {
if ($type eq 'MAN') {
print TARGET "$nonspaceprefix\n";
} else {
print TARGET "\n";
}
if (($type eq "C" || $type eq "CONF-C") &&
$sysyears =~ /$this_year/) {
my $body = "";
while (<SOURCE>) {
# Process leading white space.
# Remove 1-7 spaces followed by a tab into a single
# tab if at start of line or proceeded by tabs.
s/^(\t*) {1,7}\t/$1\t/ while (/^\t* {1,7}\t/);
# Convert 8 spaces into tabs if at start of line
# or preceeded by tabs.
s/^(\t*) {8}/$1\t/ while (/^\t* {8}/);
# Remove trailing white space.
s/[ \t]*$//;
$body = "$body$_";
}
$_ = $body;
} elsif ($type eq "SGML" && $sysyears =~ /$this_year/) {
my $body = "";
while (<SOURCE>) {
# Remove trailing white space.
s/[ \t]*$//;
$body = "$body$_";
}
$_ = $body;
} else {
undef $/;
$_ = <SOURCE>;
$/ = "\n";
}
if ($type eq 'SGML' && m:<articleinfo>.*?</articleinfo>:s) {
# print "docinfo: $file\n";
my $r = copyrights(@years);
s:<articleinfo>.*?</articleinfo>:<articleinfo>\n$r </articleinfo>:s;
}
if ($type eq 'SGML' && m:<docinfo>.*?</docinfo>:s) {
# print "docinfo: $file\n";
my $r = copyrights(@years);
s:<docinfo>.*?</docinfo>:<docinfo>\n$r </docinfo>:s;
}
if ($type eq 'SGML' && m:<bookinfo>.*?</bookinfo>:s) {
# print "bookinfo: $file\n";
my $r = copyrights(@years);
$r .= " <xi:include href=\"releaseinfo.xml\"/>\n";
s:<bookinfo>.*?</bookinfo>:<bookinfo>\n$r </bookinfo>:s;
}
my ($start, $end);
if ($type =~ /^PYTHON$/) {
($start = $prefix) =~ s/\s*\n//;
$end = "\n";
} elsif ($start_comment ne "") {
($start = $start_comment) =~ s/\s*\n/ /;
($end = $end_comment) =~ s/^\s*(.*)\n/ $1\n/;
} elsif ($prefix ne "") {
($start = $prefix) =~ s/\s*\n//;
$end = "\n";
} else {
$start = "";
$end = "\n";
}
if (!$noid && $first !~ /$keyword_pat/ &&
(!defined($_) || $_ !~ /$keyword_pat/)) {
$end = "\n$nonspaceprefix" if ($type eq "MAN");
print TARGET "$start\$";
print TARGET "Id";
print TARGET "\$$end\n";
}
print TARGET $first if $first !~ /^\s*$/;
print TARGET $_ if (defined($_));
}
close(TARGET);
close(SOURCE);
$mode = (stat $file)[2]&511;
chmod $mode, "$file.new";
if (system("cmp -s $file.new $file") == 0) {
unlink("$file.new");
} else {
rename("$file.new", "$file")
or die "rename($file.new, $file): $!";
}
}