| cmp.c - sbase - suckless unix tools | |
| git clone git://git.suckless.org/sbase | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| cmp.c (1419B) | |
| --- | |
| 1 /* See LICENSE file for copyright and license details. */ | |
| 2 #include <stdio.h> | |
| 3 #include <stdlib.h> | |
| 4 #include <string.h> | |
| 5 | |
| 6 #include "util.h" | |
| 7 | |
| 8 static void | |
| 9 usage(void) | |
| 10 { | |
| 11 enprintf(2, "usage: %s [-l | -s] file1 file2\n", argv0); | |
| 12 } | |
| 13 | |
| 14 int | |
| 15 main(int argc, char *argv[]) | |
| 16 { | |
| 17 FILE *fp[2]; | |
| 18 size_t line = 1, n; | |
| 19 int ret = 0, lflag = 0, sflag = 0, same = 1, b[2]; | |
| 20 | |
| 21 ARGBEGIN { | |
| 22 case 'l': | |
| 23 lflag = 1; | |
| 24 break; | |
| 25 case 's': | |
| 26 sflag = 1; | |
| 27 break; | |
| 28 default: | |
| 29 usage(); | |
| 30 } ARGEND | |
| 31 | |
| 32 if (argc != 2 || (lflag && sflag)) | |
| 33 usage(); | |
| 34 | |
| 35 for (n = 0; n < 2; n++) { | |
| 36 if (!strcmp(argv[n], "-")) { | |
| 37 argv[n] = "<stdin>"; | |
| 38 fp[n] = stdin; | |
| 39 } else { | |
| 40 if (!(fp[n] = fopen(argv[n], "r"))) { | |
| 41 if (!sflag) | |
| 42 weprintf("fopen %s:", argv[n]); | |
| 43 return 2; | |
| 44 } | |
| 45 } | |
| 46 } | |
| 47 | |
| 48 for (n = 1; ; n++) { | |
| 49 b[0] = getc(fp[0]); | |
| 50 b[1] = getc(fp[1]); | |
| 51 | |
| 52 if (b[0] == b[1]) { | |
| 53 if (b[0] == EOF) | |
| 54 break; | |
| 55 else if (b[0] == '\n') | |
| 56 line++; | |
| 57 continue; | |
| 58 } else if (b[0] == EOF || b[1] == EOF) { | |
| 59 if (!sflag) | |
| 60 weprintf("EOF on %s\n", argv[(b[0] != EO… | |
| 61 same = 0; | |
| 62 break; | |
| 63 } else if (!lflag) { | |
| 64 if (!sflag) | |
| 65 printf("%s %s differ: byte %zu, line %zu… | |
| 66 argv[0], argv[1], n, line); | |
| 67 same = 0; | |
| 68 break; | |
| 69 } else { | |
| 70 printf("%zu %o %o\n", n, b[0], b[1]); | |
| 71 same = 0; | |
| 72 } | |
| 73 } | |
| 74 | |
| 75 if (!ret) | |
| 76 ret = !same; | |
| 77 if (fshut(fp[0], argv[0]) | (fp[0] != fp[1] && fshut(fp[1], argv… | |
| 78 fshut(stdout, "<stdout>")) | |
| 79 ret = 2; | |
| 80 | |
| 81 return ret; | |
| 82 } |