Annotation of coherent/d/bin/cmp.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Compare two files.
        !             3:  */
        !             4: 
        !             5: #include <stdio.h>
        !             6: #include <sys/types.h>
        !             7: 
        !             8: #define        isdigit(c)      ((c)>='0'&&(c)<='9')
        !             9: 
        !            10: int    lflag;          /* Print all differences */
        !            11: int    sflag;          /* Return status only */
        !            12: int    differ;         /* Non-zero if files differ */
        !            13: long   byteno;
        !            14: long   lineno = 1;
        !            15: fsize_t        skip1, skip2;
        !            16: long   atol();
        !            17: 
        !            18: char   eopen[] = "Cannot open %s\n";
        !            19: char   usage[] = "Usage: cmp [-l] [-s] file1 file2 [skip1 skip2]\n";
        !            20: #if    HEX
        !            21: char   diffl[] = "%ld: 0x%02x 0x%02x\n";
        !            22: #else
        !            23: char   diffl[] = "%ld: %3o %3o\n";
        !            24: #endif
        !            25: char   diffn[] = "%s, %s differ at char %ld, line %ld\n";
        !            26: 
        !            27: main(argc, argv)
        !            28: char *argv[];
        !            29: {
        !            30: #ifdef MSDOS
        !            31:        msdoscvt("cmp", &argc, &argv);
        !            32: #endif
        !            33:        if (argc > 1) {
        !            34:                if (*argv[1] == '-') {
        !            35:                        if (argv[1][1]=='s' && argv[1][2]=='\0')
        !            36:                                sflag = 1;
        !            37:                        else if (argv[1][1]=='l' && argv[1][2]=='\0')
        !            38:                                lflag = 1;
        !            39:                        else if (argv[1][1] == '\0') {
        !            40:                                argc++;
        !            41:                                argv--;
        !            42:                        } else
        !            43:                                err(usage);
        !            44:                        argc--;
        !            45:                        argv++;
        !            46:                }
        !            47:        }
        !            48:        if (argc==5 && isdigit(*argv[3]) && isdigit(*argv[4])) {
        !            49:                skip1 = atol(argv[3]);
        !            50:                skip2 = atol(argv[4]);
        !            51:                argc -= 2;
        !            52:        }
        !            53:        if (argc != 3)
        !            54:                err(usage);
        !            55:        cmp(argv[1], argv[2]);
        !            56:        exit(differ ? 1 : 0);
        !            57: }
        !            58: 
        !            59: /*
        !            60:  * Do the work of comparing the two files
        !            61:  */
        !            62: cmp(a, b)
        !            63: char *a, *b;
        !            64: {
        !            65:        FILE *fp1, *fp2;
        !            66:        register c1, c2;
        !            67: 
        !            68:        if (a[0]=='-' && a[1]=='\0') {
        !            69:                fp1 = stdin;
        !            70: #ifdef MSDOS
        !            71:                _setbinary(stdin);
        !            72: #endif
        !            73:        }
        !            74:        else if ((fp1 = fopen(a, "rb")) == NULL)
        !            75:                err(eopen, a);
        !            76:        if ((fp2 = fopen(b, "rb")) == NULL)
        !            77:                err(eopen, b);
        !            78:        while (skip1--)
        !            79:                if ((c1 = getc(fp1)) == EOF) {
        !            80:                        remark("EOF in skipping on %s\n", a);
        !            81:                        exit(1);
        !            82:                }
        !            83:        while (skip2--)
        !            84:                if ((c2 = getc(fp2)) == EOF) {
        !            85:                        remark("EOF in skipping on %s\n", b);
        !            86:                        exit(1);
        !            87:                }
        !            88:        for (;;) {
        !            89:                c1 = getc(fp1);
        !            90:                c2 = getc(fp2);
        !            91:                if (c1==EOF || c2==EOF)
        !            92:                        break;
        !            93:                byteno++;
        !            94:                if (c1 != c2) {
        !            95:                        differ = 1;
        !            96:                        if (lflag)
        !            97:                                remark(diffl, byteno, c1, c2);
        !            98:                        else {
        !            99:                                remark(diffn, a, b, byteno, lineno);
        !           100:                                return;
        !           101:                        }
        !           102:                }
        !           103:                if (c1 == '\n')
        !           104:                        lineno++;
        !           105:        }
        !           106:        if (c1 != c2) {
        !           107:                remark("EOF on %s\n", c1==EOF ? a : b);
        !           108:                differ = 1;
        !           109:        }
        !           110: }
        !           111: 
        !           112: err(x)
        !           113: {
        !           114:        if (!sflag)
        !           115:                fprintf(stderr, "%r", &x);
        !           116:        exit(2);
        !           117: }
        !           118: 
        !           119: remark(x)
        !           120: {
        !           121:        if (!sflag)
        !           122:                printf("%r", &x);
        !           123: }

unix.superglobalmegacorp.com

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