-/*
- * skip --
- * skip first part of file
- */
-static
-skip(dist,fd,fname)
-register u_long dist; /* length in bytes, to skip */
-register int fd; /* file descriptor */
-char *fname; /* file name for error */
-{
- register int rlen; /* read length */
-
- for (;dist;dist -= rlen) {
- rlen = MIN(dist,sizeof(buf1));
- if (read(fd,buf1,rlen) != rlen) {
- if (!silent)
- printf("cmp: EOF on %s\n",fname);
- exit(DIFF);
- }
- }
-}
-
-static
-cmp()
-{
- register u_char *C1, /* traveling pointers */
- *C2;
- register int cnt, /* counter */
- len1, /* read length 1 */
- len2; /* read length 2 */
- register long byte, /* byte count */
- line; /* line count */
- short dfound = NO; /* if difference found */
-
- for (byte = 0,line = 1;;) {
- switch(len1 = read(fd1,buf1,MAXBSIZE)) {
- case -1:
- if (!silent)
- perror(file1);
- exit(ERR);
- case 0:
- /*
- * read of file 1 just failed, find out
- * if there's anything left in file 2
- */
- switch(read(fd2,buf2,1)) {
- case -1:
- if (!silent)
- perror(file2);
- exit(ERR);
- case 0:
- exit(dfound ? DIFF : OK);
- default:
- if (!silent)
- printf("cmp: EOF on %s\n",file1);
- exit(DIFF);
- }
- }
- /*
- * 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) {
- if (!silent)
- perror(file2);
- exit(ERR);
- }
- 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;
- }
- }