Attached cmp.c and cmp.1.
/* See LICENSE file for copyright and license details. */ #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #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;
}
cmp.1
Description: Binary data
