mirror of
https://github.com/sheumann/hush.git
synced 2024-12-25 03:32:18 +00:00
- patch from Rob Sullivan to add support for -L
This commit is contained in:
parent
5fb0fecc1f
commit
bc14214018
100
coreutils/diff.c
100
coreutils/diff.c
@ -88,15 +88,16 @@ static unsigned long cmd_flags;
|
||||
#define FLAG_b (1<<1)
|
||||
#define FLAG_d (1<<2)
|
||||
#define FLAG_i (1<<3)
|
||||
#define FLAG_N (1<<4)
|
||||
#define FLAG_q (1<<5)
|
||||
#define FLAG_r (1<<6)
|
||||
#define FLAG_s (1<<7)
|
||||
#define FLAG_S (1<<8)
|
||||
#define FLAG_t (1<<9)
|
||||
#define FLAG_T (1<<10)
|
||||
#define FLAG_U (1<<11)
|
||||
#define FLAG_w (1<<12)
|
||||
#define FLAG_L (1<<4)
|
||||
#define FLAG_N (1<<5)
|
||||
#define FLAG_q (1<<6)
|
||||
#define FLAG_r (1<<7)
|
||||
#define FLAG_s (1<<8)
|
||||
#define FLAG_S (1<<9)
|
||||
#define FLAG_t (1<<10)
|
||||
#define FLAG_T (1<<11)
|
||||
#define FLAG_U (1<<12)
|
||||
#define FLAG_w (1<<13)
|
||||
|
||||
int context, status;
|
||||
char *start, *label[2];
|
||||
@ -376,7 +377,6 @@ static int isqrt(int n) {
|
||||
return (x);
|
||||
}
|
||||
|
||||
|
||||
static int newcand(int x, int y, int pred)
|
||||
{
|
||||
struct cand *q;
|
||||
@ -422,10 +422,10 @@ static int stone(int *a, int n, int *b, int *c)
|
||||
int i, k, y, j, l;
|
||||
int oldc, tc, oldl;
|
||||
u_int numtries;
|
||||
#ifdef CONFIG_FEATURE_DIFF_MINIMAL
|
||||
const u_int bound = (cmd_flags & FLAG_d) ? UINT_MAX : MAX(256, isqrt(n));
|
||||
#if ENABLE_FEATURE_DIFF_MINIMAL
|
||||
const u_int bound = (cmd_flags & FLAG_d) ? UINT_MAX : MAX(256, isqrt(n));
|
||||
#else
|
||||
const u_int bound = MAX(256, isqrt(n));
|
||||
const u_int bound = MAX(256, isqrt(n));
|
||||
#endif
|
||||
k = 0;
|
||||
c[0] = newcand(0, 0, 0);
|
||||
@ -672,7 +672,7 @@ static int fetch(long *f, int a, int b, FILE *lb, int ch)
|
||||
|
||||
static int asciifile(FILE *f)
|
||||
{
|
||||
#ifdef CONFIG_FEATURE_DIFF_BINARY
|
||||
#if ENABLE_FEATURE_DIFF_BINARY
|
||||
unsigned char buf[BUFSIZ];
|
||||
int i, cnt;
|
||||
#endif
|
||||
@ -680,14 +680,16 @@ static int asciifile(FILE *f)
|
||||
if ((cmd_flags & FLAG_a) || f == NULL)
|
||||
return (1);
|
||||
|
||||
#ifdef CONFIG_FEATURE_DIFF_BINARY
|
||||
#if ENABLE_FEATURE_DIFF_BINARY
|
||||
rewind(f);
|
||||
cnt = fread(buf, 1, sizeof(buf), f);
|
||||
for (i = 0; i < cnt; i++)
|
||||
if (!isprint(buf[i]) && !isspace(buf[i]))
|
||||
return (0);
|
||||
cnt = fread(buf, 1, sizeof(buf), f);
|
||||
for (i = 0; i < cnt; i++) {
|
||||
if (!isprint(buf[i]) && !isspace(buf[i])) {
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return (1);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* dump accumulated "unified" diff changes */
|
||||
@ -837,7 +839,10 @@ static void change(char *file1, FILE *f1, char *file2, FILE *f2, int a, int b, i
|
||||
|
||||
static void output(char *file1, FILE *f1, char *file2, FILE *f2)
|
||||
{
|
||||
int m, i0, i1, j0, j1;
|
||||
|
||||
/* Note that j0 and j1 can't be used as they are defined in math.h.
|
||||
* This also allows the rather amusing variable 'j00'... */
|
||||
int m, i0, i1, j00, j01;
|
||||
|
||||
rewind(f1);
|
||||
rewind(f2);
|
||||
@ -847,13 +852,13 @@ static void output(char *file1, FILE *f1, char *file2, FILE *f2)
|
||||
for (i0 = 1; i0 <= m; i0 = i1 + 1) {
|
||||
while (i0 <= m && J[i0] == J[i0 - 1] + 1)
|
||||
i0++;
|
||||
j0 = J[i0 - 1] + 1;
|
||||
j00 = J[i0 - 1] + 1;
|
||||
i1 = i0 - 1;
|
||||
while (i1 < m && J[i1 + 1] == 0)
|
||||
i1++;
|
||||
j1 = J[i1 + 1] - 1;
|
||||
J[i1] = j1;
|
||||
change(file1, f1, file2, f2, i0, i1, j0, j1);
|
||||
j01 = J[i1 + 1] - 1;
|
||||
J[i1] = j01;
|
||||
change(file1, f1, file2, f2, i0, i1, j00, j01);
|
||||
}
|
||||
if (m == 0) {
|
||||
change(file1, f1, file2, f2, 1, 0, 1, len[1]);
|
||||
@ -1064,7 +1069,7 @@ static void do_diff (char *dir1, char *path1, char *dir2, char *path2) {
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FEATURE_DIFF_DIR
|
||||
#if ENABLE_FEATURE_DIFF_DIR
|
||||
static int dir_strcmp(const void *p1, const void *p2) {
|
||||
return strcmp(*(char * const *)p1, *(char * const *)p2);
|
||||
}
|
||||
@ -1196,13 +1201,36 @@ static void diffdir (char *p1, char *p2) {
|
||||
|
||||
|
||||
|
||||
extern int diff_main(int argc, char **argv) {
|
||||
char *ep;
|
||||
int gotstdin = 0;
|
||||
int diff_main(int argc, char **argv) {
|
||||
char *ep;
|
||||
int gotstdin = 0;
|
||||
|
||||
char *U_opt;
|
||||
cmd_flags = bb_getopt_ulflags(argc, argv, "abdiNqrsS:tTU:wu", &start, &U_opt);
|
||||
|
||||
llist_t *L_arg = NULL;
|
||||
bb_opt_complementally = "L::";
|
||||
cmd_flags = bb_getopt_ulflags(argc, argv, "abdiL:NqrsS:tTU:wu", &L_arg, &start, &U_opt);
|
||||
|
||||
if (cmd_flags & FLAG_L) {
|
||||
while (L_arg) {
|
||||
if (label[0] == NULL)
|
||||
label[0] = L_arg->data;
|
||||
else if (label[1] == NULL)
|
||||
label[1] = L_arg->data;
|
||||
else
|
||||
bb_show_usage();
|
||||
|
||||
L_arg = L_arg->link;
|
||||
}
|
||||
|
||||
/* If both label[0] and label[1] were set, they need to be swapped. */
|
||||
if (label[0] && label[1]) {
|
||||
char *tmp;
|
||||
tmp = label[1];
|
||||
label[1] = label[0];
|
||||
label[0] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
context = 3; /* This is the default number of lines of context. */
|
||||
if (cmd_flags & FLAG_U) {
|
||||
context = strtol(U_opt, &ep, 10);
|
||||
@ -1235,23 +1263,23 @@ extern int diff_main(int argc, char **argv) {
|
||||
if (gotstdin && (S_ISDIR(stb1.st_mode) || S_ISDIR(stb2.st_mode)))
|
||||
bb_error_msg_and_die("Can't compare - to a directory");
|
||||
if (S_ISDIR(stb1.st_mode) && S_ISDIR(stb2.st_mode)) {
|
||||
#ifdef CONFIG_FEATURE_DIFF_DIR
|
||||
#if ENABLE_FEATURE_DIFF_DIR
|
||||
diffdir(argv[0], argv[1]);
|
||||
#else
|
||||
bb_error_msg_and_die("Directory comparison not supported");
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
else {
|
||||
if (S_ISDIR(stb1.st_mode)) {
|
||||
argv[0] = concat_path_file(argv[0], argv[1]);
|
||||
if (stat(argv[0], &stb1) < 0)
|
||||
bb_perror_msg_and_die("Couldn't stat %s", argv[0]);
|
||||
}
|
||||
if (S_ISDIR(stb2.st_mode)) {
|
||||
}
|
||||
if (S_ISDIR(stb2.st_mode)) {
|
||||
argv[1] = concat_path_file(argv[1], argv[0]);
|
||||
if (stat(argv[1], &stb2) < 0)
|
||||
bb_perror_msg_and_die("Couldn't stat %s", argv[1]);
|
||||
}
|
||||
}
|
||||
print_status(diffreg(argv[0], argv[1], 0), argv[0], argv[1], NULL);
|
||||
}
|
||||
exit(status);
|
||||
|
@ -454,7 +454,7 @@
|
||||
"/dev/sda3 8690864 8553540 137324 98% /\n"
|
||||
|
||||
#define diff_trivial_usage \
|
||||
"[-abdiNqrTstw] [-S FILE] [-U LINES] FILE1 FILE2"
|
||||
"[-abdiNqrTstw] [-L LABEL] [-S FILE] [-U LINES] FILE1 FILE2"
|
||||
#define diff_full_usage \
|
||||
"Compare files line by line and output the differences between them.\n" \
|
||||
"This diff implementation only supports unified diffs.\n\n" \
|
||||
@ -463,6 +463,7 @@
|
||||
"\t-b\tIgnore changes in the amount of whitespace\n" \
|
||||
"\t-d\tTry hard to find a smaller set of changes\n" \
|
||||
"\t-i\tIgnore case differences\n" \
|
||||
"\t-L\tUse LABEL instead of the filename in the unified header\n" \
|
||||
"\t-N\tTreat absent files as empty\n" \
|
||||
"\t-q\tOutput only whether files differ\n" \
|
||||
"\t-r\tRecursively compare any subdirectories\n" \
|
||||
|
Loading…
Reference in New Issue
Block a user