#!/bin/sh
# Automatically update copyright for GDB, the GNU debugger.
#
# Copyright (C) 2007 Free Software Foundation, Inc.
#
# This file is part of GDB.
#
# 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 2 of the License, 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.

# Usage: cd src/gdb && sh ./copyright.sh
# To use a different version of emacs, set the EMACS environment
# variable before running.

# After running, update those files mentioned in $byhand by hand.
# Always review the output of this script before committing it!
# A useful command to review the output is:
#  filterdiff -x \*.c -x \*.cc -x \*.h -x \*.exp updates.diff
# This removes the bulk of the changes which are most likely
# to be correct.

####
# Configuration
####

# As of Emacs 22.0 (snapshot), wrapping and copyright updating do not
# handle these file types - all reasonable:
#  Assembly (weird comment characters, e.g. "!"); .S usually has C
#            comments, which are fine)
#  Fortran ("c" comment character)
#  igen
#  Autoconf input (dnl)
#  texinfo (@c)
#  tex (%)
#  *.defs as C
#   man
# So these need to be done by hand, as needed
byhand="
*.s
*.f
*.f90
*.igen
*.ac
*.texi
*.texinfo
*.tex
*.defs
*.1
"

# Files which should not be modified, either because they are
# generated, non-FSF, or otherwise special (e.g. license text,
# or test cases which must be sensitive to line numbering).
prunes="
COPYING
COPYING.LIB
CVS
configure
copying.c
gdbarch.c
gdbarch.h
fdl.texi
gpl.texi
gdbtk
gdb.gdbtk
osf-share
aclocal.m4
step-line.inp
step-line.c
"

####
# Main program
####

: ${EMACS:=emacs}

# Disable filename expansion, so that we can get at the glob patterns
# from $byhand.
set -f

version=`$EMACS --version | sed 's/GNU Emacs \([0-9]*\)\..*/\1/; 1q'`
if test "$version" -lt 22; then
  echo "error: $EMACS is too old; use at least an Emacs 22.0.XX snapshot." >&2
  exit 1
fi

if test $# -lt 1; then
  dir=.
else
  dir=$1
fi

if ! test -f doc/gdbint.texinfo; then
  echo "\"$dir\" is not a GDB source directory."
  exit 1
fi

cat > copytmp.el <<EOF
(load "copyright")
(setq vc-cvs-stay-local nil
      message-log-max t)
(setq fsf-regexp "Free[#; \t\n]+Software[#; \t\n]+Foundation,[#; \t\n]+Inc\."
      fsf-copyright-regexp (concat copyright-regexp "[#; \t\n]+" fsf-regexp)
      generated-regexp "THIS FILE IS MACHINE GENERATED WITH CGEN")

(defun gdb-copyright-update (filename)
  (widen)
  (goto-char (point-min))
  (if (and (not (re-search-forward generated-regexp (+ (point) copyright-limit) t))
	   (re-search-forward fsf-copyright-regexp (+ (point) copyright-limit) t))
      (progn
	(setq copyright-update t
	      copyright-query nil
	      fill-column 78
	      start (copy-marker (match-beginning 0))
	      end (progn
		    (re-search-backward fsf-regexp)
		    (re-search-forward fsf-regexp
		     (+ (point) copyright-limit) t)
		    (point-marker))
	      fsf-start (copy-marker (match-beginning 0)))
	(replace-match "Free_Software_Foundation,_Inc." t t)
	(copyright-update)
	(fill-region-as-paragraph start end)
	(replace-string "_" " " nil fsf-start end))
    (message (concat "WARNING: No copyright message found in " filename))))

EOF

for f in $prunes $byhand; do
  prune_opts="$prune_opts -name $f -prune -o"
done

for f in $(find "$dir" "$dir/../include/gdb" "$dir/../sim" \
           $prune_opts -type f -print); do
  cat >> copytmp.el <<EOF
(switch-to-buffer (find-file "$f"))
(setq backup-inhibited t)
(setq write-file-hooks '())
(gdb-copyright-update "$f")
(save-buffer)
(kill-buffer (buffer-name))
EOF
done

cat >> copytmp.el <<EOF
(delete-file "copytmp.el")
;; Comment out the next line to examine the message buffer.
(kill-emacs)
EOF

exec $EMACS --no-site-file -q -l ./copytmp.el
