Function: gnus-adjust-marked-articles
gnus-adjust-marked-articles is a byte-compiled function defined in
gnus-sum.el.gz.
Signature
(gnus-adjust-marked-articles INFO)
Documentation
Set all article lists and remove all marks that are no longer valid.
Source Code
;; Defined in /usr/src/emacs/lisp/gnus/gnus-sum.el.gz
(defun gnus-adjust-marked-articles (info)
"Set all article lists and remove all marks that are no longer valid."
(let* ((marked-lists (gnus-info-marks info))
(active (gnus-active (gnus-info-group info)))
(min (car active))
(max (cdr active))
(types gnus-article-mark-lists)
var articles article mark mark-type
bgn end)
;; Hack to avoid adjusting marks for imap.
(when (eq (car (gnus-find-method-for-group (gnus-info-group info)))
'nnimap)
(setq min 1))
(dolist (marks marked-lists)
(setq mark (car marks)
mark-type (gnus-article-mark-to-type mark)
var (intern (format "gnus-newsgroup-%s" (car (rassq mark types)))))
;; We set the variable according to the type of the marks list,
;; and then adjust the marks to a subset of the active articles.
(cond
;; Adjust "simple" lists - compressed yet unsorted
((eq mark-type 'list)
;; Simultaneously uncompress and clip to active range
;; See range-uncompress for a description of possible marks
(let (l lh)
(if (not (cadr marks))
(set var nil)
(setq articles (if (numberp (cddr marks))
(list (cdr marks))
(cdr marks))
lh (cons nil nil)
l lh)
(while (setq article (pop articles))
(cond ((consp article)
(setq bgn (max (car article) min)
end (min (cdr article) max))
(while (<= bgn end)
(setq l (setcdr l (cons bgn nil))
bgn (1+ bgn))))
((and (<= min article)
(>= max article))
(setq l (setcdr l (cons article nil))))))
(set var (cdr lh)))))
;; Adjust assocs.
((eq mark-type 'tuple)
(set var (setq articles (cdr marks)))
(when (not (listp (cdr (symbol-value var))))
(set var (list (symbol-value var))))
(when (not (listp (cdr articles)))
(setq articles (list articles)))
(while articles
(when (or (not (consp (setq article (pop articles))))
(< (car article) min)
(> (car article) max))
(set var (delq article (symbol-value var))))))
;; Adjust ranges (sloppily).
((eq mark-type 'range)
(cond
((eq mark 'seen)
;; Fix the record for `seen' if it looks like (seen NUM1 . NUM2).
;; It should be (seen (NUM1 . NUM2)).
(when (numberp (cddr marks))
(setcdr marks (list (cdr marks))))
(setq articles (cdr marks))
(while (and articles
(or (and (consp (car articles))
(> min (cdar articles)))
(and (numberp (car articles))
(> min (car articles)))))
(pop articles))
(set var articles))
((eq mark 'unexist)
(set var (cdr marks)))))))))