* mail/rmail.el (rmail-set-message-counters):

Call rmail-set-message-counters-counter just once.
It returns # msgs after point.
(rmail-set-message-counters-counter):
Arg is now SPOT-TO-FIND.  Return # messages after that one.

* mail/rmail.el (rmail-forget-messages):
Ignore nil elt in rmail-message-vector.  Use dotimes.
This commit is contained in:
Richard M. Stallman 2009-08-13 01:13:09 +00:00
parent 5c9509238d
commit 76e1e40b4e
2 changed files with 35 additions and 21 deletions

View file

@ -3,6 +3,9 @@
* mail/rmail.el (rmail-get-attr-names):
Accept an attribute header that is too short.
* mail/rmail.el (rmail-forget-messages):
Ignore nil elt in rmail-message-vector. Use dotimes.
* progmodes/compile.el (compilation-goto-locus):
Use next-error-move-function.

View file

@ -2369,12 +2369,11 @@ change the invisible header text."
(defun rmail-forget-messages ()
(unwind-protect
(if (vectorp rmail-message-vector)
(let* ((i 0)
(v rmail-message-vector)
(let* ((v rmail-message-vector)
(n (length v)))
(while (< i n)
(move-marker (aref v i) nil)
(setq i (1+ i)))))
(dotimes (i n)
(if (aref v i)
(move-marker (aref v i) nil)))))
(setq rmail-message-vector nil)
(setq rmail-msgref-vector nil)
(setq rmail-deleted-vector nil)))
@ -2440,20 +2439,25 @@ Output a helpful message unless NOMSG is non-nil."
;; the entry for message N+1, which marks
;; the end of message N. (N = number of messages).
(setq messages-head (list (point-marker)))
(rmail-set-message-counters-counter (min (point) point-save))
(setq messages-after-point total-messages)
(setq messages-after-point
(or (rmail-set-message-counters-counter (min (point) point-save))
0))
;; Determine how many precede point.
(rmail-set-message-counters-counter)
(setq rmail-total-messages total-messages)
(setq rmail-current-message
(min total-messages
(max 1 (- total-messages messages-after-point))))
(setq rmail-message-vector
(apply 'vector (cons (point-min-marker) messages-head))
rmail-deleted-vector (concat "0" deleted-head)
rmail-summary-vector (make-vector rmail-total-messages nil)
;; Make an element 0 in rmail-message-vector and rmail-deleted-vector
;; which will never be used.
(push nil messages-head)
(push ?0 deleted-head)
(setq rmail-message-vector (apply 'vector messages-head)
rmail-deleted-vector (concat deleted-head))
(setq rmail-summary-vector (make-vector rmail-total-messages nil)
rmail-msgref-vector (make-vector (1+ rmail-total-messages) nil))
(let ((i 0))
(while (<= i rmail-total-messages)
(aset rmail-msgref-vector i (list i))
@ -2480,12 +2484,17 @@ the message. Point is at the beginning of the message."
?D
?\s) deleted-head))))
(defun rmail-set-message-counters-counter (&optional stop)
;; Collect the start position for each message into 'messages-head.
(let ((start (point)))
(while (search-backward "\n\nFrom " stop t)
(defun rmail-set-message-counters-counter (&optional spot-to-find)
"Collect the start positions of messages in list `messages-head'.
Return the number of messages after the one containing SPOT-TO-FIND."
(let ((start (point))
messages-after-spot)
(while (search-backward "\n\nFrom " nil t)
(forward-char 2)
(when (looking-at rmail-unix-mail-delimiter)
(if (and (<= (point) spot-to-find)
(null messages-after-spot))
(setq messages-after-spot total-messages))
(rmail-collect-deleted start)
(setq messages-head (cons (point-marker) messages-head)
total-messages (1+ total-messages)
@ -2494,13 +2503,15 @@ the message. Point is at the beginning of the message."
(if (zerop (% total-messages 20))
(message "Counting messages...%d" total-messages))))
;; Handle the first message, maybe.
(if stop
(goto-char stop)
(goto-char (point-min)))
(goto-char (point-min))
(unless (not (looking-at rmail-unix-mail-delimiter))
(if (and (<= (point) spot-to-find)
(null messages-after-spot))
(setq messages-after-spot total-messages))
(rmail-collect-deleted start)
(setq messages-head (cons (point-marker) messages-head)
total-messages (1+ total-messages)))))
total-messages (1+ total-messages)))
messages-after-spot))
;; Display a message.