diff options
author | Ori Bernstein <ori@eigenstate.org> | 2020-09-21 09:40:42 -0700 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2020-09-21 09:40:42 -0700 |
commit | 8fe1d622b5b46dee51db6581282ec1fba76782b1 (patch) | |
tree | d7dca8fed3bc7ecf6e4fe1cb8e83fb0463befb71 /sys/src/cmd/diff | |
parent | aa7c8cac1145d0cd6e9117deaa1f8c9f418bca17 (diff) |
diff: support unified diff via -u
The format produced by `diff -u` is inferior to that
produced by `diff -c`, but it's what ape/patch and
unix patch expect, so it's useful to generate it.
This patch adds `diff -u`.
Diffstat (limited to 'sys/src/cmd/diff')
-rw-r--r-- | sys/src/cmd/diff/diff.h | 1 | ||||
-rw-r--r-- | sys/src/cmd/diff/diffio.c | 34 | ||||
-rw-r--r-- | sys/src/cmd/diff/diffreg.c | 1 | ||||
-rw-r--r-- | sys/src/cmd/diff/main.c | 1 |
4 files changed, 27 insertions, 10 deletions
diff --git a/sys/src/cmd/diff/diff.h b/sys/src/cmd/diff/diff.h index 76fe050df..34a5dc010 100644 --- a/sys/src/cmd/diff/diff.h +++ b/sys/src/cmd/diff/diff.h @@ -22,5 +22,6 @@ Biobuf *prepare(int, char *); void panic(int, char *, ...); void check(Biobuf *, Biobuf *); void change(int, int, int, int); +void fileheader(void); void flushchanges(void); diff --git a/sys/src/cmd/diff/diffio.c b/sys/src/cmd/diff/diffio.c index 640f2d2ba..d937b1fef 100644 --- a/sys/src/cmd/diff/diffio.c +++ b/sys/src/cmd/diff/diffio.c @@ -303,6 +303,7 @@ change(int a, int b, int c, int d) break; case 'c': case 'a': + case 'u': if(nchanges%1024 == 0) changes = erealloc(changes, (nchanges+1024)*sizeof(changes[0])); ch = &changes[nchanges++]; @@ -339,6 +340,15 @@ changeset(int i) } void +fileheader(void) +{ + if(mode != 'u') + return; + Bprint(&stdout, "--- %s\n", file1); + Bprint(&stdout, "+++ %s\n", file2); +} + +void flushchanges(void) { int a, b, c, d, at; @@ -368,20 +378,24 @@ flushchanges(void) d = len[1]; j = nchanges; } - Bprint(&stdout, "%s:", file1); - range(a, b, ","); - Bprint(&stdout, " - "); - Bprint(&stdout, "%s:", file2); - range(c, d, ","); - Bputc(&stdout, '\n'); + if(mode == 'u'){ + Bprint(&stdout, "@@ -%d,%d +%d,%d @@\n", a, b-a+1, c, d-c+1); + }else{ + Bprint(&stdout, "%s:", file1); + range(a, b, ","); + Bprint(&stdout, " - "); + Bprint(&stdout, "%s:", file2); + range(c, d, ","); + Bputc(&stdout, '\n'); + } at = a; 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], "+ "); + fetch(ixold, at, changes[i].a-1, input[0], mode == 'u' ? " " : " "); + fetch(ixold, changes[i].a, changes[i].b, input[0], mode == 'u' ? "-" : "- "); + fetch(ixnew, changes[i].c, changes[i].d, input[1], mode == 'u' ? "+" : "- "); at = changes[i].b+1; } - fetch(ixold, at, b, input[0], " "); + fetch(ixold, at, b, input[0], mode == 'u' ? " " : " "); } nchanges = 0; } diff --git a/sys/src/cmd/diff/diffreg.c b/sys/src/cmd/diff/diffreg.c index 7ef855994..6f6f144fc 100644 --- a/sys/src/cmd/diff/diffreg.c +++ b/sys/src/cmd/diff/diffreg.c @@ -285,6 +285,7 @@ output(void) m = len[0]; J[0] = 0; J[m+1] = len[1]+1; + fileheader(); if (mode != 'e') { for (i0 = 1; i0 <= m; i0 = i1+1) { while (i0 <= m && J[i0] == J[i0-1]+1) diff --git a/sys/src/cmd/diff/main.c b/sys/src/cmd/diff/main.c index 054f4c878..a25168cec 100644 --- a/sys/src/cmd/diff/main.c +++ b/sys/src/cmd/diff/main.c @@ -192,6 +192,7 @@ main(int argc, char *argv[]) case 'n': case 'c': case 'a': + case 'u': mode = *p; break; |