Function: rmail-edit-diff-headers
rmail-edit-diff-headers is a byte-compiled function defined in
rmailedit.el.gz.
Signature
(rmail-edit-diff-headers OLD-HEADERS NEW-HEADERS)
Documentation
Compare OLD-HEADERS and NEW-HEADERS and return field differences.
The value is a list of three lists, (INSERTED DELETED CHANGED).
INSERTED's elements describe inserted header fields and each looks like (AFTER-WHAT INSERT-WHAT) INSERT-WHAT is the header field to insert (a member of NEW-HEADERS). AFTER-WHAT is the field to insert it after (a member of NEW-HEADERS) or else nil to insert it at the beginning.
DELETED's elements are elements of OLD-HEADERS. CHANGED's elements have the form (OLD . NEW) where OLD is an element of OLD-HEADERS and NEW is an element of NEW-HEADERS.
Source Code
;; Defined in /usr/src/emacs/lisp/mail/rmailedit.el.gz
(defun rmail-edit-diff-headers (old-headers new-headers)
"Compare OLD-HEADERS and NEW-HEADERS and return field differences.
The value is a list of three lists, (INSERTED DELETED CHANGED).
INSERTED's elements describe inserted header fields
and each looks like (AFTER-WHAT INSERT-WHAT)
INSERT-WHAT is the header field to insert (a member of NEW-HEADERS).
AFTER-WHAT is the field to insert it after (a member of NEW-HEADERS)
or else nil to insert it at the beginning.
DELETED's elements are elements of OLD-HEADERS.
CHANGED's elements have the form (OLD . NEW)
where OLD is an element of OLD-HEADERS and NEW is an element of NEW-HEADERS."
(let ((reverse-new (reverse new-headers))
inserted deleted changed)
(dolist (old old-headers)
(let ((new (assoc (car old) new-headers)))
;; If it's in OLD-HEADERS and has no new counterpart,
;; it is a deletion.
(if (null new)
(push old deleted)
;; If it has a new counterpart, maybe it was changed.
(unless (equal (cdr old) (cdr new))
(push (cons old new) changed))
;; Remove the new counterpart, since it has been spoken for.
(setq new-headers (remq new new-headers)))))
;; Look at the new headers with no old counterpart.
(dolist (new new-headers)
(let ((prev (cadr (member new reverse-new))))
;; Mark each one as an insertion.
;; Record the previous new header, to insert it after that.
(push (list prev new) inserted)))
;; It is crucial to return the insertions in buffer order
;; so that `rmail-edit-update-headers' can insert a field
;; after a new field.
(list (nreverse inserted)
(nreverse deleted)
(nreverse changed))))