home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / snip9707.zip / BINCOMP.C < prev    next >
C/C++ Source or Header  |  1997-07-05  |  4KB  |  173 lines

  1. /* +++Date last modified: 05-Jul-1997 */
  2.  
  3. /*
  4. ** BINCOMP -- binary compare
  5. ** by Raymond Gardner -- Englewood CO -- 8/92 -- public domain
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <ctype.h>
  12. #include "minmax.h"
  13.  
  14. #define bufsize             8
  15. #define empty_legend        " .."
  16.  
  17. unsigned char f1buf[bufsize+1], f2buf[bufsize+1];
  18. long prevn;
  19.  
  20. void putempty(unsigned n)
  21. {
  22.       while (n--)
  23.             printf(empty_legend);
  24. }
  25.  
  26. void putbl(unsigned n)
  27. {
  28.       while (n--)
  29.             printf(" ");
  30. }
  31.  
  32. void showbufs(long n, unsigned m, unsigned char *b1, unsigned char *b2)
  33. {
  34.       unsigned i;
  35.  
  36.       if (n != prevn + bufsize)
  37.             printf("\n");
  38.       prevn = n;
  39.       printf("%08lX ", n);
  40.  
  41.       if (b1 && b2)
  42.       {
  43.             for (i = 0; i < m; i++)
  44.                   printf(" %02X", b1[i]);
  45.             for (i = m; i < 8; i++)
  46.                   printf("   ");
  47.             putchar(' ');
  48.             for (i = 0; i < m; i++)
  49.             {
  50.                   if (isprint(b1[i]))
  51.                         putchar(b1[i]);
  52.                   else  putchar(' ');
  53.             }
  54.             for (i = m; i < 8; i++)
  55.                   putchar(' ');
  56.             printf(" |");
  57.             for (i = 0; i < m; i++)
  58.             {
  59.                   if (b1[i] != b2[i])
  60.                         printf(" %02X", b2[i]);
  61.                   else  printf(empty_legend);
  62.             }
  63.             for (i = m; i < 8; i++)
  64.                   printf("   ");
  65.             putchar(' ');
  66.             for (i = 0; i < m; i++)
  67.             {
  68.                   if (b1[i] != b2[i] && isprint(b2[i]))
  69.                         putchar(b2[i]);
  70.                   else  putchar(' ');
  71.             }
  72.       }
  73.       else if (b1)
  74.       {
  75.             for (i = 0; i < m; i++)
  76.                   printf(" %02X", b1[i]);
  77.             for (i = m; i < 8; i++)
  78.                   printf("   ");
  79.             putchar(' ');
  80.             for (i = 0; i < m; i++)
  81.             {
  82.                   if (isprint(b1[i]))
  83.                         putchar(b1[i]);
  84.                   else  putchar(' ');
  85.             }
  86.             for (i = m; i < 8; i++)
  87.                   putchar(' ');
  88.             printf(" |");
  89.       }
  90.       else
  91.       {
  92.             putbl(33);
  93.             printf(" |");
  94.             for (i = 0; i < m; i++)
  95.                   printf(" %02X", b2[i]);
  96.             for (i = m; i < 8; i++)
  97.                   printf("   ");
  98.             putchar(' ');
  99.             for (i = 0; i < m; i++)
  100.             {
  101.                   if (isprint(b2[i]))
  102.                         putchar(b2[i]);
  103.                   else  putchar(' ');
  104.             }
  105.       }
  106.       printf("\n");
  107. }
  108.  
  109. long fsize(FILE *fp)
  110. {
  111.       long pos, size;
  112.  
  113.       pos = ftell(fp);
  114.       fseek(fp, 0L, SEEK_END);
  115.       size = ftell(fp);
  116.       fseek(fp, pos, SEEK_SET);
  117.       return size;
  118. }
  119.  
  120. void bincomp(FILE *f1, FILE *f2)
  121. {
  122.       unsigned m;
  123.       long f1len, f2len, k, n;
  124.  
  125.       prevn = -1;
  126.       f1len = fsize(f1);
  127.       f2len = fsize(f2);
  128.       printf("%ld %ld\n", f1len, f2len);
  129.       k = min(f1len, f2len);
  130.       n = 0;
  131.       while (n < k)
  132.       {
  133.             m = (unsigned)min(k - n, (long)bufsize);
  134.             fread(f1buf, 1, m, f1);
  135.             fread(f2buf, 1, m, f2);
  136.             if (memcmp(f1buf, f2buf, m) != 0)
  137.                   showbufs(n, m, f1buf, f2buf);
  138.             n += m;
  139.       }
  140.       while (n < f1len)
  141.       {
  142.             m = (unsigned)min(f1len - n, (long)bufsize);
  143.             fread(f1buf, 1, m, f1);
  144.             showbufs(n, m, f1buf, NULL);
  145.             n += m;
  146.       }
  147.       while (n < f2len)
  148.       {
  149.             m = (unsigned)min(f2len - n, (long)bufsize);
  150.             fread(f2buf, 1, m, f2);
  151.             showbufs(n, m, NULL, f2buf);
  152.             n += m;
  153.       }
  154. }
  155.  
  156. int main(int argc, char **argv)
  157. {
  158.       FILE *f1, *f2;
  159.  
  160.       if (argc < 3)
  161.       {
  162.             puts("Usage: bincomp f1 f2");
  163.             exit(0);
  164.       }
  165.       printf("%s vs. %s\n", argv[1], argv[2]);
  166.       f1 = fopen(argv[1], "rb");
  167.       f2 = fopen(argv[2], "rb");
  168.       if (f1 && f2)
  169.             bincomp(f1, f2);
  170.       else  puts("can't open file(s)");
  171.       return 0;
  172. }
  173.