summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>2003-07-16 21:39:07 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>2003-07-16 21:39:07 +0000
commit767598f49c321541e915c20f74ec31d288986a39 (patch)
treeb78bcf2c864f79850078bcc18c0445bd19b55f7e
parent4db30cb4642a4ccd91755e50166b9a2a9771af45 (diff)
Deal with files that lack a final newline before EOF (you naughty
emacs users!). In most cases this just means checking for EOF in addition to '\n'. However, we need to tread carefully in readhash(). There we return 0 on EOF iff it is the first char in a "line". Additionally, if the -b or -w flags were specified and the last character in one file was '\n' but the other file is missing '\n', pretend that we didn't see the newline in the one file. This is consistent with GNU diff. For the non-{b,w} case, print "\ No newline at end of file" when we see EOF before a newline in one file where the other file has one. Again, this is for consistency with GNU diff and patch(1) in -current knows how to interpret this message. OK tedu@ and otto@
-rw-r--r--usr.bin/diff/diffreg.c66
1 files changed, 42 insertions, 24 deletions
diff --git a/usr.bin/diff/diffreg.c b/usr.bin/diff/diffreg.c
index 9ca4cbcec89..f2bad0095e8 100644
--- a/usr.bin/diff/diffreg.c
+++ b/usr.bin/diff/diffreg.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: diffreg.c,v 1.33 2003/07/15 23:17:56 millert Exp $ */
+/* $OpenBSD: diffreg.c,v 1.34 2003/07/16 21:39:06 millert Exp $ */
/*
* Copyright (C) Caldera International Inc. 2001-2002.
@@ -65,7 +65,7 @@
*/
#ifndef lint
-static const char rcsid[] = "$OpenBSD: diffreg.c,v 1.33 2003/07/15 23:17:56 millert Exp $";
+static const char rcsid[] = "$OpenBSD: diffreg.c,v 1.34 2003/07/16 21:39:06 millert Exp $";
#endif /* not lint */
#include <sys/param.h>
@@ -705,6 +705,15 @@ check(char *file1, FILE *f1, char *file2, FILE *f2)
for (;;) {
c = getc(f1);
d = getc(f2);
+ /*
+ * GNU diff ignores a missing newline
+ * in one file if bflag || wflag.
+ */
+ if ((bflag || wflag) &&
+ ((c == EOF && d == '\n') ||
+ (c == '\n' && d == EOF))) {
+ break;
+ }
ctold++;
ctnew++;
if (bflag && isspace(c) && isspace(d)) {
@@ -731,13 +740,13 @@ check(char *file1, FILE *f1, char *file2, FILE *f2)
if (chrtran[c] != chrtran[d]) {
jackpot++;
J[i] = 0;
- if (c != '\n')
+ if (c != '\n' && c != EOF)
ctold += skipline(f1);
- if (d != '\n')
+ if (d != '\n' && c != EOF)
ctnew += skipline(f2);
break;
}
- if (c == '\n')
+ if (c == '\n' || c == EOF)
break;
}
} else {
@@ -747,13 +756,13 @@ check(char *file1, FILE *f1, char *file2, FILE *f2)
if ((c = getc(f1)) != (d = getc(f2))) {
/* jackpot++; */
J[i] = 0;
- if (c != '\n')
+ if (c != '\n' && c != EOF)
ctold += skipline(f1);
- if (d != '\n')
+ if (d != '\n' && c != EOF)
ctnew += skipline(f2);
break;
}
- if (c == '\n')
+ if (c == '\n' || c == EOF)
break;
}
}
@@ -820,9 +829,8 @@ skipline(FILE *f)
{
int i, c;
- for (i = 1; (c = getc(f)) != '\n'; i++)
- if (c < 0)
- return (i);
+ for (i = 1; (c = getc(f)) != '\n' && c != EOF; i++)
+ continue;
return (i);
}
@@ -866,8 +874,7 @@ output(char *file1, FILE *f1, char *file2, FILE *f2)
if (format == D_IFDEF) {
for (;;) {
#define c i0
- c = getc(f1);
- if (c < 0)
+ if ((c = getc(f1)) == EOF)
return;
putchar(c);
}
@@ -1043,12 +1050,15 @@ fetch(long *f, int a, int b, FILE *lb, char *s, int oldfile)
fputs(s, stdout);
col = 0;
for (j = 0; j < nc; j++) {
- c = getc(lb);
- if (c == '\t' && tflag)
- do
+ if ((c = getc(lb)) == EOF) {
+ puts("\n\\ No newline at end of file");
+ return;
+ }
+ if (c == '\t' && tflag) {
+ do {
putchar(' ');
- while (++col & 7);
- else {
+ } while (++col & 7);
+ } else {
putchar(c);
col++;
}
@@ -1078,8 +1088,11 @@ readhash(FILE *f)
if (!bflag && !wflag) {
if (iflag)
for (shift = 0; (t = getc(f)) != '\n'; shift += 7) {
- if (t == -1)
- return (0);
+ if (t == EOF) {
+ if (shift == 0)
+ return (0);
+ break;
+ }
sum += (long)chrtran[t] << (shift
#ifdef POW2
&= HALFLONG - 1);
@@ -1089,8 +1102,11 @@ readhash(FILE *f)
}
else
for (shift = 0; (t = getc(f)) != '\n'; shift += 7) {
- if (t == -1)
- return (0);
+ if (t == EOF) {
+ if (shift == 0)
+ return (0);
+ break;
+ }
sum += (long)t << (shift
#ifdef POW2
&= HALFLONG - 1);
@@ -1101,8 +1117,6 @@ readhash(FILE *f)
} else {
for (shift = 0;;) {
switch (t = getc(f)) {
- case -1:
- return (0);
case '\t':
case ' ':
space++;
@@ -1120,6 +1134,10 @@ readhash(FILE *f)
#endif
shift += 7;
continue;
+ case EOF:
+ if (shift == 0)
+ return (0);
+ /* FALLTHROUGH */
case '\n':
break;
}