cmp.c - sbase - suckless unix tools
 (HTM) git clone git://git.suckless.org/sbase
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) 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] != EOF)]);
           61                         same = 0;
           62                         break;
           63                 } else if (!lflag) {
           64                         if (!sflag)
           65                                 printf("%s %s differ: byte %zu, line %zu\n",
           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[1])) |
           78             fshut(stdout, "<stdout>"))
           79                 ret = 2;
           80 
           81         return ret;
           82 }