home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / snip9707.zip / SHOWANSI.CPP < prev    next >
C/C++ Source or Header  |  1997-07-05  |  4KB  |  146 lines

  1. // +++Date last modified: 05-Jul-1997
  2.  
  3. // Ansi/AVT0+ file viewer
  4. // public domain
  5. // by David Nugent <davidn@unique.blaze.net.au>
  6. // 3:632/348@fidonet
  7. // V1.1 David Nugent  Added cmdline wildcard expansion using
  8. //                    SNIPPETS dirport.h
  9. //                    Added avatar/0+ file support.
  10.  
  11. #define PROGRAM   "showansi"
  12. #define VERSION   "V1.10-PD"
  13.  
  14. #if defined(__WATCOMC__)
  15.   // Turn off warnings for resolution of temp object
  16. #pragma warning 604 9
  17. #pragma warning 595 9
  18. #endif
  19.  
  20. #include <fstream.h>
  21. #include <string.h>
  22. #include <ctype.h>
  23. #include <errno.h>
  24. #include "ansisys.hpp"
  25. #include "avatar.hpp"
  26. extern "C"
  27. { // SNIPPETS portable directory routines
  28.   #include "dirport.h"
  29. }
  30.  
  31. int
  32. main(int argc, char * argv[])
  33. {
  34.   if (argc == 1)
  35.     cout << PROGRAM "; ANSI & AVT/0+ file interpreter; " VERSION "\n"
  36.     "This program is in the public domain. Compiled " __DATE__ "\n"
  37.     "by David Nugent <davidn@unique.blaze.net.au> 3:632/348@fidonet\n\n"
  38.     "  usage: " PROGRAM " [-p] [-a] [-f] file1 [file2 ...]\n"
  39.     "    Displays file1[,file2..] to the screen handling ANSI/Avatar\n"
  40.     "    -p     Toggles screen pausing (default=ON)\n"
  41.     "    -a     Toggles file type (default=ANSI)\n"
  42.     "    -f     Toggles flush after every character (default=OFF)\n"
  43.     << endl;
  44.   else
  45.   {
  46.     char pause = 1;
  47.     char done = 0;
  48.     char doavt0 = 0;
  49.     char doflush = 0;
  50.     scrinterp * interpreter = 0;
  51.     video V;
  52.  
  53.     for (int carg = 0 ; !done && ++carg < argc ;)
  54.     {
  55.       char * argp = argv[carg];
  56.  
  57.       if (*argp == '-' || *argp == '/')
  58.       {
  59.         ++argp;
  60.  
  61.         switch(tolower(*argp))
  62.         {
  63.           case 'p':     // -p toggles pause between files
  64.             pause = !pause;
  65.             break;
  66.           case 'a':     // -a toggles ansi/avt0 display
  67.             doavt0 = !doavt0;
  68.             delete interpreter;
  69.             interpreter = 0;
  70.             break;
  71.           case 'f':     // -f flush each character (slows output)
  72.             doflush = !doflush;
  73.             break;
  74.         }
  75.       }
  76.       else
  77.       {
  78.         DOSFileData ff;
  79.         char * p;
  80.         char tmpstr[128] = "";
  81.  
  82.         while ((p = strchr(argp, '/')) != 0)
  83.           *p = '\\';
  84.         p = strrchr(argp, '\\');
  85.         if (p == 0)
  86.           *(p = tmpstr) = '\0';
  87.         else
  88.         {
  89.           ++p;
  90.           int n = p - argp;
  91.           strncpy(tmpstr, argp, n);
  92.           p = tmpstr + n;
  93.         }
  94.  
  95.         if (FIND_FIRST(argp, _A_NORMAL, &ff) != 0)
  96.           cerr << "can't find file: " << argp << endl;
  97.         else do
  98.         {
  99.           argp = tmpstr;
  100.           strcpy(p, ff_name(&ff));    // Append it to path, if any
  101.  
  102.           ifstream ansifile(argp, ios::in|ios::binary);
  103.  
  104.           if (!ansifile)
  105.             cerr << "showansi: can't open file " << argp
  106.                  << ':' << strerror(errno) << endl;
  107.           else
  108.           {
  109.             V.setattr(7);
  110.             V.cls();
  111.             V.gotoxy(0, 0);
  112.             if (interpreter == 0)   // Nothing allocated yet
  113.               interpreter = (doavt0) ? (scrinterp *)new avatar(V) :
  114.                                        (scrinterp *)new ansisys(V);
  115.             interpreter->flusheverychar(doflush);
  116.             interpreter->display(ansifile);
  117.             if (pause)
  118.             {
  119.               cell_t x, y;
  120.               V.maxxy(x, y);
  121.               V.gotoxy(0, --y);
  122.               V.setattr(15);
  123.               V.put(argp);
  124.               V.put(" -- press any key to continue --");
  125.               unsigned short k = V.getkey();
  126.               V.gotoxy(0, y);
  127.               V.repchr(' ', x);
  128.               V.gotoxy(0, --y);
  129.               if ((k & 0xff) == 27) // ESC
  130.               {
  131.                 ++done;
  132.                 break;
  133.               }
  134.             }
  135.           }
  136.         }
  137.         while (FIND_NEXT(&ff)==0);
  138.         FIND_END(&ff);
  139.       }
  140.     }
  141.     delete interpreter;
  142.   }
  143.   return 0;
  144. }
  145.  
  146.