Index: lib/c-stack.c
--- lib/c-stack.c.orig	2004-03-08 00:51:09 +0100
+++ lib/c-stack.c	2007-09-24 21:12:08 +0200
@@ -63,6 +63,9 @@
 #include <stdlib.h>
 #include <string.h>
 
+#if defined(__FreeBSD__)
+#include <sys/types.h>
+#endif
 #if HAVE_SYS_RESOURCE_H
 /* Include sys/time.h here, because...
    SunOS-4.1.x <sys/resource.h> fails to include <sys/time.h>.

-----------------------------------------------------------------------------

Add option "-O" to diff3(1) in order to allow one to display information
about the 2nd file (the ancestor/older one) not just under option "-A",
but also under "-E" and "-X". This way one especially can get the
consise output of "-E" (where only "unmerged" conflicts and overlaps are
shown), but still get the verbose information (introduced with "|||||||
<older-name>") about the ancestor/older file in the flagged/marked
output. This way "diff3 -m -E -O" gives one the best resolution chances
on a 3-way merge without having to deal with the useless (already
"merged") information one would get under "diff3 -m -A". --rse 20070924

Index: man/diff3.1
--- man/diff3.1.orig	2004-04-13 09:07:28 +0200
+++ man/diff3.1	2007-09-24 21:42:43 +0200
@@ -38,6 +38,9 @@
 \fB\-a\fR  \fB\-\-text\fR
 Treat all files as text.
 .TP
+\fB\-O\fR
+Always show content of OLDFILE in bracketing output of unmerged changes. (OpenPKG only)
+.TP
 \fB\-\-strip\-trailing\-cr\fR
 Strip trailing carriage return on input.
 .TP
Index: src/diff3.c
--- src/diff3.c.orig	2004-04-12 09:44:35 +0200
+++ src/diff3.c	2007-09-24 21:21:38 +0200
@@ -153,6 +153,9 @@
 /* If nonzero, show information for DIFF_2ND diffs.  */
 static bool show_2nd;
 
+/* If nonzero, show information for DIFF_2ND on overlaps, too. */
+static bool show_2nd_on_overlap;
+
 /* If nonzero, include `:wq' at the end of the script
    to write out the file being edited.   */
 static bool finalwrite;
@@ -234,7 +237,7 @@
   textdomain (PACKAGE);
   c_stack_action (0);
 
-  while ((c = getopt_long (argc, argv, "aeimvx3AEL:TX", longopts, 0)) != -1)
+  while ((c = getopt_long (argc, argv, "aeimvx3AEL:TXO", longopts, 0)) != -1)
     {
       switch (c)
 	{
@@ -269,6 +272,9 @@
 	case 'e':
 	  incompat++;
 	  break;
+	case 'O':
+	  show_2nd_on_overlap = true;
+	  break;
 	case 'T':
 	  initial_tab = true;
 	  break;
@@ -1527,7 +1533,7 @@
 	  leading_dot = false;
 	  if (type == DIFF_ALL)
 	    {
-	      if (show_2nd)
+	      if (show_2nd || show_2nd_on_overlap)
 		{
 		  /* Append lines from FILE1.  */
 		  fprintf (outputfile, "||||||| %s\n", file1);
@@ -1665,7 +1671,7 @@
 			D_RELLEN (b, mapping[FILE0], i), outputfile);
 	    }
 
-	  if (show_2nd)
+	  if (show_2nd || show_2nd_on_overlap)
 	    {
 	      /* Put in lines from FILE1 with bracket.  */
 	      fprintf (outputfile, format_2nd, file1);

