Annotation of researchv9/cmd/diff/diffdir.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)diffdir.c   4.5 (Berkeley) 81/02/28";
                      2: 
                      3: #include "diff.h"
                      4: /*
                      5:  * diff - directory comparison
                      6:  */
                      7: #define        d_flags d_ino
                      8: 
                      9: #define        ONLY    1               /* Only in this directory */
                     10: #define        SAME    2               /* Both places and same */
                     11: #define        DIFFER  4               /* Both places and different */
                     12: #define        DIRECT  8               /* Directory */
                     13: 
                     14: struct direct *setupdir();
                     15: int    header;
                     16: char   title[2*BUFSIZ], *etitle;
                     17: 
                     18: diffdir(argv)
                     19:        char **argv;
                     20: {
                     21:        register struct direct *d1, *d2;
                     22:        struct direct *dir1, *dir2;
                     23:        register int i;
                     24:        int cmp;
                     25: 
                     26:        if (opt == D_IFDEF) {
                     27:                fprintf(stderr, "diff: can't specify -I with directories\n");
                     28:                done();
                     29:        }
                     30:        if (opt == D_EDIT && (sflag || lflag))
                     31:                fprintf(stderr,
                     32:                    "diff: warning: shouldn't give -s or -l with -e\n");
                     33:        title[0] = 0;
                     34:        strcpy(title, "diff ");
                     35:        for (i = 1; diffargv[i+2]; i++) {
                     36:                if (!strcmp(diffargv[i], "-"))
                     37:                        continue;       /* was -S, dont look silly */
                     38:                strcat(title, diffargv[i]);
                     39:                strcat(title, " ");
                     40:        }
                     41:        for (etitle = title; *etitle; etitle++)
                     42:                ;
                     43:        setfile(&file1, &efile1, file1);
                     44:        setfile(&file2, &efile2, file2);
                     45:        argv[0] = file1;
                     46:        argv[1] = file2;
                     47:        dir1 = setupdir(file1);
                     48:        dir2 = setupdir(file2);
                     49:        d1 = dir1; d2 = dir2;
                     50:        while (d1->d_name[0] != 0 || d2->d_name[0] != 0) {
                     51:                if (d1->d_name[0] && useless(d1->d_name)) {
                     52:                        d1++;
                     53:                        continue;
                     54:                }
                     55:                if (d2->d_name[0] && useless(d2->d_name)) {
                     56:                        d2++;
                     57:                        continue;
                     58:                }
                     59:                if (d1->d_name[0] == 0)
                     60:                        cmp = 1;
                     61:                else if (d2->d_name[0] == 0)
                     62:                        cmp = -1;
                     63:                else
                     64:                        cmp = strncmp(d1->d_name, d2->d_name, DIRSIZ);
                     65:                if (cmp < 0) {
                     66:                        if (lflag)
                     67:                                d1->d_flags |= ONLY;
                     68:                        else if (opt == 0 || opt == 2) {
                     69:                                only(d1, 1);
                     70:                                printf(": %.*s\n", DIRSIZ, d1->d_name);
                     71:                        }
                     72:                        d1++;
                     73:                } else if (cmp == 0) {
                     74:                        compare(d1);
                     75:                        d1++;
                     76:                        d2++;
                     77:                } else {
                     78:                        if (lflag)
                     79:                                d2->d_flags |= ONLY;
                     80:                        else if (opt == 0 || opt == 2) {
                     81:                                only(d2, 2);
                     82:                                printf(": %.*s\n", DIRSIZ, d2->d_name);
                     83:                        }
                     84:                        d2++;
                     85:                }
                     86:        }
                     87:        if (lflag) {
                     88:                scanpr(dir1, ONLY, "Only in %.*s", file1, efile1);
                     89:                scanpr(dir2, ONLY, "Only in %.*s", file2, efile2);
                     90:                scanpr(dir1, SAME, "Common identical files", 0, 0);
                     91:                scanpr(dir1, DIFFER, "Binary files which differ", 0, 0);
                     92:                scanpr(dir1, DIRECT, "Common subdirectories", 0, 0);
                     93:        }
                     94:        if (rflag) {
                     95:                if (header && lflag)
                     96:                        printf("\f");
                     97:                for (d1 = dir1; d1->d_name[0]; d1++)  {
                     98:                        if ((d1->d_flags & DIRECT) == 0)
                     99:                                continue;
                    100:                        strncpy(efile1, d1->d_name, DIRSIZ);
                    101:                        strncpy(efile2, d1->d_name, DIRSIZ);
                    102: /*
                    103:                        if (opt != D_EDIT) {
                    104:                                *etitle = 0;
                    105:                                printf("%s%s %s\n", title, file1, file2);
                    106:                        }
                    107: */
                    108:                        calldiff(0);
                    109:                }
                    110:        }
                    111: }
                    112: 
                    113: setfile(fpp, epp, file)
                    114:        char **fpp, **epp;
                    115:        char *file;
                    116: {
                    117:        register char *cp;
                    118: 
                    119:        *fpp = malloc(BUFSIZ);
                    120:        if (*fpp == 0) {
                    121:                fprintf(stderr, "diff: ran out of memory\n");
                    122:                exit(1);
                    123:        }
                    124:        strcpy(*fpp, file);
                    125:        for (cp = *fpp; *cp; cp++)
                    126:                continue;
                    127:        *cp++ = '/';
                    128:        *epp = cp;
                    129: }
                    130: 
                    131: scanpr(dp, test, title, file, efile)
                    132:        register struct direct *dp;
                    133:        int test;
                    134:        char *title, *file, *efile;
                    135: {
                    136:        int titled = 0;
                    137: 
                    138:        for (; dp->d_name[0]; dp++)
                    139:                if (dp->d_flags & test) {
                    140:                        if (titled == 0) {
                    141:                                if (header == 0) {
                    142:                                        if (anychange)
                    143:                                                printf("\f");
                    144:                                        header = 1;
                    145:                                } else
                    146:                                        printf("\n");
                    147:                                printf(title, efile - file - 1, file);
                    148:                                printf(":\n");
                    149:                                titled = 1;
                    150:                        }
                    151:                        ptname(dp);
                    152:                }
                    153: }
                    154: 
                    155: only(dp, which)
                    156:        struct direct *dp;
                    157:        int which;
                    158: {
                    159:        char *file = which == 1 ? file1 : file2;
                    160:        char *efile = which == 1 ? efile1 : efile2;
                    161: 
                    162:        printf("Only in %.*s", efile - file - 1, file, DIRSIZ, dp->d_name);
                    163: }
                    164: 
                    165: ptname(dp)
                    166:        struct direct *dp;
                    167: {
                    168: 
                    169:        printf("\t%.*s\n", DIRSIZ, dp->d_name);
                    170: }
                    171: 
                    172: int    entcmp();
                    173: 
                    174: struct direct *
                    175: setupdir(cp)
                    176:        char *cp;
                    177: {
                    178:        struct stat stb;
                    179:        register struct direct *dp, *ep;
                    180: 
                    181:        close(0);
                    182:        if (open(cp, 0) < 0) {
                    183:                fprintf(stderr, "diff: ");
                    184:                perror(cp);
                    185:                done();
                    186:        }
                    187:        fstat(0, &stb);
                    188:        dp = (struct direct *)malloc((unsigned) stb.st_size + sizeof (struct direct));
                    189:        if (dp == 0) {
                    190:                fprintf(stderr, "diff: ran out of memory\n");
                    191:                done();
                    192:        }
                    193:        if (read(0, (char *)dp, (int)stb.st_size) != (int)stb.st_size) {
                    194:                fprintf(stderr, "diff: ");
                    195:                perror(cp);
                    196:                done();
                    197:        }
                    198:        qsort(dp, (int) stb.st_size / sizeof (struct direct), 
                    199:            sizeof (struct direct), entcmp);
                    200:        ep = &dp[stb.st_size / sizeof (struct direct)];
                    201:        ep->d_name[0] = 0;
                    202:        while (--ep >= dp && ep->d_ino == 0)
                    203:                ep->d_name[0] = 0;
                    204:        for (; ep >= dp; ep--)
                    205:                ep->d_flags = 0;
                    206:        return (dp);
                    207: }
                    208: 
                    209: entcmp(d1, d2)
                    210:        struct direct *d1, *d2;
                    211: {
                    212: 
                    213:        if (d1->d_ino == 0)
                    214:                return (1);
                    215:        if (d2->d_ino == 0)
                    216:                return (-1);
                    217:        return (strncmp(d1->d_name, d2->d_name, DIRSIZ));
                    218: }
                    219: 
                    220: compare(dp)
                    221:        register struct direct *dp;
                    222: {
                    223:        register int i, j;
                    224:        int f1, f2, fmt1, fmt2;
                    225:        struct stat stb1, stb2;
                    226:        int flag = 0;
                    227:        char buf1[BUFSIZ], buf2[BUFSIZ];
                    228: 
                    229:        strncpy(efile1, dp->d_name, DIRSIZ);
                    230:        strncpy(efile2, dp->d_name, DIRSIZ);
                    231:        f1 = open(file1, 0);
                    232:        if (f1 < 0) {
                    233:                perror(file1);
                    234:                return;
                    235:        }
                    236:        f2 = open(file2, 0);
                    237:        if (f2 < 0) {
                    238:                perror(file2);
                    239:                close(f1);
                    240:                return;
                    241:        }
                    242:        fstat(f1, &stb1); fstat(f2, &stb2);
                    243:        fmt1 = stb1.st_mode & S_IFMT;
                    244:        fmt2 = stb2.st_mode & S_IFMT;
                    245:        if (fmt1 != S_IFREG || fmt2 != S_IFREG) {
                    246:                if (fmt1 == fmt2) {
                    247:                        if (fmt1 != S_IFDIR && stb1.st_rdev == stb2.st_rdev)
                    248:                                goto same;
                    249:                        if (fmt1 == S_IFDIR) {
                    250:                                dp->d_flags = DIRECT;
                    251:                                if (lflag || opt == D_EDIT)
                    252:                                        goto closem;
                    253:                                printf("Common subdirectories: %s and %s\n",
                    254:                                    file1, file2);
                    255:                                goto closem;
                    256:                        }
                    257:                }
                    258:                goto notsame;
                    259:        }
                    260:        if (stb1.st_size != stb2.st_size)
                    261:                goto notsame;
                    262:        for (;;) {
                    263:                i = read(f1, buf1, BUFSIZ);
                    264:                j = read(f2, buf2, BUFSIZ);
                    265:                if (i < 0 || j < 0 || i != j)
                    266:                        goto notsame;
                    267:                if (i == 0 && j == 0)
                    268:                        goto same;
                    269:                for (j = 0; j < i; j++)
                    270:                        if (buf1[j] != buf2[j])
                    271:                                goto notsame;
                    272:        }
                    273: same:
                    274:        if (sflag == 0)
                    275:                goto closem;
                    276:        if (lflag)
                    277:                dp->d_flags = SAME;
                    278:        else
                    279:                printf("Files %s and %s are identical\n", file1, file2);
                    280:        goto closem;
                    281: notsame:
                    282:        if (!ascii(f1) || !ascii(f2)) {
                    283:                if (lflag)
                    284:                        dp->d_flags |= DIFFER;
                    285:                else if (opt == D_NORMAL || opt == D_CONTEXT)
                    286:                        printf("Binary files %s and %s differ\n",
                    287:                            file1, file2);
                    288:                goto closem;
                    289:        }
                    290:        close(f1); close(f2);
                    291:        anychange = 1;
                    292:        if (lflag)
                    293:                calldiff(title);
                    294:        else {
                    295:                if (opt == D_EDIT) {
                    296:                        printf("ed - %.*s << '-*-END-*-'\n",
                    297:                            DIRSIZ, dp->d_name);
                    298:                        calldiff(0);
                    299:                } else {
                    300:                        printf("%s%s %s\n", title, file1, file2);
                    301:                        calldiff(0);
                    302:                }
                    303:                if (opt == D_EDIT)
                    304:                        printf("w\nq\n-*-END-*-\n");
                    305:        }
                    306:        return;
                    307: closem:
                    308:        close(f1); close(f2);
                    309: }
                    310: 
                    311: char   *prargs[] = { "pr", "-h", 0, "-f", 0, 0 };
                    312: 
                    313: calldiff(wantpr)
                    314:        char *wantpr;
                    315: {
                    316:        int pid, status, status2, pv[2];
                    317: 
                    318:        prargs[2] = wantpr;
                    319:        fflush(stdout);
                    320:        if (wantpr) {
                    321:                sprintf(etitle, "%s %s", file1, file2);
                    322:                pipe(pv);
                    323:                pid = fork();
                    324:                if (pid == -1) {
                    325:                        fprintf(stderr, "No more processes");
                    326:                        done();
                    327:                }
                    328:                if (pid == 0) {
                    329:                        close(0);
                    330:                        dup(pv[0]);
                    331:                        close(pv[0]);
                    332:                        close(pv[1]);
                    333:                        execv(pr+4, prargs);
                    334:                        execv(pr, prargs);
                    335:                        perror(pr);
                    336:                        done();
                    337:                }
                    338:        }
                    339:        pid = fork();
                    340:        if (pid == -1) {
                    341:                fprintf(stderr, "diff: No more processes\n");
                    342:                done();
                    343:        }
                    344:        if (pid == 0) {
                    345:                if (wantpr) {
                    346:                        close(1);
                    347:                        dup(pv[1]);
                    348:                        close(pv[0]);
                    349:                        close(pv[1]);
                    350:                }
                    351:                execv(diff+4, diffargv);
                    352:                execv(diff, diffargv);
                    353:                perror(diff);
                    354:                done();
                    355:        }
                    356:        close(pv[0]);
                    357:        close(pv[1]);
                    358:        while (wait(&status) != pid)
                    359:                continue;
                    360:        while (wait(&status2) != -1)
                    361:                continue;
                    362: /*
                    363:        if ((status >> 8) >= 2)
                    364:                done();
                    365: */
                    366: }
                    367: 
                    368: #include <a.out.h>
                    369: 
                    370: ascii(f)
                    371:        int f;
                    372: {
                    373:        char buf[BUFSIZ];
                    374:        register int cnt;
                    375:        register char *cp;
                    376: 
                    377:        lseek(f, (long)0, 0);
                    378:        cnt = read(f, buf, BUFSIZ);
                    379:        if (cnt >= sizeof (struct exec)) {
                    380:                struct exec hdr;
                    381:                hdr = *(struct exec *)buf;
                    382:                if (!N_BADMAG(hdr))
                    383:                        return (0);
                    384:        }
                    385:        cp = buf;
                    386:        while (--cnt >= 0)
                    387:                if (*cp++ & 0200)
                    388:                        return (0);
                    389:        return (1);
                    390: }
                    391: 
                    392: /*
                    393:  * THIS IS CRUDE.
                    394:  */
                    395: useless(cp)
                    396: register char *cp;
                    397: {
                    398: 
                    399:        if (cp[0] == '.')
                    400:                return (1);
                    401:        if (start && strcmp(start, cp) > 0)
                    402:                return (1);
                    403:        return (0);
                    404: }

unix.superglobalmegacorp.com

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