diff: implement flag -B (Ignore changes whose lines are all blank)
No binary (build failed)
—
(log yok)
| @@ -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) { | |
| @@ -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" \ | |