+/* cat.c
+
+ Compares two files. */
+
+#include <stdio.h>
+#include <syscall.h>
+
+int
+main (int argc, char *argv[])
+{
+ int fd[2];
+
+ if (argc != 3)
+ {
+ printf ("usage: cmp A B\n");
+ return 1;
+ }
+
+ /* Open files. */
+ fd[0] = open (argv[1]);
+ if (fd[0] < 0)
+ {
+ printf ("%s: open failed\n", argv[1]);
+ return 1;
+ }
+ fd[1] = open (argv[2]);
+ if (fd[1] < 0)
+ {
+ printf ("%s: open failed\n", argv[1]);
+ return 1;
+ }
+
+ /* 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 1;
+ }
+
+ 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 0;
+}