/*******************************************************/
/*                                                     */
/*  1.2.2.A. dump                                      */
/*                         DUMP                        */
/*                  (c) Bruno Jennrich                 */
/*                                                     */
/*                                                     */
/* This program creates a hex dump of a file.          */
/*******************************************************/
#include "stdio.h"

#define WIDTH 12L               /* 12 numbers per line */
                                   /* 80-column screen */

FILE *_File;                        /* file descriptor */
long filepos;                 /* current file position */
unsigned char Byte[WIDTH];    /* buffer for bytes read */
unsigned char Conversion_Table[256]; 
                        /* ASCII - printable coversion */
int ok;                        /* number of bytes read */

int BRead()
{
   int i;
   int z = 0;

   for (i=0;i<WIDTH;i++)
      if (!feof(_File))
      {
         Byte[i] = fgetc(_File);
         z++;
      }

   return (z);
}

main (argc, argv)
int   argc;
char       *argv[];
{
   int i;                             /* loop variable */

   if (argc != 2)                /* too few parameters */
   {
      printf ("USAGE: dump FILE \n");
      exit (10);
   }

   _File = fopen (argv[1],"r");           /* open file */

   if (_File == 0)                  /* file open error */
   {
      printf ("\"%s\" cannot be opened !!!\n",argv[1]);
      CloseIt (10);
   }

   for (i=0;i<32 ;i++) Conversion_Table[i] = '.';
   for (   ;i<128;i++) Conversion_Table[i] = (char)i;
   for (   ;i<160;i++) Conversion_Table[i] = '.';
   for (   ;i<256;i++) Conversion_Table[i] = (char)i;
                          /* Conversion_Table aufbauen */

   filepos=0;        /* current file position equals 0 */
   while ((ok = BRead()) != 0)
   {
      printf ("$%08lx   ",filepos);  
                        /* print current file position */
      filepos+=ok;  /* increment current file position */

      for (i=0;i<ok;i++) printf ("$%02x ",Byte[i]);
                                /* hexadecimal numbers */

     if (ok < WIDTH) for (i=ok;i<WIDTH;i++) printf ("    ");
                                    /* "blank numbers" */
      printf ("  ");                 /* column divider */

      for (i=0;i<ok;i++) printf
         ("%c",Conversion_Table[Byte[i]]);
                             /* "ASCII" representation */
      printf ("\n");                /* carriage return */
   } 
   CloseIt (0);                                 /* bye */
}

CloseIt (Error_Code)
int      Error_Code;
{
   if (_File != 0) fclose (_File);     /* if file open */
                                           /* close it */
   exit (Error_Code);
}

