[git commit master] diff: implement flag -B (Ignore changes whose lines are all blank)

Denys Vlasenko vda.linux at googlemail.com
Wed Jan 20 01:46:39 UTC 2010


commit: http://git.busybox.net/busybox/commit/?id=fe1ce2e43e612d7b07118cf139a8b61d76bea893
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

>>From 7c3ce93213590bd0592435dc27d1272d0fd3309b Mon Sep 17 00:00:00 2001
From: Denys Vlasenko <vda.linux at googlemail.com>
Date: Wed, 20 Jan 2010 02:46:39 +0100
Subject: [PATCH] diff: implement flag -B (Ignore changes whose lines are all blank)

function                                             old     new   delta
diffreg                                             1196    1240     +44
.rodata                                             6538    6561     +23
packed_usage                                         457     478     +21
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 88/0)               Total: 88 bytes
   text	   data	    bss	    dec	    hex	filename
  70123	    733	   8576	  79432	  13648	busybox_old
  70190	    733	   8576	  79499	  1368b	busybox_unstripped

Signed-off-by: Matheus Izvekov <mizvekov at gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 editors/diff.c  |   28 +++++++++++++++++-----------
 include/usage.h |    3 ++-
 2 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/editors/diff.c b/editors/diff.c
index ef20305..7726104 100644
--- a/editors/diff.c
+++ b/editors/diff.c
@@ -84,27 +84,31 @@
 #define dbg_error_msg(...) ((void)0)
 #endif
 
-enum {                   /* print_status() and diffreg() return values */
-	STATUS_SAME,     /* files are the same */
-	STATUS_DIFFER,   /* files differ */
-	STATUS_BINARY,   /* binary files differ */
+enum {                  /* print_status() and diffreg() return values */
+	STATUS_SAME,    /* files are the same */
+	STATUS_DIFFER,  /* files differ */
+	STATUS_BINARY,  /* binary files differ */
 };
 
-enum {                   /* Commandline flags */
+enum {                  /* Commandline flags */
 	FLAG_a,
 	FLAG_b,
 	FLAG_d,
 	FLAG_i,
-	FLAG_L, /* unused */
+	FLAG_L,         /* never used, handled by getopt32 */
 	FLAG_N,
 	FLAG_q,
 	FLAG_r,
 	FLAG_s,
-	FLAG_S, /* unused */
+	FLAG_S,         /* never used, handled by getopt32 */
 	FLAG_t,
 	FLAG_T,
-	FLAG_U, /* unused */
+	FLAG_U,         /* never used, handled by getopt32 */
 	FLAG_w,
+	FLAG_u,         /* ignored, this is the default */
+	FLAG_p,         /* not implemented */
+	FLAG_B,
+	FLAG_E,         /* not implemented */
 };
 #define FLAG(x) (1 << FLAG_##x)
 
@@ -578,6 +582,8 @@ static bool diff(FILE_and_pos_t ft[2], char *file[2])
 	int idx = -1, i = 1;
 
 	do {
+		bool nonempty = false;
+
 		while (1) {
 			struct context_vec v;
 
@@ -606,6 +612,7 @@ static bool diff(FILE_and_pos_t ft[2], char *file[2])
 				) {
 					break;
 				}
+				nonempty |= (v.a >= v.b) && (v.c >= v.d);
 				vec = xrealloc_vector(vec, 6, ++idx);
 				vec[idx] = v;
 			}
@@ -617,7 +624,7 @@ static bool diff(FILE_and_pos_t ft[2], char *file[2])
 		}
 		if (idx < 0)
 			continue;
-		if (!(option_mask32 & FLAG(q))) {
+		if (!(option_mask32 & FLAG(q)) && !((option_mask32 & FLAG(B)) && !nonempty)) {
 			struct context_vec *cvp = vec;
 			int lowa = MAX(1, cvp->a - opt_U_context);
 			int upb  = MIN(nlen[0], vec[idx].b + opt_U_context);
@@ -880,8 +887,7 @@ int diff_main(int argc UNUSED_PARAM, char **argv)
 
 	/* exactly 2 params; collect multiple -L <label>; -U N */
 	opt_complementary = "=2:L::U+";
-	getopt32(argv, "abdiL:NqrsS:tTU:wu"
-			"p" /* ignored (for compatibility) */,
+	getopt32(argv, "abdiL:NqrsS:tTU:wupBE",
 			&L_arg, &s_start, &opt_U_context);
 	argv += optind;
 	while (L_arg) {
diff --git a/include/usage.h b/include/usage.h
index 168d6e1..7b85642 100644
--- a/include/usage.h
+++ b/include/usage.h
@@ -852,13 +852,14 @@
        "Relay DHCP requests between clients and server" \
 
 #define diff_trivial_usage \
-       "[-abdiNqrTstw] [-L LABEL] [-S FILE] [-U LINES] FILE1 FILE2"
+       "[-abBdiNqrTstw] [-L LABEL] [-S FILE] [-U LINES] FILE1 FILE2"
 #define diff_full_usage "\n\n" \
        "Compare files line by line and output the differences between them.\n" \
        "This implementation supports unified diffs only.\n" \
      "\nOptions:" \
      "\n	-a	Treat all files as text" \
      "\n	-b	Ignore changes in the amount of whitespace" \
+     "\n	-B	Ignore changes whose lines are all blank" \
      "\n	-d	Try hard to find a smaller set of changes" \
      "\n	-i	Ignore case differences" \
      "\n	-L	Use LABEL instead of the filename in the unified header" \
-- 
1.6.3.3



More information about the busybox-cvs mailing list