add -c option
This commit is contained in:
parent
57d2613621
commit
4ac5f249ad
4 changed files with 88 additions and 2 deletions
|
|
@ -4,7 +4,7 @@ diff \- differential file comparator
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B diff
|
.B diff
|
||||||
[
|
[
|
||||||
.B -efmnbwr
|
.B -cefmnbwr
|
||||||
] file1 ... file2
|
] file1 ... file2
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.I Diff
|
.I Diff
|
||||||
|
|
@ -123,6 +123,11 @@ not useful with
|
||||||
in the opposite order. It may, however, be
|
in the opposite order. It may, however, be
|
||||||
useful as input to a stream-oriented post-processor.
|
useful as input to a stream-oriented post-processor.
|
||||||
.PP
|
.PP
|
||||||
|
The
|
||||||
|
.B -c
|
||||||
|
option includes three lines of context around each
|
||||||
|
change, merging changes whose contexts overlap.
|
||||||
|
.PP
|
||||||
Except in rare circumstances,
|
Except in rare circumstances,
|
||||||
.I diff
|
.I diff
|
||||||
finds a smallest sufficient set of file
|
finds a smallest sufficient set of file
|
||||||
|
|
|
||||||
|
|
@ -24,4 +24,4 @@ Biobuf *prepare(int, char *);
|
||||||
void panic(int, char *, ...);
|
void panic(int, char *, ...);
|
||||||
void check(Biobuf *, Biobuf *);
|
void check(Biobuf *, Biobuf *);
|
||||||
void change(int, int, int, int);
|
void change(int, int, int, int);
|
||||||
|
void flushchanges(void);
|
||||||
|
|
|
||||||
|
|
@ -226,7 +226,18 @@ static void
|
||||||
fetch(long *f, int a, int b, Biobuf *bp, char *s)
|
fetch(long *f, int a, int b, Biobuf *bp, char *s)
|
||||||
{
|
{
|
||||||
char buf[MAXLINELEN];
|
char buf[MAXLINELEN];
|
||||||
|
int maxb;
|
||||||
|
|
||||||
|
if(a <= 1)
|
||||||
|
a = 1;
|
||||||
|
if(bp == input[0])
|
||||||
|
maxb = len[0];
|
||||||
|
else
|
||||||
|
maxb = len[1];
|
||||||
|
if(b > maxb)
|
||||||
|
b = maxb;
|
||||||
|
if(a > maxb)
|
||||||
|
return;
|
||||||
Bseek(bp, f[a-1], 0);
|
Bseek(bp, f[a-1], 0);
|
||||||
while (a++ <= b) {
|
while (a++ <= b) {
|
||||||
readline(bp, buf);
|
readline(bp, buf);
|
||||||
|
|
@ -234,11 +245,24 @@ fetch(long *f, int a, int b, Biobuf *bp, char *s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct Change Change;
|
||||||
|
struct Change
|
||||||
|
{
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
int c;
|
||||||
|
int d;
|
||||||
|
};
|
||||||
|
|
||||||
|
Change *changes;
|
||||||
|
int nchanges;
|
||||||
|
|
||||||
void
|
void
|
||||||
change(int a, int b, int c, int d)
|
change(int a, int b, int c, int d)
|
||||||
{
|
{
|
||||||
char verb;
|
char verb;
|
||||||
char buf[4];
|
char buf[4];
|
||||||
|
Change *ch;
|
||||||
|
|
||||||
if (a > b && c > d)
|
if (a > b && c > d)
|
||||||
return;
|
return;
|
||||||
|
|
@ -277,6 +301,15 @@ change(int a, int b, int c, int d)
|
||||||
Bputc(&stdout, verb);
|
Bputc(&stdout, verb);
|
||||||
range(a, b, " ");
|
range(a, b, " ");
|
||||||
break;
|
break;
|
||||||
|
case 'c':
|
||||||
|
if(nchanges%1024 == 0)
|
||||||
|
changes = erealloc(changes, (nchanges+1024)*sizeof(changes[0]));
|
||||||
|
ch = &changes[nchanges++];
|
||||||
|
ch->a = a;
|
||||||
|
ch->b = b;
|
||||||
|
ch->c = c;
|
||||||
|
ch->d = d;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
Bputc(&stdout, '\n');
|
Bputc(&stdout, '\n');
|
||||||
if (mode == 0 || mode == 'n') {
|
if (mode == 0 || mode == 'n') {
|
||||||
|
|
@ -289,3 +322,50 @@ change(int a, int b, int c, int d)
|
||||||
Bprint(&stdout, ".\n");
|
Bprint(&stdout, ".\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
Lines = 3, /* number of lines of context shown */
|
||||||
|
};
|
||||||
|
|
||||||
|
int
|
||||||
|
changeset(int i)
|
||||||
|
{
|
||||||
|
while(i<nchanges && changes[i].b+1+2*Lines > changes[i+1].a)
|
||||||
|
i++;
|
||||||
|
if(i<nchanges)
|
||||||
|
return i+1;
|
||||||
|
return nchanges;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
flushchanges(void)
|
||||||
|
{
|
||||||
|
int a, b, c, d, at;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
if(nchanges == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(i=0; i<nchanges; ){
|
||||||
|
j = changeset(i);
|
||||||
|
a = changes[i].a;
|
||||||
|
b = changes[j-1].b;
|
||||||
|
c = changes[i].c;
|
||||||
|
d = changes[j-1].d;
|
||||||
|
Bprint(&stdout, "%s:", file1);
|
||||||
|
range(a, b, ",");
|
||||||
|
Bprint(&stdout, " - ");
|
||||||
|
Bprint(&stdout, "%s:", file2);
|
||||||
|
range(c, d, ",");
|
||||||
|
Bputc(&stdout, '\n');
|
||||||
|
at = a-Lines;
|
||||||
|
for(; i<j; i++){
|
||||||
|
fetch(ixold, at, changes[i].a-1, input[0], " ");
|
||||||
|
fetch(ixold, changes[i].a, changes[i].b, input[0], "< ");
|
||||||
|
fetch(ixnew, changes[i].c, changes[i].d, input[1], "> ");
|
||||||
|
at = changes[i].b+1;
|
||||||
|
}
|
||||||
|
fetch(ixold, at, b+Lines, input[0], " ");
|
||||||
|
}
|
||||||
|
nchanges = 0;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -313,6 +313,7 @@ output(void)
|
||||||
}
|
}
|
||||||
if (m == 0)
|
if (m == 0)
|
||||||
change(1, 0, 1, len[1]);
|
change(1, 0, 1, len[1]);
|
||||||
|
flushchanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BUF 4096
|
#define BUF 4096
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue