| 1 | #include <stdio.h> |
| 2 | #include <ctype.h> |
| 3 | |
| 4 | FILE *file1,*file2; |
| 5 | int eflg; |
| 6 | int lflg = 1; |
| 7 | long line = 1; |
| 8 | long chr = 0; |
| 9 | long skip1; |
| 10 | long skip2; |
| 11 | |
| 12 | long otoi(); |
| 13 | |
| 14 | main(argc, argv) |
| 15 | char **argv; |
| 16 | { |
| 17 | register c1, c2; |
| 18 | char *arg; |
| 19 | |
| 20 | if(argc < 3) |
| 21 | goto narg; |
| 22 | arg = argv[1]; |
| 23 | if(arg[0] == '-' && arg[1] == 's') { |
| 24 | lflg--; |
| 25 | argv++; |
| 26 | argc--; |
| 27 | } |
| 28 | arg = argv[1]; |
| 29 | if(arg[0] == '-' && arg[1] == 'l') { |
| 30 | lflg++; |
| 31 | argv++; |
| 32 | argc--; |
| 33 | } |
| 34 | if(argc < 3) |
| 35 | goto narg; |
| 36 | arg = argv[1]; |
| 37 | if( arg[0]=='-' && arg[1]==0 ) |
| 38 | file1 = stdin; |
| 39 | else if((file1 = fopen(arg, "r")) == NULL) |
| 40 | goto barg; |
| 41 | arg = argv[2]; |
| 42 | if((file2 = fopen(arg, "r")) == NULL) |
| 43 | goto barg; |
| 44 | if (argc>3) |
| 45 | skip1 = otoi(argv[3]); |
| 46 | if (argc>4) |
| 47 | skip2 = otoi(argv[4]); |
| 48 | while (skip1) { |
| 49 | if ((c1 = getc(file1)) == EOF) { |
| 50 | arg = argv[1]; |
| 51 | goto earg; |
| 52 | } |
| 53 | skip1--; |
| 54 | } |
| 55 | while (skip2) { |
| 56 | if ((c2 = getc(file2)) == EOF) { |
| 57 | arg = argv[2]; |
| 58 | goto earg; |
| 59 | } |
| 60 | skip2--; |
| 61 | } |
| 62 | |
| 63 | loop: |
| 64 | chr++; |
| 65 | c1 = getc(file1); |
| 66 | c2 = getc(file2); |
| 67 | if(c1 == c2) { |
| 68 | if (c1 == '\n') |
| 69 | line++; |
| 70 | if(c1 == EOF) { |
| 71 | if(eflg) |
| 72 | exit(1); |
| 73 | exit(0); |
| 74 | } |
| 75 | goto loop; |
| 76 | } |
| 77 | if(lflg == 0) |
| 78 | exit(1); |
| 79 | if(c1 == EOF) { |
| 80 | arg = argv[1]; |
| 81 | goto earg; |
| 82 | } |
| 83 | if(c2 == EOF) |
| 84 | goto earg; |
| 85 | if(lflg == 1) { |
| 86 | printf("%s %s differ: char %ld, line %ld\n", argv[1], arg, |
| 87 | chr, line); |
| 88 | exit(1); |
| 89 | } |
| 90 | eflg = 1; |
| 91 | printf("%6ld %3o %3o\n", chr, c1, c2); |
| 92 | goto loop; |
| 93 | |
| 94 | narg: |
| 95 | printf("cmp: arg count\n"); |
| 96 | exit(2); |
| 97 | |
| 98 | barg: |
| 99 | if (lflg) |
| 100 | printf("cmp: cannot open %s\n", arg); |
| 101 | exit(2); |
| 102 | |
| 103 | earg: |
| 104 | printf("cmp: EOF on %s\n", arg); |
| 105 | exit(1); |
| 106 | } |
| 107 | |
| 108 | long otoi(s) |
| 109 | char *s; |
| 110 | { |
| 111 | long v; |
| 112 | int base; |
| 113 | |
| 114 | v = 0; |
| 115 | base = 10; |
| 116 | if (*s == '0') |
| 117 | base = 8; |
| 118 | while(isdigit(*s)) |
| 119 | v = v*base + *s++ - '0'; |
| 120 | return(v); |
| 121 | } |