changeset 14582:c768f6d7daaa

*** empty log message ***
author Michael Kifer <kifer@cs.stonybrook.edu>
date Fri, 16 Feb 1996 06:36:35 +0000
parents 4951b11970a1
children 38204b26f2e7
files lisp/ediff-diff.el lisp/ediff-hook.el lisp/ediff-init.el lisp/ediff-merg.el lisp/ediff-mult.el lisp/ediff-util.el lisp/ediff-wind.el lisp/ediff.el lisp/emulation/viper-ex.el
diffstat 9 files changed, 662 insertions(+), 724 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ediff-diff.el	Fri Feb 16 05:25:08 1996 +0000
+++ b/lisp/ediff-diff.el	Fri Feb 16 06:36:35 1996 +0000
@@ -25,8 +25,10 @@
 
 (require 'ediff-init)
 
+
 (defvar ediff-shell
   (cond ((eq system-type 'emx) "cmd") ; OS/2
+	((eq system-type 'ms-dos) shell-file-name) ; no standard name on MS-DOS
 	((memq system-type '(vax-vms axp-vms)) "*dcl*") ; VMS
 	(t  "sh")) ; UNIX
   "*The shell used to run diff and patch.  If user's .profile or
@@ -84,7 +86,7 @@
   
 ;;; Fine differences 
 
-(ediff-defvar-local ediff-auto-refine (if (ediff-window-display-p) 'on 'nix)
+(ediff-defvar-local ediff-auto-refine (if (ediff-has-face-support-p) 'on 'nix)
   "If `on', Ediff auto-highlights fine diffs for the current diff region.
 If `off', auto-highlighting is not used. If `nix', no fine diffs are shown
 at all, unless the user force-refines the region by hitting `*'.
@@ -132,9 +134,9 @@
 ;; ediff-setup-diff-regions-function, which can also have the value
 ;; ediff-setup-diff-regions3, which takes 4 arguments.
 (defun ediff-setup-diff-regions (file-A file-B file-C)
-  ;; Force all minibuffers to display ediff's messages.
-  ;; When xemacs implements minibufferless frames, this won't be necessary
-  (if ediff-xemacs-p (setq synchronize-minibuffers t))
+;;;  ;; Force all minibuffers to display ediff's messages.
+;;;  ;; When xemacs implements minibufferless frames, this won't be necessary
+;;;  (if ediff-xemacs-p (setq synchronize-minibuffers t))
 						  
   (or (ediff-buffer-live-p ediff-diff-buffer)
       (setq ediff-diff-buffer
@@ -148,8 +150,7 @@
   ;;(message "Computing differences ... done")
   (ediff-convert-diffs-to-overlays
    (ediff-extract-diffs
-    ediff-diff-buffer ediff-word-mode ediff-narrow-bounds))
-  )
+    ediff-diff-buffer ediff-word-mode ediff-narrow-bounds)))
      
 ;; If file-A/B/C is nil, do 2-way comparison with the non-nil buffers
 ;; This function works for diff3 and diff2 jobs
@@ -178,7 +179,8 @@
 			) ; exec process
   
     (ediff-prepare-error-list ok-regexp ediff-fine-diff-buffer)
-    ;;(ediff-message-if-verbose
+    (ediff-message-if-verbose
+     "")
     ;; "Refining difference region %d ... done" (1+ reg-num))
     
     (setq diff-list
@@ -463,15 +465,9 @@
 	    (setq pt-saved (ediff-eval-in-buffer buff (point)))))
       (setq overlay (ediff-make-bullet-proof-overlay begin end buff))
       
-      ;; Priorities of overlays should be equal in all ediff control
-      ;; panel buffers. Otherwise it won't work due to Emacs
-      ;; bug, as insert-in-front-hooks will be called 
-      ;; only on behalf of the buffer with higher priority.
       (ediff-overlay-put overlay 'priority ediff-shadow-overlay-priority)
       (ediff-overlay-put overlay 'ediff-diff-num current-diff)
-      (ediff-overlay-put 
-       overlay 'insert-in-front-hooks '(ediff-insert-in-front))
-      (if (and (ediff-window-display-p)
+      (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)))
@@ -502,7 +498,7 @@
   (or n  (setq n ediff-current-difference))
   
   (if (< ediff-number-of-differences 1)
-      (error "No differences found"))
+      (error "Sorry, it is not my job to munch identical variants..."))
       
   (if ediff-word-mode
       (setq flag 'skip
@@ -668,10 +664,10 @@
     
 ;; if fine diff vector is not set for diff N, then do nothing
 (defun ediff-set-fine-diff-properties (n &optional default)
-  (or (not (ediff-window-display-p))
+  (or (not (ediff-has-face-support-p))
       (< n 0)
       (>= n ediff-number-of-differences)
-      ;; in a window system, set faces and priorities of fine overlays
+      ;; when faces are supported, set faces and priorities of fine overlays
       (progn
 	(ediff-set-fine-diff-properties-in-one-buffer 'A n default)
 	(ediff-set-fine-diff-properties-in-one-buffer 'B n default)
@@ -966,9 +962,9 @@
 ;; or it is the ancestor file.
 (defun ediff-setup-diff-regions3 (file-A file-B file-C)
   
-  ;; force all minibuffers to display ediff's messages.
-  ;; when xemacs implements minibufferless frames, this won't be necessary
-  (if ediff-xemacs-p (setq synchronize-minibuffers t))
+;;;  ;; force all minibuffers to display ediff's messages.
+;;;  ;; when xemacs implements minibufferless frames, this won't be necessary
+;;;  (if ediff-xemacs-p (setq synchronize-minibuffers t))
 						  
   (or (ediff-buffer-live-p ediff-diff-buffer)
       (setq ediff-diff-buffer
@@ -987,11 +983,11 @@
    ))
    
 
-;; Execute PROGRAM asynchronously, unless OS/2 or unless SYNC is non-nil.
-;; BUFFER must be a buffer object, and must be alive.
-;; All arguments in ARGS must be strings. The first arg may be a blank string,
-;; in which case we delete it from ARGS list. We also delete nil from args.
-(defun ediff-exec-process (program buffer sync &rest args)
+;; Execute PROGRAM asynchronously, unless OS/2, Windows-*, or DOS, or unless
+;; SYNCH is non-nil.  BUFFER must be a buffer object, and must be alive.  All
+;; arguments in ARGS must be strings. The first arg may be a blank string, in
+;; which case we delete it from ARGS list. We also delete nil from args.
+(defun ediff-exec-process (program buffer synch &rest args)
   (let ((data (match-data)))
     (if (string-match "^[ \t]*$" (car args)) ; delete blank string
 	(setq args (cdr args)))
@@ -1004,13 +1000,17 @@
 	    (set-buffer buffer)
 	    (erase-buffer)
 	    (setq default-directory directory)
-	    (if (or (eq system-type 'emx) sync)
-		;; In OS/2 do it synchronously, since OS/2 doesn't let us
+	    (if (or (memq system-type '(emx ms-dos windows-nt windows-95))
+		    synch)
+		;; In OS/2 (emx) do it synchronously, since OS/2 doesn't let us
 		;; delete files used by other processes. Thus, in ediff-buffers
 		;; and similar functions, we can't delete temp files because
-		;; they might be used by the async process that computes
+		;; they might be used by the asynch process that computes
 		;; custom diffs. So, we have to wait till custom diff
 		;; subprocess is done.
+		;; Similarly for Windows-*
+		;; In DOS, must synchronize because DOS doesn't have
+		;; asynchronous processes.
 		(apply 'call-process program nil buffer nil args)
 	      ;; On other systems, do it asynchronously.
 	      (setq proc (get-buffer-process buffer))
@@ -1164,4 +1164,5 @@
 
 (provide 'ediff-diff)
 
+
 ;; ediff-diff.el ends here
--- a/lisp/ediff-hook.el	Fri Feb 16 05:25:08 1996 +0000
+++ b/lisp/ediff-hook.el	Fri Feb 16 06:36:35 1996 +0000
@@ -23,10 +23,12 @@
 
 ;;; Code:
 
-;;   These must be placed in menu-bar.el in Emacs
+;;;   These must be placed in menu-bar.el in Emacs
 ;;
+;;      (define-key menu-bar-tools-menu [ediff-doc]
+;;	 '("Ediff Manual..." . ediff-documentation))
 ;;      (define-key menu-bar-tools-menu [eregistry]
-;;	'("List Ediff Sessions" . ediff-show-registry))
+;;	'("List Ediff Sessions..." . ediff-show-registry))
 ;;      (define-key menu-bar-tools-menu [epatch]
 ;;	'("Apply Patch" . menu-bar-epatch-menu))
 ;;      (define-key menu-bar-tools-menu [ediff-merge]
@@ -46,14 +48,16 @@
 	 '("Tools") epatch-menu "OO-Browser...")
 	(add-menu-button
 	 '("Tools")
-	 ["List Ediff Sessions" ediff-show-registry t] "OO-Browser...")
+	 ["List Ediff Sessions..." ediff-show-registry t] "OO-Browser...")
 	(add-menu-button
 	 '("Tools")
-	 ["---" nil nil] "OO-Browser...")
+	 ["Ediff Manual..." ediff-documentation t] "OO-Browser...")
+	(add-menu-button
+	 '("Tools")
+	 ["-------" nil nil] "OO-Browser...")
 	)))
 
 
-
 ;; explicit string-match is needed: ediff-xemacs-p is not defined at build time
 (cond ((string-match "XEmacs" emacs-version)
        (defvar ediff-menu
@@ -73,7 +77,8 @@
 	   ["Windows Line-by-line..." ediff-windows-linewise t]
 	   "---"
 	   ["Regions Word-by-word..." ediff-regions-wordwise t]
-	   ["Regions Line-by-line..." ediff-regions-linewise t]))
+	   ["Regions Line-by-line..." ediff-regions-linewise t]
+	   ))
        (defvar ediff-merge-menu
 	 '("Merge"
 	   ["Files..."  ediff-merge-files t]
@@ -91,15 +96,16 @@
 	    ediff-merge-revisions-with-ancestor t]
 	   ["Directory Revisions..." ediff-merge-directory-revisions t]
 	   ["Directory Revisions with Ancestor..."
-	    ediff-merge-directory-revisions-with-ancestor t]))
+	    ediff-merge-directory-revisions-with-ancestor t]
+	   ))
        (defvar epatch-menu
 	 '("Apply Patch"
 	   ["To a file..."  ediff-patch-file t]
-	   ["To a buffer..." ediff-patch-buffer t]))
+	   ["To a buffer..." ediff-patch-buffer t]
+	   ))
 
        ;; put these menus before Object-Oriented-Browser in Tools menu
        (add-hook 'before-init-hook 'ediff-xemacs-init-menus)
-       ;; this `if' is to be deleted before going into distribution
        (if (not purify-flag)
 	   (ediff-xemacs-init-menus))
        )
@@ -117,7 +123,17 @@
 
        ;; define ediff-menu
        (define-key menu-bar-ediff-menu [window]
-	 '("This Window And Next Window" . compare-windows))
+	 '("This Window and Next Window" . compare-windows))
+       (define-key menu-bar-ediff-menu [ediff-windows-linewise]
+	 '("Windows Line-by-line..." . ediff-windows-linewise))
+       (define-key menu-bar-ediff-menu [ediff-windows-wordwise]
+	 '("Windows Word-by-word..." . ediff-windows-wordwise))
+       (define-key menu-bar-ediff-menu [separator-ediff-windows] '("--"))
+       (define-key menu-bar-ediff-menu [ediff-regions-linewise]
+	 '("Regions Line-by-line..." . ediff-regions-linewise))
+       (define-key menu-bar-ediff-menu [ediff-regions-wordwise]
+	 '("Regions Word-by-word..." . ediff-regions-wordwise))
+       (define-key menu-bar-ediff-menu [separator-ediff-regions] '("--"))
        (define-key menu-bar-ediff-menu [ediff-dir-revision]
 	 '("Directory Revisions..." . ediff-directory-revisions))
        (define-key menu-bar-ediff-menu [ediff-revision]
@@ -136,16 +152,6 @@
 	 '("Two Buffers..." . ediff-buffers))
        (define-key menu-bar-ediff-menu [ediff-files]
 	 '("Two Files..." . ediff-files))
-       (define-key menu-bar-ediff-menu [separator-ediff-regions] '("--"))
-       (define-key menu-bar-ediff-menu [ediff-regions-linewise]
-	 '("Regions Line-by-line..." . ediff-regions-linewise))
-       (define-key menu-bar-ediff-menu [ediff-regions-wordwise]
-	 '("Regions Word-by-word..." . ediff-regions-wordwise))
-       (define-key menu-bar-ediff-menu [separator-ediff-windows] '("--"))
-       (define-key menu-bar-ediff-menu [ediff-windows-linewise]
-	 '("Windows Line-by-line..." . ediff-windows-linewise))
-       (define-key menu-bar-ediff-menu [ediff-windows-wordwise]
-	 '("Windows Word-by-word..." . ediff-windows-wordwise))
 
        ;; define merge menu
        (define-key
@@ -268,7 +274,7 @@
 
   ;; misc
   (autoload 'ediff-show-registry
-    "ediff-mult"
+    "ediff-meta"
     "Display the registry of active Ediff sessions"
     t)
   (autoload 'ediff-version
--- a/lisp/ediff-init.el	Fri Feb 16 05:25:08 1996 +0000
+++ b/lisp/ediff-init.el	Fri Feb 16 06:36:35 1996 +0000
@@ -33,8 +33,18 @@
       window-system
     (device-type (selected-device))))
 ;; in XEmacs: device-type is tty on tty and stream in batch.
-(defsubst ediff-window-display-p ()
-  (and (ediff-device-type) (not (memq (ediff-device-type) '(tty stream)))))
+(defun ediff-window-display-p ()
+  (and (ediff-device-type) (not (memq (ediff-device-type) '(tty pc stream)))))
+
+;; test if supports faces
+;; ediff-force-faces is for those devices that support faces, but we don't know
+;; this yet
+(defun ediff-has-face-support-p ()
+  (cond ((ediff-window-display-p))
+	(ediff-force-faces)
+	(ediff-emacs-p (memq (ediff-device-type) '(pc)))
+	(ediff-xemacs-p (memq (ediff-device-type) '(tty pc)))))
+  
 
 ;;; Macros
 (defmacro ediff-odd-p (arg)
@@ -146,8 +156,7 @@
 		 (,@ forms))
 	     (set-buffer StartBuffer))
 	 (or (eq this-command 'ediff-quit)
-	     (error
-	      "You've killed an essential Ediff buffer---Please quit Ediff"))
+	     (error ediff-KILLED-VITAL-BUFFER))
 	 ))))
 	 
 
@@ -226,11 +235,16 @@
       ;; add more here
       ))
 (defsubst ediff-collect-diffs-metajob (&optional metajob)
-  (or (ediff-revision-metajob metajob)
-      (memq ediff-metajob-name
-	    '(ediff-directories
-	      ;; add more here
-	      ediff-directory-revisions))))
+  (memq (or metajob ediff-metajob-name)
+	'(ediff-directories
+	  ediff-directory-revisions
+	  ediff-merge-directories
+	  ediff-merge-directories-with-ancestor
+	  ediff-merge-directory-revisions
+	  ediff-merge-directory-revisions-with-ancestor
+	  ;; add more here
+	  )))
+
 (defsubst ediff-metajob3 (&optional metajob)
   (memq (or metajob ediff-metajob-name)
 	'(ediff-merge-directories-with-ancestor
@@ -335,7 +349,7 @@
   C-l -recenter      |    ## -ignore whitespace  |
   v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
   </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
-                     |     m -wide display       |  ~ -swap buffers
+    ~ -swap variants |     m -wide display       |  
 "
   "Help message usually used for 2-way comparison.
 Normally, not a user option. See `ediff-help-message' for details.")
@@ -349,7 +363,7 @@
   C-l -recenter      |    ## -ignore whitespace  |
   v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
   </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
-                     |     m -wide display       |  ~ -swap buffers
+    ~ -swap variants |     m -wide display       |  
 "
   "Help message when comparing windows or regions line-by-line.
 Normally, not a user option. See `ediff-help-message' for details.")
@@ -363,7 +377,7 @@
   C-l -recenter      |                           |
   v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
   </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
-                     |     m -wide display       |  ~ -swap buffers
+    ~ -swap variants |     m -wide display       |  
 "
   "Help message when comparing windows or regions word-by-word.
 Normally, not a user option. See `ediff-help-message' for details.")
@@ -377,7 +391,7 @@
   C-l -recenter      | #f/#h -focus/hide regions |  + -combine diff regions
   v/V -scroll up/dn  |     X -read-only in buf X | wx -save buf X
   </> -scroll lt/rt  |     m -wide display       | wd -save diff output
-    / -ancestor buff |     s -shrink window C    |  ~ -swap buffers
+    ~ -swap variants |     s -shrink window C    |  / -show ancestor buff 
                      |     $ -show clashes only  |  & -merge w/new default
 "
   "Help message during merging.
@@ -402,8 +416,8 @@
   "The long help message that the user can customize.
 See `ediff-brief-help-message-function' for more.")
 
-(defvar ediff-prefer-long-help-message nil
-  "*If t, Ediff starts with a long help message. Short help msg otherwise.")
+(defvar ediff-use-long-help-message nil
+  "*If t, Ediff displays a long help message. Short help message otherwise.")
 
 ;; The actual help message.
 (ediff-defvar-local ediff-help-message ""
@@ -412,6 +426,12 @@
 start up with different help messages for different jobs, you can change
 the value of this variable and the variables `ediff-help-message-*' in
 `ediff-startup-hook'.") 
+
+;; Error messages
+(defconst ediff-KILLED-VITAL-BUFFER
+  "You have killed a vital Ediff buffer---you must leave Ediff now!")
+(defconst ediff-NO-DIFFERENCES
+  "Sorry, it is not my job to munch identical variants...")
  
 ;; Selective browsing
 
@@ -484,13 +504,18 @@
 
   
 (ediff-defvar-local ediff-use-faces t 
-  "If t, differences are highlighted using faces on a window system.
-If nil, they are highlighted using ASCII flags, ediff-before-flag
+  "If t, differences are highlighted using faces, if device supports faces.
+If nil, differences are highlighted using ASCII flags, ediff-before-flag
 and ediff-after-flag.  On a non-window system, differences are always
 highlighted using ASCII flags.
 This variable can be set either in .emacs or toggled interactively.
 Use `setq-default' if setting it in .emacs")
 
+(defvar ediff-force-faces nil
+  "If t, Ediff will think that it is running on a display that supports faces.
+This is provided as a temporary relief for users of face-capable displays
+that Ediff doesn't know about.")
+
 
 ;; this indicates that diff regions are word-size, so fine diffs are
 ;; permanently nixed; used in ediff-windows-wordwise and ediff-regions-wordwise
@@ -570,7 +595,7 @@
 ;; Buffer-local variables to be saved then restored during Ediff sessions
 ;; Buffer-local variables to be saved then restored during Ediff sessions
 (defconst ediff-protected-variables '(buffer-read-only 
-				      synchronize-minibuffers
+;;;				      synchronize-minibuffers
 				      mode-line-format))
 
 ;; Vector of differences between the variants.  Each difference is
@@ -636,10 +661,10 @@
 
 (defvar ediff-version-control-package 'vc
   "Version control package used.
-Currently, Ediff supports vc.el, rcs.el, and generic-sc.el. The standard Emacs
-interface to RCS, CVS, SCCS, etc., is vc.el. However, some people find the
-other two packages more convenient. Set this variable `rcs' or `generic-sc' if
-you are such a person.")
+Currently, Ediff supports vc.el, rcs.el, pcl-cvs.el, and generic-sc.el. The
+standard Emacs interface to RCS, CVS, SCCS, etc., is vc.el. However, some
+people find the other two packages more convenient. Set this variable to the
+appropriate symbol: `rcs', `pcl-cvs', or `generic-sc' if you so desire.")
 
 
 (if ediff-xemacs-p
@@ -647,16 +672,12 @@
       (fset 'ediff-read-event (symbol-function 'next-command-event))
       (fset 'ediff-overlayp (symbol-function 'extentp))
       (fset 'ediff-make-overlay (symbol-function 'make-extent))
-      (fset 'ediff-delete-overlay (symbol-function 'delete-extent))
-      (fset 'ediff-overlay-buffer (symbol-function 'extent-buffer))
-      (fset 'ediff-overlay-get (symbol-function 'extent-property)))
+      (fset 'ediff-delete-overlay (symbol-function 'delete-extent)))
   (fset 'ediff-read-event (symbol-function 'read-event))
   (fset 'ediff-overlayp (symbol-function 'overlayp))
   (fset 'ediff-overlayp (symbol-function 'overlayp))
   (fset 'ediff-make-overlay (symbol-function 'make-overlay))
-  (fset 'ediff-delete-overlay (symbol-function 'delete-overlay))
-  (fset 'ediff-overlay-buffer (symbol-function 'overlay-buffer))
-  (fset 'ediff-overlay-get (symbol-function 'overlay-get)))
+  (fset 'ediff-delete-overlay (symbol-function 'delete-overlay)))
   
 ;; Check the current version against the major and minor version numbers
 ;; using op: cur-vers op major.minor If emacs-major-version or
@@ -728,30 +749,34 @@
     (eq (device-class (selected-device)) 'color)))
 
   
+(if (ediff-has-face-support-p)
+    (if ediff-xemacs-p
+	(progn
+	  (fset 'ediff-valid-color-p (symbol-function 'valid-color-name-p))
+	  (fset 'ediff-get-face (symbol-function 'get-face)))
+      ;; Temporary fix for OS/2 port of Emacs
+      ;; pm-win.el in PM-Emacs should be fixed.
+      (if (eq (ediff-device-type) 'pm)
+	  (fset 'ediff-valid-color-p 
+		(function (lambda (color) (assoc color pm-color-alist))))
+	(fset 'ediff-valid-color-p (symbol-function 'x-color-defined-p)))
+      (fset 'ediff-get-face (symbol-function 'internal-get-face))))
+
 (if (ediff-window-display-p)
     (if ediff-xemacs-p
 	(progn
 	  (fset 'ediff-display-pixel-width
 		(symbol-function 'device-pixel-width))
 	  (fset 'ediff-display-pixel-height
-		(symbol-function 'device-pixel-height))
-	  (fset 'ediff-valid-color-p (symbol-function 'valid-color-name-p))
-	  (fset 'ediff-get-face (symbol-function 'get-face)))
-      ;; Temporary fix for OS/2 port of Emacs
-      ;; pm-win.el in PM-Emacs should be fixed.
+		(symbol-function 'device-pixel-height)))
       (fset 'ediff-display-pixel-width 
 	    (symbol-function 'x-display-pixel-width))
       (fset 'ediff-display-pixel-height
-	    (symbol-function 'x-display-pixel-height))
-      (if (eq (ediff-device-type) 'pm)
-	  (fset 'ediff-valid-color-p 
-		(function (lambda (color) (assoc color pm-color-alist))))
-	(fset 'ediff-valid-color-p (symbol-function 'x-color-defined-p)))
-      (fset 'ediff-get-face (symbol-function 'internal-get-face))))
+	    (symbol-function 'x-display-pixel-height))))
       
 
 (defun ediff-make-current-diff-overlay (type)
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (let ((overlay (intern (format "ediff-current-diff-overlay-%S" type)))
 	    (buffer (ediff-get-buffer type))
 	    (face (face-name
@@ -787,7 +812,7 @@
 
 (defun ediff-set-face (ground face color)
   "Set face foreground/background."
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (if (ediff-valid-color-p color)
 	  (if (eq ground 'foreground)
 	      (set-face-foreground face color)
@@ -815,14 +840,15 @@
 	       (copy-face 'secondary-selection face))))
     ))
 
-(or (boundp 'facemenu-unlisted-faces)
-    (setq facemenu-unlisted-faces nil))
-
-(add-to-list 'facemenu-unlisted-faces 'ediff-current-diff-face-A)
+(defun ediff-hide-face (face)
+  (if (and (ediff-has-face-support-p) ediff-emacs-p)
+      (add-to-list 'facemenu-unlisted-faces face)))
+      
 (defvar ediff-current-diff-face-A
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-current-diff-face-A)
+	(ediff-hide-face 'ediff-current-diff-face-A)
 	(or (face-differs-from-default-p 'ediff-current-diff-face-A)
 	    (cond ((ediff-color-display-p)
 		   (ediff-set-face
@@ -837,11 +863,11 @@
 	'ediff-current-diff-face-A))
   "Face for highlighting the selected difference in buffer A.")
 
-(add-to-list 'facemenu-unlisted-faces 'ediff-current-diff-face-B)
 (defvar ediff-current-diff-face-B
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-current-diff-face-B)
+	(ediff-hide-face 'ediff-current-diff-face-B)
 	(or (face-differs-from-default-p 'ediff-current-diff-face-B)
 	    (cond ((ediff-color-display-p)
 		   (ediff-set-face
@@ -857,11 +883,11 @@
   "Face for highlighting the selected difference in buffer B.")
     
 
-(add-to-list 'facemenu-unlisted-faces 'ediff-current-diff-face-C)
 (defvar ediff-current-diff-face-C
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-current-diff-face-C)
+	(ediff-hide-face 'ediff-current-diff-face-C)
 	(or (face-differs-from-default-p 'ediff-current-diff-face-C)
 	    (cond ((ediff-color-display-p)
 		   (ediff-set-face
@@ -876,21 +902,21 @@
 	'ediff-current-diff-face-C))
   "Face for highlighting the selected difference in buffer C.")
 
-(add-to-list 'facemenu-unlisted-faces 'ediff-current-diff-face-Ancestor)
 (defvar ediff-current-diff-face-Ancestor
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-current-diff-face-Ancestor)
+	(ediff-hide-face 'ediff-current-diff-face-Ancestor)
 	(or (face-differs-from-default-p 'ediff-current-diff-face-Ancestor)
 	    (copy-face 
 	     'ediff-current-diff-face-C 'ediff-current-diff-face-Ancestor))))
   "Face for highlighting the selected difference in the ancestor buffer.")
 
-(add-to-list 'facemenu-unlisted-faces 'ediff-fine-diff-face-A)
 (defvar ediff-fine-diff-face-A
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-fine-diff-face-A)
+	(ediff-hide-face 'ediff-fine-diff-face-A)
 	(or (face-differs-from-default-p 'ediff-fine-diff-face-A)
 	    (cond ((ediff-color-display-p)
 		   (ediff-set-face 'foreground 'ediff-fine-diff-face-A
@@ -901,11 +927,11 @@
 	'ediff-fine-diff-face-A))
   "Face for highlighting the refinement of the selected diff in buffer A.")
 
-(add-to-list 'facemenu-unlisted-faces 'ediff-fine-diff-face-B)
 (defvar ediff-fine-diff-face-B
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-fine-diff-face-B)
+	(ediff-hide-face 'ediff-fine-diff-face-B)
 	(or (face-differs-from-default-p 'ediff-fine-diff-face-B)
 	    (cond ((ediff-color-display-p)
 		   (ediff-set-face 'foreground 'ediff-fine-diff-face-B "Black")
@@ -914,11 +940,11 @@
 	'ediff-fine-diff-face-B))
   "Face for highlighting the refinement of the selected diff in buffer B.")
     
-(add-to-list 'facemenu-unlisted-faces 'ediff-fine-diff-face-C)
 (defvar ediff-fine-diff-face-C
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-fine-diff-face-C)
+	(ediff-hide-face 'ediff-fine-diff-face-C)
 	(or (face-differs-from-default-p 'ediff-fine-diff-face-C)
 	    (cond ((ediff-color-display-p)
 		   (ediff-set-face 'foreground 'ediff-fine-diff-face-C "black")
@@ -928,11 +954,11 @@
 	'ediff-fine-diff-face-C))
   "Face for highlighting the refinement of the selected diff in buffer C.")
 
-(add-to-list 'facemenu-unlisted-faces 'ediff-fine-diff-face-Ancestor)
 (defvar ediff-fine-diff-face-Ancestor
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-fine-diff-face-Ancestor)
+	(ediff-hide-face 'ediff-fine-diff-face-Ancestor)
 	(or (face-differs-from-default-p 'ediff-fine-diff-face-Ancestor)
 	    (copy-face
 	     'ediff-fine-diff-face-C 'ediff-fine-diff-face-Ancestor))))
@@ -940,11 +966,11 @@
 Presently, this is not used, as difference regions are not refined in the
 ancestor buffer.")
     
-(add-to-list 'facemenu-unlisted-faces 'ediff-even-diff-face-A)
 (defvar ediff-even-diff-face-A
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-even-diff-face-A)
+	(ediff-hide-face 'ediff-even-diff-face-A)
 	(or (face-differs-from-default-p 'ediff-even-diff-face-A)
 	    (cond ((ediff-color-display-p)
 		   (ediff-set-face
@@ -956,11 +982,11 @@
 	'ediff-even-diff-face-A))
   "Face used to highlight even-numbered differences in buffer A.")
       
-(add-to-list 'facemenu-unlisted-faces 'ediff-even-diff-face-B)
 (defvar ediff-even-diff-face-B
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-even-diff-face-B)
+	(ediff-hide-face 'ediff-even-diff-face-B)
 	(or (face-differs-from-default-p 'ediff-even-diff-face-B)
 	    (cond ((ediff-color-display-p)
 		   (ediff-set-face
@@ -972,31 +998,31 @@
 	'ediff-even-diff-face-B))
   "Face used to highlight even-numbered differences in buffer B.")
     
-(add-to-list 'facemenu-unlisted-faces 'ediff-even-diff-face-C)
 (defvar ediff-even-diff-face-C
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-even-diff-face-C)
+	(ediff-hide-face 'ediff-even-diff-face-C)
 	(or (face-differs-from-default-p 'ediff-even-diff-face-C)
 	    (copy-face 'ediff-even-diff-face-A 'ediff-even-diff-face-C))
 	'ediff-even-diff-face-C))
   "Face used to highlight even-numbered differences in buffer C.")
 
-(add-to-list 'facemenu-unlisted-faces 'ediff-even-diff-face-Ancestor)
 (defvar ediff-even-diff-face-Ancestor
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-even-diff-face-Ancestor)
+	(ediff-hide-face 'ediff-even-diff-face-Ancestor)
 	(or (face-differs-from-default-p 'ediff-even-diff-face-Ancestor)
 	    (copy-face 'ediff-even-diff-face-C 'ediff-even-diff-face-Ancestor))
 	'ediff-even-diff-face-Ancestor))
   "Face highlighting even-numbered differences in the ancestor buffer.")
   
-(add-to-list 'facemenu-unlisted-faces 'ediff-odd-diff-face-A)
 (defvar ediff-odd-diff-face-A
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-odd-diff-face-A)
+	(ediff-hide-face 'ediff-odd-diff-face-A)
 	(or (face-differs-from-default-p 'ediff-odd-diff-face-A)
 	    (cond ((ediff-color-display-p)
 		   (ediff-set-face
@@ -1008,11 +1034,11 @@
 	'ediff-odd-diff-face-A))
   "Face used to highlight odd-numbered differences in buffer A.")
       
-(add-to-list 'facemenu-unlisted-faces 'ediff-odd-diff-face-B)
 (defvar ediff-odd-diff-face-B
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-odd-diff-face-B)
+	(ediff-hide-face 'ediff-odd-diff-face-B)
 	(or (face-differs-from-default-p 'ediff-odd-diff-face-B)
 	    (cond ((ediff-color-display-p)
 		   (ediff-set-face
@@ -1024,21 +1050,21 @@
 	'ediff-odd-diff-face-B))
   "Face used to highlight odd-numbered differences in buffer B.")
     
-(add-to-list 'facemenu-unlisted-faces 'ediff-odd-diff-face-C)
 (defvar ediff-odd-diff-face-C
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-odd-diff-face-C)
+	(ediff-hide-face 'ediff-odd-diff-face-C)
 	(or (face-differs-from-default-p 'ediff-odd-diff-face-C)
 	    (copy-face 'ediff-odd-diff-face-A 'ediff-odd-diff-face-C))
 	'ediff-odd-diff-face-C))
   "Face used to highlight odd-numbered differences in buffer C.")
 
-(add-to-list 'facemenu-unlisted-faces 'ediff-odd-diff-face-Ancestor )
 (defvar ediff-odd-diff-face-Ancestor 
-  (if (ediff-window-display-p)
+  (if (ediff-has-face-support-p)
       (progn
 	(make-face 'ediff-odd-diff-face-Ancestor)
+	(ediff-hide-face 'ediff-odd-diff-face-Ancestor)
 	(or (face-differs-from-default-p 'ediff-odd-diff-face-Ancestor)
 	    (copy-face 'ediff-odd-diff-face-C 'ediff-odd-diff-face-Ancestor))
 	'ediff-odd-diff-face-Ancestor))
@@ -1110,9 +1136,9 @@
 	d)
     (setq d (if (and env (> (length env) 0))
 		env
-	      (if (memq system-type '(vax-vms axp-vms))
-		  "SYS$SCRATCH:"
-		"/tmp")))
+	      (cond ((memq system-type '(vax-vms axp-vms)) "SYS$SCRATCH:")
+ 		    ((eq system-type 'ms-dos) "c:/")
+ 		    (t "/tmp"))))
     ;; The following is to make sure we get something to which we can
     ;; add directory levels on VMS.
     (setq d (file-name-as-directory (directory-file-name d)))
@@ -1129,6 +1155,9 @@
   "Characters that must be quoted with \\ when used in a shell command line.
 More precisely, a regexp to match any one such character.")
 
+;; needed to simulate frame-char-width in XEmacs.
+(defvar ediff-H-glyph (if ediff-xemacs-p (make-glyph "H")))
+
   
 (ediff-defvar-local ediff-temp-file-A nil
   "Temporary file used for refining difference regions in buffer A.")
@@ -1143,14 +1172,6 @@
   (if (fboundp ediff-ange-ftp-ftp-name)
       (funcall ediff-ange-ftp-ftp-name file-name)))
 
-;;(defun ediff-frame-has-menubar ()
-;;  (and (ediff-window-display-p)
-;;       (if ediff-xemacs-p
-;;	   current-menubar
-;;	 (let ((lines (cdr (assq 'menu-bar-lines
-;;				 (frame-parameters (selected-frame))))))
-;;	   (or (eq lines t) (and (numberp lines) (< 0 lines))))
-;;	 )))
     
 (defsubst ediff-frame-unsplittable-p (frame)
   (cdr (assq 'unsplittable (frame-parameters frame))))
@@ -1246,7 +1267,7 @@
 	   (posn-point (event-start event))))
 	((ediff-key-press-event-p event)
 	 (point))
-	(t (error ""))))
+	(t (error))))
 
 (defun ediff-event-buffer (event)
   (cond ((ediff-mouse-event-p event)
@@ -1255,7 +1276,7 @@
 	   (window-buffer (posn-window (event-start event)))))
 	((ediff-key-press-event-p event)
 	 (current-buffer))
-	(t (error ""))))
+	(t (error))))
    
     
 (defsubst ediff-frame-iconified-p (frame)
@@ -1299,10 +1320,9 @@
 (defsubst ediff-spy-after-mouse ()
   (setq ediff-mouse-pixel-position (mouse-pixel-position)))
 
-;; This is actually not easy to find out since emacs and xemacs behave
-;; differently when mouse is not in any frame. Also, this is sensitive to
-;; when the user grabbed mouse.
-;; Not used for now.
+;; It is not easy to find out when the user grabs the mouse, since emacs and
+;; xemacs behave differently when mouse is not in any frame. Also, this is
+;; sensitive to when the user grabbed mouse.  Not used for now.
 (defun ediff-user-grabbed-mouse ()
   (if ediff-mouse-pixel-position
       (cond ((not (eq (car ediff-mouse-pixel-position)
@@ -1321,12 +1341,26 @@
     
 (defsubst ediff-frame-char-height (frame)
   (if ediff-xemacs-p
-      (/ (frame-pixel-height frame) (frame-height frame))
+      (glyph-height ediff-H-glyph (selected-window frame))
     (frame-char-height frame)))
     
 
 (defsubst ediff-empty-overlay-p (overl)
   (= (ediff-overlay-start overl) (ediff-overlay-end overl)))
+
+;; like overlay-buffer in Emacs. In XEmacs, returns nil if the extent is
+;; dead. Otherwise, works like extent-buffer
+(defun ediff-overlay-buffer (overl)
+  (if ediff-emacs-p
+      (overlay-buffer overl)
+    (and (extent-live-p overl) (extent-buffer overl))))
+
+;; like overlay-get in Emacs. In XEmacs, returns nil if the extent is
+;; dead. Otherwise, like extent-property
+(defun ediff-overlay-get (overl property)
+  (if ediff-emacs-p
+      (overlay-get overl property)
+    (and (extent-live-p overl) (extent-property overl property))))
   
 ;; t if diff region is empty.
 ;; In case of buffer C, t also if it is not a 3way
@@ -1354,7 +1388,7 @@
 	    
 ;; temporarily uses DIR to abbreviate file name
 ;; if DIR is nil, use default-directory
-(defsubst ediff-abbreviate-file-name (file &optional dir)
+(defun ediff-abbreviate-file-name (file &optional dir)
   (cond ((stringp dir)
 	 (let ((directory-abbrev-alist (list (cons dir ""))))
 	   (abbreviate-file-name file)))
@@ -1447,6 +1481,7 @@
 (defsubst ediff-message-if-verbose (string &rest args)
   (if ediff-verbose-p
       (apply 'message string args)))
+
      
 (provide 'ediff-init)
 
--- a/lisp/ediff-merg.el	Fri Feb 16 05:25:08 1996 +0000
+++ b/lisp/ediff-merg.el	Fri Feb 16 06:36:35 1996 +0000
@@ -25,12 +25,12 @@
 
 (require 'ediff-init)
 
-(defvar ediff-default-variant 'default-A
+(defvar ediff-default-variant 'combined
   "*The variant to be used as a default for buffer C in merging.
 Valid values are the symbols `default-A', `default-B', and `combined'.")
 
 (defvar ediff-combination-pattern 
-  '("#ifdef NEW /* variant A */" "#else /* variant B */" "#endif /* NEW */")
+  '("<<<<<<<<<<<<<< variant A" ">>>>>>>>>>>>>> variant B" "======= end of combination")
   "*Pattern to be used for combining difference regions in buffers A and B.
 The value is (STRING1 STRING2 STRING3). The combined text will look like this:
 
@@ -213,9 +213,11 @@
 ;; N here is the user's region number. It is 1+ what Ediff uses internally.
 (defun ediff-combine-diffs (n &optional batch-invocation)
   "Combine Nth diff regions of buffers A and B and place the combination in C.
-Combining is done using the list in variable `ediff-combination-pattern'."
+N is a prefix argument. If nil, combine the current difference regions.
+Combining is done according to the specifications in variable
+`ediff-combination-pattern'."
   (interactive "P")
-  (setq n (if n (1- n) ediff-current-difference))
+  (setq n (if (numberp n) (1- n) ediff-current-difference))
   
   (let (regA regB reg-combined)
     (setq regA (ediff-get-region-contents n 'A ediff-control-buffer)
@@ -224,7 +226,7 @@
     (setq reg-combined (ediff-make-combined-diff regA regB))
     
     (ediff-copy-diff n nil 'C batch-invocation reg-combined))
-    (or batch-invocation (ediff-recenter)))
+    (or batch-invocation (ediff-jump-to-difference (1+ n))))
     
 
 ;; Checks if the region in buff C looks like a combination of the regions
--- a/lisp/ediff-mult.el	Fri Feb 16 05:25:08 1996 +0000
+++ b/lisp/ediff-mult.el	Fri Feb 16 06:36:35 1996 +0000
@@ -23,7 +23,7 @@
 
 ;;; Commentary:
 
-;; Users are strongly encourage to add functionality to this file.
+;; Users are strongly encouraged to add functionality to this file.
 ;; In particular, epatch needs to be enhanced to work with multi-file
 ;; patches. The present file contains all the infrastructure needed for that.
 ;;
@@ -300,9 +300,9 @@
 ;;	((dir1 dir2 dir3) (file . num) (file . num)...)
 ;; where num encodes the set of dirs where the file is found:
 ;; 2 - only dir1; 3 - only dir2; 5 - only dir3; 6 - dir1&2; 10 - dir1&3; etc.
-(defun ediff-intersect-directories (jobname diff-var regexp dir1 dir2
-					    &optional dir3 comparison-func)
-  (require 'cl)
+(defun ediff-intersect-directories (jobname
+				    diff-var regexp dir1 dir2
+				    &optional dir3 comparison-func)
   (setq comparison-func (or comparison-func 'string=))
   (let (lis1 lis2 lis3 common auxdir1 auxdir2 auxdir3 difflist)
 
@@ -318,7 +318,7 @@
     (setq lis1 (delete "."  lis1)
 	  lis1 (delete ".." lis1))
 
-    (setq common (intersection lis1 lis2 ':test comparison-func))
+    (setq common (ediff-intersection lis1 lis2 comparison-func))
     ;; get rid of files that are directories in dir1 but not dir2
     (mapcar (function (lambda (elt)
 			(if (Xor (file-directory-p (concat auxdir1 elt))
@@ -326,7 +326,7 @@
 			    (setq common (delq elt common)))))
 	    common)
     ;; intersect with the third dir
-    (if lis3 (setq common (intersection common lis3 ':test comparison-func)))
+    (if lis3 (setq common (ediff-intersection common lis3 comparison-func)))
     (if (ediff-comparison-metajob3 jobname)
 	(mapcar (function (lambda (elt)
 			    (if (Xor (file-directory-p (concat auxdir1 elt))
@@ -334,19 +334,20 @@
 				(setq common (delq elt common)))))
 		common))
 
-    ;; trying to avoid side effects of sorting
-    (setq common (sort (copy-list common) 'string-lessp))
+    ;; copying is needed because sort sorts via side effects
+    (setq common (sort (ediff-copy-list common) 'string-lessp))
 
     ;; compute difference list
-    (setq difflist (set-difference
-		    (union (union lis1 lis2 ':test comparison-func)
-			   lis3
-			   ':test comparison-func)
+    (setq difflist (ediff-set-difference
+		    (ediff-union (ediff-union lis1 lis2 comparison-func)
+				 lis3
+				 comparison-func)
 		    common
-		    ':test comparison-func)
+		    comparison-func)
 	  difflist (delete "."  difflist)
-	  ;; copy-list needed because sort sorts it by side effects
-	  difflist (sort (copy-list (delete ".." difflist)) 'string-lessp))
+	  ;; copying is needed because sort sorts via side effects
+	  difflist (sort (ediff-copy-list (delete ".." difflist))
+			 'string-lessp))
 
     (setq difflist (mapcar (function (lambda (elt) (cons elt 1))) difflist))
 
@@ -377,7 +378,6 @@
 ;; find directory files that are under revision.
 ;; display subdirectories, too, since we may visit them recursively.
 (defun ediff-get-directory-files-under-revision (jobname regexp dir1)
-  (require 'cl)
   (let (lis1 elt common auxdir1)
     (setq auxdir1 (file-name-as-directory dir1)
 	  lis1	  (directory-files auxdir1 nil regexp))
@@ -389,14 +389,17 @@
       (cond ((file-directory-p (concat auxdir1 elt))
 	     (setq common (cons elt common)))
 	    ((file-exists-p (concat auxdir1 elt ",v"))
-	     (setq common (cons elt common))))
+	     (setq common (cons elt common)))
+	    ((file-exists-p (concat auxdir1 "RCS/" elt ",v"))
+	     (setq common (cons elt common)))
+	    ) ; cond
       ) ; while
 
     (setq common (delete "."  common)
 	  common (delete ".." common))
 
-    ;; trying to avoid side effects of sorting
-    (setq common (sort (copy-list common) 'string-lessp))
+    ;; copying is needed because sort sorts via side effects
+    (setq common (sort (ediff-copy-list common) 'string-lessp))
 
     ;; return result
     (cons (list regexp auxdir1 nil nil)
@@ -942,7 +945,9 @@
     (if (ediff-buffer-live-p session-buf)
 	(ediff-eval-in-buffer session-buf
 	  (if (eq ediff-control-buffer session-buf) ; individual session
-	      (setq custom-diff-buf ediff-custom-diff-buffer))))
+	      (progn
+		(ediff-compute-custom-diffs-maybe)
+		(setq custom-diff-buf ediff-custom-diff-buffer)))))
 
     (or (ediff-buffer-live-p meta-diff-buff)
 	(error "Ediff: something wrong--no multiple diffs buffer"))
@@ -953,7 +958,9 @@
 	     (goto-char (point-max))
 	     (insert-buffer custom-diff-buf)
 	     (insert "\n")))
-	  ((eq metajob 'ediff-directories)
+	  ((memq metajob '(ediff-directories 
+			   ediff-merge-directories
+			   ediff-merge-directories-with-ancestor))
 	   ;; get diffs by calling shell command on ediff-custom-diff-program
 	   (save-excursion
 	     (set-buffer (setq tmp-buf (get-buffer-create ediff-tmp-buffer)))
@@ -970,10 +977,8 @@
 	     (insert-buffer tmp-buf)
 	     (insert "\n")))
 	  (t
-	   (error
-	    "Session %d is marked but inactive--can't make its diff"
-	    sessionNum)))
-	  ))
+	   (error "Can't make context diff for Session %d" sessionNum )))
+    ))
 
 (defun ediff-collect-custom-diffs ()
   "Collect custom diffs of marked sessions in buffer `*Ediff Multifile Diffs*'.
@@ -1185,10 +1190,11 @@
 	      (t (ediff-skip-unsuitable-frames 'ok-unsplittable)
 		 (set-window-buffer (selected-window) meta-buf)))
 	))
-    (if (ediff-window-display-p)
+    (if (and (ediff-window-display-p)
+	     (window-live-p 
+	      (setq wind (ediff-get-visible-buffer-window meta-buf))))
 	(progn
-	  (setq frame
-		(window-frame (ediff-get-visible-buffer-window meta-buf)))
+	  (setq frame (window-frame wind))
 	  (raise-frame frame)
 	  (ediff-reset-mouse frame)))
     (run-hooks 'ediff-show-session-group-hook)
@@ -1213,7 +1219,7 @@
       (error "No active Ediff sessions or corrupted session registry"))
   (let (wind frame)
     ;; for some reason, point moves in ediff-registry-buffer, so we preserve it
-    ;; explictly
+    ;; explicitly
     (ediff-eval-in-buffer ediff-registry-buffer
       (save-excursion
 	(cond  ((setq wind
@@ -1322,7 +1328,7 @@
 	     (bury-buffer)
 	     (beep)
 	     (message
-	      "Group has active sessions, panel not deleted")))
+	      "Session group suspended, not deleted (has active sessions)")))
       (ediff-cleanup-meta-buffer parent-buf)
       (ediff-kill-buffer-carefully dir-diffs-buffer)
       (ediff-kill-buffer-carefully meta-diff-buffer)
@@ -1342,7 +1348,7 @@
   (kill-buffer buf))
     
 
-;; obtain information on a meta record where the user clicked or typed
+;; Obtain information on a meta record where the user clicked or typed
 ;; BUF is the buffer where this happened and POINT is the position
 ;; If optional NOERROR arg is given, don't report error and return nil if no
 ;; meta info is found on line.
--- a/lisp/ediff-util.el	Fri Feb 16 05:25:08 1996 +0000
+++ b/lisp/ediff-util.el	Fri Feb 16 06:36:35 1996 +0000
@@ -138,43 +138,28 @@
 	 ;; Will barf if no ancestor
 	 (define-key ediff-mode-map "/" 'ediff-show-ancestor)
 	 ;; In merging, we allow only A->C and B->C copying.
-	 (define-key ediff-mode-map "a" (function
-					 (lambda (arg)
-					   (interactive "P")
-					   (ediff-diff-to-diff arg "ac"))))
-	 (define-key ediff-mode-map "b" (function
-					 (lambda (arg)
-					   (interactive "P")
-					   (ediff-diff-to-diff arg "bc"))))
-	 (define-key ediff-mode-map "r" (function
-					 (lambda (arg)
-					   (interactive "P")
-					   (ediff-restore-diff arg ?c))))
+	 (define-key ediff-mode-map "a" 'ediff-copy-A-to-C)
+	 (define-key ediff-mode-map "b" 'ediff-copy-B-to-C)
+	 (define-key ediff-mode-map "r" 'ediff-restore-diff-in-merge-buffer)
 	 (define-key ediff-mode-map "s" 'ediff-shrink-window-C)
 	 (define-key ediff-mode-map "+" 'ediff-combine-diffs)
 	 (define-key ediff-mode-map "$" 'ediff-toggle-show-clashes-only)
 	 (define-key ediff-mode-map "&" 'ediff-re-merge))
 	(ediff-3way-comparison-job
-	 (define-key ediff-mode-map "ab" 'ediff-diff-to-diff)
-	 (define-key ediff-mode-map "ba" 'ediff-diff-to-diff)
-	 (define-key ediff-mode-map "ac" 'ediff-diff-to-diff)
-	 (define-key ediff-mode-map "bc" 'ediff-diff-to-diff)
+	 (define-key ediff-mode-map "ab" 'ediff-copy-A-to-B)
+	 (define-key ediff-mode-map "ba" 'ediff-copy-B-to-A)
+	 (define-key ediff-mode-map "ac" 'ediff-copy-A-to-C)
+	 (define-key ediff-mode-map "bc" 'ediff-copy-B-to-C)
 	 (define-key ediff-mode-map "c" nil)
-	 (define-key ediff-mode-map "ca" 'ediff-diff-to-diff)
-	 (define-key ediff-mode-map "cb" 'ediff-diff-to-diff)
+	 (define-key ediff-mode-map "ca" 'ediff-copy-C-to-A)
+	 (define-key ediff-mode-map "cb" 'ediff-copy-C-to-B)
 	 (define-key ediff-mode-map "ra" 'ediff-restore-diff)
 	 (define-key ediff-mode-map "rb" 'ediff-restore-diff)
 	 (define-key ediff-mode-map "rc" 'ediff-restore-diff)
 	 (define-key ediff-mode-map "C"  'ediff-toggle-read-only))
 	(t ; 2-way comparison
-	 (define-key ediff-mode-map "a" (function
-					 (lambda (arg)
-					   (interactive "P")
-					   (ediff-diff-to-diff arg "ab"))))
-	 (define-key ediff-mode-map "b" (function
-					 (lambda (arg)
-					   (interactive "P")
-					   (ediff-diff-to-diff arg "ba"))))
+	 (define-key ediff-mode-map "a"  'ediff-copy-A-to-B)
+	 (define-key ediff-mode-map "b"  'ediff-copy-B-to-A)
 	 (define-key ediff-mode-map "ra" 'ediff-restore-diff)
 	 (define-key ediff-mode-map "rb" 'ediff-restore-diff))
 	) ; cond
@@ -208,8 +193,9 @@
 
 (require 'ediff-wind)
 
-(or (boundp 'synchronize-minibuffers)
-    (defvar synchronize-minibuffers nil))
+;; No longer needed: XEmacs has surrogate minibuffers now.
+;;(or (boundp 'synchronize-minibuffers)
+;;    (defvar synchronize-minibuffers nil))
 
 ;; Common startup entry for all Ediff functions
 ;; It now returns control buffer so other functions can do post-processing
@@ -241,7 +227,7 @@
 	    ediff-windows-job (ediff-windows-job)
 	    ediff-word-mode-job (ediff-word-mode-job))
 	
-      (make-local-variable 'ediff-prefer-long-help-message)
+      (make-local-variable 'ediff-use-long-help-message)
       (make-local-variable 'ediff-prefer-iconified-control-frame)
       (make-local-variable 'ediff-split-window-function)
       (make-local-variable 'ediff-default-variant)
@@ -254,13 +240,9 @@
       (if (string-match "buffer" (symbol-name ediff-job-name))
 	  (setq ediff-keep-variants t))
 
-      ;; XEmacs has local-pre-command-hook
-      (if ediff-emacs-p
-	  (make-local-variable 'pre-command-hook))
-
-      (if ediff-emacs-p
-	  (add-hook 'pre-command-hook 'ediff-spy-after-mouse)
-	(add-hook 'local-pre-command-hook 'ediff-spy-after-mouse))
+      (make-local-hook 'pre-command-hook)
+      (if (ediff-window-display-p)
+	  (add-hook 'pre-command-hook 'ediff-spy-after-mouse))
       (setq ediff-mouse-pixel-position (mouse-pixel-position))
       
       ;; adjust for merge jobs
@@ -490,7 +472,7 @@
 (defun ediff-help-message-line-length ()
   (save-excursion
     (goto-char (point-min))
-    (if ediff-prefer-long-help-message
+    (if ediff-use-long-help-message
 	(next-line 1))
     (end-of-line)
     (current-column)))
@@ -546,7 +528,7 @@
 	      (t ; long brief msg, not multiframe --- put in the middle
 	       ediff-brief-message-string)
 	      ))
-  (setq ediff-help-message (if ediff-prefer-long-help-message
+  (setq ediff-help-message (if ediff-use-long-help-message
 			       ediff-long-help-message
 			     ediff-brief-help-message))
   (run-hooks 'ediff-display-help-hook))
@@ -703,11 +685,9 @@
   (interactive)
   (ediff-barf-if-not-control-buffer)
   
-  ;; force all minibuffer to display ediff's messages.
-  ;; when xemacs implements minibufferless frames, this won't be necessary
-  (if ediff-xemacs-p (setq synchronize-minibuffers t))
+;;  ;; No longer needed: XEmacs has surrogate minibuffers now.
+;;  (if ediff-xemacs-p (setq synchronize-minibuffers t))
   
-  (setq ediff-disturbed-overlays nil) ; clear after use
   (let (buffer-read-only)
     (if (and (ediff-buffer-live-p ediff-buffer-A)
 	     (ediff-buffer-live-p ediff-buffer-B)
@@ -716,9 +696,8 @@
 	(ediff-setup-windows
 	 ediff-buffer-A ediff-buffer-B ediff-buffer-C ediff-control-buffer)
       (or (eq this-command 'ediff-quit)
-	  (message
-	   "You've killed an essential Ediff buffer---Please quit Ediff"
-	   (beep 1)))
+	  (message ediff-KILLED-VITAL-BUFFER
+		   (beep 1)))
       ))
   
   ;; set visibility range appropriate to this invocation of Ediff.
@@ -751,7 +730,7 @@
 	    (raise-frame (window-frame ediff-window-C)))))
   (if (and (ediff-window-display-p)
 	   (frame-live-p ediff-control-frame)
-	   (not ediff-prefer-long-help-message)
+	   (not ediff-use-long-help-message)
 	   (not (ediff-frame-iconified-p ediff-control-frame)))
       (raise-frame ediff-control-frame))
   
@@ -773,10 +752,10 @@
 	      (ediff-recenter-one-window 'C))
 	  
 	  (ediff-eval-in-buffer control-buf
-	    (ediff-recenter-ancestor) ; it checks if ancestor is alive
+	    (ediff-recenter-ancestor) ; check if ancestor is alive
 	    
 	    (if (and (ediff-multiframe-setup-p)
-		     (not ediff-prefer-long-help-message)
+		     (not ediff-use-long-help-message)
 		     (not (ediff-frame-iconified-p ediff-control-frame)))
 		;; never grab mouse on quit in this place
 		(ediff-reset-mouse
@@ -870,7 +849,7 @@
 On a dumb terminal, switches between ASCII highlighting and no highlighting." 
   (interactive)
   (ediff-barf-if-not-control-buffer)
-  (if (not (ediff-window-display-p))
+  (if (not (ediff-has-face-support-p))
       (if (eq ediff-highlighting-style 'ascii)
 	  (progn
 	    (message "ASCII highlighting flags removed")
@@ -951,11 +930,11 @@
   (ediff-barf-if-not-control-buffer)
   (let (buffer-read-only)
     (erase-buffer)
-    (setq ediff-prefer-long-help-message (not ediff-prefer-long-help-message))
+    (setq ediff-use-long-help-message (not ediff-use-long-help-message))
     (ediff-set-help-message))
   ;; remember the icon status of the control frame when the user requested
   ;; full control message
-  (if (and ediff-prefer-long-help-message (ediff-multiframe-setup-p))
+  (if (and ediff-use-long-help-message (ediff-multiframe-setup-p))
       (setq ediff-prefer-iconified-control-frame
 	    (ediff-frame-iconified-p ediff-control-frame)))
 	    
@@ -971,11 +950,11 @@
 of the current buffer."
   (interactive)
   (ediff-barf-if-not-control-buffer)
-  (let ((ctl-buf (if (null buf) (current-buffer))))
+  (let ((ctl-buf (if (null buf) (current-buffer)))
+	(buf-type (ediff-char-to-buftype last-command-char)))
     (or buf (ediff-recenter))
     (or buf
-	(setq buf
-	      (ediff-get-buffer (ediff-char-to-buftype last-command-char))))
+	(setq buf (ediff-get-buffer buf-type)))
 	      
     (ediff-eval-in-buffer buf     ; eval in buf A/B/C
       (let* ((file (buffer-file-name buf))
@@ -1009,8 +988,7 @@
 		   ;; is checked in.
 		   (ediff-eval-in-buffer ctl-buf
 		     (ediff-change-saved-variable
-		      'buffer-read-only nil
-		      (ediff-char-to-buftype last-command-char))))
+		      'buffer-read-only nil buf-type)))
 		  (t
 		   (setq toggle-ro-cmd 'toggle-read-only)
 		   (beep 1) (beep 1)
@@ -1041,16 +1019,22 @@
 ;; in and not checked out for the purpose of patching (since patch won't be
 ;; able to read such a file anyway).
 ;; FILE is a string representing file name
-(defsubst ediff-file-checked-out-p (file)
+(defun ediff-file-checked-out-p (file)
   (and (stringp file)
        (file-exists-p file)
        (file-writable-p file)
-       (file-exists-p (concat file ",v"))))
-(defsubst ediff-file-checked-in-p (file)
+       (or
+	(file-exists-p (concat file ",v"))
+	(file-exists-p (concat "RCS/" file ",v")))
+       ))
+(defun ediff-file-checked-in-p (file)
   (and (stringp file)
        (file-exists-p file)
        (not (file-writable-p file))
-       (file-exists-p (concat file ",v"))))
+       (or
+	(file-exists-p (concat file ",v"))
+	(file-exists-p (concat "RCS/" file ",v")))
+       ))
       
 (defun ediff-swap-buffers ()
   "Rotate the display of buffers A, B, and C."
@@ -1063,7 +1047,7 @@
 	    (hide-regexp ediff-regexp-hide-A)
 	    (focus-regexp ediff-regexp-focus-A)
 	    (wide-visibility-p (eq ediff-visible-bounds ediff-wide-bounds))
-	    (overlay (if (ediff-window-display-p)
+	    (overlay (if (ediff-has-face-support-p)
 			 ediff-current-diff-overlay-A)))
 	(if ediff-3way-comparison-job
 	    (progn
@@ -1112,7 +1096,7 @@
 	
 	;; The following is needed for XEmacs, since there one can't move
 	;; overlay to another buffer. In Emacs, this swap is redundant.
-	(if (ediff-window-display-p)
+	(if (ediff-has-face-support-p)
 	    (if ediff-3way-comparison-job
 		(setq ediff-current-diff-overlay-A ediff-current-diff-overlay-C
 		      ediff-current-diff-overlay-C ediff-current-diff-overlay-B
@@ -1219,8 +1203,7 @@
 Used in ediff-windows/regions only."
   (interactive)
   (if (eq ediff-buffer-A ediff-buffer-B)
-      (error
-       "Buffers A and B are the same. Can't narrow to two different regions"))
+      (error ediff-NO-DIFFERENCES))
   (if (eq ediff-visible-bounds ediff-wide-bounds)
       (setq ediff-visible-bounds ediff-narrow-bounds)
     (setq ediff-visible-bounds ediff-wide-bounds))
@@ -1255,7 +1238,7 @@
 	(narrow-to-region
 	 (ediff-overlay-start overl-B) (ediff-overlay-end overl-B)))
       
-      (if ediff-3way-job
+      (if ediff-3way-comparison-job
 	  (ediff-eval-in-buffer ediff-buffer-C
 	    (narrow-to-region
 	     (ediff-overlay-start overl-C) (ediff-overlay-end overl-C))))
@@ -1277,7 +1260,7 @@
 		(ediff-buffer-live-p ediff-buffer-B)
 		(or (not ediff-3way-job) ediff-buffer-C)
 		))
-      (error "You've killed an essential Ediff buffer---Please quit Ediff"))
+      (error ediff-KILLED-VITAL-BUFFER))
 	
   (let* ((wind (selected-window))
 	 (wind-A ediff-window-A)
@@ -1308,7 +1291,7 @@
 (defun ediff-scroll-vertically (&optional arg)
   "Vertically scroll buffers A, B \(and C if appropriate\).
 With optional argument ARG, scroll ARG lines; otherwise scroll by nearly
-the height of window-A."
+the one half of the height of window-A."
   (interactive "P")
   (ediff-barf-if-not-control-buffer)
   
@@ -1320,7 +1303,7 @@
 		(or (not ediff-3way-job)
 		    (ediff-buffer-live-p ediff-buffer-C))
 		))
-      (error "You've killed an essential Ediff buffer---Please quit Ediff"))
+      (error ediff-KILLED-VITAL-BUFFER))
       
   (ediff-operate-on-windows
    (if (memq last-command-char '(?v ?\C-v))
@@ -1364,7 +1347,7 @@
 		(or (not ediff-3way-job)
 		    (ediff-buffer-live-p ediff-buffer-C))
 		))
-      (error "You've killed an essential Ediff buffer---Please quit Ediff"))
+      (error ediff-KILLED-VITAL-BUFFER))
     
   (ediff-operate-on-windows
    (if (= last-command-char ?<)
@@ -1566,7 +1549,8 @@
   (if (and (>= difference-number -1)
 	   (< difference-number (1+ ediff-number-of-differences)))
       (ediff-unselect-and-select-difference difference-number)
-    (error "Bad difference number, %d" difference-number)))
+    (error "Bad difference number, %d. Valid numbers are 1 to %d"
+	   (1+ difference-number) ediff-number-of-differences)))
       
 (defun ediff-jump-to-difference-at-point ()
   "Go to difference closest to the point in buffer A, B, or C.
@@ -1610,8 +1594,8 @@
 ;;; Copying diffs.
 
 (defun ediff-diff-to-diff (arg &optional keys)
-  "Copy buffer-X'th diff to buffer Y \(X,Y are A, B, or C\).
-If numerical prefix argument, copy this diff specified in the arg.
+  "Copy buffer-X'th difference region to buffer Y \(X,Y are A, B, or C\).
+If numerical prefix argument, copy the difference specified in the arg.
 Otherwise, copy the difference given by `ediff-current-difference'.
 This command assumes it is bound to a 2-character key sequence, `ab', `ba',
 `ac', etc., which is used to determine the types of buffers to be used for
@@ -1623,7 +1607,7 @@
   (interactive "P")
   (ediff-barf-if-not-control-buffer)
   (or keys (setq keys (this-command-keys)))
-  (if arg
+  (if (numberp arg)
       (ediff-jump-to-difference arg))
   (let* ((key1 (aref keys 0))
 	 (key2 (aref keys 1))
@@ -1636,6 +1620,43 @@
     ;; recenter with rehighlighting, but no messages
     (ediff-recenter)))
 
+(defun ediff-copy-A-to-B (arg)
+  "Copy ARGth difference region from buffer A to B.
+ARG is a prefix argument. If nil, copy the current difference region."
+  (interactive "P")
+  (ediff-diff-to-diff arg "ab"))
+
+(defun ediff-copy-B-to-A (arg)
+  "Copy ARGth difference region from buffer B to A.
+ARG is a prefix argument. If nil, copy the current difference region."
+  (interactive "P")
+  (ediff-diff-to-diff arg "ba"))
+
+(defun ediff-copy-A-to-C (arg)
+  "Copy ARGth difference region from buffer A to buffer C.
+ARG is a prefix argument. If nil, copy the current difference region."
+  (interactive "P")
+  (ediff-diff-to-diff arg "ac"))
+
+(defun ediff-copy-B-to-C (arg)
+  "Copy ARGth difference region from buffer B to buffer C.
+ARG is a prefix argument. If nil, copy the current difference region."
+  (interactive "P")
+  (ediff-diff-to-diff arg "bc"))
+
+(defun ediff-copy-C-to-B (arg)
+  "Copy ARGth difference region from buffer C to B.
+ARG is a prefix argument. If nil, copy the current difference region."
+  (interactive "P")
+  (ediff-diff-to-diff arg "cb"))
+
+(defun ediff-copy-C-to-A (arg)
+  "Copy ARGth difference region from buffer C to A.
+ARG is a prefix argument. If nil, copy the current difference region."
+  (interactive "P")
+  (ediff-diff-to-diff arg "ca"))
+
+
 
 ;; Copy diff N from FROM-BUF-TYPE \(given as A, B or C\) to TO-BUF-TYPE.
 ;; If optional DO-NOT-SAVE is non-nil, do not save the old value of the
@@ -1665,10 +1686,8 @@
 			 n to-buf-type ctrl-buf
 			 reg-to-delete-beg reg-to-delete-end))
     
-    (setq ediff-disturbed-overlays nil) ; clear before use
-    
     (if (string= reg-to-delete reg-to-copy)
-	(setq saved-p nil)     ; refuse to copy identical buffers
+	(setq saved-p nil) ; don't copy identical buffers
       ;; seems ok to copy
       (if (or batch-invocation (ediff-test-save-region n to-buf-type))
 	  (condition-case conds
@@ -1676,30 +1695,12 @@
 		(ediff-eval-in-buffer to-buf
 		  ;; to prevent flags from interfering if buffer is writable
 		  (let ((inhibit-read-only (null buffer-read-only)))
-		    ;; these two insert a dummy char to overcome a bug in
-		    ;; XEmacs, which sometimes prevents 0-length extents
-		    ;; from sensing insertion at its end-points.
-		    ;; (need to check if 19.12 still has the bug)
-		    (if ediff-xemacs-p
-			(progn
-			  (goto-char reg-to-delete-end)
-			  (insert-before-markers "@")))
 		    
 		    (goto-char reg-to-delete-end)
-		    (insert-before-markers reg-to-copy)
-		    
-		    ;; delete the dummy char "@"
-		    (if ediff-xemacs-p
-			(delete-char 1))
+		    (insert reg-to-copy)
 		    
-		    (if ediff-xemacs-p
-			(if (> reg-to-delete-end reg-to-delete-beg)
-			    (kill-region reg-to-delete-beg
-					 reg-to-delete-end))
-		      (if (> reg-to-delete-end reg-to-delete-beg)
-			  (kill-region reg-to-delete-beg reg-to-delete-end)
-			(ediff-move-disturbed-overlays reg-to-delete-beg)
-			))
+		    (if (> reg-to-delete-end reg-to-delete-beg)
+			(kill-region reg-to-delete-beg reg-to-delete-end))
 		    ))
 		(or batch-invocation
 		    (setq 
@@ -1789,38 +1790,20 @@
 	(setq saved-diff (cdr saved-rec))
       (if (> ediff-number-of-differences 0)
 	  (error "Nothing saved for diff %d in buffer %S" (1+ n) buf-type)
-	(error "No differences found")))
+	(error ediff-NO-DIFFERENCES)))
     
     (setq reg-beg (ediff-get-diff-posn buf-type 'beg n ediff-control-buffer))
     (setq reg-end (ediff-get-diff-posn buf-type 'end n ediff-control-buffer))
-    (setq ediff-disturbed-overlays nil) ; clear before use
     
     (condition-case conds
 	(ediff-eval-in-buffer buf
 	  (let ((inhibit-read-only (null buffer-read-only)))
-	    ;; these two insert a dummy char to overcome a bug in XEmacs,
-	    ;; which sometimes prevents 0-length extents from sensing
-	    ;; insertion at its end-points.
-	    ;; (need to check if 19.12 still has the bug)
-	    (if ediff-xemacs-p
-		(progn
-		  (goto-char reg-end)
-		  (insert-before-markers "@")))
 	    
 	    (goto-char reg-end)
-	    (insert-before-markers saved-diff)
-	    
-	    ;; delete dummy char
-	    (if ediff-xemacs-p
-		(delete-char 1))
+	    (insert saved-diff)
 	    
-	    (if ediff-xemacs-p
-		(if (> reg-end reg-beg)
-		    (kill-region reg-beg reg-end))
-	      (if (> reg-end reg-beg)
-		  (kill-region reg-beg reg-end)
-		(ediff-move-disturbed-overlays reg-beg)
-		))
+	    (if (> reg-end reg-beg)
+		(kill-region reg-beg reg-end))
 	    
 	    (setq recovered t)
 	    ))
@@ -1852,19 +1835,25 @@
       
 (defun ediff-restore-diff  (arg &optional key)
   "Restore ARGth diff from `ediff-killed-diffs-alist'.
-ARG is a prefix argument.  If ARG is nil, restore current-difference.
-
+ARG is a prefix argument.  If ARG is nil, restore the current-difference.
 If the second optional argument, a character, is given, use it to
 determine the target buffer instead of last-command-char"
   (interactive "P")
   (ediff-barf-if-not-control-buffer)
-  (if arg
+  (if (numberp arg)
       (ediff-jump-to-difference arg))
   (ediff-pop-diff ediff-current-difference 
 		  (ediff-char-to-buftype (or key last-command-char)))
   ;; recenter with rehighlighting, but no messages
   (let (ediff-verbose-p)
     (ediff-recenter)))
+
+(defun ediff-restore-diff-in-merge-buffer (arg)
+  "Restore ARGth diff in the merge buffer.
+ARG is a prefix argument. If nil, restore the current diff."
+  (interactive "P")
+  (ediff-restore-diff arg ?c))
+  
   
 (defun ediff-toggle-regexp-match ()
   "Toggle between focusing and hiding of difference regions that match
@@ -1990,25 +1979,25 @@
 	     (regex-B ediff-regexp-focus-B)
 	     (regex-C ediff-regexp-focus-C)
 	     (reg-A-match (ediff-eval-in-buffer ediff-buffer-A
-			    (goto-char (ediff-get-diff-posn 'A 'beg n ctl-buf))
-			    (re-search-forward
-			     regex-A
-			     (ediff-get-diff-posn 'A 'end n ctl-buf)
-			     t)))
+			    (save-restriction
+			      (narrow-to-region
+			       (ediff-get-diff-posn 'A 'beg n ctl-buf)
+			       (ediff-get-diff-posn 'A 'end n ctl-buf))
+			      (goto-char (point-min))
+			      (re-search-forward regex-A nil t))))
 	     (reg-B-match (ediff-eval-in-buffer ediff-buffer-B
-			    (goto-char (ediff-get-diff-posn 'B 'beg n ctl-buf))
-			    (re-search-forward
-			     regex-B
-			     (ediff-get-diff-posn 'B 'end n ctl-buf)
-			     t)))
+			    (save-restriction
+			      (narrow-to-region
+			       (ediff-get-diff-posn 'B 'beg n ctl-buf)
+			       (ediff-get-diff-posn 'B 'end n ctl-buf))
+			      (re-search-forward regex-B nil t))))
 	     (reg-C-match (if ediff-3way-comparison-job
 			      (ediff-eval-in-buffer ediff-buffer-C
-				(goto-char
-				 (ediff-get-diff-posn 'C 'beg n ctl-buf))
-				(re-search-forward
-				 regex-C
-				 (ediff-get-diff-posn 'C 'end n ctl-buf)
-				 t)))))
+				(save-restriction
+				  (narrow-to-region
+				   (ediff-get-diff-posn 'C 'beg n ctl-buf)
+				   (ediff-get-diff-posn 'C 'end n ctl-buf))
+				  (re-search-forward regex-C nil t))))))
 	(not (eval (if ediff-3way-comparison-job
 		       (list ediff-focus-regexp-connective
 			     reg-A-match reg-B-match reg-C-match)
@@ -2031,25 +2020,27 @@
 	     (regex-B ediff-regexp-hide-B)
 	     (regex-C ediff-regexp-hide-C)
 	     (reg-A-match (ediff-eval-in-buffer ediff-buffer-A
-			    (goto-char (ediff-get-diff-posn 'A 'beg n ctl-buf))
-			    (re-search-forward
-			     regex-A
-			     (ediff-get-diff-posn 'A 'end n ctl-buf)
-			     t)))
+			    (save-restriction
+			      (narrow-to-region
+			       (ediff-get-diff-posn 'A 'beg n ctl-buf)
+			       (ediff-get-diff-posn 'A 'end n ctl-buf))
+			      (goto-char (point-min))
+			      (re-search-forward regex-A nil t))))
 	     (reg-B-match (ediff-eval-in-buffer ediff-buffer-B
-			    (goto-char (ediff-get-diff-posn 'B 'beg n ctl-buf))
-			    (re-search-forward
-			     regex-B
-			     (ediff-get-diff-posn 'B 'end n ctl-buf)
-			     t)))
+			    (save-restriction
+			      (narrow-to-region
+			       (ediff-get-diff-posn 'B 'beg n ctl-buf)
+			       (ediff-get-diff-posn 'B 'end n ctl-buf))
+			      (goto-char (point-min))
+			      (re-search-forward regex-B nil t))))
 	     (reg-C-match (if ediff-3way-comparison-job
 			      (ediff-eval-in-buffer ediff-buffer-C
-				(goto-char
-				 (ediff-get-diff-posn 'C 'beg n ctl-buf))
-				(re-search-forward
-				 regex-C
-				 (ediff-get-diff-posn 'C 'end n ctl-buf)
-				 t)))))
+				(save-restriction
+				  (narrow-to-region
+				   (ediff-get-diff-posn 'C 'beg n ctl-buf)
+				   (ediff-get-diff-posn 'C 'end n ctl-buf))
+				  (goto-char (point-min))
+				  (re-search-forward regex-C nil t))))))
 	(eval (if ediff-3way-comparison-job
 		  (list ediff-hide-regexp-connective
 			reg-A-match reg-B-match reg-C-match)
@@ -2196,7 +2187,6 @@
     (ediff-kill-buffer-carefully ediff-msg-buffer)
     (ediff-kill-buffer-carefully ediff-debug-buffer)
 
-    ;;(redraw-display)
     (if (and (ediff-window-display-p) (frame-live-p ctl-frame))
 	(delete-frame ctl-frame))
     (ediff-kill-buffer-carefully ctl-buf)
@@ -2378,13 +2368,16 @@
 			      ediff-number-of-differences) 'end)
 			 (t (1+ ediff-current-difference)))))
 
-    (cond (ediff-ignore-similar-regions
-	   (princ "\nSkipping regions that differ only in white space & line breaks"))
-	  (t 
-	   (princ "\nNot skipping regions that differ in white space & line breaks")))
+    (princ
+     (format "\n%s regions that differ only in white space & line breaks"
+	     (if ediff-ignore-similar-regions
+		 "Skipping" "Not skipping")))
+    (if (and ediff-merge-job ediff-show-clashes-only)
+	(princ
+	 "\nFocusing on regions where both buffers differ from the ancestor"))
     
     (cond ((eq ediff-skip-diff-region-function 'ediff-show-all-diffs)
-	   (princ "\nSelective browsing by regexp is off.\n"))
+	   (princ "\nSelective browsing by regexp is off\n"))
 	  ((eq ediff-skip-diff-region-function
 	       ediff-hide-regexp-matches-function)
 	   (princ
@@ -2414,31 +2407,6 @@
   (if (window-live-p ediff-control-window)
       (select-window ediff-control-window)))
     
-(defun ediff-documentation ()
-  "Jump to Ediff's Info file."
-  (interactive)
-  (let ((ctl-window ediff-control-window)
-	(ctl-buf ediff-control-buffer))
-
-    (ediff-skip-unsuitable-frames)
-    (condition-case nil
-	(progn
-	  (pop-to-buffer (get-buffer-create "*info*"))
-	  (info "ediff.info")
-	  (message "Type `i' to search for a specific topic"))
-      (error (beep 1)
-	     (with-output-to-temp-buffer " *ediff-info*"
-	       (princ (format "
-The Info file for Ediff does not seem to be installed.
-
-This file is part of the distribution of %sEmacs.
-Please contact your system administrator. "
-			      (if ediff-xemacs-p "X" ""))))
-	     (if (window-live-p ctl-window)
-		 (progn
-		   (select-window ctl-window)
-		   (set-window-buffer ctl-window ctl-buf)))))))
-    
 
 
 
@@ -2452,7 +2420,7 @@
 	   (ediff-buffer-live-p ediff-buffer-B)
 	   (ediff-valid-difference-p n))
       (progn
-	(if (and (ediff-window-display-p) ediff-use-faces)
+	(if (and (ediff-has-face-support-p) ediff-use-faces)
 	    (progn
 	      (ediff-highlight-diff n)
 	      (setq ediff-highlighting-style 'face))
@@ -2479,7 +2447,7 @@
 (defun ediff-unselect-difference (n)
   (if (ediff-valid-difference-p n)
       (progn 
-	(cond ((and (ediff-window-display-p) ediff-use-faces)
+	(cond ((and (ediff-has-face-support-p) ediff-use-faces)
 	       (ediff-unhighlight-diff))
 	      ((eq ediff-highlighting-style 'ascii)
 	       (ediff-remove-flags-from-buffer
@@ -2578,18 +2546,35 @@
 		 (file-name-nondirectory default-file) f)))
     f)) 
   
-;; If `prefix' is given, then it is used as a prefix for the temp file
-;; name. Otherwise, `ediff_' is used. If `file' is given, use this
+;; If PREFIX is given, then it is used as a prefix for the temp file
+;; name. Otherwise, `ediff_' is used. If FILE is given, use this
 ;; file and don't create a new one.
+;; On MS-DOS, make sure the prefix isn't longer than 7 characters, or
+;; else `make-temp-name' isn't guaranteed to return a unique filename.
 ;; Also, save buffer from START to END in the file.
 ;; START defaults to (point-min), END to (point-max)
 (defun ediff-make-temp-file (buff &optional prefix given-file start end)
-  (let ((f (or given-file
-	       (make-temp-name (concat
-				ediff-temp-file-prefix
-				(if prefix
-				    (concat prefix "_")
-				    "ediff_"))))))
+  (let ((p (or prefix "ediff"))
+	f)
+    (if (and (eq system-type 'ms-dos) (> (length p) 7))
+	(setq p (substring p 0 7)))
+
+    (setq f (concat ediff-temp-file-prefix p)
+	  f (cond (given-file)
+		  ((find-file-name-handler f 'find-file-noselect)
+		   ;; to thwart file handlers in write-region, e.g., if file
+		   ;; name ends with .Z or .gz
+		   ;; This is needed so that patches produced by ediff will
+		   ;; have more meaningful names
+		   (make-temp-name f))
+		  ;; Prefix is most often the same as the file name for the
+		  ;; variant. Here we are trying to use the original file name
+		  ;; but in the temp directory.
+		  ((and prefix (not (file-exists-p f))) f)
+		  ;; If a file with the orig name exists, add some random stuff
+		  ;; to it.
+		  (t (make-temp-name f))))
+    
     ;; create the file
     (ediff-eval-in-buffer buff
       (write-region (if start start (point-min))
@@ -2617,7 +2602,7 @@
 ;; Signal an error if we can't make them the same, or the user doesn't want
 ;; to do what is necessary to make them the same.
 ;; If file has file handlers (indicated by the optional arg), then we
-;; offer to instead of saving. This is one difference with Emerge. 
+;; offer to revert instead of saving. This is one difference with Emerge. 
 ;; Another is that we always offer to revert obsolete files, whether they
 ;; are modified or not.
 (defun ediff-verify-file-buffer (&optional file-magic)
@@ -2649,49 +2634,6 @@
       (error "Buffer out of sync for file %s" buffer-file-name))))
 
 
-
-;; It would be nice to use these two functions as hooks instead of
-;; ediff-insert-in-front and ediff-move-disturbed-overlays.
-;; However, Emacs has a bug that causes BEG and END, below, to be
-;; the same, i.e., the end of inserted text is not passed correctly.
-;; Since the overlay doesn't move when these hooks run, 
-;; there is no way to correctly determine the new (desired) position of
-;; the overlay end.
-;; Either this bug is fixed, or (better) use sticky overlays when they will
-;; be implemented in Emacs, like they are in XEmacs.
-;;(defun ediff-capture-inserts-in-front (overl flag beg end &optional len)
-;;  (if (and flag (ediff-overlay-get overl 'ediff-diff-num))
-;;      (ediff-move-overlay overl beg (ediff-overlay-end overl))
-;;    ))
-;;
-;;(defun ediff-capture-inserts-behind (overl flag beg end &optional len)
-;;  (if (and flag (ediff-overlay-get overl 'ediff-diff-num))
-;;      (ediff-move-overlay overl (ediff-overlay-start overl) (point))
-;;  ))
-  
-;; to be deleted in due time
-;; Capture overlays that had insertions in the front.
-;; Called when overlay OVERL gets insertion in front.
-(defun ediff-insert-in-front (overl &optional flag beg end length)
-  (if (ediff-overlay-get overl 'ediff-diff-num)
-      (setq ediff-disturbed-overlays
-	    (cons overl ediff-disturbed-overlays))))
-  
-  
-;; to be deleted in due time
-;; We can't move overlays directly in insert-in-front-hooks
-;; because when diff is highlighted  with ascii flags, they will  disturb
-;; overlays and so they will be included in them, which we don't want.
-(defun  ediff-move-disturbed-overlays (posn)  
-  (mapcar (function (lambda (overl)
-		       (ediff-move-overlay overl
-					   posn
-					   (ediff-overlay-end overl))
-		       ))
-	  ediff-disturbed-overlays)
-  (setq ediff-disturbed-overlays nil))
-  
-  
 (defun ediff-save-buffer (arg)
   "Safe way of saving buffers A, B, C, and the diff output.
 `wa' saves buffer A, `wb' saves buffer B, `wc' saves buffer C,
@@ -2721,16 +2663,26 @@
     (save-buffer)))
 
 (defun ediff-compute-custom-diffs-maybe ()
-  (or ediff-3way-job
-      (let ((file-A (ediff-make-temp-file ediff-buffer-A))
-	    (file-B (ediff-make-temp-file ediff-buffer-B)))
-	(or (ediff-buffer-live-p ediff-custom-diff-buffer)
-	    (setq ediff-custom-diff-buffer
-		  (get-buffer-create
-		   (ediff-unique-buffer-name "*ediff-custom-diff" "*"))))
-	(ediff-exec-process
-	 ediff-custom-diff-program ediff-custom-diff-buffer 'synchronize
-	 ediff-custom-diff-options file-A file-B))))
+  (let ((buf-A-file-name (buffer-file-name ediff-buffer-A))
+	(buf-B-file-name (buffer-file-name ediff-buffer-B))
+	file-A file-B)
+    (if (stringp buf-A-file-name)
+	(setq buf-A-file-name (file-name-nondirectory buf-A-file-name)))
+    (if (stringp buf-B-file-name)
+	(setq buf-B-file-name (file-name-nondirectory buf-B-file-name)))
+    (setq file-A (ediff-make-temp-file ediff-buffer-A buf-A-file-name)
+	  file-B (ediff-make-temp-file ediff-buffer-B buf-B-file-name))
+			 
+    (or (ediff-buffer-live-p ediff-custom-diff-buffer)
+	(setq ediff-custom-diff-buffer
+	      (get-buffer-create
+	       (ediff-unique-buffer-name "*ediff-custom-diff" "*"))))
+    (ediff-exec-process
+     ediff-custom-diff-program ediff-custom-diff-buffer 'synchronize
+     ediff-custom-diff-options file-A file-B)
+    (delete-file file-A)
+    (delete-file file-B)
+    ))
 
 (defun ediff-show-diff-output (arg)
   (interactive "P")
@@ -2842,13 +2794,12 @@
       (or n  (setq n ediff-current-difference))
       (if (or (< n 0) (>= n ediff-number-of-differences))
 	  (if (> ediff-number-of-differences 0)
-	      (error "There is no diff %d. Valid diffs are 1 to %d"
+	      (error "Bad difference number, %d. Valid numbers are 1 to %d"
 		     (1+ n) ediff-number-of-differences)
-	    (error "No differences found")))
+	    (error ediff-NO-DIFFERENCES)))
       (setq diff-overlay (ediff-get-diff-overlay n buf-type)))
     (if (not (ediff-buffer-live-p (ediff-overlay-buffer diff-overlay)))
-	(error
-	 "You have killed an essential Ediff buffer---Please exit Ediff"))
+	(error ediff-KILLED-VITAL-BUFFER))
     (if (eq pos 'beg)
 	(ediff-overlay-start diff-overlay)
       (ediff-overlay-end diff-overlay))
@@ -2900,14 +2851,14 @@
 	;; current difference region
 	(ediff-set-overlay-face
 	 overlay
-	 (if (and (ediff-window-display-p)
+	 (if (and (ediff-has-face-support-p)
 		  ediff-use-faces ediff-highlight-all-diffs)
 	     (ediff-background-face buf-type ediff-current-difference)))
 	)))
 
 (defun ediff-unhighlight-diffs-totally-in-one-buffer (buf-type)
   (ediff-unselect-and-select-difference -1)
-  (if (and (ediff-window-display-p) ediff-use-faces)
+  (if (and (ediff-has-face-support-p) ediff-use-faces)
       (let* ((inhibit-quit t)
 	     (current-diff-overlay-var
 	      (intern (format "ediff-current-diff-overlay-%S" buf-type)))
@@ -2963,7 +2914,7 @@
 
 ;;; Misc
 
-;; These two functions are here to neutralize XEmacs's unwillingness to
+;; These two functions are here to neutralize XEmacs unwillingless to
 ;; handle overlays whose buffers were deleted.
 (defun ediff-move-overlay (overlay beg end &optional buffer)
   "Calls `move-overlay' in Emacs and `set-extent-endpoints' in Lemacs.
@@ -3003,27 +2954,19 @@
 	      (setq beg (eval beg)))
 	  (or (number-or-marker-p end)
 	      (setq end (eval end)))
-	  (setq overl (ediff-make-overlay beg end buff))
+	  (setq overl 
+		(if ediff-xemacs-p
+		    (make-extent beg end buff)
+		  ;; don't advance front, but advance rear
+		  (make-overlay beg end buff nil 'rear-advance)))
 	  
-	  (if ediff-xemacs-p
-	      (progn
-		;; take precautions against detached extents
-		(ediff-overlay-put overl 'detachable nil) 
-		;; chars inserted at both ends will be inside extent
-		(ediff-overlay-put overl 'start-open nil)
-		(ediff-overlay-put overl 'end-open nil))
-	    (ediff-overlay-put overl 'evaporate nil)  ; don't detach
-	    ;; doesn't work since emacs buggily doesn't call these functions
-	    ;; after the change
-	    ;;(ediff-overlay-put overl 'insert-in-front-hooks
-	    ;;		         '(ediff-capture-inserts-in-front))
-	    ;;(ediff-overlay-put overl 'insert-behind-hooks
-	    ;;  	         '(ediff-capture-inserts-behind))
+	  (if ediff-emacs-p
+	      (ediff-overlay-put overl 'evaporate nil)  ; don't detach
+	    (ediff-overlay-put overl 'detachable nil)  ; don't detach
+	    ;; don't advance front, but advance rear
+	    (ediff-overlay-put overl 'start-open nil) 
+	    (ediff-overlay-put overl 'end-open nil))
 
-	    ;; These two are not yet implemented in Emacs
-	    (ediff-overlay-put overl 'rear-sticky t)
-	    (ediff-overlay-put overl 'front-sticky t)
-	    )
 	  (ediff-overlay-put overl 'ediff-diff-num 0)
 	  overl))))
 	  
@@ -3285,6 +3228,11 @@
 	  (ediff-restore-variables ediff-protected-variables values-Ancestor)))
     ))
 
+;; save BUFFER in FILE. used in hooks.
+(defun ediff-save-buffer-in-file (buffer file)
+  (ediff-eval-in-buffer buffer
+    (write-file file)))
+
 
 ;;; Debug
 
@@ -3309,11 +3257,9 @@
   "Toggle profiling Ediff commands."
   (interactive)
   (ediff-barf-if-not-control-buffer)
-  (if ediff-emacs-p
-      (make-local-variable 'post-command-hook))
-  (let ((pre-hook (if ediff-emacs-p 'pre-command-hook 'local-pre-command-hook))
-	(post-hook
-	 (if ediff-emacs-p 'post-command-hook 'local-post-command-hook)))
+  (make-local-hook 'post-command-hook)
+  (let ((pre-hook 'pre-command-hook)
+	(post-hook 'post-command-hook))
     (if (not (equal ediff-command-begin-time '(0 0 0)))
 	(progn (remove-hook pre-hook 'ediff-save-time)
 	       (remove-hook post-hook 'ediff-calc-command-time)
@@ -3361,6 +3307,63 @@
     (ediff-print-diff-vector (intern "ediff-difference-vector-Ancestor"))
     ))
 
+
+;;; General utilities
+
+;; this uses comparison-func to decide who is a member
+(defun ediff-member (elt lis comparison-func)
+  (while (and lis (not (funcall comparison-func (car lis) elt)))
+    (setq lis (cdr lis)))
+  lis)
+
+;; this uses comparison-func to decide who is a member, and this determines how
+;; intersection looks like
+(defun ediff-intersection (lis1 lis2 comparison-func)
+  (let ((result (list 'a)))
+    (while lis1
+      (if (ediff-member (car lis1) lis2 comparison-func)
+	  (nconc result (list (car lis1))))
+      (setq lis1 (cdr lis1)))
+    (cdr result)))
+    
+
+;; eliminates duplicates using comparison-func
+(defun ediff-union (lis1 lis2 comparison-func)
+  (let ((result (list 'a)))
+    (while lis1
+      (or (ediff-member (car lis1) (cdr result) comparison-func)
+	  (nconc result (list (car lis1))))
+      (setq lis1 (cdr lis1)))
+    (while lis2
+      (or (ediff-member (car lis2) (cdr result) comparison-func)
+	  (nconc result (list (car lis2))))
+      (setq lis2 (cdr lis2)))
+    (cdr result)))
+
+;; eliminates duplicates using comparison-func
+(defun ediff-set-difference (lis1 lis2 comparison-func)
+  (let ((result (list 'a)))
+    (while lis1
+      (or (ediff-member (car lis1) (cdr result) comparison-func)
+	  (ediff-member (car lis1) lis2 comparison-func)
+	  (nconc result (list (car lis1))))
+      (setq lis1 (cdr lis1)))
+    (cdr result)))
+
+(defun ediff-copy-list (list)
+  (if (consp list)
+      ;;;(let ((res nil))
+      ;;;  (while (consp list) (push (pop list) res))
+      ;;;  (prog1 (nreverse res) (setcdr res list)))
+      (let (res elt)
+	(while (consp list)
+	  (setq elt (car list)
+		res (cons elt res)
+		list (cdr list)))
+	(nreverse res))
+    (car list)))
+    
+
 ;; don't report error if version control package wasn't found
 ;;(ediff-load-version-control 'silent)
 
--- a/lisp/ediff-wind.el	Fri Feb 16 05:25:08 1996 +0000
+++ b/lisp/ediff-wind.el	Fri Feb 16 06:36:35 1996 +0000
@@ -85,29 +85,28 @@
 In this case, Ediff will use those frames to display these buffers.")
 
 (defconst ediff-control-frame-parameters
-  (if (ediff-window-display-p)
-      (list 
-       '(name . "Ediff")
-       ;;'(unsplittable . t)
-       '(minibuffer . nil)
-       '(user-position . t)	      ; Emacs only
-       '(vertical-scroll-bars . nil)  ; Emacs only
-       '(scrollbar-width . 0)         ; XEmacs only
-       '(menu-bar-lines . 0)          ; Emacs only
-       '(visibility . nil)	      ; doesn't work for XEmacs yet
-       ;; don't lower and auto-raise
-       '(auto-lower . nil)
-       '(auto-raise . t)
-       ;; this blocks queries from  window manager as to where to put
-       ;; ediff's control frame. we put the frame outside the display,
-       ;; so the initial frame won't jump all over the screen
-       (cons 'top  (if (fboundp 'ediff-display-pixel-height)
-		       (1+ (ediff-display-pixel-height))
-		     3000))
-       (cons 'left (if (fboundp 'ediff-display-pixel-width)
-		       (1+ (ediff-display-pixel-width))
-		     3000))
-       ))
+  (list 
+   '(name . "Ediff")
+   ;;'(unsplittable . t)
+   '(minibuffer . nil)
+   '(user-position . t)	      ; Emacs only
+   '(vertical-scroll-bars . nil)  ; Emacs only
+   '(scrollbar-width . 0)         ; XEmacs only
+   '(menu-bar-lines . 0)          ; Emacs only
+   '(visibility . nil)	      ; doesn't work for XEmacs yet
+   ;; don't lower and auto-raise
+   '(auto-lower . nil)
+   '(auto-raise . t)
+   ;; this blocks queries from  window manager as to where to put
+   ;; ediff's control frame. we put the frame outside the display,
+   ;; so the initial frame won't jump all over the screen
+   (cons 'top  (if (fboundp 'ediff-display-pixel-height)
+		   (1+ (ediff-display-pixel-height))
+		 3000))
+   (cons 'left (if (fboundp 'ediff-display-pixel-width)
+		   (1+ (ediff-display-pixel-width))
+		 3000))
+   )
   "Frame parameters for displaying Ediff Control Panel.
 Do not specify width and height here. These are computed automatically.")
 
@@ -266,7 +265,7 @@
 (defun ediff-setup-windows-plain-merge (buf-A buf-B buf-C control-buffer)
   ;; skip dedicated and unsplittable frames
   (ediff-destroy-control-frame control-buffer)
-  (let ((window-min-height 2)
+  (let ((window-min-height 1)
 	split-window-function 
 	merge-window-share merge-window-lines
 	wind-A wind-B wind-C)
@@ -319,7 +318,7 @@
 (defun ediff-setup-windows-plain-compare (buf-A buf-B buf-C control-buffer)
   ;; skip dedicated and unsplittable frames
   (ediff-destroy-control-frame control-buffer)
-  (let ((window-min-height 2)
+  (let ((window-min-height 1)
 	split-window-function wind-width-or-height
 	three-way-comparison
 	wind-A-start wind-B-start wind-A wind-B wind-C)
@@ -386,7 +385,7 @@
     ))
 
     
-;; dispatch the appropriate window setup function
+;; dispatch an appropriate window setup function
 (defun ediff-setup-windows-multiframe (buf-A buf-B buf-C control-buf)
   (ediff-eval-in-buffer control-buf
     (setq ediff-multiframe t))
@@ -408,7 +407,7 @@
   ;;   Unsplittable frames are taken care of later.
   (ediff-skip-unsuitable-frames 'ok-unsplittable)
   
-  (let* ((window-min-height 2)
+  (let* ((window-min-height 1)
 	 (wind-A (ediff-get-visible-buffer-window buf-A))
 	 (wind-B (ediff-get-visible-buffer-window buf-B))
 	 (wind-C (ediff-get-visible-buffer-window buf-C))
@@ -486,7 +485,7 @@
     
     (if use-same-frame
 	(let ((curr-frame (selected-frame))
-	      (window-min-height 2))
+	      (window-min-height 1))
 	  ;; avoid dedicated and non-splittable windows
 	  (ediff-skip-unsuitable-frames)
 	  (or (eq curr-frame (selected-frame))
@@ -583,7 +582,7 @@
   ;; Unsplittable frames are taken care of later.
   (ediff-skip-unsuitable-frames 'ok-unsplittable)
   
-  (let* ((window-min-height 2)
+  (let* ((window-min-height 1)
 	 (wind-A (ediff-get-visible-buffer-window buf-A))
 	 (wind-B (ediff-get-visible-buffer-window buf-B))
 	 (wind-C (ediff-get-visible-buffer-window buf-C))
@@ -754,6 +753,8 @@
 		    (or
 		     (window-dedicated-p (selected-window))
 		     (ediff-frame-iconified-p (selected-frame))
+		     (< (frame-height (selected-frame))
+			(* 3 window-min-height))
 		     (if ok-unsplittable
 			 nil
 		       (ediff-frame-unsplittable-p (selected-frame)))))
@@ -769,7 +770,7 @@
 
 ;; Prepare or refresh control frame
 (defun ediff-setup-control-frame (ctl-buffer designated-minibuffer-frame)
-  (let ((window-min-height 2)
+  (let ((window-min-height 1)
 	ctl-frame-iconified-p dont-iconify-ctl-frame deiconify-ctl-frame
 	ctl-frame old-ctl-frame lines user-grabbed-mouse
 	fheight fwidth adjusted-parameters) 
@@ -780,20 +781,11 @@
       (run-hooks 'ediff-before-setup-control-frame-hook))
   
     (setq old-ctl-frame (ediff-eval-in-buffer ctl-buffer ediff-control-frame))
-    ;; Delete the old ctl frame and get a new ctl frame.
-    ;; The old ctl frame is deleted to let emacs reset default minibuffer
-    ;; frame or when the ctl frame needs to be moved.
-    ;; The old frame isn't reused, since ediff-setup-control-frame is called
-    ;; very rarely, so the overhead is minimal.
-    (if (frame-live-p old-ctl-frame) (delete-frame old-ctl-frame))
-    ;;(redraw-display)
-    ;; new ctl frame should be created while ctl-buff is current, so that
-    ;; the local default-minibuffer-frame will be consulted and
-    ;; that ediff-control-frame-parameters will have the right value.
     (ediff-eval-in-buffer ctl-buffer
-      (let ((default-minibuffer-frame designated-minibuffer-frame))
-	(setq ctl-frame (make-frame ediff-control-frame-parameters)
-	      ediff-control-frame ctl-frame)))
+      (setq ctl-frame (if (frame-live-p old-ctl-frame)
+			  old-ctl-frame
+			(make-frame ediff-control-frame-parameters))
+	    ediff-control-frame ctl-frame))
     
     (setq ctl-frame-iconified-p (ediff-frame-iconified-p ctl-frame))
     (select-frame ctl-frame)
@@ -817,19 +809,21 @@
 	       dont-iconify-ctl-frame))
     
     ;; 1 more line for the modeline
-    (setq lines (if ediff-xemacs-p
-		    (+ 2 (count-lines (point-min) (point-max)))
-		  (1+ (count-lines (point-min) (point-max))))
+    (setq lines (1+ (count-lines (point-min) (point-max)))
 	  fheight lines
 	  fwidth (+ (ediff-help-message-line-length) 2)
 	  adjusted-parameters (append (list
 				       '(visibility . t)
+				       ;; possibly change surrogate minibuffer
+				       (cons 'minibuffer
+					     (minibuffer-window
+					      designated-minibuffer-frame))
 				       (cons 'width fwidth)
 				       (cons 'height fheight))
 				      (funcall
 				       ediff-control-frame-position-function
 				       ctl-buffer fwidth fheight)))
-    (if ediff-prefer-long-help-message
+    (if ediff-use-long-help-message
 	(setq adjusted-parameters
 	      (cons '(auto-raise . nil) adjusted-parameters)))
     
@@ -846,11 +840,12 @@
 	  ;;(sit-for 0)
 	  ))
     
-    ;; Under OS/2 (emx) we have to call modify frame parameters twice, in
-    ;; order to make sure that at least once we do it for non-iconified
-    ;; frame. If appears that in the OS/2 port of Emacs, one can't modify
-    ;; frame parameters of iconified frames.
-    (if (eq system-type 'emx)
+    ;; Under OS/2 (emx) we have to call modify frame parameters twice, in order
+    ;; to make sure that at least once we do it for non-iconified frame. If
+    ;; appears that in the OS/2 port of Emacs, one can't modify frame
+    ;; parameters of iconified frames. As a precaution, we do likewise for
+    ;; windows-nt.
+    (if (memq system-type '(emx windows-nt windows-95))
 	(modify-frame-parameters ctl-frame adjusted-parameters))
       
     (goto-char (point-min))
@@ -876,15 +871,18 @@
       
     ;; resynch so the cursor will move to control frame
     ;; per RMS suggestion
-    (let ((count 7))
-      (sit-for .1)
-      (while (and (not (frame-visible-p ctl-frame)) (> count 0))
-	(setq count (1- count))
-	(sit-for .3)))
+    (if (ediff-window-display-p)
+	(let ((count 7))
+	  (sit-for .1)
+	  (while (and (not (frame-visible-p ctl-frame)) (> count 0))
+	    (setq count (1- count))
+	    (sit-for .3))))
 
     (or (ediff-frame-iconified-p ctl-frame)
 	;; don't warp the mouse, unless ediff-grab-mouse = t
-	(ediff-reset-mouse ctl-frame (not (eq ediff-grab-mouse t))))
+	(ediff-reset-mouse ctl-frame
+			   (or (eq this-command 'ediff-quit)
+			       (not (eq ediff-grab-mouse t)))))
 	
     (if ediff-xemacs-p
 	(ediff-eval-in-buffer ctl-buffer
@@ -932,7 +930,7 @@
 	    (- frame-A-top upward-adjustment ediff-control-frame-upward-shift)
 	    ctl-frame-left
 	    (+ frame-A-left
-	       (if ediff-prefer-long-help-message
+	       (if ediff-use-long-help-message
 		   (* (ediff-frame-char-width ctl-frame)
 		      (+ ediff-wide-control-frame-rightward-shift
 			 horizontal-adjustment))
@@ -941,9 +939,6 @@
 		       (+ ctl-frame-width
 			  ediff-narrow-control-frame-leftward-shift
 			  horizontal-adjustment))))))
-      ;; keep ctl frame within the visible bounds
-      (setq ctl-frame-top (max ctl-frame-top 1)
-	    ctl-frame-left (max ctl-frame-left 1))
       (setq ctl-frame-top
 	    (min ctl-frame-top
 		 (- (ediff-display-pixel-height)
@@ -953,6 +948,9 @@
 	    (min ctl-frame-left
 		 (- (ediff-display-pixel-width)
 		    (* ctl-frame-width (ediff-frame-char-width ctl-frame)))))
+      ;; keep ctl frame within the visible bounds
+      (setq ctl-frame-top (max ctl-frame-top 1)
+	    ctl-frame-left (max ctl-frame-left 1))
       
       (list (cons 'top ctl-frame-top)
 	    (cons 'left ctl-frame-left))
@@ -960,7 +958,7 @@
 			       
 (defun ediff-xemacs-select-frame-hook ()
   (if (and (equal (selected-frame) ediff-control-frame)
-	   (not ediff-prefer-long-help-message))
+	   (not ediff-use-long-help-message))
       (raise-frame ediff-control-frame)))
 	
 (defun ediff-make-wide-display ()
--- a/lisp/ediff.el	Fri Feb 16 05:25:08 1996 +0000
+++ b/lisp/ediff.el	Fri Feb 16 06:36:35 1996 +0000
@@ -6,8 +6,8 @@
 ;; Created: February 2, 1994
 ;; Keywords: comparing, merging, patching, version control.
 
-(defconst ediff-version "2.47" "The current version of Ediff")
-(defconst ediff-date "October 11, 1995" "Date of last update")  
+(defconst ediff-version "2.54" "The current version of Ediff")
+(defconst ediff-date "February 14, 1996" "Date of last update")  
 
 ;; This file is part of GNU Emacs.
 
@@ -70,6 +70,8 @@
 ;; particular, it can do patching, and 2-way and 3-way file comparison,
 ;; merging, and directory operations.
 
+
+
 ;;; Bugs:
 
 ;;  1. The undo command doesn't restore deleted regions well. That is, if
@@ -93,6 +95,7 @@
 ;;  buffer used by Ediff) or you can execute them interactively, at any time
 ;;  and on any buffer.
 
+
 ;;; Acknowledgements:
 
 ;; Ediff was inspired by Dale R. Worley's <drw@math.mit.edu> emerge.el.
@@ -128,7 +131,7 @@
 
 ;;;###autoload
 (defun ediff-patch-file (source-filename &optional startup-hooks job-name)
-  "Run Ediff by patching FILE-TP-PATCH."
+  "Run Ediff by patching SOURCE-FILENAME."
   ;; This now returns the control buffer
   (interactive 
    (list (ediff-read-file-name
@@ -160,12 +163,15 @@
 	 ;; file for the purpose of patching.
 	 (true-source-filename source-filename)
 	 (target-filename source-filename)
-	 target-buf buf-to-patch file-name-magic-p ctl-buf)
+	 target-buf buf-to-patch file-name-magic-p ctl-buf backup-style)
 	  
     ;; if the user didn't specify a backup extension, use
     ;; ediff-backup-extension 
     (if (string= backup-extension "")
 	(setq backup-extension ediff-backup-extension))
+    (if (string-match "-V" ediff-patch-options)
+	(error
+	 "Ediff doesn't take the -V option in `ediff-patch-options'--sorry"))
 					
     ;; Make a temp file, if source-filename has a magic file handler (or if
     ;; it is handled via auto-mode-alist and similar magic).
@@ -188,7 +194,9 @@
     
     (ediff-eval-in-buffer ediff-patch-diagnostics
       (message "Applying patch ... ")
-      ;;(sit-for 0)
+      ;; fix environment for gnu patch, so it won't make numbered extensions
+      (setq backup-style (getenv "VERSION_CONTROL"))
+      (setenv "VERSION_CONTROL" nil)
       ;; always pass patch the -f option, so it won't ask any questions
       (shell-command-on-region 
        (point-min) (point-max)
@@ -196,7 +204,9 @@
 	       ediff-patch-program ediff-patch-options
 	       backup-extension
 	       (expand-file-name true-source-filename))
-       t))
+       t)
+      ;; restore environment for gnu patch
+      (setenv "VERSION_CONTROL" backup-style))
     ;;(message "Applying patch ... done")(sit-for 0)
     (switch-to-buffer ediff-patch-diagnostics)
     (sit-for 0) ; synchronize - let the user see diagnostics
@@ -251,8 +261,8 @@
 	     (buffer-name ediff-patch-diagnostics))
     ctl-buf))
   
+;; Used as a startup hook to set `_orig' patch file read-only.
 (defun ediff-set-read-only-in-buf-A ()
-  "Used as a startup hook to set `_orig' patch file read-only."
   (ediff-eval-in-buffer ediff-buffer-A
     (toggle-read-only 1)))
 
@@ -363,15 +373,16 @@
 (defalias 'ediff3 'ediff-files3)
 
 
+;; Visit FILE and arrange its buffer to Ediff's liking. 
+;; FILE is actually a variable symbol that must contain a true file name.
+;; BUFFER-NAME is a variable symbol, which will get the buffer object into
+;; which FILE is read.
+;; LAST-DIR is the directory variable symbol where FILE's
+;; directory name should be returned. HOOKS-VAR is a variable symbol that will
+;; be assigned the hook to be executed after `ediff-startup' is finished.
+;; `ediff-find-file' arranges that the temp files it might create will be
+;; deleted.
 (defun ediff-find-file (file-var buffer-name &optional last-dir hooks-var)
-  "Visit FILE and arrange its buffer to Ediff's liking. 
-FILE is actually a variable symbol that must contain a true file name.
-BUFFER-NAME is a variable symbol, which will get the buffer object into which
-FILE is read.  LAST-DIR is the directory variable symbol where FILE's
-directory name should be returned. HOOKS is a variable symbol that will be
-assigned the hook to be executed after `ediff-startup' is finished.
-`ediff-find-file' arranges that the temp files it might create will be
-deleted."
   (let* ((file (symbol-value file-var))
 	 (file-magic (find-file-name-handler file 'find-file-noselect))
 	 (temp-file-name-prefix (file-name-nondirectory file)))
@@ -380,7 +391,7 @@
 	  ((file-directory-p file)
 	   (error "File `%s' is a directory" file)))
 	
-    ;; some of the command, below, require full file name
+    ;; some of the commands, below, require full file name
     (setq file (expand-file-name file))
   
     ;; Record the directory of the file
@@ -509,8 +520,8 @@
     (if (stringp buf-C-file-name)
 	(setq buf-C-file-name (file-name-nondirectory buf-C-file-name)))
 	
-    (setq file-A (ediff-make-temp-file buf-A buf-A-file-name))
-    (setq file-B (ediff-make-temp-file buf-B buf-B-file-name))
+    (setq file-A (ediff-make-temp-file buf-A buf-A-file-name)
+	  file-B (ediff-make-temp-file buf-B buf-B-file-name))
     (if buf-C-is-alive
 	(setq file-C (ediff-make-temp-file buf-C buf-C-file-name)))
 	  
@@ -1148,9 +1159,8 @@
 The file is the optional FILE argument or the file visited by the current
 buffer."
   (interactive)
-  (ediff-load-version-control)
   (if (stringp file) (find-file file))
-  (let (rev1 rev2 buf1 buf2)
+  (let (rev1 rev2)
     (setq rev1
 	  (read-string
 	   (format
@@ -1163,38 +1173,11 @@
 	    "Version 2 to merge (default: %s): "
 	    (if (stringp file)
 		(file-name-nondirectory file) "current buffer"))))
-    (cond ((eq ediff-version-control-package 'vc)
-	   (save-excursion
-	     (vc-version-other-window rev1)
-	     (setq buf1 (current-buffer)))
-	   (save-excursion
-	     (or (string= rev2 "")
-		 (vc-version-other-window rev2))
-	     (setq buf2 (current-buffer)))
-	   (setq startup-hooks 
-		 (cons 
-		  (` (lambda () 
-		       (delete-file (, (buffer-file-name buf1)))
-		       (or (, (string= rev2 ""))
-			   (delete-file (, (buffer-file-name buf2))))))
-		  startup-hooks)))
-	  ((eq ediff-version-control-package 'rcs)
-	   (setq buf1 (rcs-ediff-view-revision rev1)
-		 buf2 (if (string= rev2 "")
-			  (current-buffer)
-			(rcs-ediff-view-revision rev2))))
-	  ((eq ediff-version-control-package 'generic-sc)
-	   (save-excursion
-	     (if (string= rev1 "")
-		 (setq rev1 (generic-sc-get-latest-rev)))
-	     (sc-visit-previous-revision rev1)
-	     (setq buf1 (current-buffer)))
-	   (save-excursion
-	     (or (string= rev2 "")
-		 (sc-visit-previous-revision rev2))
-	     (setq buf2 (current-buffer))))
-	  ) ; cond
-    (ediff-merge-buffers buf1 buf2 startup-hooks 'ediff-merge-revisions)))
+    (ediff-load-version-control)
+    ;; ancestor-revision=nil
+    (funcall
+     (intern (format "%S-ediff-merge-internal" ediff-version-control-package))
+     rev1 rev2 nil startup-hooks)))
     
 
 ;;;###autoload
@@ -1203,9 +1186,8 @@
 The file is the the optional FILE argument or the file visited by the current
 buffer."
   (interactive)
-  (ediff-load-version-control)
   (if (stringp file) (find-file file))
-  (let (rev1 rev2 ancestor-rev buf1 buf2 ancestor-buf)
+  (let (rev1 rev2 ancestor-rev)
     (setq rev1
 	  (read-string
 	   (format
@@ -1224,53 +1206,22 @@
 	    "Ancestor version (default: %s): "
 	    (if (stringp file)
 		(file-name-nondirectory file) "current buffer"))))
-    (cond ((eq ediff-version-control-package 'vc)
-	   (save-excursion
-	     (vc-version-other-window rev1)
-	     (setq buf1 (current-buffer)))
-	   (save-excursion
-	     (or (string= rev2 "")
-		 (vc-version-other-window rev2))
-	     (setq buf2 (current-buffer)))
-	   (save-excursion
-	     (or (string= ancestor-rev "")
-		 (vc-version-other-window ancestor-rev))
-	     (setq ancestor-buf (current-buffer)))
-	   (setq startup-hooks 
-		 (cons
-		  (` (lambda () 
-		       (delete-file (, (buffer-file-name buf1)))
-		       (or (, (string= rev2 ""))
-			   (delete-file (, (buffer-file-name buf2))))
-		       (or (, (string= ancestor-rev ""))
-			   (delete-file (, (buffer-file-name ancestor-buf))))))
-		  startup-hooks)))
-	  ((eq ediff-version-control-package 'rcs)
-	   (setq buf1 (rcs-ediff-view-revision rev1)
-		 buf2 (if (string= rev2 "")
-			  (current-buffer)
-			(rcs-ediff-view-revision rev2))
-		 ancestor-buf (if (string= ancestor-rev "")
-				  (current-buffer)
-				(rcs-ediff-view-revision ancestor-rev))))
-	  ((eq ediff-version-control-package 'generic-sc)
-	   (save-excursion
-	     (if (string= rev1 "")
-		 (setq rev1 (generic-sc-get-latest-rev)))
-	     (sc-visit-previous-revision rev1)
-	     (setq buf1 (current-buffer)))
-	   (save-excursion
-	     (or (string= rev2 "")
-		 (sc-visit-previous-revision rev2))
-	     (setq buf2 (current-buffer)))
-	   (save-excursion
-	     (or (string= ancestor-rev "")
-		 (sc-visit-previous-revision ancestor-rev))
-	     (setq ancestor-buf (current-buffer))))
-	  ) ; cond
-    (ediff-merge-buffers-with-ancestor
-     buf1 buf2 ancestor-buf
-     startup-hooks 'ediff-merge-revisions-with-ancestor)))
+    (ediff-load-version-control)
+    (funcall
+     (intern (format "%S-ediff-merge-internal" ediff-version-control-package))
+     rev1 rev2 ancestor-rev startup-hooks)))
+
+;;;###autoload
+(defun run-ediff-from-cvs-buffer (pos)
+  "Run Ediff-merge on appropriate revisions of the selected file.
+First run after `M-x cvs-update'. Then place the cursor on a lide describing a
+file and then run `run-ediff-from-cvs-buffer'."
+  (interactive "d")
+  (ediff-load-version-control)
+  (let ((tin (tin-locate cvs-cookie-handle pos)))
+    (if tin
+	(cvs-run-ediff-on-file-descriptor tin)
+      (error "There is no file to merge"))))
      
      
 ;;; Apply patch
@@ -1369,6 +1320,7 @@
 ;; Test if version control package is loaded and load if not
 ;; Is SILENT is non-nil, don't report error if package is not found.
 (defun ediff-load-version-control (&optional silent)
+  (require 'ediff-vers)
   (or (featurep ediff-version-control-package)
       (if (locate-library (symbol-name ediff-version-control-package))
 	  (progn
@@ -1378,105 +1330,6 @@
 	    (error "Version control package %S.el not found. Use vc.el instead"
 		   ediff-version-control-package)))))
 
-      
-(defun vc-ediff-internal (rev1 rev2 &optional startup-hooks)
-  "Run Ediff on versions of the current buffer.
-If REV2 is \"\" then compare current buffer with REV1.
-If the current buffer is named `F', the version is named `F.~REV~'.
-If `F.~REV~' already exists, it is used instead of being re-created."
-  (let (file1 file2 rev1buf rev2buf)
-    (save-excursion
-      (vc-version-other-window rev1)
-      (setq rev1buf (current-buffer)
-	    file1 (buffer-file-name)))
-    (save-excursion
-      (or (string= rev2 "") 		; use current buffer
-	  (vc-version-other-window rev2))
-      (setq rev2buf (current-buffer)
-	    file2 (buffer-file-name)))
-    (setq startup-hooks
-	  (cons (` (lambda ()
-		     (delete-file (, file1))
-		     (or (, (string= rev2 "")) (delete-file (, file2)))
-		     ))
-		startup-hooks))
-    (ediff-buffers
-     rev1buf rev2buf
-     startup-hooks
-     'ediff-revision)))
-    
-(defun rcs-ediff-view-revision (&optional rev)
-  "View previous RCS revision of current file.
-With prefix argument, prompts for a revision name." 
-  (interactive (list (if current-prefix-arg 
-			 (read-string "Revision: "))))
-  (let* ((filename (buffer-file-name (current-buffer)))
-	 (switches (append '("-p")
-			   (if rev (list (concat "-r" rev)) nil)))
-	 (buff (concat (file-name-nondirectory filename) ".~" rev "~")))
-    (message "Working ...")
-    (setq filename (expand-file-name filename))
-    (with-output-to-temp-buffer buff
-      (let ((output-buffer (ediff-rcs-get-output-buffer filename buff)))
-	(delete-windows-on output-buffer)
-	(save-excursion
-	  (set-buffer output-buffer)
-	  (apply 'call-process "co" nil t nil
-		 ;; -q: quiet (no diagnostics)
-		 (append switches rcs-default-co-switches
-			 (list "-q" filename))))) 
-      (message "")
-      buff)))    
-      
-(defun ediff-rcs-get-output-buffer (file name)
-  ;; Get a buffer for RCS output for FILE, make it writable and clean it up.
-  ;; Optional NAME is name to use instead of `*RCS-output*'.
-  ;; This is a modified version from rcs.el v1.1. I use it here to make
-  ;; Ediff immune to changes in rcs.el
-  (let* ((default-major-mode 'fundamental-mode) ; no frills!
-	 (buf (get-buffer-create name)))
-    (save-excursion
-      (set-buffer buf)
-      (setq buffer-read-only nil
-	    default-directory (file-name-directory (expand-file-name file)))
-      (erase-buffer))
-    buf))
-
-(defun rcs-ediff-internal (rev1 rev2 &optional startup-hooks)
-  "Run Ediff on versions of the current buffer.
-If REV2 is \"\" then use current buffer."
-  (let ((rev2buf (if (string= rev2 "")
-		     (current-buffer)
-		   (rcs-ediff-view-revision rev2)))
-	(rev1buf (rcs-ediff-view-revision rev1)))
-	
-    ;; rcs.el doesn't create temp version files, so we don't have to delete
-    ;; anything in startup hooks to ediff-buffers
-    (ediff-buffers rev1buf rev2buf startup-hooks 'ediff-revision)
-    ))
-
-(defun generic-sc-get-latest-rev ()
-  (cond ((eq sc-mode 'CCASE)
-	 (eval "main/LATEST"))
-	(t (eval "")))
-  )
-
-(defun generic-sc-ediff-internal (rev1 rev2 &optional startup-hooks)
-  "Run Ediff on versions of the current buffer.
-If REV2 is \"\" then compare current buffer with REV1.
-If the current buffer is named `F', the version is named `F.~REV~'.
-If `F.~REV~' already exists, it is used instead of being re-created."
-  (let (rev1buf rev2buf)
-    (save-excursion
-      (if (or (not rev1) (string= rev1 ""))
-	  (setq rev1 (generic-sc-get-latest-rev)))
-      (sc-visit-previous-revision rev1)
-      (setq rev1buf (current-buffer)))
-    (save-excursion
-      (or (string= rev2 "") 		; use current buffer
-	  (sc-visit-previous-revision rev2))
-      (setq rev2buf (current-buffer)))
-    (ediff-buffers rev1buf rev2buf startup-hooks 'ediff-revision)))
 
 ;;;###autoload
 (defun ediff-version ()
@@ -1488,6 +1341,40 @@
     (format "Ediff %s of %s" ediff-version ediff-date)))
 
 
+;;;###autoload
+(defun ediff-documentation ()
+  "Jump to Ediff's Info file."
+  (interactive)
+  (let ((ctl-window ediff-control-window)
+	(ctl-buf ediff-control-buffer))
+
+    (ediff-skip-unsuitable-frames)
+    (condition-case nil
+	(progn
+	  (pop-to-buffer (get-buffer-create "*info*"))
+	  (info (if ediff-xemacs-p "ediff.info" "ediff"))
+	  (message "Type `i' to search for a specific topic"))
+      (error (beep 1)
+	     (with-output-to-temp-buffer " *ediff-info*"
+	       (princ (format "
+The Info file for Ediff does not seem to be installed.
+
+This file is part of the distribution of %sEmacs.
+Please contact your system administrator. "
+			      (if ediff-xemacs-p "X" ""))))
+	     (if (window-live-p ctl-window)
+		 (progn
+		   (select-window ctl-window)
+		   (set-window-buffer ctl-window ctl-buf)))))))
+    
+
+
+
+;;; Local Variables:
+;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
+;;; eval: (put 'ediff-eval-in-buffer 'lisp-indent-hook 1)
+;;; End:
+
 (provide 'ediff)
 (require 'ediff-util)
 
--- a/lisp/emulation/viper-ex.el	Fri Feb 16 05:25:08 1996 +0000
+++ b/lisp/emulation/viper-ex.el	Fri Feb 16 06:36:35 1996 +0000
@@ -1992,4 +1992,4 @@
 
 (provide 'viper-ex)
 
-;;;  viper-ex.el ends here
\ No newline at end of file
+;;;  viper-ex.el ends here