home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / FLEXLIST.ZIP / DUMP.C < prev    next >
Text File  |  1989-07-20  |  5KB  |  247 lines

  1. /*
  2.  
  3.     dump.c
  4.     7/20/89
  5.  
  6.     Copyright 1989
  7.     John W. Small
  8.     All rights reserved
  9.  
  10.     PSW / Power SoftWare
  11.     P.O. Box 10072
  12.     McLean, Virginia 22102 8072
  13.  
  14. */
  15.  
  16. #include <stdlib.h>        /*  exit()  */
  17. #include <string.h>     /*  strlen(), strcpy()  */
  18. #include <io.h>         /*  open(), close(), read()  */
  19. #include <fcntl.h>      /*  O_RDONLY, O_BINARY  */
  20. #include <conio.h>      /*  clrscr(), clreol(),  */
  21.                         /*  gotoxy(), window(),  */
  22.                         /*  textcolor(), cprintf(),  */
  23.                         /*  textbackground(), putch(),  */
  24.                         /*  window()  */
  25. #include <dos.h>        /*  int86(), union REGS;  */
  26. #include <flexlist.h>    /*  mkFlist(), rmFlist(),  */
  27.                         /*  nempty(), iquedptr(),  */
  28.                         /*  ncur(), mkcdptr(),  */
  29.                         /*  nextdptr(), prevdptr()  */
  30.  
  31. #define NSIZE   256
  32. #define FNSIZE   65
  33.  
  34. static int color, bgrd, ccolor, cbgrd, mcolor, mbgrd;
  35.  
  36. Flist loaddf(char *fname)
  37. {
  38.     Flist df;
  39.     int fd, n;
  40.     char *txt;
  41.  
  42.     if (!fname)
  43.         return (Flist) 0;
  44.     if (strlen(fname) >= FNSIZE)
  45.         return (Flist) 0;
  46.     if ((fd = open(fname,O_RDONLY|O_BINARY)) < 0)
  47.         return (Flist) 0;
  48.     if ((df = mkFlist(NSIZE,FNSIZE)) == (Flist) 0)  {
  49.         close(fd);
  50.         return (Flist) 0;
  51.     }
  52.     strcpy(Flistdptr(df),fname);
  53.     while ((txt = iquedptr(df,(void *) 0)) != (char *) 0)
  54.         if ((n = read(fd,txt,NSIZE)) < NSIZE)  {
  55.             for (; n < NSIZE; n++)
  56.                 txt[n] = '\0';
  57.             break;
  58.         }
  59.     close(fd);
  60.     if (!nempty(df))
  61.         rmFlist(&df);
  62.     return df;
  63. }
  64.  
  65. #define  Home    71
  66. #define  UpArr  72
  67. #define  PgUp   73
  68. #define  LArr   75
  69. #define  RArr   77
  70. #define  EndKey 79
  71. #define  DnArr  80
  72. #define  PgDn   81
  73. #define  ESC    27
  74. #define     F1     59
  75. #define  F3     61
  76.  
  77. int getPC(void)
  78. {
  79.   union REGS rgs;
  80.  
  81.   rgs.x.ax  =  0x0000;
  82.   int86(0x16,&rgs,&rgs);
  83.   if (rgs.h.al) {
  84.      return (int ) rgs.h.al;
  85.   }
  86.   return - (int) rgs.h.ah;
  87. }
  88.  
  89. char *newFile(void)
  90. {
  91.     static char fname[FNSIZE];
  92.     int c;
  93.  
  94.     gotoxy(1,25);
  95.     textcolor(mcolor);
  96.     textbackground(mbgrd);
  97.     clreol();
  98.     fname[0] = FNSIZE;
  99.     cprintf("Enter file: ");
  100.     return cgets(fname);
  101. }
  102.  
  103. int dump(char *fname)
  104. {
  105.     Flist df, newdf;
  106.     char c, *txt;
  107.     int i, r, n;
  108.  
  109.     if ((df = loaddf(fname))
  110.         == (Flist) 0)
  111.         return 1;
  112.     for (c = -Home; c != ESC; c = getPC())  {
  113.         switch (c)  {
  114.         case -PgDn:
  115.             if (ncur(df) < nempty(df))
  116.                 txt = nextdptr(df,(void *) 0);
  117.             else
  118.                 continue;
  119.             break;
  120.         case -PgUp:
  121.             if (ncur(df) > 1)
  122.                 txt = prevdptr(df,(void *) 0);
  123.             else
  124.                 continue;
  125.             break;
  126.         case -Home:
  127.             txt = mkcdptr(df,1);
  128.             break;
  129.         case -EndKey:
  130.             txt = mkcdptr(df,nempty(df));
  131.             break;
  132.         case -F1:
  133.             textcolor(mcolor);
  134.             textbackground(mbgrd);
  135.             gotoxy(1,25);
  136.             clreol();
  137.             cprintf("Keys: PgUp, PgDn, Home = top,"
  138.             " End = bottom, F3 = new file, ESC = Quit");
  139.             continue;
  140.         case -F3:
  141.             if ((newdf = loaddf(newFile()))
  142.                 != (Flist) 0)  {
  143.                 rmFlist(&df);
  144.                 df = newdf;
  145.                 txt = mkcdptr(df,1);
  146.             }
  147.             break;
  148.         default:
  149.             continue;
  150.         }
  151.         textcolor(color);
  152.         textbackground(bgrd);
  153.         window(1,1,80,24);
  154.         clrscr();
  155.         cprintf(" Addr      Dword        Dword   "
  156.             "     Dword        Dword           ASCII"
  157.             "\n\r\n\r\n\r");
  158.         for (n = ncur(df) - 1, r = 0;
  159.             r < 16; r++, txt += 16)  {
  160.             cprintf("\n\r%06x ",n * NSIZE + r * 16);
  161.             for (i = 0; i < 16; i++)  {
  162.                 if (i % 4 == 0)
  163.                     putch(' ');
  164.                 cprintf("%02X ",(unsigned char) txt[i]);
  165.             }
  166.             cprintf("  ");
  167.             for (i = 0; i < 16; i++)
  168.                 switch (txt[i])  {
  169.                     case 7: case 8: case 9:
  170.                     case 10: case 13:
  171.                         putch(' ');
  172.                         break;
  173.                     default:
  174.                         if (txt[i] < 26)  {  /* ctrl char */
  175.                             textcolor(ccolor);
  176.                             textbackground(cbgrd);
  177.                             putch(txt[i] + 'A' - 1);
  178.                             textcolor(color);
  179.                             textbackground(bgrd);
  180.                         }
  181.                         else
  182.                         putch(txt[i]);
  183.                 }
  184.         }
  185.         textcolor(mcolor);
  186.         textbackground(mbgrd);
  187.         window(1,1,80,25);
  188.         gotoxy(1,25);
  189.         clreol();
  190.         cprintf("Dump file: %s",(char *) Flistdptr(df));
  191.     }
  192.     rmFlist(&df);
  193.     return 0;
  194. }
  195.  
  196. int vmode(void)
  197. {
  198.     union REGS rgs;
  199.  
  200.     rgs.x.ax = 0x0F00;
  201.     int86(0x10,&rgs,&rgs);
  202.     return (int) rgs.h.al;
  203. }
  204.  
  205. void scrInit(void)
  206. {
  207.     textmode(C80);
  208.     if (vmode() == 7)  {
  209.         color  = BLACK;
  210.         bgrd   = LIGHTGRAY;
  211.         ccolor = LIGHTGRAY;
  212.         cbgrd  = BLACK;
  213.         mcolor = BLACK;
  214.         mbgrd  = LIGHTGRAY;
  215.     }
  216.     else  {
  217.         color  = BLACK;
  218.         bgrd   = LIGHTGRAY;
  219.         ccolor = BLUE;
  220.         cbgrd  = LIGHTGRAY;
  221.         mcolor = LIGHTGRAY;
  222.         mbgrd  = MAGENTA;
  223.     }
  224.     textcolor(color);
  225.     textbackground(bgrd);
  226.     clrscr();
  227. }
  228.  
  229. main(int argc, char *argv[])
  230. {
  231.     int i;
  232.  
  233.     if (argc > 2)  {
  234.         puts("\nusage:  dump  filename");
  235.         exit(1);
  236.     }
  237.     scrInit();
  238.     if (argc == 1)
  239.         i = dump(newFile());
  240.     else
  241.         i = dump(argv[1]);
  242.     textcolor(LIGHTGRAY);
  243.     textbackground(BLACK);
  244.     clrscr();
  245.     exit(i);
  246. }
  247.