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;
}

Attachment: cmp.1
Description: Binary data

Reply via email to