Commit Diff


commit - 72311eba1e091f581f894b17962842d212a0a73a
commit + 2b9186217b1d8cca1354498715e7fddb01ccd481
blob - b4a9acb0cdc71e2d714c76d3f510873470cb8236
blob + 222a4a24891b9bbe1b5841616efa323af443afa4
--- diff.1
+++ diff.1
@@ -23,6 +23,8 @@
 .Nd compare files
 .Sh SYNOPSIS
 .Nm diff
+.Op Fl u
+.Op Fl U Ar number
 .Ar file1 file2
 .Sh DESCRIPTION
 The
@@ -32,6 +34,18 @@ utility compares the contents of
 and
 .Ar file2
 line by line.
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl u
+Produces a unified diff with 3 lines of context.
+.It Fl U Ar number
+Similar to
+.Fl u
+with
+.Ar number
+lines of context.
+.El
 .Sh EXIT STATUS
 The
 .Nm
blob - 3344aeac27a0c5d0e85706e5967a72c931ebb1b1
blob + 1052643f3e50a4a715acce0247da56ddc6b786af
--- diff.c
+++ diff.c
@@ -25,6 +25,7 @@
 
 #include <err.h>
 #include <fcntl.h>
+#include <limits.h>
 #include <stdio.h>
 #include <stdint.h>
 #include <stdlib.h>
@@ -32,8 +33,12 @@
 
 #include "diff_main.h"
 
+#define DEFAULT_CONTEXT	3
+
+#define F_UNIFIED	(1 << 0)
+
 __dead void	 usage(void);
-int		 diffreg(char *, char *, int);
+int		 diffreg(char *, char *, int, int);
 char		*mmapfile(const char *, struct stat *);
 
 const struct diff_algo_config myers, patience, myers_divide;
@@ -75,10 +80,21 @@ usage(void)
 int
 main(int argc, char *argv[])
 {
-	int ch;
+	int ch, context = DEFAULT_CONTEXT, flags = 0;
+	long lval;
+	char *ep;
 
-	while ((ch = getopt(argc, argv, "")) != -1) {
+	while ((ch = getopt(argc, argv, "uU:")) != -1) {
 		switch (ch) {
+		case 'U':
+			lval = strtol(optarg, &ep, 10);
+			if (*ep != '\0' || lval < 0 || lval >= INT_MAX)
+				usage();
+			context = (int)lval;
+			/* FALLTHROUGH */
+		case 'u':
+			flags |= F_UNIFIED;
+			break;
 		default:
 			usage();
 		}
@@ -90,11 +106,11 @@ main(int argc, char *argv[])
 	if (argc != 2)
 		usage();
 
-	return diffreg(argv[0], argv[1], 0);
+	return diffreg(argv[0], argv[1], flags, context);
 }
 
 int
-diffreg(char *file1, char *file2, int flags)
+diffreg(char *file1, char *file2, int flags, int context)
 {
 	char *str1, *str2;
 	struct stat st1, st2;
@@ -106,8 +122,12 @@ diffreg(char *file1, char *file2, int flags)
 	str1 = mmapfile(file1, &st1);
 	str2 = mmapfile(file2, &st2);
 
-	diff_unidiff(stdout, &diff_config, &info, str1, st1.st_size, str2,
-	    st2.st_size, 3);
+	if (flags & F_UNIFIED)
+		diff_unidiff(stdout, &diff_config, &info, str1, st1.st_size,
+		    str2, st2.st_size, context);
+	else
+		diff_plain(stdout, &diff_config, &info, str1, st1.st_size,
+		    str2, st2.st_size);
 
 	munmap(str1, st1.st_size);
 	munmap(str2, st2.st_size);
blob - 480a582f5d2848c9cb614cf98532f97a5bfb5ba2
blob + e35c921f7b05f08a48e761caa0c410bfd5525ac9
--- test/verify_all.sh
+++ test/verify_all.sh
@@ -39,7 +39,7 @@ verify_diff_script() {
                         return 1
                 fi
         fi
-        echo "OK: $diff_prog $orig_left $orig_right"
+        echo "OK: $diff_prog -u $orig_left $orig_right"
         return 0
 }
 
@@ -48,7 +48,7 @@ for left in test*.left.* ; do
         expected_diff="$(echo "$left" | sed 's/test\([0-9]*\)\..*/expect\1.diff/')"
         got_diff="verify.$expected_diff"
 
-        "$diff_prog" "$left" "$right" > "$got_diff"
+        "$diff_prog" -u "$left" "$right" > "$got_diff"
 
         set -e
 	verify_diff_script "$left" "$right" "$got_diff"