69 lines
1.5 KiB
C
69 lines
1.5 KiB
C
|
/* 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 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;
|
||
|
}
|