added "more" command
[unix-history] / usr / src / usr.bin / diff / diff / diffreg.c
index c651ce7..fd4e873 100644 (file)
@@ -1,4 +1,4 @@
-static char sccsid[] = "@(#)diffreg.c 4.3 %G%";
+static char sccsid[] = "@(#)diffreg.c 4.9 %G%";
 
 #include "diff.h"
 /*
 
 #include "diff.h"
 /*
@@ -108,7 +108,6 @@ diffreg()
                perror(diffh);
                done();
        }
                perror(diffh);
                done();
        }
-       dummy = malloc(1);
        if ((stb1.st_mode & S_IFMT) == S_IFDIR)
                file1 = splice(file1, file2);
        else if ((stb2.st_mode & S_IFMT) == S_IFDIR)
        if ((stb1.st_mode & S_IFMT) == S_IFDIR)
                file1 = splice(file1, file2);
        else if ((stb2.st_mode & S_IFMT) == S_IFDIR)
@@ -124,26 +123,25 @@ diffreg()
        if ((f1 = fopen(file1, "r")) == NULL) {
                fprintf(stderr, "diff: ");
                perror(file1);
        if ((f1 = fopen(file1, "r")) == NULL) {
                fprintf(stderr, "diff: ");
                perror(file1);
-               fclose(f1);
                done();
        }
        if ((f2 = fopen(file2, "r")) == NULL) {
                fprintf(stderr, "diff: ");
                perror(file2);
                fclose(f1);
                done();
        }
        if ((f2 = fopen(file2, "r")) == NULL) {
                fprintf(stderr, "diff: ");
                perror(file2);
                fclose(f1);
-               fclose(f2);
                done();
        }
        if (stb1.st_size != stb2.st_size)
                goto notsame;
        for (;;) {
                done();
        }
        if (stb1.st_size != stb2.st_size)
                goto notsame;
        for (;;) {
-               i = fread(buf1, BUFSIZ, 1, f1);
-               j = fread(buf2, BUFSIZ, 1, f2);
+               i = fread(buf1, 1, BUFSIZ, f1);
+               j = fread(buf2, 1, BUFSIZ, f2);
                if (i < 0 || j < 0 || i != j)
                        goto notsame;
                if (i == 0 && j == 0) {
                        fclose(f1);
                        fclose(f2);
                if (i < 0 || j < 0 || i != j)
                        goto notsame;
                if (i == 0 && j == 0) {
                        fclose(f1);
                        fclose(f2);
+                       status = 0;             /* files don't differ */
                        goto same;
                }
                for (j = 0; j < i; j++)
                        goto same;
                }
                for (j = 0; j < i; j++)
@@ -151,7 +149,11 @@ diffreg()
                                goto notsame;
        }
 notsame:
                                goto notsame;
        }
 notsame:
