diff lisp/emacs-lisp/copyright.el @ 51564:09736ff1baa6

(copyright-update-year): New function extracted from copyright-update. When `arg' is set, replace the year, not the `copyright' text. Ignore `copyright-update = nil' if called interactively. Use "," rather than ", " if that's what was used before. Recognize mixes of 2 and 4 digit years. Use replace-match. (copyright-update): Add interactivep arg. Use it instead of use last-command. Use replace-match. Don't assume (point-min) == 1.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Sat, 14 Jun 2003 20:11:12 +0000
parents 717543e790e1
children 2c851f739011
line wrap: on
line diff
--- a/lisp/emacs-lisp/copyright.el	Sat Jun 14 20:02:59 2003 +0000
+++ b/lisp/emacs-lisp/copyright.el	Sat Jun 14 20:11:12 2003 +0000
@@ -1,6 +1,7 @@
 ;;; copyright.el --- update the copyright notice in current buffer
 
-;; Copyright (C) 1991, 92, 93, 94, 95, 98, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 1991, 92, 93, 94, 95, 1998, 2001, 2003
+;;           Free Software Foundation, Inc.
 
 ;; Author: Daniel Pfeiffer <occitan@esperanto.org>
 ;; Keywords: maint, tools
@@ -25,7 +26,8 @@
 ;;; Commentary:
 
 ;; Allows updating the copyright year and above mentioned GPL version manually
-;; or when saving a file.  Do (add-hook 'write-file-hooks 'copyright-update).
+;; or when saving a file.
+;; Do (add-hook 'write-file-functions 'copyright-update).
 
 ;;; Code:
 
@@ -75,53 +77,82 @@
 (defvar copyright-current-year (substring (current-time-string) -4)
   "String representing the current year.")
 
