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))))