diff options
Diffstat (limited to 'lisp/gnus/gnus.el')
-rw-r--r-- | lisp/gnus/gnus.el | 105 |
1 files changed, 44 insertions, 61 deletions
diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el index 0673ac15f60..23643cc6c79 100644 --- a/lisp/gnus/gnus.el +++ b/lisp/gnus/gnus.el @@ -2817,67 +2817,50 @@ See Info node `(gnus)Formatting Variables'." ;; Info access macros. -(defmacro gnus-info-group (info) - `(nth 0 ,info)) -(defmacro gnus-info-rank (info) - `(nth 1 ,info)) -(defmacro gnus-info-read (info) - `(nth 2 ,info)) -(defmacro gnus-info-marks (info) - `(nth 3 ,info)) -(defmacro gnus-info-method (info) - `(nth 4 ,info)) -(defmacro gnus-info-params (info) - `(nth 5 ,info)) - -(defmacro gnus-info-level (info) - `(let ((rank (gnus-info-rank ,info))) - (if (consp rank) - (car rank) - rank))) -(defmacro gnus-info-score (info) - `(let ((rank (gnus-info-rank ,info))) - (or (and (consp rank) (cdr rank)) 0))) - -(defmacro gnus-info-set-group (info group) - `(setcar ,info ,group)) -(defmacro gnus-info-set-rank (info rank) - `(setcar (nthcdr 1 ,info) ,rank)) -(defmacro gnus-info-set-read (info read) - `(setcar (nthcdr 2 ,info) ,read)) -(defmacro gnus-info-set-marks (info marks &optional extend) - (if extend - `(gnus-info-set-entry ,info ,marks 3) - `(setcar (nthcdr 3 ,info) ,marks))) -(defmacro gnus-info-set-method (info method &optional extend) - (if extend - `(gnus-info-set-entry ,info ,method 4) - `(setcar (nthcdr 4 ,info) ,method))) -(defmacro gnus-info-set-params (info params &optional extend) - (if extend - `(gnus-info-set-entry ,info ,params 5) - `(setcar (nthcdr 5 ,info) ,params))) - -(defun gnus-info-set-entry (info entry number) +(cl-defstruct (gnus-info + (:constructor nil) + (:type list)) + group rank read marks method params) + +(defsubst gnus-info-level (info) + (declare (gv-setter gnus-info--set-level)) + (let ((rank (gnus-info-rank info))) + (if (consp rank) + (car rank) + rank))) +(defsubst gnus-info-score (info) + (declare (gv-setter gnus-info--set-score)) + (let ((rank (gnus-info-rank info))) + (or (and (consp rank) (cdr rank)) 0))) + +(defsubst gnus-info-set-marks (info marks &optional extend) + (if extend (gnus-info--grow-entry info 3)) + (setf (gnus-info-marks info) marks)) +(defsubst gnus-info-set-method (info method &optional extend) + (if extend (gnus-info--grow-entry info 4)) + (setf (gnus-info-method info) method)) +(defsubst gnus-info-set-params (info params &optional extend) + (if extend (gnus-info--grow-entry info 5)) + (setf (gnus-info-params info) params)) + +(defun gnus-info--grow-entry (info number) ;; Extend the info until we have enough elements. (while (<= (length info) number) - (nconc info (list nil))) - ;; Set the entry. - (setcar (nthcdr number info) entry)) - -(defmacro gnus-info-set-level (info level) - `(let ((rank (cdr ,info))) - (if (consp (car rank)) - (setcar (car rank) ,level) - (setcar rank ,level)))) -(defmacro gnus-info-set-score (info score) - `(let ((rank (cdr ,info))) - (if (consp (car rank)) - (setcdr (car rank) ,score) - (setcar rank (cons (car rank) ,score))))) - -(defmacro gnus-get-info (group) - `(nth 1 (gethash ,group gnus-newsrc-hashtb))) + (nconc info (list nil)))) + +(defsubst gnus-info--set-level (info level) + (let ((rank (gnus-info-rank info))) + (if (consp rank) + (setcar rank level) + (setf (gnus-info-rank info) level)))) +(defsubst gnus-info--set-score (info score) + (let ((rank (gnus-info-rank info))) + (if (consp rank) + (setcdr rank score) + (setf (gnus-info-rank info) (cons rank score))))) + +(defsubst gnus-get-info (group) + (nth 1 (gethash group gnus-newsrc-hashtb))) (defun gnus-set-info (group info) (setcdr (gethash group gnus-newsrc-hashtb) @@ -3704,14 +3687,14 @@ GROUP can also be an INFO structure." (setq params (delq name params)) (while (assq name params) (gnus-alist-pull name params)) - (gnus-info-set-params info params)))))) + (setf (gnus-info-params info) params)))))) (defun gnus-group-add-score (group &optional score) "Add SCORE to the GROUP score. If SCORE is nil, add 1 to the score of GROUP." (let ((info (gnus-get-info group))) (when info - (gnus-info-set-score info (+ (gnus-info-score info) (or score 1)))))) + (setf (gnus-info-score info) (+ (gnus-info-score info) (or score 1)))))) (defun gnus-short-group-name (group &optional levels) "Collapse GROUP name LEVELS. |