home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 293_02 / dump1.c < prev    next >
C/C++ Source or Header  |  1989-08-25  |  2KB  |  95 lines

  1. /*
  2.  * Dumps a number of bytes from a specified offset from a file.
  3.  * The bytes are output in hex and ascii.
  4.  *
  5.  * Usage: dump file [-o] [-n] [-d | -h] [-w | -b]
  6.  *        -o    : offset (default 0)
  7.  *        -n    : number (default 256)
  8.  *        -d -h : decimal/hexadecimal (default h)
  9.  *        -w -b : word/byte (default b)
  10.  *
  11.  */
  12.  
  13. #include <stdio.h>
  14. #include <ctype.h>
  15. #include <math.h>
  16.  
  17. main(argc, argv)
  18. int argc;
  19. char *argv[];
  20. {
  21.   FILE *fp;
  22.   char  fn[256];
  23.   int   offset;
  24.   int   number;
  25.   int   char_cnt;
  26.   unsigned char  in_char[16];
  27.   char  out_char[16];
  28.   int   i;
  29.   int   hexmode;
  30.   int   bytemode;
  31.  
  32.   fn[0] = '\0'; 
  33.   offset = 0;
  34.   number = 256;
  35.   hexmode = bytemode = 1;
  36.   for (argc; argc > 1; argc--) {
  37.     if (**++argv == '-') {
  38.       switch (tolower(*(*argv + 1))) {
  39.         case 'o':
  40.           offset = atoi(*argv+2);
  41.           break;
  42.         case 'n':
  43.           number = atoi(*argv+2);
  44.           break;
  45.         case 'd':
  46.           hexmode = 0;
  47.           break;
  48.         case 'h':
  49.           hexmode = 1;
  50.           break;
  51.         case 'b':
  52.           bytemode = 1;
  53.           break;
  54.         case 'w':
  55.           bytemode = 0;
  56.           break;
  57.       }
  58.     }
  59.     else
  60.     strcpy(fn, *argv);
  61.   }
  62.  
  63.   if (fn[0] == '\0' || offset < 0 || number <= 0) {
  64.     printf("Usage: dump file [-o] [-n] [-d | -h] [-b | -w]\n");
  65.     exit(0);
  66.   }
  67.  
  68.   if ((fp = fopen(fn, "rb")) == NULL) {
  69.     printf("Error opening %s\n", fn);
  70.     exit(1);
  71.   }
  72.  
  73.   fseek(fp, (long) offset, SEEK_SET);
  74.  
  75.   for (char_cnt = 0; char_cnt < number; char_cnt += 16) {
  76.     fread(in_char, 1, 16, fp);
  77.     if (bytemode)
  78.       for (i = 0; i < 16; i++)
  79.         if (hexmode)
  80.           printf("%02x ", in_char[i]);
  81.         else
  82.           printf("%03d ", in_char[i]);
  83.     else
  84.       for (i = 0; i < 16; i += 2)
  85.         if (hexmode)
  86.           printf("%02x%02x ", in_char[i], in_char[i+1]);
  87.         else
  88.           printf("%06d ", in_char[i+1] * 0x100 + in_char[i]);
  89.  
  90.     for (i = 0; i < 16; i++)
  91.       printf("%c", (isprint(in_char[i])) ? in_char[i] : '.');
  92.     printf("\n");
  93.   }
  94.  
  95. }