+ /*
+ * file1 might be stdio, which means that a read of less than
+ * MAXBSIZE might not mean an EOF. So, read whatever we read
+ * from file1 from file2.
+ */
+ if ((len2 = read(fd2, buf2, len1)) == -1)
+ error(file2);
+ if (bcmp(buf1, buf2, len2)) {
+ if (silent)
+ exit(DIFF);
+ if (all) {
+ dfound = YES;
+ for (C1 = buf1, C2 = buf2, cnt = len2; cnt--; ++C1, ++C2) {
+ ++byte;
+ if (*C1 != *C2)
+ printf("%6ld %3o %3o\n", byte, *C1, *C2);
+ }
+ }
+ else for (C1 = buf1, C2 = buf2;; ++C1, ++C2) {
+ ++byte;
+ if (*C1 != *C2) {
+ printf("%s %s differ: char %ld, line %ld\n", file1, file2, byte, line);
+ exit(DIFF);
+ }
+ if (*C1 == '\n')
+ ++line;
+ }
+ }
+ else {
+ byte += len2;
+ /*
+ * here's the real performance problem, we've got to
+ * count the stupid lines, which means that -l is a
+ * *much* faster version, i.e., unless you really
+ * *want* to know the line number, run -s or -l.
+ */
+ if (!silent && !all)
+ for (C1 = buf1, cnt = len2; cnt--;)
+ if (*C1++ == '\n')
+ ++line;
+ }
+ /*
+ * couldn't read as much from file2 as from file1; checked
+ * here because there might be a difference before we got
+ * to this point, which would have precedence.
+ */
+ if (len2 < len1)
+ endoffile(file2);