+Hex counterpart of cmp(1).
authorlace <>
Fri, 12 Oct 2007 13:55:02 +0000 (13:55 +0000)
committerlace <>
Fri, 12 Oct 2007 13:55:02 +0000 (13:55 +0000)
src/cmpx.c [new file with mode: 0644]

diff --git a/src/cmpx.c b/src/cmpx.c
new file mode 100644 (file)
index 0000000..a776f65
--- /dev/null
@@ -0,0 +1,127 @@
+#define _LARGEFILE64_SOURCE 1
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+
+static FILE *
+open_file (const char *filename)
+{
+  FILE *retval;
+
+  if (strcmp (filename, "-") == 0)
+    return stdin;
+  
+  retval = fopen (filename, "r");
+  if (retval == NULL)
+    {
+      fprintf (stderr, "Error opening \"%s\": %m\n", filename);
+      exit (2);
+    }
+
+  return retval;
+}
+
+static void
+close_file (FILE *f, const char *filename)
+{
+  if (f == stdin)
+    return;
+
+  if (fclose (f) != 0)
+    {
+      fprintf (stderr, "Error closing \"%s\": %m\n", filename);
+      exit(2);
+    }
+}
+
+static int
+get_character (FILE *f, const char *filename)
+{
+  int retval;
+
+  retval = fgetc (f);
+  if (ferror (f))
+    {
+      fprintf (stderr, "Error reading \"%s\": %m\n", filename);
+      exit(2);
+    }
+
+  return retval;
+}
+
+static void
+dump_character (int c)
+{
+/*_(0xXX YYY 'C') */
+/*_EOF            */
+
+  if (c == EOF)
+    fputs (" EOF            ", stdout);
+  else
+    {
+      printf (" (0x%02x %3d ", c, c);
+      if (isprint (c))
+        printf ("'%c'", c);
+      else
+        fputs ("   ", stdout);
+      putchar (')');
+    }
+}
+
+int
+main (int argc, char **argv)
+{
+  int exit_code = 0;
+  int argi;
+
+  if (argc < 3)
+    {
+      fputs ("Syntax: cmpx <file1> <file2> [<file3>...]\n", stderr);
+      exit (2);
+    }
+
+  for (argi = 1; argi <= argc - 2; argi++)
+    {
+      FILE *f1, *f2;
+      int c1, c2;
+      off_t offset;
+      char *f1_filename, *f2_filename;
+      int need_header = argc > 3;
+
+      f1_filename = argv[argi + 0];
+      f2_filename = argv[argi + 1];
+
+      f1 = open_file (f1_filename);
+      f2 = open_file (f2_filename);
+
+      for (offset = 0 ;; offset++)
+       {
+         c1 = get_character (f1, f1_filename);
+         c2 = get_character (f2, f2_filename);
+
+         if (c1 == EOF && c2 == EOF)
+           break;
+         if (c1 == c2)
+           continue;
+
+         if (need_header)
+           {
+             printf ("%s\t%s\n", f1_filename, f2_filename);
+             need_header = 0;
+           }
+         printf ("0x%08llx", (unsigned long long) offset);
+         dump_character (c1);
+         dump_character (c2);
+         putchar ('\n');
+         exit_code = 1;
+       }
+
+      close_file (f1, f1_filename);
+      close_file (f2, f2_filename);
+    }
+
+  return exit_code;
+}