home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / tools / exe2bin / exe2com / strings.c < prev   
Text File  |  1987-12-30  |  3KB  |  119 lines

  1. /*
  2.  *      S T R I N G S . C
  3.  *
  4.  *      This program is used to display strings in binary files
  5.  *
  6.  *    Steve Sampson, Public Domain (p) November 1987
  7.  *
  8.  *     Updated 12/29/87 - P. Lyall (76703,4230)
  9.  *
  10.  *    - bug fix: in_string was previously never reset to FALSE,
  11.  *      resulting in erroneous marking of string start.
  12.  *
  13.  *    - hex offset of each string start is now provided to ease
  14.  *      hacking/patching of files.
  15.  */
  16.  
  17. #include <stdio.h>
  18. #include <ctype.h>
  19.  
  20. #ifdef MSDOS
  21. #include <fcntl.h>
  22. #define    READ    O_RDONLY
  23. #define    pflinit()
  24. #else
  25. #include <lowio.h>
  26. #endif
  27.  
  28. #define FALSE   0
  29. #define TRUE    ~FALSE
  30. #define DEFCHARS 3
  31. #define MAXLINE 256
  32.  
  33.  
  34. main(argc, argv)
  35. int     argc;
  36. char    *argv[];
  37. {
  38.      int     i, ercode, lptr, nchars = DEFCHARS, fd, in_string;
  39.      char    *fname, inbuff[MAXLINE], outbuff[MAXLINE];
  40.      long    sofar = 0L, sstart;
  41.  
  42.      pflinit();
  43.  
  44.      if (argc < 2 || argc > 3)  
  45.      {
  46.           fprintf(stderr, "Usage: strings [n] <filename>\n");
  47.           fprintf(stderr, "Where n is the minimum width (default is 3)\n");
  48.           exit(0);
  49.      }
  50.  
  51.      if (argc == 3)  
  52.      {
  53.           nchars = abs(atoi(argv[1]));
  54.           if (nchars < 1 || nchars > MAXLINE - 1)  
  55.           {
  56.                fprintf(stderr, "strings: Maximum width is %d\n", MAXLINE - 1);
  57.                exit(1);
  58.           }
  59.  
  60.           fname  = argv[2];
  61.      }
  62.      else
  63.           fname  = argv[1];
  64.  
  65.  
  66.      if ((fd = open(fname, READ)) == -1)  
  67.      {
  68.           fprintf(stderr, "strings: File `%s' Not Found\n", fname);
  69.           exit(1);     }
  70.  
  71.      lptr = 0;                               /* Index into outbuff        */
  72.      in_string = FALSE;                      /* Not in a string yet       */
  73.  
  74.      while ((ercode = read(fd, inbuff, MAXLINE)) > 0)  
  75.      {
  76.           for (i = 0; i < ercode; i++)  
  77.           {
  78.  
  79.                /* Search entire buffer */
  80.  
  81.                if (in_string && isprint(inbuff[i]))
  82.  
  83.                     /* We are in a string and are continuing */
  84.  
  85.                     outbuff[lptr++] = inbuff[i];
  86.  
  87.                else 
  88.                     if (isprint(inbuff[i]))   /* would this char start one ? */
  89.                     {
  90.                          outbuff[lptr++] = inbuff[i]; /* start new one */
  91.                          in_string = TRUE;      /* We're in a string now */
  92.                          sstart = i+sofar;      /* mark string start */
  93.                     }
  94.                     else 
  95.                          if (in_string) /* if in one, would this end it? */
  96.                          {
  97.                               /* End of string */
  98.                               if (lptr >= nchars)  /* enough to tell about? */
  99.                               {
  100.                                    /* Found a long-enough string */
  101.                                    outbuff[lptr] = '\0';
  102.  
  103.                                    /* Terminate the string and print */
  104.  
  105.                                    printf("%6lx: %s\n", sstart, outbuff);
  106.                               }
  107.  
  108.                               in_string = FALSE; /* PWL */
  109.                               lptr = 0;       /* Start at beginning again */
  110.                          }
  111.  
  112.           }
  113.  
  114.           sofar += (long)ercode;   /* update how far we've read into buffers */
  115.      }
  116.  
  117.      close(fd);
  118. }
  119.