summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/bincomp.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/bincomp.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/bincomp.c172
1 files changed, 172 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SNIP/bincomp.c b/reference/C/CONTRIB/SNIP/bincomp.c
new file mode 100755
index 0000000..15ad353
--- /dev/null
+++ b/reference/C/CONTRIB/SNIP/bincomp.c
@@ -0,0 +1,172 @@
+/*
+** BINCOMP -- binary compare
+** by Raymond Gardner -- Englewood CO -- 8/92 -- public domain
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#ifndef min
+#define min(a,b) ((a) < (b) ? (a) : (b))
+#endif
+#define bufsize 8
+#define empty_legend " .."
+
+unsigned char f1buf[bufsize+1], f2buf[bufsize+1];
+long prevn;
+
+void putempty(unsigned n)
+{
+ while (n--)
+ printf(empty_legend);
+}
+
+void putbl(unsigned n)
+{
+ while (n--)
+ printf(" ");
+}
+
+void showbufs(long n, unsigned m, unsigned char *b1, unsigned char *b2)
+{
+ unsigned i;
+
+ if (n != prevn + bufsize)
+ printf("\n");
+ prevn = n;
+ printf("%08lX ", n);
+
+ if (b1 && b2)
+ {
+ for (i = 0; i < m; i++)
+ printf(" %02X", b1[i]);
+ for (i = m; i < 8; i++)
+ printf(" ");
+ putchar(' ');
+ for (i = 0; i < m; i++)
+ {
+ if (isprint(b1[i]))
+ putchar(b1[i]);
+ else putchar(' ');
+ }
+ for (i = m; i < 8; i++)
+ putchar(' ');
+ printf(" |");
+ for (i = 0; i < m; i++)
+ {
+ if (b1[i] != b2[i])
+ printf(" %02X", b2[i]);
+ else printf(empty_legend);
+ }
+ for (i = m; i < 8; i++)
+ printf(" ");
+ putchar(' ');
+ for (i = 0; i < m; i++)
+ {
+ if (b1[i] != b2[i] && isprint(b2[i]))
+ putchar(b2[i]);
+ else putchar(' ');
+ }
+ }
+ else if (b1)
+ {
+ for (i = 0; i < m; i++)
+ printf(" %02X", b1[i]);
+ for (i = m; i < 8; i++)
+ printf(" ");
+ putchar(' ');
+ for (i = 0; i < m; i++)
+ {
+ if (isprint(b1[i]))
+ putchar(b1[i]);
+ else putchar(' ');
+ }
+ for (i = m; i < 8; i++)
+ putchar(' ');
+ printf(" |");
+ }
+ else
+ {
+ putbl(33);
+ printf(" |");
+ for (i = 0; i < m; i++)
+ printf(" %02X", b2[i]);
+ for (i = m; i < 8; i++)
+ printf(" ");
+ putchar(' ');
+ for (i = 0; i < m; i++)
+ {
+ if (isprint(b2[i]))
+ putchar(b2[i]);
+ else putchar(' ');
+ }
+ }
+ printf("\n");
+}
+
+long fsize(FILE *fp)
+{
+ long pos, size;
+
+ pos = ftell(fp);
+ fseek(fp, 0L, SEEK_END);
+ size = ftell(fp);
+ fseek(fp, pos, SEEK_SET);
+ return size;
+}
+
+void bincomp(FILE *f1, FILE *f2)
+{
+ unsigned m;
+ long f1len, f2len, k, n;
+
+ prevn = -1;
+ f1len = fsize(f1);
+ f2len = fsize(f2);
+ printf("%ld %ld\n", f1len, f2len);
+ k = min(f1len, f2len);
+ n = 0;
+ while (n < k)
+ {
+ m = (unsigned)min(k - n, (long)bufsize);
+ fread(f1buf, 1, m, f1);
+ fread(f2buf, 1, m, f2);
+ if (memcmp(f1buf, f2buf, m) != 0)
+ showbufs(n, m, f1buf, f2buf);
+ n += m;
+ }
+ while (n < f1len)
+ {
+ m = (unsigned)min(f1len - n, (long)bufsize);
+ fread(f1buf, 1, m, f1);
+ showbufs(n, m, f1buf, NULL);
+ n += m;
+ }
+ while (n < f2len)
+ {
+ m = (unsigned)min(f2len - n, (long)bufsize);
+ fread(f2buf, 1, m, f2);
+ showbufs(n, m, NULL, f2buf);
+ n += m;
+ }
+}
+
+int main(int argc, char **argv)
+{
+ FILE *f1, *f2;
+
+ if (argc < 3)
+ {
+ puts("Usage: bincomp f1 f2");
+ exit(0);
+ }
+ printf("%s vs. %s\n", argv[1], argv[2]);
+ f1 = fopen(argv[1], "rb");
+ f2 = fopen(argv[2], "rb");
+ if (f1 && f2)
+ bincomp(f1, f2);
+ else puts("can't open file(s)");
+ return 0;
+}