+(defun copyright-update-year (replace noquery)
+  (when (re-search-forward copyright-regexp (+ (point) copyright-limit) t)
+    ;; Note that `current-time-string' isn't locale-sensitive.
+    (setq copyright-current-year (substring (current-time-string) -4))
+    (unless (string= (buffer-substring (- (match-end 2) 2) (match-end 2))
+		     (substring copyright-current-year -2))
+      (if (or noquery
+	      (y-or-n-p (if replace
+			    (concat "Replace copyright year(s) by "
+				    copyright-current-year "? ")
+			  (concat "Add " copyright-current-year
+				  " to copyright? "))))
+	  (if replace
+	      (replace-match copyright-current-year t t nil 1)
+	    (let ((size (save-excursion (skip-chars-backward "0-9"))))
+	      (if (and (eq (% (- (string-to-number copyright-current-year)
+				 (string-to-number (buffer-substring
+						    (+ (point) size)
+						    (point))))
+			      100)
+			   1)
+		       (or (eq (char-after (+ (point) size -1)) ?-)
+			   (eq (char-after (+ (point) size -2)) ?-)))
+		  ;; This is a range so just replace the end part.
+		  (delete-char size)
+		;; Detect if this is using the following shorthand:
+		;; (C) 1993, 94, 95, 1998, 2000, 01, 02, 2003
+		(if (and
+		     ;; Check that the last year was 4-chars and same century.
+		     (eq size -4)
+		     (equal (buffer-substring (- (point) 4) (- (point) 2))
+			    (substring copyright-current-year 0 2))
+		     ;; Check that there are 2-char years as well.
+		     (save-excursion
+		       (re-search-backward "[^0-9][0-9][0-9][^0-9]"
+					   (line-beginning-position) t))
+		     ;; Make sure we don't remove the first century marker.
+		     (save-excursion
+		       (forward-char size)
+		       (re-search-backward
+			(concat (buffer-substring (point) (+ (point) 2))
+				"[0-9][0-9]")
+			(line-beginning-position) t)))
+		    ;; Remove the century marker of the last entry.
+		    (delete-region (- (point) 4) (- (point) 2)))
+		;; Insert a comma with the preferred number of spaces.
+		(insert
+		 (save-excursion
+		   (if (re-search-backward "[0-9]\\( *, *\\)[0-9]"
+					   (line-beginning-position) t)
+		       (match-string 1)
+		     ", ")))
+		;; If people use the '91 '92 '93 scheme, do that as well.
+		(if (eq (char-after (+ (point) size -3)) ?')
+		    (insert ?')))
+	      ;; Finally insert the new year.
+	      (insert (substring copyright-current-year size))))))))
 
 ;;;###autoload
-(defun copyright-update (&optional arg)
+(defun copyright-update (&optional arg interactivep)
   "Update copyright notice at beginning of buffer to indicate the current year.
 With prefix ARG, replace the years in the notice rather than adding
 the current year after them.  If necessary, and
 `copyright-current-gpl-version' is set, any copying permissions
-following the copyright are updated as well."
-  (interactive "*P")
-  (if copyright-update
+following the copyright are updated as well.
+If non-nil, INTERACTIVEP tells the function to behave as when it's called
+interactively."
+  (interactive "*P\nd")
+  (when (or copyright-update interactivep)
+    (let ((noquery (or (not copyright-query)
+		       (and (eq copyright-query 'function) interactivep))))
       (save-excursion
 	(save-restriction
 	  (widen)
 	  (goto-char (point-min))
-	  ;; Note that `current-time-string' isn't locale-sensitive.
-	  (setq copyright-current-year (substring (current-time-string) -4))
-	  (if (re-search-forward copyright-regexp copyright-limit t)
-	      (if (string= (buffer-substring (- (match-end 2) 2) (match-end 2))
-			   (substring copyright-current-year -2))
-		  ()
-		(if (or (not copyright-query)
-			(and (eq copyright-query 'function)
-			     (eq this-command 'copyright-update))
-			(y-or-n-p (if arg
-				      (concat "Replace copyright year(s) by "
-					      copyright-current-year "? ")
-				    (concat "Add " copyright-current-year
-					    " to copyright? "))))
-		    (if arg
-			(progn
-			  (delete-region (match-beginning 1) (match-end 1))
-			  (insert copyright-current-year))
-		      (setq arg (save-excursion (skip-chars-backward "0-9")))
-		      (if (and (eq (% (- (string-to-number
-					  copyright-current-year)
-					 (string-to-number (buffer-substring
-							    (+ (point) arg)
-							    (point))))
-				      100)
-				   1)
-			       (or (eq (char-after (+ (point) arg -1)) ?-)
-				   (eq (char-after (+ (point) arg -2)) ?-)))
-			  (delete-char arg)
-			(insert ", ")
-			(if (eq (char-after (+ (point) arg -3)) ?')
-			    (insert ?')))
-		      (insert (substring copyright-current-year arg))))))
+	  (copyright-update-year arg noquery)
 	  (goto-char (point-min))
 	  (and copyright-current-gpl-version
 	       ;; match the GPL version comment in .el files, including the
@@ -129,26 +160,19 @@
 	       (re-search-forward "\\(the Free Software Foundation;\
  either \\|; a\\^u eldono \\([0-9]+\\)a, ? a\\^u (la\\^u via	 \\)\
 version \\([0-9]+\\), or (at"
-				  copyright-limit t)
+				  (+ (point) copyright-limit) t)
 	       (not (string= (match-string 3) copyright-current-gpl-version))
-	       (or (not copyright-query)
-		   (and (eq copyright-query 'function)
-			(eq this-command 'copyright-update))
+	       (or noquery
 		   (y-or-n-p (concat "Replace GPL version by "
 				     copyright-current-gpl-version "? ")))
 	       (progn
 		 (if (match-end 2)
 		     ;; Esperanto bilingual comment in two-column.el
-		     (progn
-		       (delete-region (match-beginning 2) (match-end 2))
-		       (goto-char (match-beginning 2))
-		       (insert copyright-current-gpl-version)))
-		 (delete-region (match-beginning 3) (match-end 3))
-		 (goto-char (match-beginning 3))
-		 (insert copyright-current-gpl-version))))
+		     (replace-match copyright-current-gpl-version t t nil 2))
+		 (replace-match copyright-current-gpl-version t t nil 3))))
 	(set (make-local-variable 'copyright-update) nil)))
-  ;; If a write-file-hook returns non-nil, the file is presumed to be written.
-  nil)
+    ;; If a write-file-hook returns non-nil, the file is presumed to be written.
+    nil))
 
 
 ;;;###autoload
@@ -159,7 +183,7 @@
   "Copyright (C) " `(substring (current-time-string) -4) " by "
   (or (getenv "ORGANIZATION")
       str)
-  '(if (> (point) copyright-limit)
+  '(if (> (point) (+ (point-min) copyright-limit))
        (message "Copyright extends beyond `copyright-limit' and won't be updated automatically."))
   comment-end \n)