Annotation of researchv8dc/cmd/idiff.c, revision 1.1.1.1

1.1       root        1: /* idiff:  interactive diff */
                      2: 
                      3: #include <stdio.h>
                      4: #include <ctype.h>
                      5: #include <signal.h>
                      6: #include <sys/types.h>
                      7: #include <sys/dir.h>
                      8: #include <sys/stat.h>
                      9: 
                     10: #define        HUGE    10000   /* large number of lines */
                     11: 
                     12: char   *progname;
                     13: char   *diffout = "/tmp/idiff.XXXXXX";
                     14: char   *outfile = "idiff.out";
                     15: 
                     16: main(argc, argv)
                     17:        int argc;
                     18:        char *argv[];
                     19: {
                     20:        FILE *fin, *fout, *f1, *f2, *efopen();
                     21:        char buf[BUFSIZ], *mktemp(), *basename(), *p;
                     22:        struct stat stbuf;
                     23:        int cleanup();
                     24: 
                     25:        progname = argv[0];
                     26:        if (argc != 3) {
                     27:                fprintf(stderr, "Usage: idiff file1 file2\n");
                     28:                exit(1);
                     29:        }
                     30:        f1 = efopen(argv[1], "r");
                     31:        f2 = efopen(argv[2], "r");
                     32:        fstat(fileno(f2), &stbuf);
                     33:        if (stbuf.st_mode & S_IFDIR) {
                     34:                fclose(f2);
                     35:                sprintf(buf, "%s/%s", argv[2], basename(argv[1]));
                     36:                f2 = efopen(buf, "r");
                     37:        }
                     38:        if (signal(SIGINT, SIG_IGN) != SIG_IGN)
                     39:                signal(SIGINT, cleanup);
                     40:        fout = efopen(outfile, "w");
                     41:        mktemp(diffout);
                     42:        sprintf(buf,"diff %s %s >%s",argv[1], argv[2], diffout);
                     43:        system(buf);
                     44:        fin = efopen(diffout, "r");
                     45:        idiff(f1, f2, fin, fout);
                     46:        unlink(diffout);
                     47:        printf("%s output in file %s\n", progname, outfile);
                     48:        exit(0);
                     49: }
                     50: 
                     51: cleanup()
                     52: {
                     53:        unlink(diffout);
                     54:        unlink(outfile);
                     55:        exit(1);
                     56: }
                     57: 
                     58: char *basename(s)      /* find last component of filename */
                     59:        char *s;
                     60: {
                     61:        static char *p;
                     62: 
                     63:        for (p = s+strlen(s)-1; p >= s; p--)
                     64:                if (*p == '/')
                     65:                        return p+1;
                     66:        return s;
                     67: }
                     68: 
                     69: idiff(f1, f2, fin, fout)       /* process diffs */
                     70:        FILE *f1, *f2, *fin, *fout;
                     71: {
                     72:        char *tempfile = "idiff.XXXXXX";
                     73:        char buf[BUFSIZ], buf2[BUFSIZ], *mktemp();
                     74:        FILE *ft, *efopen();
                     75:        int cmd, n, from1, to1, from2, to2, nf1, nf2, done;
                     76: 
                     77:        mktemp(tempfile);
                     78:        nf1 = nf2 = 0;
                     79:        done = 0;
                     80:        while (!done && fgets(buf, sizeof buf, fin) != NULL) {
                     81:                parse(buf, &from1, &to1, &cmd, &from2, &to2);
                     82:                n = to1-from1 + to2-from2 + 1; /* #lines from diff */
                     83:                if (cmd == 'c')
                     84:                        n += 2;
                     85:                else if (cmd == 'a')
                     86:                        from1++;
                     87:                else if (cmd == 'd')
                     88:                        from2++;
                     89:                printf("%s", buf);
                     90:                while (n-- > 0) {
                     91:                        fgets(buf, sizeof buf, fin);
                     92:                        printf("%s", buf);
                     93:                }
                     94:                for(;;) {
                     95:                        printf("? ");
                     96:                        fflush(stdout);
                     97:                        fgets(buf, sizeof buf, stdin);
                     98:                        switch (buf[0]) {
                     99:                        case '2':
                    100:                                to1 = to2 = HUGE;
                    101:                                done = 1;
                    102:                        case '>':
                    103:                                nskip(f1, to1-nf1);
                    104:                                ncopy(f2, to2-nf2, fout);
                    105:                                break;
                    106:                        case '1':
                    107:                                to1 = to2 = HUGE;
                    108:                                done = 1;
                    109:                        case '<':
                    110:                                nskip(f2, to2-nf2);
                    111:                                ncopy(f1, to1-nf1, fout);
                    112:                                break;
                    113:                        case 'e':
                    114:                                ncopy(f1, from1-1-nf1, fout);
                    115:                                nskip(f2, from2-1-nf2);
                    116:                                ft = efopen(tempfile, "w");
                    117:                                ncopy(f1, to1+1-from1, ft);
                    118:                                fprintf(ft, "---\n");
                    119:                                ncopy(f2, to2+1-from2, ft);
                    120:                                fclose(ft);
                    121:                                sprintf(buf2, "ed %s", tempfile);       
                    122:                                system(buf2);
                    123:                                ft = efopen(tempfile, "r");
                    124:                                ncopy(ft, HUGE, fout);
                    125:                                fclose(ft);
                    126:                                break;
                    127:                        case '!':
                    128:                                system(buf+1);
                    129:                                printf("!\n");
                    130:                                break;
                    131:                        case 'd':
                    132:                                nskip(f1, to1-nf1);
                    133:                                nskip(f2, to2-nf2);
                    134:                                break;
                    135:                        default:
                    136:                                printf("< > d e 1 2 !\n");
                    137:                                continue;
                    138:                        }
                    139:                        break;
                    140:                }
                    141:                nf1 = to1;
                    142:                nf2 = to2;
                    143:        }
                    144:        ncopy(f1, HUGE, fout);  /* can fail on very long files */
                    145:        unlink(tempfile);
                    146: }
                    147: 
                    148: parse(s, pfrom1, pto1, pcmd, pfrom2, pto2)
                    149:        char *s;
                    150:        int *pcmd, *pfrom1, *pto1, *pfrom2, *pto2;
                    151: {
                    152: #define a2i(p) while (isdigit(*s)) p = 10*(p) + *s++ - '0'
                    153: 
                    154:        *pfrom1 = *pto1 = *pfrom2 = *pto2 = 0;
                    155:        a2i(*pfrom1);
                    156:        if (*s == ',') {
                    157:                s++;
                    158:                a2i(*pto1);
                    159:        } else
                    160:                *pto1 = *pfrom1;
                    161:        *pcmd = *s++;
                    162:        a2i(*pfrom2);
                    163:        if (*s == ',') {
                    164:                s++;
                    165:                a2i(*pto2);
                    166:        } else
                    167:                *pto2 = *pfrom2;
                    168: }
                    169: 
                    170: nskip(fin, n)  /* skip n lines of file fin */
                    171:        FILE *fin;
                    172: {
                    173:        char buf[BUFSIZ];
                    174: 
                    175:        while (n-- > 0)
                    176:                fgets(buf, sizeof buf, fin);
                    177: }
                    178: 
                    179: ncopy(fin, n, fout)    /* copy n lines from fin to fout */
                    180:        FILE *fin, *fout;
                    181: {
                    182:        char buf[BUFSIZ];
                    183: 
                    184:        while (n-- > 0) {
                    185:                if (fgets(buf, sizeof buf, fin) == NULL)
                    186:                        return;
                    187:                fputs(buf, fout);
                    188:        }
                    189: }
                    190: 
                    191: FILE *efopen(file, mode)       /* fopen file, die if can't */
                    192:        char *file, *mode;
                    193: {
                    194:        FILE *fp, *fopen();
                    195:        extern char *progname;
                    196: 
                    197:        if ((fp = fopen(file, mode)) != NULL)
                    198:                return fp;
                    199:        fprintf(stderr, "%s: can't open file %s mode %s\n",
                    200:                progname, file, mode);
                    201:        exit(1);
                    202: }

unix.superglobalmegacorp.com

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