/* cat.c Compares two files. */ #include #include int main (int argc, char *argv[]) { int fd[2]; if (argc != 3) { printf ("usage: cmp A B\n"); return EXIT_FAILURE; } /* Open files. */ fd[0] = open (argv[1]); if (fd[0] < 0) { printf ("%s: open failed\n", argv[1]); return EXIT_FAILURE; } fd[1] = open (argv[2]); if (fd[1] < 0) { printf ("%s: open failed\n", argv[1]); return EXIT_FAILURE; } /* Compare data. */ for (;;) { int pos; char buffer[2][1024]; int bytes_read[2]; int min_read; int i; pos = tell (fd[0]); bytes_read[0] = read (fd[0], buffer[0], sizeof buffer[0]); bytes_read[1] = read (fd[1], buffer[1], sizeof buffer[1]); min_read = bytes_read[0] < bytes_read[1] ? bytes_read[0] : bytes_read[1]; if (min_read == 0) break; for (i = 0; i < min_read; i++) if (buffer[0][i] != buffer[1][i]) { printf ("Byte %d is %02hhx ('%c') in %s but %02hhx ('%c') in %s\n", pos + i, buffer[0][i], buffer[0][i], argv[1], buffer[1][i], buffer[1][i], argv[2]); return EXIT_FAILURE; } if (min_read < bytes_read[1]) printf ("%s is shorter than %s\n", argv[1], argv[2]); else if (min_read < bytes_read[0]) printf ("%s is shorter than %s\n", argv[2], argv[1]); } printf ("%s and %s are identical\n", argv[1], argv[2]); return EXIT_SUCCESS; }