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] != 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 }