/* ** BINCOMP -- binary compare ** by Raymond Gardner -- Englewood CO -- 8/92 -- public domain */ #include #include #include #include #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; }