CS318 - Pintos
Pintos source browser for JHU CS318 course
cmp.c
Go to the documentation of this file.
1 /** cat.c
2 
3  Compares two files. */
4 
5 #include <stdio.h>
6 #include <syscall.h>
7 
8 int
9 main (int argc, char *argv[])
10 {
11  int fd[2];
12 
13  if (argc != 3)
14  {
15  printf ("usage: cmp A B\n");
16  return EXIT_FAILURE;
17  }
18 
19  /* Open files. */
20  fd[0] = open (argv[1]);
21  if (fd[0] < 0)
22  {
23  printf ("%s: open failed\n", argv[1]);
24  return EXIT_FAILURE;
25  }
26  fd[1] = open (argv[2]);
27  if (fd[1] < 0)
28  {
29  printf ("%s: open failed\n", argv[1]);
30  return EXIT_FAILURE;
31  }
32 
33  /* Compare data. */
34  for (;;)
35  {
36  int pos;
37  char buffer[2][1024];
38  int bytes_read[2];
39  int min_read;
40  int i;
41 
42  pos = tell (fd[0]);
43  bytes_read[0] = read (fd[0], buffer[0], sizeof buffer[0]);
44  bytes_read[1] = read (fd[1], buffer[1], sizeof buffer[1]);
45  min_read = bytes_read[0] < bytes_read[1] ? bytes_read[0] : bytes_read[1];
46  if (min_read == 0)
47  break;
48 
49  for (i = 0; i < min_read; i++)
50  if (buffer[0][i] != buffer[1][i])
51  {
52  printf ("Byte %d is %02hhx ('%c') in %s but %02hhx ('%c') in %s\n",
53  pos + i,
54  buffer[0][i], buffer[0][i], argv[1],
55  buffer[1][i], buffer[1][i], argv[2]);
56  return EXIT_FAILURE;
57  }
58 
59  if (min_read < bytes_read[1])
60  printf ("%s is shorter than %s\n", argv[1], argv[2]);
61  else if (min_read < bytes_read[0])
62  printf ("%s is shorter than %s\n", argv[2], argv[1]);
63  }
64 
65  printf ("%s and %s are identical\n", argv[1], argv[2]);
66 
67  return EXIT_SUCCESS;
68 }
EXIT_FAILURE
#define EXIT_FAILURE
Unsuccessful execution.
Definition: syscall.h:20
buffer
static struct intq buffer
Stores keys from the keyboard and serial port.
Definition: input.c:7
printf
int printf(const char *format,...)
Writes formatted output to the console.
Definition: stdio.c:79
open
int open(const char *file)
Definition: syscall.c:103
tell
unsigned tell(int fd)
Definition: syscall.c:133
EXIT_SUCCESS
#define EXIT_SUCCESS
Typical return values from main() and arguments to exit().
Definition: syscall.h:19
read
int read(int fd, void *buffer, unsigned size)
Definition: syscall.c:115
main
int main(int argc, char *argv[])
cat.c
Definition: cmp.c:9