diff: implement flag -B (Ignore changes whose lines are all blank)
authorMatheus Izvekov <mizvekov@gmail.com>
Mon, 18 Jan 2010 18:07:07 +0000 (16:07 -0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 20 Jan 2010 01:45:05 +0000 (02:45 +0100)
>>From 7c3ce93213590bd0592435dc27d1272d0fd3309b Mon Sep 17 00:00:00 2001
From: Matheus Izvekov <mizvekov@gmail.com>
Date: Mon, 18 Jan 2010 15:52:31 -0200
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@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
editors/diff.c
include/usage.h

index ef203052781fb04788d6c1dc40294e00e8047c5b..772610477ea66c880f89e37b09769c1a5ec4296e 100644 (file)
 #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) {
index 168d6e1e5a2856937b3811b68b3351123a47cb3d..7b85642786ef8a76c73b9632a7bf1ea4cc50469e 100644 (file)
        "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" \