Annotation of 43BSD/bin/diff/diffh.c, revision 1.1

1.1     ! root        1: static char sccsid[] = "@(#)diffh.c 4.4 11/27/85";
        !             2: 
        !             3: #include <stdio.h>
        !             4: #include <ctype.h>
        !             5: #include <sys/types.h>
        !             6: #include <sys/stat.h>
        !             7: 
        !             8: #define C 3
        !             9: #define RANGE 30
        !            10: #define LEN 255
        !            11: #define INF 16384
        !            12: 
        !            13: char *text[2][RANGE];
        !            14: long lineno[2] = {1, 1};       /*no. of 1st stored line in each file*/
        !            15: int ntext[2];          /*number of stored lines in each*/
        !            16: long n0,n1;            /*scan pointer in each*/
        !            17: int bflag;
        !            18: int debug = 0;
        !            19: FILE *file[2];
        !            20: 
        !            21:        /* return pointer to line n of file f*/
        !            22: char *getl(f,n)
        !            23: long n;
        !            24: {
        !            25:        register char *t;
        !            26:        char *malloc();
        !            27:        register delta, nt;
        !            28: again:
        !            29:        delta = n - lineno[f];
        !            30:        nt = ntext[f];
        !            31:        if(delta<0)
        !            32:                progerr("1");
        !            33:        if(delta<nt)
        !            34:                return(text[f][delta]);
        !            35:        if(delta>nt)
        !            36:                progerr("2");
        !            37:        if(nt>=RANGE)
        !            38:                progerr("3");
        !            39:        if(feof(file[f]))
        !            40:                return(NULL);
        !            41:        t = text[f][nt];
        !            42:        if(t==0) {
        !            43:                t = text[f][nt] = malloc(LEN+1);
        !            44:                if(t==NULL)
        !            45:                        if(hardsynch())
        !            46:                                goto again;
        !            47:                        else
        !            48:                                progerr("5");
        !            49:        }
        !            50:        t = fgets(t,LEN,file[f]);
        !            51:        if(t!=NULL)
        !            52:                ntext[f]++;
        !            53:        return(t);
        !            54: }
        !            55: 
        !            56:        /*remove thru line n of file f from storage*/
        !            57: clrl(f,n)
        !            58: long n;
        !            59: {
        !            60:        register i,j;
        !            61:        j = n-lineno[f]+1;
        !            62:        for(i=0;i+j<ntext[f];i++)
        !            63:                movstr(text[f][i+j],text[f][i]);
        !            64:        lineno[f] = n+1;
        !            65:        ntext[f] -= j;
        !            66: }
        !            67: 
        !            68: movstr(s,t)
        !            69: register char *s, *t;
        !            70: {
        !            71:        while(*t++= *s++)
        !            72:                continue;
        !            73: }
        !            74: 
        !            75: main(argc,argv)
        !            76: char **argv;
        !            77: {
        !            78:        char *s0,*s1;
        !            79:        FILE *dopen();
        !            80:        register int status = 0;
        !            81: 
        !            82:        while(*argv[1]=='-') {
        !            83:                argc--;
        !            84:                argv++;
        !            85:                while(*++argv[0])
        !            86:                        if(*argv[0]=='b')
        !            87:                                bflag++;
        !            88:        }
        !            89:        if(argc!=3)
        !            90:                error("must have 2 file arguments","");
        !            91:        file[0] = dopen(argv[1],argv[2]);
        !            92:        file[1] = dopen(argv[2],argv[1]);
        !            93:        for(;;) {
        !            94:                s0 = getl(0,++n0);
        !            95:                s1 = getl(1,++n1);
        !            96:                if(s0==NULL||s1==NULL)
        !            97:                        break;
        !            98:                if(cmp(s0,s1)!=0) {
        !            99:                        if(!easysynch()&&!hardsynch())
        !           100:                                progerr("5");
        !           101:                        status = 1;
        !           102:                } else {
        !           103:                        clrl(0,n0);
        !           104:                        clrl(1,n1);
        !           105:                }
        !           106:        }
        !           107:        if(s0==NULL&&s1==NULL)
        !           108:                exit(status);
        !           109:        if(s0==NULL)
        !           110:                output(-1,INF);
        !           111:        if(s1==NULL)
        !           112:                output(INF,-1);
        !           113:        exit(1);
        !           114: }
        !           115: 
        !           116:        /* synch on C successive matches*/
        !           117: easysynch()
        !           118: {
        !           119:        int i,j;
        !           120:        register k,m;
        !           121:        char *s0,*s1;
        !           122:        for(i=j=1;i<RANGE&&j<RANGE;i++,j++) {
        !           123:                s0 = getl(0,n0+i);
        !           124:                if(s0==NULL)
        !           125:                        return(output(INF,INF));
        !           126:                for(k=C-1;k<j;k++) {
        !           127:                        for(m=0;m<C;m++)
        !           128:                                if(cmp(getl(0,n0+i-m),
        !           129:                                        getl(1,n1+k-m))!=0)
        !           130:                                        goto cont1;
        !           131:                        return(output(i-C,k-C));
        !           132: cont1:                 ;
        !           133:                }
        !           134:                s1 = getl(1,n1+j);
        !           135:                if(s1==NULL)
        !           136:                        return(output(INF,INF));
        !           137:                for(k=C-1;k<=i;k++) {
        !           138:                        for(m=0;m<C;m++)
        !           139:                                if(cmp(getl(0,n0+k-m),
        !           140:                                        getl(1,n1+j-m))!=0)
        !           141:                                        goto cont2;
        !           142:                        return(output(k-C,j-C));
        !           143: cont2:                 ;
        !           144:                }
        !           145:        }
        !           146:        return(0);
        !           147: }
        !           148: 
        !           149: output(a,b)
        !           150: {
        !           151:        register i;
        !           152:        char *s;
        !           153:        if(a<0)
        !           154:                change(n0-1,0,n1,b,"a");
        !           155:        else if(b<0)
        !           156:                change(n0,a,n1-1,0,"d");
        !           157:        else
        !           158:                change(n0,a,n1,b,"c");
        !           159:        for(i=0;i<=a;i++) {
        !           160:                s = getl(0,n0+i);
        !           161:                if(s==NULL)
        !           162:                        break;
        !           163:                printf("< %s",s);
        !           164:                clrl(0,n0+i);
        !           165:        }
        !           166:        n0 += i-1;
        !           167:        if(a>=0&&b>=0)
        !           168:                printf("---\n");
        !           169:        for(i=0;i<=b;i++) {
        !           170:                s = getl(1,n1+i);
        !           171:                if(s==NULL)
        !           172:                        break;
        !           173:                printf("> %s",s);
        !           174:                clrl(1,n1+i);
        !           175:        }
        !           176:        n1 += i-1;
        !           177:        return(1);
        !           178: }
        !           179: 
        !           180: change(a,b,c,d,s)
        !           181: long a,c;
        !           182: char *s;
        !           183: {
        !           184:        range(a,b);
        !           185:        printf("%s",s);
        !           186:        range(c,d);
        !           187:        printf("\n");
        !           188: }
        !           189: 
        !           190: range(a,b)
        !           191: long a;
        !           192: {
        !           193:        if(b==INF)
        !           194:                printf("%ld,$",a);
        !           195:        else if(b==0)
        !           196:                printf("%ld",a);
        !           197:        else
        !           198:                printf("%ld,%ld",a,a+b);
        !           199: }
        !           200: 
        !           201: cmp(s,t)
        !           202: char *s,*t;
        !           203: {
        !           204:        if(debug)
        !           205:                printf("%s:%s\n",s,t);
        !           206:        for(;;){
        !           207:                if(bflag&&isspace(*s)&&isspace(*t)) {
        !           208:                        while(isspace(*++s)) ;
        !           209:                        while(isspace(*++t)) ;
        !           210:                }
        !           211:                if(*s!=*t||*s==0)
        !           212:                        break;
        !           213:                s++;
        !           214:                t++;
        !           215:        }
        !           216:        return(*s-*t);
        !           217: }
        !           218: 
        !           219: FILE *dopen(f1,f2)
        !           220: char *f1,*f2;
        !           221: {
        !           222:        FILE *f;
        !           223:        char b[100],*bptr,*eptr;
        !           224:        struct stat statbuf;
        !           225:        if(cmp(f1,"-")==0)
        !           226:                if(cmp(f2,"-")==0)
        !           227:                        error("can't do - -","");
        !           228:                else
        !           229:                        return(stdin);
        !           230:        if(stat(f1,&statbuf)==-1)
        !           231:                error("can't access ",f1);
        !           232:        if((statbuf.st_mode&S_IFMT)==S_IFDIR) {
        !           233:                for(bptr=b;*bptr= *f1++;bptr++) ;
        !           234:                *bptr++ = '/';
        !           235:                for(eptr=f2;*eptr;eptr++)
        !           236:                        if(*eptr=='/'&&eptr[1]!=0&&eptr[1]!='/')
        !           237:                                f2 = eptr+1;
        !           238:                while(*bptr++= *f2++) ;
        !           239:                f1 = b;
        !           240:        }
        !           241:        f = fopen(f1,"r");
        !           242:        if(f==NULL)
        !           243:                error("can't open",f1);
        !           244:        return(f);
        !           245: }
        !           246: 
        !           247: 
        !           248: progerr(s)
        !           249: char *s;
        !           250: {
        !           251:        error("program error ",s);
        !           252: }
        !           253: 
        !           254: error(s,t)
        !           255: char *s,*t;
        !           256: {
        !           257:        fprintf(stderr,"diffh: %s%s\n",s,t);
        !           258:        exit(2);
        !           259: }
        !           260: 
        !           261:        /*stub for resychronization beyond limits of text buf*/
        !           262: hardsynch()
        !           263: {
        !           264:        change(n0,INF,n1,INF,"c");
        !           265:        printf("---change record omitted\n");
        !           266:        error("can't resynchronize","");
        !           267:        return(0);
        !           268: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.