home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume6 / hd < prev    next >
Text File  |  1989-02-03  |  5KB  |  136 lines

  1. Path: xanth!nic.MR.NET!csd4.milw.wisc.edu!leah!itsgw!steinmetz!uunet!allbery
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Newsgroups: comp.sources.misc
  4. Subject: v06i029: hd- A hex dump utility
  5. Message-ID: <47762@uunet.UU.NET>
  6. Date: 29 Jan 89 21:24:51 GMT
  7. Sender: allbery@uunet.UU.NET
  8. Reply-To: hal@dad.UUCP (Harold A. Miller)
  9. Lines: 124
  10. Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  11.  
  12. Posting-number: Volume 6, Issue 29
  13. Submitted-by: hal@dad.UUCP (Harold A. Miller)
  14. Archive-name: hd
  15.  
  16. #! /bin/sh
  17. echo shar: extracting hd.c
  18. if test -f 'hd.c' ; then
  19.     echo shar: will not overwrite hd.c
  20. else
  21.     cat > hd.c << '@EOF hd.c'
  22. /* ********************************************************************** */
  23. /*                                   hd.c                                 */
  24. /*                         A CP/M dump-like utility                       */
  25. /*                   Written by: Mike Ewan and Hal Miller                 */
  26. /* tektronix!tekgen!nesa!raven!mike       uw-beaver!tikal!dad!hal         */
  27. /* Use hereby authorized by anyone for any reason, except sale.           */
  28. /* ********************************************************************** */
  29.  
  30. #include <stdio.h>
  31.  
  32. main(argc,argv)
  33. int        argc ;
  34. char    *argv[] ;
  35. {
  36.     FILE    *fopen(), *fp ;
  37.     int     c     ;                       /* work character             */
  38.     int     llgt  ;                       /* for efficiency in loops    */
  39.     int     x     ;                       /* ascii column index         */
  40.     int     z     ;                       /* loop counter               */
  41.     long    addr  ;                       /* starting address for line  */
  42.     long    start ;                       /* optional begin file offset */
  43.     char    *flname ;                     /* pointer for file open      */
  44.     char    str[8]  ;                     /* work buffer for conversion */
  45.     char    asc[17] ;                     /* contents of ascii column   */
  46.  
  47.     if (argc == 3)
  48.         {                     /* given filename and starting offset     */
  49.         flname = argv[1] ;
  50.         sscanf(argv[2], "%x", &start) ;
  51.         }
  52.     else
  53.         {
  54.         if (argc == 2)
  55.             {                 /* no offset given, use beginning of file */
  56.             flname = argv[1] ;
  57.             start = 0L ;
  58.             }
  59.         else
  60.             {
  61.             printf("usage: %s filename [offset]\n", argv[0]) ;
  62.             exit(1) ;
  63.             }
  64.         }
  65.     if ((fp = fopen(flname,"r")) == NULL)
  66.         {
  67.         printf("%s: unable to open %s\n", argv[0], flname) ;
  68.         exit(1) ;
  69.         }
  70.  
  71.     x = 0 ;
  72.     addr = start ;
  73.  
  74.     sprintf(str, "%08x", addr) ;          /* set up and print start address */
  75.     llgt = strlen(str) ;                  /* for the first row              */
  76.     for (z=0; z<llgt; z++)
  77.         if (str[z] >= 'a' && str[z] <= 'f')
  78.             str[z] &= 0137 ;
  79.     printf("%8s:  ", str) ;
  80.  
  81.     if (start != 0)                       /* get to offset if need be       */
  82.         fseek(fp, start, 0) ;
  83.  
  84.     while ((c = getc(fp)) != EOF)
  85.         {                                 /* read and process entire file   */
  86.         sprintf(str,"%02x",c) ;           /* set up and print the hex stuff */
  87.         if (str[0] >= 'a' && str[0] <= 'f')
  88.             str[0] &= 0137 ;
  89.         if (str[1] >= 'a' && str[1] <= 'f')
  90.             str[1] &= 0137 ;
  91.         printf("%s ",str) ;
  92.  
  93.         if ((c >= ' ') && (c <= '~'))     /* set up the ascii stuff         */
  94.             asc[x] = c ;
  95.         else
  96.             asc[x] = '.' ;
  97.         x++ ;
  98.  
  99.         if (x >= 16)
  100.             {                             /* got enough to print a line     */
  101.             putchar(32) ;
  102.             for (z=0; z<=15; z++)
  103.                 {
  104.                 putchar(asc[z]) ;
  105.                 asc[z] = '\0' ;
  106.                 }
  107.             putchar(10) ;
  108.             x = 0 ;
  109.  
  110.             addr += 16L ;                 /* set up for next line's address */
  111.             sprintf(str, "%08x", addr) ;
  112.             llgt = strlen(str) ;
  113.             for (z=0; z<=llgt; z++)
  114.                 if (str[z] >= 'a' && str[z] <= 'f')
  115.                     str[z] &= 0137 ;
  116.             printf("%8s:  ",str) ;
  117.             }
  118.         }                                 /* end of file                    */
  119.  
  120.     llgt = 15 - x ;                       /* space fill rest of last line   */
  121.     for (z=0; z<=llgt; z++)
  122.         printf("   ") ;
  123.     putchar(32) ;
  124.     for (z=0; z<=15; z++)
  125.         putchar(asc[z]) ;
  126.     putchar(10) ;
  127.     fclose(fp) ;
  128.     exit(0) ;
  129. }
  130. @EOF hd.c
  131. if test 3871 -ne "`wc -c < hd.c`"; then
  132.     echo shar: checksum error - number of characters should be 3871
  133. fi
  134. fi
  135. chmod 666 hd.c
  136.