update_copyrights revision c968a9ca37964ae0bdc5d452ad784ec93bd04c57
015055b6e23f5c08f6a5b34726f90b62597e9e45Tinderbox User#!/usr/local/bin/perl -w
6fe48fb46e53ffc37542853a1edb74cb481b7d94Automatic Updater#
18920d790825d96ca3943aa2dcb6eb80dc611c5fTinderbox User# Copyright (C) 1998-2001 Internet Software Consortium.
18920d790825d96ca3943aa2dcb6eb80dc611c5fTinderbox User#
ab496cc3df1648e9ad992a87c35c2c0870fdc69dTinderbox User# Permission to use, copy, modify, and distribute this software for any
7c1468ed500356839a4a222517364e6ce18cb1a2Tinderbox User# purpose with or without fee is hereby granted, provided that the above
c57668a2fbbe558c1bd21652813616f2f517c469Tinderbox User# copyright notice and this permission notice appear in all copies.
a7c412f37cc73d0332887a746e81220cbf09dd00Mark Andrews#
1f4c645185bd8fc70048e0a69eee46193a284e5cTinderbox User# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
8de3f14f1c300c3e1ed99084cc03485b42c92bf1Tinderbox User# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
950d203b64f512b85fcc093ee1e9e3e531a1aea3Tinderbox User# INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
b886b04d8d2b085cbf3e1bf4442dee87f43ba5e4Tinderbox User# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
e676a596869d8a80a644c99a848afb53d1c5975eMark Andrews# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
e676a596869d8a80a644c99a848afb53d1c5975eMark Andrews# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews
a7c412f37cc73d0332887a746e81220cbf09dd00Mark Andrews# $Id: update_copyrights,v 1.25 2001/06/10 14:01:10 tale Exp $
a7c412f37cc73d0332887a746e81220cbf09dd00Mark Andrews
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrewsrequire 5.002;
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews
e676a596869d8a80a644c99a848afb53d1c5975eMark Andrews# Map copyright owners to the files containing copyright messages.
e676a596869d8a80a644c99a848afb53d1c5975eMark Andrews# The first line of the copyright message is not in the file;
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews# it is constructed by this script.
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrewsmy %owner2filename = (
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User "" => "util/COPYRIGHT",
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews "NAI" => "util/COPYRIGHT.NAI",
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User "NOM" => "util/COPYRIGHT.NOM",
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews "BSDI" => "util/COPYRIGHT.BSDI",
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User "BRIEF" => "util/COPYRIGHT.BRIEF",
efb0e886f18894a1d2489f1ad74ad14b579e11c7Mark Andrews "PORTION" => "util/COPYRIGHT.PORTION",
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews);
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews# Map each copyright owner name to a reference to an array containing
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User# the lines of the copyright message.
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox Usermy %owner2text = ();
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox Usermy $keyword_pat = '\$(Id|Revision):.*\$';
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews
015055b6e23f5c08f6a5b34726f90b62597e9e45Tinderbox Userforeach $owner (keys %owner2filename) {
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews my $f = $owner2filename{$owner};
aa9c561961e9d877946ebaa8795fa2be054ab7bfEvan Hunt open(COPYRIGHT, "<$f") || die "can't open $f: $!";
dc238a06bffa79de141ee7655765e2df91498a8aTinderbox User @copyright_text = <COPYRIGHT>;
0e573cdd111e060e5f6c18249b5ccacbe8abe278Tinderbox User close(COPYRIGHT);
aa9c561961e9d877946ebaa8795fa2be054ab7bfEvan Hunt $owner2text{$owner} = [ @copyright_text ];
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater}
16f6050f29b6b0422cee858e609f65e474e70ef2Tinderbox User
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updaterwhile (<>) {
aa9c561961e9d877946ebaa8795fa2be054ab7bfEvan Hunt ($file, $typeandowner, $years_list) = split(/\s+/);
dc238a06bffa79de141ee7655765e2df91498a8aTinderbox User @years = split(/,/, $years_list);
0e573cdd111e060e5f6c18249b5ccacbe8abe278Tinderbox User
aa9c561961e9d877946ebaa8795fa2be054ab7bfEvan Hunt if ( ! -f $file ) {
710bce1a85c96e85ca1a90471382055acd29d51fTinderbox User print "$file: missing\n";
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater next;
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater }
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews my ($type, $owner) = split(/\./, $typeandowner);
cdfc81e048bd34c1d628380247bda6b80a89e20eAutomatic Updater $owner = "" if !defined $owner;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $textp = $owner2text{$owner};
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews if (!defined $textp) {
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews print "$file: unknown copyright owner $owner\n";
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater next;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews }
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews
16f6050f29b6b0422cee858e609f65e474e70ef2Tinderbox User next if $type eq "X";
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater $before_copyright = "";
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $c_comment = 0;
eabc9c3c07cd956d3c436bd7614cb162dabdda76Mark Andrews $shell_comment = 0;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $m4_comment = 0;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $sgml_comment = 0;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $zone_comment = 0;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $man_comment = 0;
015055b6e23f5c08f6a5b34726f90b62597e9e45Tinderbox User $start_comment = "";
2ae159b376dac23870d8005563c585acf85a4b5aEvan Hunt $end_comment = "";
2ae159b376dac23870d8005563c585acf85a4b5aEvan Hunt $first = "";
2ae159b376dac23870d8005563c585acf85a4b5aEvan Hunt if ($type =~ /^(C|YACC|CONF-C)$/) {
95637507c3d47481fbf0a8a8c750a57f944f677fMark Andrews $c_comment = 1;
2ae159b376dac23870d8005563c585acf85a4b5aEvan Hunt $start_comment = "/*\n";
2ae159b376dac23870d8005563c585acf85a4b5aEvan Hunt $prefix = " * ";
2ae159b376dac23870d8005563c585acf85a4b5aEvan Hunt $end_comment = " */\n";
2ae159b376dac23870d8005563c585acf85a4b5aEvan Hunt } elsif ($type =~ /^(SH|PERL|TCL|MAKE|CONF-SH)$/) {
2ae159b376dac23870d8005563c585acf85a4b5aEvan Hunt $shell_comment = 1;
2ae159b376dac23870d8005563c585acf85a4b5aEvan Hunt $prefix = "# ";
2ae159b376dac23870d8005563c585acf85a4b5aEvan Hunt } elsif ($type eq "ZONE") {
7cc0a5d21ef046bfd630c4769943d896a7d7472cTinderbox User $zone_comment = 1;
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews $prefix = "; ";
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews } elsif ($type eq "MAN") {
950d203b64f512b85fcc093ee1e9e3e531a1aea3Tinderbox User $man_comment = 1;
27739dd25026283c24645c8a1044b95ef9eb5ac6Tinderbox User $prefix = ".\\\" ";
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews } elsif ($type eq "M4") {
18920d790825d96ca3943aa2dcb6eb80dc611c5fTinderbox User $m4_comment = 1;
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews $prefix = "dnl ";
7a6494cfb6cc7d3f67af07359561e05e6bb8c0edTinderbox User } elsif ($type eq "HTML" || $type eq "SGML") {
0e573cdd111e060e5f6c18249b5ccacbe8abe278Tinderbox User $sgml_comment = 1;
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews $start_comment = "<!--\n";
18920d790825d96ca3943aa2dcb6eb80dc611c5fTinderbox User $prefix = " - ";
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews $end_comment = "-->\n";
7a6494cfb6cc7d3f67af07359561e05e6bb8c0edTinderbox User } elsif ($type eq "TXT") {
77932ac533c711eca5cd86de4e7eca8d91102b43Tinderbox User $prefix = "";
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews } else {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User print "$file: type '$type' not supported yet; skipping\n";
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson next;
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User }
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User ($nonspaceprefix = $prefix) =~ s/\s+$//;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User open(SOURCE, "<$file") || die "can't open $file: $!";
efb0e886f18894a1d2489f1ad74ad14b579e11c7Mark Andrews $_ = <SOURCE>;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews if ($type eq "YACC") {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User unless ($_ eq "%{\n") {
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews print "$file: unexpected yacc file start ",
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User "(expected \"%{\\n\")\n";
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson close(SOURCE);
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User next;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews }
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $before_copyright = "$_";
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $_ = <SOURCE>;
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User }
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson if ($c_comment && /^\/\*/) {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $_ = <SOURCE>;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews if ($_ !~ /[Cc]opyright/) {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User print "$file: non-copyright comment\n";
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews close(SOURCE);
28a5dd720187fddb16055a0f64b63a7b66f29f64Mark Andrews next;
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews }
78f3ed4bc2fcd3d270bfd599804f3b27a1db4d91Mark Andrews if ($_ !~ /\*\//) {
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews while (<SOURCE>) {
0e573cdd111e060e5f6c18249b5ccacbe8abe278Tinderbox User last if $_ =~ /\*\//;
78f3ed4bc2fcd3d270bfd599804f3b27a1db4d91Mark Andrews }
fd972434c29fc1169d66594e4cc7697d33036c2bTinderbox User }
37d8e0a4455876fe1e4cca511076cc2c5ab9eedeTinderbox User } elsif ($shell_comment) {
37d8e0a4455876fe1e4cca511076cc2c5ab9eedeTinderbox User if (/^\#\!/) {
fd972434c29fc1169d66594e4cc7697d33036c2bTinderbox User $before_copyright = "$_#\n";
2a31bd531072824ef252c18303859d6af7451b00Francis Dupont $_ = <SOURCE>;
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews $_ = <SOURCE> if $_ eq "#\n";
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews }
2a31bd531072824ef252c18303859d6af7451b00Francis Dupont if (/^\#/) {
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews if ($_ !~ /[Cc]opyright/) {
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews print "$file: non-copyright comment\n";
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews close(SOURCE);
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews next;
78f3ed4bc2fcd3d270bfd599804f3b27a1db4d91Mark Andrews }
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews while (<SOURCE>) {
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews if ($_ !~ /^\#/) {
78f3ed4bc2fcd3d270bfd599804f3b27a1db4d91Mark Andrews $first = $_;
78f3ed4bc2fcd3d270bfd599804f3b27a1db4d91Mark Andrews last;
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews }
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews }
78f3ed4bc2fcd3d270bfd599804f3b27a1db4d91Mark Andrews } else {
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews $first = $_;
dc238a06bffa79de141ee7655765e2df91498a8aTinderbox User }
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews } elsif (($m4_comment || $zone_comment || $man_comment) &&
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews /^\Q$nonspaceprefix\E/) {
e20788e1216ed720aefa84f3295f7899d9f28c22Mark Andrews
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews while (/^\Q$nonspaceprefix\E\s*$/) {
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews $_ = <SOURCE>;
01a5c5503482fb3ba52088bf0178a7213273bf96Mark Andrews }
dc238a06bffa79de141ee7655765e2df91498a8aTinderbox User
37d8e0a4455876fe1e4cca511076cc2c5ab9eedeTinderbox User if ($_ !~ /[Cc]opyright/) {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User print "$file: non-copyright comment\n";
cdfc81e048bd34c1d628380247bda6b80a89e20eAutomatic Updater close(SOURCE);
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews next;
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User }
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews while (<SOURCE>) {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User if ($_ !~ /^\Q$nonspaceprefix\E/ ||
fe80a4909bf62b602feaf246866e9d29f7654194Automatic Updater $_ =~ /$keyword_pat/) {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $first = $_;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews last;
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User }
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews }
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User } elsif ($sgml_comment) {
fa0326cc2cf428f67575b6ba3b97b528a31b0010Tinderbox User if (/^<!DOCTYPE/) {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $before_copyright = $_;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $_ = <SOURCE>;
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User }
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews if (/^<!/) {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $_ = <SOURCE> if $_ eq "<!--\n";
fe80a4909bf62b602feaf246866e9d29f7654194Automatic Updater if ($_ !~ /[Cc]opyright/) {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User print "$file: non-copyright comment\n";
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews close(SOURCE);
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User next;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews }
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User while (defined($_)) {
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson last if s/.*-->//;
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $_ = <SOURCE>;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews }
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User print "$file: unterminated comment\n"
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews unless defined($_);
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User if ($_ ne "\n") {
dd65eb1efb40b1c47d57963192bfc54873b219beAutomatic Updater $first = $_;
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User } else {
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $first = <SOURCE>;
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User }
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews } else {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $first = $_;
133e6d43fa82e80d3798be4de00f4540f485ec6cAutomatic Updater }
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User } elsif ($type eq "TXT") {
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews if ($_ =~ /[Cc]opyright/) {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $/ = ""; # paragraph at a time
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews while (<SOURCE>) {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User # Not very maintainable, but ok enough for now.
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson last unless
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User /See COPYRIGHT in the source root/ ||
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews /Permission to use, copy, modify, and / ||
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User /THE SOFTWARE IS PROVIDED "AS IS" AND /;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews }
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $/ = "\n";
5f7586ddbd3edd11272cdd30ed613d936129328bTinderbox User }
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $first = $_;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews } else {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $first = $_;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews }
015055b6e23f5c08f6a5b34726f90b62597e9e45Tinderbox User
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews $first = "" if ! defined($first);
a7c412f37cc73d0332887a746e81220cbf09dd00Mark Andrews
a7c412f37cc73d0332887a746e81220cbf09dd00Mark Andrews open(TARGET, ">$file.new") || die "can't open $file.new: $!";
dc238a06bffa79de141ee7655765e2df91498a8aTinderbox User print TARGET $before_copyright if $before_copyright;
37d8e0a4455876fe1e4cca511076cc2c5ab9eedeTinderbox User print TARGET $start_comment if $start_comment;
dc238a06bffa79de141ee7655765e2df91498a8aTinderbox User
37d8e0a4455876fe1e4cca511076cc2c5ab9eedeTinderbox User $years = "";
dc238a06bffa79de141ee7655765e2df91498a8aTinderbox User $last_year = 0;
a7c412f37cc73d0332887a746e81220cbf09dd00Mark Andrews $anchor_year = 0;
7ca715ad1587a68a531ea1cdea07515d7232567eTinderbox User foreach $year (@years) {
015055b6e23f5c08f6a5b34726f90b62597e9e45Tinderbox User if ($last_year != 0 && $year == $last_year + 1) {
8711e5c73ca872d59810760af0332194cbdd619bAutomatic Updater if ($year > $anchor_year + 1) {
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater substr($years, $anchor_end) = "-$year";
e676a596869d8a80a644c99a848afb53d1c5975eMark Andrews } else {
91d187ce035f39073f0732ff2a401a45c3c955fbMark Andrews $years .= ", $year";
37d8e0a4455876fe1e4cca511076cc2c5ab9eedeTinderbox User }
8e5fce1f9ceba17dd7e3ff0eb287e1e999c14249Mark Andrews } else {
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews $years .= $last_year == 0 ? "$year" : ", $year";
4151211e6649332f7b5a55870cbe37128bcc7b29Tinderbox User if ($anchor_year != 0) {
91d187ce035f39073f0732ff2a401a45c3c955fbMark Andrews print "$file: noncontiguous year: ",
bc0a53583d92309bebcf93c408e2f3247ebd3d3cAutomatic Updater "$year != $last_year + 1\n";
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater }
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater $anchor_year = $year;
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updater $anchor_end = length($years);
b02be031b9ff37b042adc8e68e36b8bbc1f672b7Tinderbox User }
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $last_year = $year;
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updater }
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
d7d105151a78d35afb4233d2a6dbd47b7ec0d9a5Tinderbox User ($firstline, $secondline, @otherlines) = @$textp;
b02be031b9ff37b042adc8e68e36b8bbc1f672b7Tinderbox User
37d8e0a4455876fe1e4cca511076cc2c5ab9eedeTinderbox User $firstline =~ s/\@YEARS\@/$years/;
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater $secondline =~ s/\@YEARS\@/$years/;
19b3dc94bce93fa76bd7e066f9298630dbc9dcb4Automatic Updater
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater print TARGET "$prefix$firstline";
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater print TARGET $secondline =~ /^$/ ? $nonspaceprefix : $prefix;
7f94d9a8162c9a96b56e66176702b66e79d8e1a2Automatic Updater print TARGET "$secondline";
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater foreach $_ (@otherlines) {
5ecad47f69b3fd945472ab2900a9ff826a7ce2f6Automatic Updater print TARGET (/^$/ ? $nonspaceprefix : $prefix);
37d8e0a4455876fe1e4cca511076cc2c5ab9eedeTinderbox User print TARGET "$_";
91d187ce035f39073f0732ff2a401a45c3c955fbMark Andrews }
c2abd6efeb9affa70aabb63da2acb23e135cf7f2Mark Andrews print TARGET $end_comment if $end_comment;
e21f41f6504b3381be86cbe7f457f9ee1fff947bTinderbox User
dc238a06bffa79de141ee7655765e2df91498a8aTinderbox User if ($first eq "") {
96ea71632887c58a9d00f47eb318bf76b35903c3Mark Andrews $first = <SOURCE>;
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater }
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater
dc238a06bffa79de141ee7655765e2df91498a8aTinderbox User if (defined($first)) {
dc238a06bffa79de141ee7655765e2df91498a8aTinderbox User if ($type eq 'MAN') {
4cda4fd158d6ded5586bacea8c388445d99611eaAutomatic Updater print TARGET "$nonspaceprefix\n";
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews } else {
b02be031b9ff37b042adc8e68e36b8bbc1f672b7Tinderbox User print TARGET "\n";
0e573cdd111e060e5f6c18249b5ccacbe8abe278Tinderbox User }
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater undef $/;
4fe0411487e8e4401477684c0a2bac041ca7c2d5Tinderbox User $_ = <SOURCE>;
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews $/ = "\n";
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews
bf5e2127e92e52cbf661e77dd6a76e5aef43542fTinderbox User my ($start, $end);
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews if ($start_comment ne "") {
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews ($start = $start_comment) =~ s/\s*\n/ /;
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews ($end = $end_comment) =~ s/^\s*(.*)\n/ $1\n/;
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater } elsif ($prefix ne "") {
dc238a06bffa79de141ee7655765e2df91498a8aTinderbox User ($start = $prefix) =~ s/\s*\n//;
dc238a06bffa79de141ee7655765e2df91498a8aTinderbox User $end = "\n";
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater } else {
a7c412f37cc73d0332887a746e81220cbf09dd00Mark Andrews $start = "";
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews $end = "\n";
da59e63e7af147a8bcef985b98b04443e04c3a0eTinderbox User }
710bce1a85c96e85ca1a90471382055acd29d51fTinderbox User
757ff043760e4743dda1a10e7d58349275934902Tinderbox User if ($first !~ /$keyword_pat/ && $_ !~ /$keyword_pat/) {
cf7e98f59148b559946a7f1ca728471374f1eef3Automatic Updater print TARGET "$start\$";
6025cbbe8408f4b09d53d5ec1e95cb6da97e0a8dTinderbox User print TARGET "Id: ";
e676a596869d8a80a644c99a848afb53d1c5975eMark Andrews print TARGET "\$$end\n";
757ff043760e4743dda1a10e7d58349275934902Tinderbox User }
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
cf7e98f59148b559946a7f1ca728471374f1eef3Automatic Updater print TARGET $first if $first !~ /^\s*$/;
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews print TARGET $_;
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson }
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews close(TARGET);
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews close(SOURCE);
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $mode = (stat $file)[2]&511;
757ff043760e4743dda1a10e7d58349275934902Tinderbox User chmod $mode, "$file.new";
757ff043760e4743dda1a10e7d58349275934902Tinderbox User
4fe0411487e8e4401477684c0a2bac041ca7c2d5Tinderbox User if (system("cmp -s $file.new $file") == 0) {
dc238a06bffa79de141ee7655765e2df91498a8aTinderbox User unlink("$file.new");
b886b04d8d2b085cbf3e1bf4442dee87f43ba5e4Tinderbox User } else {
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews rename("$file.new", "$file")
3857cb6fcabeb79d85de4b3e3e4ab99912b701f8Mark Andrews or die "rename($file.new, $file): $!";
dc238a06bffa79de141ee7655765e2df91498a8aTinderbox User }
0e573cdd111e060e5f6c18249b5ccacbe8abe278Tinderbox User}
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews