Function: ediff-set-diff-overlays-in-one-buffer
ediff-set-diff-overlays-in-one-buffer is a byte-compiled function
defined in ediff-diff.el.gz.
Signature
(ediff-set-diff-overlays-in-one-buffer BUF-TYPE DIFF-LIST)
Source Code
;; Defined in /usr/src/emacs/lisp/vc/ediff-diff.el.gz
(defun ediff-set-diff-overlays-in-one-buffer (buf-type diff-list)
(let* ((current-diff -1)
(buff (ediff-get-buffer buf-type))
(ctl-buf ediff-control-buffer)
;; ediff-extract-diffs puts the type of diff-list as the first elt
;; of this list. The type is either 'points or 'words
(diff-list-type (car diff-list))
(shift (ediff-overlay-start
(ediff-get-value-according-to-buffer-type
buf-type ediff-narrow-bounds)))
(limit (ediff-overlay-end
(ediff-get-value-according-to-buffer-type
buf-type ediff-narrow-bounds)))
diff-overlay-list list-element total-diffs
begin end pt-saved overlay state-of-diff)
(setq diff-list (cdr diff-list)) ; discard diff list type
(setq total-diffs (length diff-list))
;; shift, if necessary
(ediff-with-current-buffer buff (setq pt-saved shift))
(while diff-list
(setq current-diff (1+ current-diff)
list-element (car diff-list)
begin (aref list-element (cond ((eq buf-type 'A) 0)
((eq buf-type 'B) 2)
((eq buf-type 'C) 4)
(t 6))) ; Ancestor
end (aref list-element (cond ((eq buf-type 'A) 1)
((eq buf-type 'B) 3)
((eq buf-type 'C) 5)
(t 7))) ; Ancestor
state-of-diff (aref list-element 8)
)
(cond ((and (not (eq buf-type state-of-diff))
(not (eq buf-type 'Ancestor))
(memq state-of-diff '(A B C)))
(setq state-of-diff
(car (delq buf-type (delq state-of-diff (list 'A 'B 'C)))))
(setq state-of-diff (format "=diff(%S)" state-of-diff))
)
(t (setq state-of-diff nil)))
;; Put overlays at appropriate places in buffer
;; convert word numbers to points, if necessary
(if (eq diff-list-type 'words)
(progn
(ediff-with-current-buffer buff (goto-char pt-saved))
(ediff-with-current-buffer ctl-buf
(setq begin (ediff-goto-word (1+ begin) buff)
end (ediff-goto-word end buff 'end)))
(if (> end limit) (setq end limit))
(if (> begin end) (setq begin end))
(setq pt-saved (ediff-with-current-buffer buff (point)))))
(setq overlay (ediff-make-bullet-proof-overlay begin end buff))
(ediff-overlay-put overlay 'ediff-diff-num current-diff)
(if (and (ediff-has-face-support-p)
ediff-use-faces ediff-highlight-all-diffs)
(ediff-set-overlay-face
overlay (ediff-background-face buf-type current-diff)))
(if (= 0 (mod current-diff 10))
(message "Buffer %S: Processing difference region %d of %d"
buf-type current-diff total-diffs))
;; Record all overlays for this difference.
;; The 2-d elt, nil, is a place holder for the fine diff vector.
;; The 3-d elt, nil, is a place holder for no-fine-diffs flag.
;; The 4-th elt says which diff region is different from the other two
;; (3-way jobs only).
(setq diff-overlay-list
(nconc
diff-overlay-list
(list (vector overlay nil nil state-of-diff)))
diff-list
(cdr diff-list))
) ; while
(set (ediff-get-symbol-from-alist buf-type ediff-difference-vector-alist)
(vconcat diff-overlay-list))
))