-       if (!ascii(fileno(f1)) || !ascii(fileno(f2))) {
+       /*
+        *      Files certainly differ at this point; set status accordingly
+        */
+       status = 1;
+       if (!asciifile(f1) || !asciifile(f2)) {
                printf("Binary files %s and %s differ\n", file1, file2);
                fclose(f1);
                fclose(f2);
                printf("Binary files %s and %s differ\n", file1, file2);
                fclose(f1);
                fclose(f2);
@@ -249,7 +251,6 @@ prepare(i, fd)
        register struct line *p;
        register j,h;
 
        register struct line *p;
        register j,h;
 
-       input[i] = fd;
        fseek(fd, (long)0, 0);
        p = (struct line *)talloc(3*sizeof(line));
        for(j=0; h=readhash(fd);) {
        fseek(fd, (long)0, 0);
        p = (struct line *)talloc(3*sizeof(line));
        for(j=0; h=readhash(fd);) {
@@ -308,7 +309,7 @@ int *c;
 stone(a,n,b,c)
 int *a;
 int *b;
 stone(a,n,b,c)
 int *a;
 int *b;
-int *c;
+register int *c;
 {
        register int i, k,y;
        int j, l;
 {
        register int i, k,y;
        int j, l;
@@ -366,7 +367,10 @@ int *c;
                return(k+1);
        i = 0;
        j = k+1;
                return(k+1);
        i = 0;
        j = k+1;
-       while((l=(i+j)/2) > i) {
+       while (1) {
+               l = i + j;
+               if ((l >>= 1) <= i) 
+                       break;
                t = clist[c[l]].y;
                if(t > y)
                        j = l;
                t = clist[c[l]].y;
                if(t > y)
                        j = l;
@@ -401,8 +405,15 @@ check()
        int jackpot;
        long ctold, ctnew;
        char c,d;
        int jackpot;
        long ctold, ctnew;
        char c,d;
-       input[0] = fopen(file1,"r");
-       input[1] = fopen(file2,"r");
+
+       if ((input[0] = fopen(file1,"r")) == NULL) {
+               perror(file1);
+               done();
+       }
+       if ((input[1] = fopen(file2,"r")) == NULL) {
+               perror(file2);
+               done();
+       }
        j = 1;
        ixold[0] = ixnew[0] = 0;
        jackpot = 0;
        j = 1;
        ixold[0] = ixnew[0] = 0;
        jackpot = 0;
@@ -507,7 +518,11 @@ int *b;
 skipline(f)
 {
        register i;
 skipline(f)
 {
        register i;
-       for(i=1;getc(input[f])!='\n';i++) ;
+       char c;
+
+       for(i=1;(c=getc(input[f]))!='\n';i++)
+               if (c < 0)
+                       return(i);
        return(i);
 }
 
        return(i);
 }
 
@@ -715,7 +730,7 @@ char *s;
  * summing 1-s complement in 16-bit hunks 
  */
 readhash(f)
  * summing 1-s complement in 16-bit hunks 
  */
 readhash(f)
-FILE *f;
+register FILE *f;
 {
        long sum;
        register unsigned shift;
 {
        long sum;
        register unsigned shift;
@@ -726,7 +741,7 @@ FILE *f;
        if(!bflag) for(shift=0;(t=getc(f))!='\n';shift+=7) {
                if(t==-1)
                        return(0);
        if(!bflag) for(shift=0;(t=getc(f))!='\n';shift+=7) {
                if(t==-1)
                        return(0);
-               sum += (long)t << (shift%=HALFLONG);
+               sum += (long)t << (shift &= HALFLONG - 1);
        }
        else for(shift=0;;) {
                switch(t=getc(f)) {
        }
        else for(shift=0;;) {
                switch(t=getc(f)) {
@@ -741,7 +756,7 @@ FILE *f;
                                shift += 7;
                                space = 0;
                        }
                                shift += 7;
                                space = 0;
                        }
-                       sum += (long)t << (shift%=HALFLONG);
+                       sum += (long)t << (shift &= HALFLONG - 1);
                        shift += 7;
                        continue;
                case '\n':
                        shift += 7;
                        continue;
                case '\n':
@@ -752,3 +767,27 @@ FILE *f;
        sum = low(sum) + high(sum);
        return((short)low(sum) + (short)high(sum));
 }
        sum = low(sum) + high(sum);
        return((short)low(sum) + (short)high(sum));
 }
+
+#include <a.out.h>
+
+asciifile(f)
+       FILE *f;
+{
+       char buf[BUFSIZ];
+       register int cnt;
+       register char *cp;
+
+       fseek(f, (long)0, 0);
+       cnt = fread(buf, 1, BUFSIZ, f);
+       if (cnt >= sizeof (struct exec)) {
+               struct exec hdr;
+               hdr = *(struct exec *)buf;
+               if (!N_BADMAG(hdr))
+                       return (0);
+       }
+       cp = buf;
+       while (--cnt >= 0)
+               if (*cp++ & 0200)
+                       return (0);
+       return (1);
+}