]> git.saurik.com Git - bison.git/blob - build-aux/update-b4-copyright
maint: clean up update-b4-copyright code
[bison.git] / build-aux / update-b4-copyright
1 #!/usr/bin/perl -0777 -pi
2
3 # Update b4_copyright invocations or b4_copyright_years definitions to
4 # include the current year.
5
6 # Copyright (C) 2009 Free Software Foundation, Inc.
7 #
8 # This program is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 3, or (at your option)
11 # any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20
21 use strict;
22 use warnings;
23
24 my $margin = 72;
25
26 my $this_year = $ENV{UPDATE_COPYRIGHT_YEAR};
27 if (!$this_year || $this_year !~ m/^\d{4}$/)
28 {
29 my ($sec, $min, $hour, $mday, $month, $year) = localtime (time ());
30 $this_year = $year + 1900;
31 }
32 my $old_re = <<'EOF'
33 (
34 (?:^|\n)
35 #BEFORE
36 (?:
37 b4_copyright\(\[[^][]*]
38 | m4_(?:push|pop)def\(\[b4_copyright_years]
39 )
40 #AFTER
41 )
42 (?:
43 ,\s*
44 (
45 \[\s* (?:\d{4}(,\s*|-))* (\d{4}) \s*]
46 )
47 )?
48 \)
49 EOF
50 ;
51
52 while (/($old_re)/gx)
53 {
54 my $start = pos() - length ($1);
55 my $b4_copyright_line = $2;
56 my $year_lines = $3;
57 my $sep = $4 ? $4 : "";
58 my $final_year = $5;
59 $year_lines .= ')';
60
61 # If there was a second argument, it contains years, so update them.
62 if ($final_year)
63 {
64 $b4_copyright_line .= ',';
65 if ($final_year != $this_year)
66 {
67 # Update the year.
68 if ($sep eq '-' && $final_year + 1 == $this_year)
69 {
70 $year_lines =~ s/$final_year/$this_year/;
71 }
72 elsif ($sep ne '-' && $final_year + 1 == $this_year)
73 {
74 $year_lines =~ s/$final_year/$final_year-$this_year/;
75 }
76 else
77 {
78 $year_lines =~ s/$final_year/$final_year, $this_year/;
79 }
80 }
81
82 # Normalize all whitespace.
83 $year_lines =~ s/\s+/ /g;
84
85 # Put spaces after commas.
86 $year_lines =~ s/, ?/, /g;
87
88 # Format within margin.
89 my $year_lines_new;
90 my $indent = index ($b4_copyright_line, '[');
91 --$indent if ($b4_copyright_line =~ m/^\n/);
92 while (length $year_lines)
93 {
94 my $text_margin = $margin - $indent;
95 if (($year_lines =~ s/^(.{1,$text_margin})(?: |$)//)
96 || ($year_lines =~ s/^([\S]+)(?: |$)//))
97 {
98 my $line = "\n" . (' 'x$indent) . $1;
99 ++$indent if (!$year_lines_new);
100 $year_lines_new .= $line;
101 }
102 else
103 {
104 # Should be unreachable, but we don't want an infinite
105 # loop if it can be reached.
106 die;
107 }
108 }
109
110 # Replace the old invocation. Should never die.
111 die if (!s/$old_re\G/$b4_copyright_line$year_lines_new/x);
112
113 # Prepare for the next search.
114 pos () = $start + length ("$b4_copyright_line$year_lines_new");
115 }
116 }
117
118 while (/(\bb4_copyright\()/g)
119 {
120 my $pos = pos ();
121 pos () -= length ($1);
122 my $re = $old_re;
123 $re =~ s/\#BEFORE/\\G/;
124 if (!/$re/x)
125 {
126 print STDERR
127 "$ARGV: warning: failed to update a b4_copyright before char"
128 . " $pos\n";
129 }
130 pos () = $pos;
131 }
132
133 while (/\[b4_copyright_years]/g)
134 {
135 my $pos = pos ();
136 my $re = $old_re;
137 $re =~ s/\#AFTER/\\G/;
138 if (!/$re/x)
139 {
140 print STDERR
141 "$ARGV: warning: failed to update a b4_copyright_years before"
142 . " char $pos\n";
143 }
144 pos () = $pos;
145 }