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