summaryrefslogtreecommitdiff
path: root/sys/src/cmd/diff
diff options
context:
space:
mode:
authorOri Bernstein <ori@eigenstate.org>2020-09-21 09:40:42 -0700
committerOri Bernstein <ori@eigenstate.org>2020-09-21 09:40:42 -0700
commit8fe1d622b5b46dee51db6581282ec1fba76782b1 (patch)
treed7dca8fed3bc7ecf6e4fe1cb8e83fb0463befb71 /sys/src/cmd/diff
parentaa7c8cac1145d0cd6e9117deaa1f8c9f418bca17 (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.h1
-rw-r--r--sys/src/cmd/diff/diffio.c34
-rw-r--r--sys/src/cmd/diff/diffreg.c1
-rw-r--r--sys/src/cmd/diff/main.c1
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;