]> git.saurik.com Git - bison.git/blobdiff - build-aux/update-b4-copyright
grammar: free the association tracking graph
[bison.git] / build-aux / update-b4-copyright
index 8cc5bbad82e315e2c049dc71507494de84efec7d..5ba7dd66c8a711cef7e308e37689f8a904ceee05 100755 (executable)
@@ -1,8 +1,10 @@
 #!/usr/bin/perl -0777 -pi
-# Update an b4_copyright invocation to include the current year.
 
-# Copyright (C) 2009 Free Software Foundation, Inc.
-#
+# Update b4_copyright invocations or b4_copyright_years definitions to
+# include the current year.
+
+# Copyright (C) 2009-2013 Free Software Foundation, Inc.
+
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 3, or (at your option)
 use strict;
 use warnings;
 
+my $margin = 72;
+
 my $this_year = $ENV{UPDATE_COPYRIGHT_YEAR};
-if (!$this_year || $this_year !~ m/^\d\d(\d\d)?$/)
+if (!$this_year || $this_year !~ m/^\d{4}$/)
   {
     my ($sec, $min, $hour, $mday, $month, $year) = localtime (time ());
     $this_year = $year + 1900;
   }
-my $margin = 72;
 my $old_re = <<'EOF'
   (
     (?:^|\n)
+    #BEFORE
     (?:
-      b4_copyright\(\[[^]]*]
+      b4_copyright\(\[[^][]*]
       | m4_(?:push|pop)def\(\[b4_copyright_years]
     )
+    #AFTER
   )
   (?:
     ,\s*
     (
-      \[\s* (?:\d{4}(,\s*|-))* (\d{4}) \s*]
+      \[\s* (?:\d{4}(?:,\s*|-))* (\d{4}) \s*]
     )
   )?
   \)
 EOF
   ;
 
-while (/$old_re/x)
+while (/($old_re)/gx)
   {
-    my $b4_copyright_line = $1;
-    my $year_lines = $2;
-    my $sep = $3 ? $3 : "";
+    my $start = pos() - length ($1);
+    my $b4_copyright_line = $2;
+    my $year_lines = $3;
     my $final_year = $4;
     $year_lines .= ')';
 
-    # Mark it completed.
-    $b4_copyright_line =~ s/b4_/b4*/g;
-
     # If there was a second argument, it contains years, so update them.
     if ($final_year)
       {
@@ -62,63 +64,89 @@ while (/$old_re/x)
         if ($final_year != $this_year)
           {
             # Update the year.
-            if ($sep eq '-' && $final_year + 1 == $this_year)
-              {
-                $year_lines =~ s/$final_year/$this_year/;
-              }
-            elsif ($sep ne '-' && $final_year + 1 == $this_year)
+            $year_lines =~ s/$final_year/$final_year, $this_year/;
+          }
+
+        # Normalize all whitespace.
+        $year_lines =~ s/\s+/ /g;
+
+        # Put spaces after commas.
+        $year_lines =~ s/, ?/, /g;
+
+        # Compress to intervals.
+        $year_lines =~
+          s/
+            (\d{4})
+            (?:
+              (,\ |-)
+              ((??{
+                if    ($2 eq '-') { '\d{4}'; }
+                elsif (!$3)       { $1 + 1;  }
+                else              { $3 + 1;  }
+              }))
+            )+
+          /$1-$3/gx;
+
+        # Format within margin.
+        my $year_lines_new;
+        my $indent = index ($b4_copyright_line, '[');
+        --$indent if ($b4_copyright_line =~ m/^\n/);
+        while (length $year_lines)
+          {
+            my $text_margin = $margin - $indent;
+            if (($year_lines =~ s/^(.{1,$text_margin})(?: |$)//)
+                || ($year_lines =~ s/^([\S]+)(?: |$)//))
               {
-                $year_lines =~ s/$final_year/$final_year-$this_year/;
+                my $line = "\n" . (' 'x$indent) . $1;
+                ++$indent if (!$year_lines_new);
+                $year_lines_new .= $line;
               }
             else
               {
-                $year_lines =~ s/$final_year/$final_year, $this_year/;
+                # Should be unreachable, but we don't want an infinite
+                # loop if it can be reached.
+                die;
               }
           }
 
-          # Normalize all whitespace.
-          $year_lines =~ s/\s+/ /g;
-
-          # Put spaces after commas.
-          $year_lines =~ s/, ?/, /g;
-
-          # Format within margin.
-          my $year_lines_new;
-          my $indent = index ($b4_copyright_line, '[');
-          --$indent if ($b4_copyright_line =~ m/^\n/);
-          while (length $year_lines)
-            {
-              my $text_margin = $margin - $indent;
-              if (($year_lines =~ s/^(.{1,$text_margin})(?: |$)//)
-                  || ($year_lines =~ s/^([\S]+)(?: |$)//))
-                {
-                  my $line = "\n" . (' 'x$indent) . $1;
-                  ++$indent if (!$year_lines_new);
-                  $year_lines_new .= $line;
-                }
-              else
-                {
-                  # Should be unreachable, but we don't want an infinite
-                  # loop if it can be reached.
-                  die;
-                }
-            }
-          $year_lines = $year_lines_new;
-      }
+        # Replace the old invocation.  Should never die.
+        die if (!s/$old_re\G/$b4_copyright_line$year_lines_new/x);
 
-    # Replace the old invocation.
-    s/$old_re/$b4_copyright_line$year_lines/x;
+        # Prepare for the next search.
+        pos () = $start + length ("$b4_copyright_line$year_lines_new");
+      }
   }
 
-if (/\bb4_copyright\(/)
+while (/(\bb4_copyright\()/g)
   {
-    print STDERR
-      "$ARGV: warning: failed to update a b4_copyright invocation\n";
+    my $start = pos () - length ($1);
+    my $end = pos ();
+    my $re = $old_re;
+    pos () = $start;
+    $re =~ s/\#BEFORE/\\G/;
+    if (!/$re/x)
+      {
+        my $line = (substr ($_, 0, $start) =~ s/\n/\n/g) + 1;
+        print STDERR
+          "$ARGV:$line: warning: failed to update a b4_copyright\n";
+      }
+    pos () = $end;
   }
-if (/\[b4_copyright_years]/)
+
+while (/(\[b4_copyright_years])/g)
   {
-    print STDERR
-      "$ARGV: warning: failed to update a b4_copyright_years use\n";
+    my $start = pos () - length ($1);
+    my $end = pos ();
+    my $re = $old_re;
+    $re =~ s/\#AFTER/\\G/;
+    if (!/$re/x)
+      {
+        # The substr operation blows away pos (), so restoring pos ()
+        # at the end is necessary.
+        my $line = (substr ($_, 0, $start) =~ s/\n/\n/g) + 1;
+        print STDERR
+          "$ARGV:$line: warning: failed to update a"
+          . " b4_copyright_years\n";
+      }
+    pos () = $end;
   }
-
-s/b4\*copyright/b4_copyright/g;