/* See LICENSE file for copyright and license details. */ #include #include #include #include #include #include "util.h" static bool lflag = false; static bool sflag = false; int main(int argc, char *argv[]) { FILE *fp0, *fp1; int c; int line, byte; int ch0, ch1; int retval; if ((c = getopt(argc, argv, "ls")) != -1) switch (c) { case 'l': lflag = true; break; case 's': sflag = true; break; default: exit(EXIT_FAILURE); } if (argc - optind != 2) eprintf("usage: %s [-l|-s] file1 file2\n", *argv); if (!strcmp(argv[optind], "-")) fp0 = stdin; else { fp0 = fopen(argv[optind], "r"); if (!fp0) eprintf("fopen %s:", argv[optind]); } if (!strcmp(argv[optind + 1], "-")) fp1 = stdin; else { fp1 = fopen(argv[optind + 1], "r"); if (!fp1) eprintf("fopen %s:", argv[optind + 1]); } /* spit an error message as well? */ if (fp0 == fp1) exit(EXIT_FAILURE); line = 1; byte = 1; retval = EXIT_SUCCESS; do { ch0 = getc(fp0); ch1 = getc(fp1); if (ch0 != ch1) { if (!lflag) { if (!sflag) printf("%s %s differ: char %d, line %d\n", argv[optind], argv[optind + 1], byte, line); else retval = EXIT_FAILURE; break; } if (ch0 != EOF && ch1 != EOF && lflag) printf("%d %o %o\n", byte, ch0, ch1); if (ch0 == EOF) { if (!sflag) eprintf("%s: EOF on %s\n", *argv, argv[optind]); else retval = EXIT_FAILURE; } if (ch1 == EOF) { if (!sflag) eprintf("%s: EOF on %s\n", *argv, argv[optind + 1]); else retval = EXIT_FAILURE; } } if (ch0 == '\n' || ch1 == '\n') ++line; ++byte; } while (ch0 != EOF && ch1 != EOF); fclose(fp0); fclose(fp1); return retval; }