home *** CD-ROM | disk | FTP | other *** search
/ ftp.ee.pdx.edu / 2014.02.ftp.ee.pdx.edu.tar / ftp.ee.pdx.edu / pub / users / Harry / compilers / bin / hexdump.c < prev   
Text File  |  2000-09-22  |  2KB  |  113 lines

  1. /* hexdump  -  This program reads a file from the standard input containing
  2.                arbitrary hex data and outputs it to the standard output
  3.                in a format suitable for human examination.  Unlike various
  4.                versions of 'od', it prints the bytes in exactly the order
  5.                read.  */
  6.  
  7. #define EOF -1
  8.  
  9. int row [16];
  10. int size;
  11.  
  12. main () {
  13.    int addr;
  14.  
  15.    /* Each execution of this loop prints a single output line. */
  16.    addr = 0;
  17.    readline ();
  18.    while (size > 0) {
  19.      putlong (addr);
  20.      printf (": ");
  21.      printline ();
  22.      addr = addr + 16;
  23.      readline ();
  24.    }
  25.  
  26. }
  27.  
  28.  
  29.  
  30. /* readline - This routine reads in the next 16 bytes from the file and
  31.               places them in the array named 'row', setting 'size' to
  32.               be the number of bytes read in.  Size will be less than
  33.               16 if EOF was encountered, and may possibly be 0.  */
  34. readline () {
  35. int c;
  36.   size = 0;
  37.   c = getchar ();
  38.   while (c != EOF) {
  39.     row [size] = c;
  40.     size = size + 1;
  41.     if (size >= 16) break;
  42.       c = getchar ();
  43.   }
  44. }
  45.  
  46.  
  47.  
  48. /* putlong - This routine is passed an integer, which it displays as 8
  49.              hex digits.  */
  50. putlong (i) {
  51.   putbyt ((i>>24) & 0x000000ff);
  52.   putbyt ((i>>16) & 0x000000ff);
  53.   putbyt ((i>>8) & 0x000000ff);
  54.   putbyt ((i>>0) & 0x000000ff);
  55. }
  56.  
  57.  
  58.  
  59. /* printline - This routine prints the current 'row'.  */
  60. printline () {
  61.   int i, c;
  62.   if (size > 0) {
  63.     i = 0;
  64.     while (i<16) {
  65.       if (i < size) {
  66.         putbyt (row[i]);
  67.       } else {
  68.         printf ("  ");
  69.       }
  70.       i++;
  71.       if ((i%2) == 0) {
  72.         putchar (' ');
  73.       }
  74.     }
  75.     printf ("  ");
  76.     for (i=0; i<size; i++) {
  77.       c = row[i];
  78.       if ((c>=' ') && (c <= '~')) {
  79.         putchar (c);
  80.       } else {
  81.         putchar ('.');
  82.       }
  83.     }
  84.     printf ("\n");
  85.   }
  86. }
  87.  
  88.  
  89.  
  90. /* putbyt - This routine is passed a byte (i.e., an integer < 256) which
  91.           it displays as 2 hex characters.  If passed a number out of that
  92.           range, it outputs nothing.  */
  93. putbyt (c)
  94.    int c;
  95. {
  96.   int i;
  97.   if ((c >= 0) && (c <= 255)) {
  98.     i = (c & 0x000000f0) >> 4;
  99.     if (i < 10) {
  100.       putchar ('0' + i);
  101.     } else {
  102.       putchar ('A' + i - 10);
  103.     }
  104.     i = (c & 0x0000000f) >> 0;
  105.     if (i < 10) {
  106.       putchar ('0' + i);
  107.     } else {
  108.       putchar ('A' + i - 10);
  109.     }
  110.   }
  111. }
  112.  
  113.