add diff -a

This commit is contained in:
rsc 2005-01-29 16:50:51 +00:00
parent 33baa59ecc
commit a2d6635774
2 changed files with 30 additions and 13 deletions

View file

@ -302,6 +302,7 @@ change(int a, int b, int c, int d)
range(a, b, " "); range(a, b, " ");
break; break;
case 'c': case 'c':
case 'a':
if(nchanges%1024 == 0) if(nchanges%1024 == 0)
changes = erealloc(changes, (nchanges+1024)*sizeof(changes[0])); changes = erealloc(changes, (nchanges+1024)*sizeof(changes[0]));
ch = &changes[nchanges++]; ch = &changes[nchanges++];
@ -348,24 +349,39 @@ flushchanges(void)
for(i=0; i<nchanges; ){ for(i=0; i<nchanges; ){
j = changeset(i); j = changeset(i);
a = changes[i].a; a = changes[i].a-Lines;
b = changes[j-1].b; b = changes[j-1].b+Lines;
c = changes[i].c; c = changes[i].c-Lines;
d = changes[j-1].d; d = changes[j-1].d+Lines;
if(a < 1)
a = 1;
if(c < 1)
c = 1;
if(b > len[0])
b = len[0];
if(d > len[1])
d = len[1];
if(mode == 'a'){
a = 1;
b = len[0];
c = 1;
d = len[1];
j = nchanges;
}
Bprint(&stdout, "%s:", file1); Bprint(&stdout, "%s:", file1);
range(a, b, ","); range(a, b, ",");
Bprint(&stdout, " - "); Bprint(&stdout, " - ");
Bprint(&stdout, "%s:", file2); Bprint(&stdout, "%s:", file2);
range(c, d, ","); range(c, d, ",");
Bputc(&stdout, '\n'); Bputc(&stdout, '\n');
at = a-Lines; at = a;
for(; i<j; i++){ for(; i<j; i++){
fetch(ixold, at, changes[i].a-1, input[0], " "); fetch(ixold, at, changes[i].a-1, input[0], " ");
fetch(ixold, changes[i].a, changes[i].b, input[0], "< "); fetch(ixold, changes[i].a, changes[i].b, input[0], "< ");
fetch(ixnew, changes[i].c, changes[i].d, input[1], "> "); fetch(ixnew, changes[i].c, changes[i].d, input[1], "> ");
at = changes[i].b+1; at = changes[i].b+1;
} }
fetch(ixold, at, b+Lines, input[0], " "); fetch(ixold, at, b, input[0], " ");
} }
nchanges = 0; nchanges = 0;
} }

View file

@ -8,7 +8,7 @@
Biobuf stdout; Biobuf stdout;
static char *tmp[] = {"/tmp/diff1", "/tmp/diff2"}; static char *tmp[] = {"/tmp/diff1XXXXXXXXXXX", "/tmp/diff2XXXXXXXXXXX"};
static int whichtmp; static int whichtmp;
static char *progname; static char *progname;
static char usage[] = "diff [ -efmnbwr ] file1 ... file2\n"; static char usage[] = "diff [ -efmnbwr ] file1 ... file2\n";
@ -26,8 +26,6 @@ void
done(int status) done(int status)
{ {
rmtmpfiles(); rmtmpfiles();
Bflush(&stdout);
Bterm(&stdout);
switch(status) switch(status)
{ {
case 0: case 0:
@ -83,8 +81,11 @@ mktmpfile(int input, Dir **sb)
char buf[8192]; char buf[8192];
atnotify(catch, 1); atnotify(catch, 1);
p = tmp[whichtmp++]; /*
p = mktemp(tmp[whichtmp++]);
fd = create(p, OWRITE, 0600); fd = create(p, OWRITE, 0600);
*/
fd = mkstemp(p=tmp[whichtmp++]);
if (fd < 0) { if (fd < 0) {
panic(mflag ? 0: 2, "cannot create %s: %r\n", p); panic(mflag ? 0: 2, "cannot create %s: %r\n", p);
return 0; return 0;
@ -172,7 +173,6 @@ diff(char *f, char *t, int level)
} }
free(fsb); free(fsb);
free(tsb); free(tsb);
Return: Return:
rmtmpfiles(); rmtmpfiles();
} }
@ -189,10 +189,12 @@ main(int argc, char *argv[])
while (--argc && (*++argv)[0] == '-' && (*argv)[1]) { while (--argc && (*++argv)[0] == '-' && (*argv)[1]) {
for (p = *argv+1; *p; p++) { for (p = *argv+1; *p; p++) {
switch (*p) { switch (*p) {
case 'c':
case 'e': case 'e':
case 'f': case 'f':
case 'n': case 'n':
case 'c':
case 'a':
mode = *p; mode = *p;
break; break;
@ -238,7 +240,6 @@ main(int argc, char *argv[])
free(tsb); free(tsb);
for (i = 0; i < argc-1; i++) for (i = 0; i < argc-1; i++)
diff(argv[i], argv[argc-1], 0); diff(argv[i], argv[argc-1], 0);
done(anychange); done(anychange);
/*NOTREACHED*/ /*NOTREACHED*/
} }