#!/bin/sh
#! -*-perl-*-

# Update an FSF copyright year list to include the current year.

# Copyright (C) 2009-2019 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)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.
#
# Written by Jim Meyering and Joel E. Denny

# This script updates an FSF copyright year list to include the current year.
# Usage: update-copyright [FILE...]
#
# The arguments to this script should be names of files that contain
# copyright statements to be updated.  The copyright holder's name
# defaults to "Free Software Foundation, Inc." but may be changed to
# any other name by using the "UPDATE_COPYRIGHT_HOLDER" environment
# variable.
#
# For example, you might wish to use the update-copyright target rule
# in maint.mk from gnulib's maintainer-makefile module.
#
# Iff a copyright statement is recognized in a file and the final
# year is not the current year, then the statement is updated for the
# new year and it is reformatted to:
#
#   1. Fit within 72 columns.
#   2. Convert 2-digit years to 4-digit years by prepending "19".
#   3. Expand copyright year intervals.  (See "Environment variables"
#      below.)
#
# A warning is printed for every file for which no copyright
# statement is recognized.
#
# Each file's copyright statement must be formatted correctly in
# order to be recognized.  For example, each of these is fine:
#
#   Copyright @copyright{} 1990-2005, 2007-2009 Free Software
#   Foundation, Inc.
#
#   # Copyright (C) 1990-2005, 2007-2009 Free Software
#   # Foundation, Inc.
#
#   /*
#    * Copyright &copy; 90,2005,2007-2009
#    * Free Software Foundation, Inc.
#    */
#
# However, the following format is not recognized because the line
# prefix changes after the first line:
#
#   ## Copyright (C) 1990-2005, 2007-2009 Free Software
#   #  Foundation, Inc.
#
# However, any correctly formatted copyright statement following
# a non-matching copyright statements would be recognized.
#
# The exact conditions that a file's copyright statement must meet
# to be recognized are:
#
#   1. It is the first copyright statement that meets all of the
#      following conditions.  Subsequent copyright statements are
#      ignored.
#   2. Its format is "Copyright (C)", then a list of copyright years,
#      and then the name of the copyright holder.
#   3. The "(C)" takes one of the following forms or is omitted
#      entirely:
#
#        A. (C)
#        B. (c)
#        C. @copyright{}
#        D. &copy;
#        E. ©
#
#   4. The "Copyright" appears at the beginning of a line, except that it
#      may be prefixed by any sequence (e.g., a comment) of no more than
#      5 characters -- including white space.
#   5. Iff such a prefix is present, the same prefix appears at the
#      beginning of each remaining line within the FSF copyright
#      statement.  There is one exception in order to support C-style
#      comments: if the first line's prefix contains nothing but
#      whitespace surrounding a "/*", then the prefix for all subsequent
#      lines is the same as the first line's prefix except with each of
#      "/" and possibly "*" replaced by a " ".  The replacement of "*"
#      by " " is consistent throughout all subsequent lines.
#   6. Blank lines, even if preceded by the prefix, do not appear
#      within the FSF copyright statement.
#   7. Each copyright year is 2 or 4 digits, and years are separated by
#      commas, "-", or "--".  Whitespace may appear after commas.
#
# Environment variables:
#
#   1. If UPDATE_COPYRIGHT_FORCE=1, a recognized FSF copyright statement
#      is reformatted even if it does not need updating for the new
#      year.  If unset or set to 0, only updated FSF copyright
#      statements are reformatted.
#   2. If UPDATE_COPYRIGHT_USE_INTERVALS=1, every series of consecutive
#      copyright years (such as 90, 1991, 1992-2007, 2008) in a
#      reformatted FSF copyright statement is collapsed to a single
#      interval (such as 1990-2008).  If unset or set to 0, all existing
#      copyright year intervals in a reformatted FSF copyright statement
#      are expanded instead.
#      If UPDATE_COPYRIGHT_USE_INTERVALS=2, convert a sequence with gaps
#      to the minimal containing range.  For example, convert
#      2000, 2004-2007, 2009 to 2000-2009.
#   3. For testing purposes, you can set the assumed current year in
#      UPDATE_COPYRIGHT_YEAR.
#   4. The default maximum line length for a copyright line is 72.
#      Set UPDATE_COPYRIGHT_MAX_LINE_LENGTH to use a different length.
#   5. Set UPDATE_COPYRIGHT_HOLDER if the copyright holder is other
#      than "Free Software Foundation, Inc.".

# This is a prologue that allows to run a perl script as an executable
# on systems that are compliant to a POSIX version before POSIX:2017.
# On such systems, the usual invocation of an executable through execlp()
# or execvp() fails with ENOEXEC if it is a script that does not start
# with a #! line.  The script interpreter mentioned in the #! line has
# to be /bin/sh, because on GuixSD systems that is the only program that
# has a fixed file name.  The second line is essential for perl and is
# also useful for editing this file in Emacs.  The next two lines below
# are valid code in both sh and perl.  When executed by sh, they re-execute
# the script through the perl program found in $PATH.  The '-x' option
# is essential as well; without it, perl would re-execute the script
# through /bin/sh.  When executed by  perl, the next two lines are a no-op.
eval 'exec perl -wSx -0777 -pi "$0" "$@"'
     if 0;

my $VERSION = '2018-03-07.03:47'; # UTC
# The definition above must lie within the first 8 lines in order
# for the Emacs time-stamp write hook (at end) to update it.
# If you change this file with Emacs, please let the write hook
# do its job.  Otherwise, update this string manually.

use strict;
use warnings;

my $copyright_re = 'Copyright';
my $circle_c_re = '(?:\([cC]\)|@copyright\{}|\\\\\(co|&copy;|©)';
my $holder = $ENV{UPDATE_COPYRIGHT_HOLDER};
$holder ||= 'Free Software Foundation, Inc.';
my $prefix_max = 5;
my $margin = $ENV{UPDATE_COPYRIGHT_MAX_LINE_LENGTH};
!$margin || $margin !~ m/^\d+$/
  and $margin = 72;

my $tab_width = 8;

my $this_year = $ENV{UPDATE_COPYRIGHT_YEAR};
if (!$this_year || $this_year !~ m/^\d{4}$/)
  {
    my ($sec, $min, $hour, $mday, $month, $year) = localtime (time ());
    $this_year = $year + 1900;
  }

# Unless the file consistently uses "\r\n" as the EOL, use "\n" instead.
my $eol = /(?:^|[^\r])\n/ ? "\n" : "\r\n";

my $leading;
my $prefix;
my $ws_re;
my $stmt_re;
while (/(^|\n)(.{0,$prefix_max})$copyright_re/g)
  {
    $leading = "$1$2";
    $prefix = $2;
    if ($prefix =~ /^(\s*\/)\*(\s*)$/)
      {
        $prefix =~ s,/, ,;
        my $prefix_ws = $prefix;
        $prefix_ws =~ s/\*/ /; # Only whitespace.
        if (/\G(?:[^*\n]|\*[^\/\n])*\*?\n$prefix_ws/)
          {
            $prefix = $prefix_ws;
          }
      }
    $ws_re = '[ \t\r\f]'; # \s without \n
    $ws_re =
      "(?:$ws_re*(?:$ws_re|\\n" . quotemeta($prefix) . ")$ws_re*)";
    my $holder_re = $holder;
    $holder_re =~ s/\s/$ws_re/g;
    my $stmt_remainder_re =
      "(?:$ws_re$circle_c_re)?"
      . "$ws_re(?:(?:\\d\\d)?\\d\\d(?:,$ws_re?|--?))*"
      . "((?:\\d\\d)?\\d\\d)$ws_re$holder_re";
    if (/\G$stmt_remainder_re/)
      {
        $stmt_re =
          quotemeta($leading) . "($copyright_re$stmt_remainder_re)";
        last;
      }
  }
if (defined $stmt_re)
  {
    /$stmt_re/ or die; # Should never die.
    my $stmt = $1;
    my $final_year_orig = $2;

    # Handle two-digit year numbers like "98" and "99".
    my $final_year = $final_year_orig;
    $final_year <= 99
      and $final_year += 1900;

    if ($final_year != $this_year)
      {
        # Update the year.
        $stmt =~ s/\b$final_year_orig\b/$final_year, $this_year/;
      }
    if ($final_year != $this_year || $ENV{'UPDATE_COPYRIGHT_FORCE'})
      {
        # Normalize all whitespace including newline-prefix sequences.
        $stmt =~ s/$ws_re/ /g;

        # Put spaces after commas.
        $stmt =~ s/, ?/, /g;

        # Convert 2-digit to 4-digit years.
        $stmt =~ s/(\b\d\d\b)/19$1/g;

        # Make the use of intervals consistent.
        if (!$ENV{UPDATE_COPYRIGHT_USE_INTERVALS})
          {
            $stmt =~ s/(\d{4})--?(\d{4})/join(', ', $1..$2)/eg;
          }
        else
          {
            my $ndash = $ARGV =~ /\.tex(i(nfo)?)?$/ ? "--" : "-";

            $stmt =~
              s/
                (\d{4})
                (?:
                  (,\ |--?)
                  ((??{
                    if   ($2 ne ', ') { '\d{4}'; }
                    elsif (!$3)       { $1 + 1;  }
                    else              { $3 + 1;  }
                  }))
                )+
              /$1$ndash$3/gx;

            # When it's 2, emit a single range encompassing all year numbers.
            $ENV{UPDATE_COPYRIGHT_USE_INTERVALS} == 2
              and $stmt =~ s/\b(\d{4})\b.*\b(\d{4})\b/$1$ndash$2/;
          }

        # Format within margin.
        my $stmt_wrapped;
        my $text_margin = $margin - length($prefix);
        if ($prefix =~ /^(\t+)/)
          {
            $text_margin -= length($1) * ($tab_width - 1);
          }
        while (length $stmt)
          {
            if (($stmt =~ s/^(.{1,$text_margin})(?: |$)//)
                || ($stmt =~ s/^([\S]+)(?: |$)//))
              {
                my $line = $1;
                $stmt_wrapped .= $stmt_wrapped ? "$eol$prefix" : $leading;
                $stmt_wrapped .= $line;
              }
            else
              {
                # Should be unreachable, but we don't want an infinite
                # loop if it can be reached.
                die;
              }
          }

        # Replace the old copyright statement.
        s/$stmt_re/$stmt_wrapped/;
      }
  }
else
  {
    print STDERR "$ARGV: warning: copyright statement not found\n";
  }

# Hey Emacs!
# Local variables:
# coding: utf-8
# mode: perl
# indent-tabs-mode: nil
# eval: (add-hook 'before-save-hook 'time-stamp)
# time-stamp-line-limit: 200
# time-stamp-start: "my $VERSION = '"
# time-stamp-format: "%:y-%02m-%02d.%02H:%02M"
# time-stamp-time-zone: "UTC0"
# time-stamp-end: "'; # UTC"
# End:
