home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / os2sdk / os2sdk10 / apps / sse / sse.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-08-11  |  4.5 KB  |  214 lines

  1. /***    SSE - Simple Screen Editor
  2.  *
  3.  *
  4.  *
  5.  *
  6.  *
  7.  *
  8.  *
  9.  *
  10.  */
  11.  
  12.  
  13.  
  14. #include <ctype.h>
  15. #include <doscalls.h>
  16. #include <dos.h>
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. #include <subcalls.h>
  20. #include "ssedefs.h"
  21.  
  22.  
  23. unsigned short     TotalLines;          /* num of entries in line table */
  24. struct Line far *LineTable[MAXLINES]; /* the line table */
  25.  
  26. unsigned short     TotalSegs;          /* num of entries in seg table */
  27. struct    SegEntry SegTable[MAXSEGS];
  28.  
  29. char           fbuffer[FBUFFSIZE];
  30. unsigned short bytesread;
  31.  
  32. unsigned char ScrBuff[LONGPAGE][LINESIZE];
  33. unsigned char EditBuff[LINESIZE];
  34. unsigned short EditBuffDirty;
  35.  
  36. unsigned short PageSize;
  37. unsigned short Mode43Set = 0;
  38.  
  39. unsigned short ForeNorm = 0x07;
  40. unsigned short BackNorm = 0x10;
  41. unsigned short ForeHilite = 0x01;
  42. unsigned short BackHilite = 0x70;
  43. unsigned short Fore25 = 0x07;
  44. unsigned short Back25 = 0x40;
  45.  
  46. unsigned short CurRow, CurCol;
  47. unsigned short TopRow;
  48.  
  49. unsigned short LinesMarked, CharsMarked;
  50. unsigned short MarkedLine[MAXLINES], MarkedChar[LINESIZE];
  51.  
  52. char           *fname;
  53. unsigned short fhandle;
  54.  
  55. /***    main
  56.  *
  57.  *
  58.  *
  59.  */
  60.  
  61. main(argc, argv)
  62. int   argc;
  63. char *argv[];
  64. {
  65.     unsigned short i;
  66.  
  67.     unsigned short handtype, flagword;
  68.  
  69.     struct  ModeData    modedata;       /* from subcalls.h */
  70.     struct  CursorData    cursordata;
  71.  
  72.  
  73. /* check if we're in foreground */
  74.  
  75.     DOSQHANDTYPE( 0, (unsigned far *)&handtype, (unsigned far *)&flagword );
  76.     if( (handtype == 0) || ( !( flagword & 1 )) || ( !( flagword & 2 )) )
  77.       quit(1);
  78.  
  79.  
  80. /* disable signals so user can't exit with Ctrl-C or Ctrl-Break */
  81.  
  82.     DOSHOLDSIGNAL( TRUE );
  83.  
  84.  
  85. /* initialize variables */
  86.  
  87.     EditBuffDirty = 0;
  88.     LinesMarked = 0;
  89.     CharsMarked = 0;
  90.     for (i = 0; i < MAXLINES; i++)
  91.     MarkedLine[i] = 0;
  92.     for (i = 0; i < LINESIZE; i++)
  93.     MarkedChar[i] = 0;
  94.  
  95. /* Set PageSize to match the mode we're in, 25 or 43.
  96.    This may be changed later by a switch from the command line. */
  97.  
  98.     modedata.length = sizeof( modedata );
  99.     VIOGETMODE( &modedata, 0 );
  100.     if( modedata.row == 25 )
  101.     PageSize = SHORTPAGE;
  102.     else PageSize = LONGPAGE;
  103.  
  104. /*  Parse file name */
  105.     if (argc < 2) {
  106.       error25(8);
  107.       quit(1);
  108.       }
  109.     else if (argc < 4) {
  110.        for( i = 1; i < (argc-1); i++ ) {
  111.            if( (argv[i][0] == '/') &&
  112.            ( argv[i][1] == '4' ) &&
  113.            ( argv[i][2] == '3' ) ) {
  114.            PageSize = LONGPAGE;
  115.            modedata.row = ( LONGPAGE + 1 );
  116.            VIOSETMODE( &modedata, 0 );
  117.            cursordata.cur_start = 6;
  118.            cursordata.cur_end = 7;
  119.            cursordata.cur_width = 1;
  120.            cursordata.cur_attribute = 0;
  121.            VIOSETCURTYPE( &cursordata, 0 );
  122.            Mode43Set = 1;
  123.            }
  124.            else if( (argv[i][0] == '/') &&
  125.             ( (argv[i][1] == 'B') || (argv[i][1] == 'b') ) &&
  126.             ( (argv[i][2] == 'W') || (argv[i][2] == 'w') ) ) {
  127.                ForeNorm = 0x07;
  128.                BackNorm = 0;
  129.                ForeHilite = 0;
  130.                BackHilite = 0x70;
  131.                Fore25 = 0;
  132.                Back25 = 0x70;
  133.                }
  134.            else {
  135.             error25(9);
  136.             quit(1);
  137.             }
  138.  
  139.        }
  140.        fname = argv[i];
  141.        }
  142.     else {
  143.        error25(10);
  144.        quit(1);
  145.        }
  146.  
  147.     /* paint the screen */
  148.     clearscr();
  149.     drawscr(0);
  150.  
  151. /*  read file */
  152.     switch (openfile(fname, &fhandle, FOFLAG)) {
  153.     case  0:
  154.         if (readfile(fhandle))
  155.         error25(1);
  156.         if (backupfile(fname, fhandle))
  157.         error25(2);
  158.         break;
  159.  
  160.     case  110:
  161. /*        create the file */
  162.         error25(3);
  163.         if (openfile(fname, &fhandle, CFFLAG))
  164.         error25(4);   /* error creating file */
  165.         break;
  166.  
  167.     case  32:
  168. /*        denied write access */
  169.         error25(5);
  170.         break;
  171.  
  172.     default :
  173. /*        error on opening file */
  174.         error25(6);
  175.         break;
  176.     }
  177.  
  178.  
  179. /* if open worked, continue */
  180.  
  181.     drawscr(0);
  182.     name25();
  183.     VIOSETCURPOS(0,0,0);
  184.     getline( 0, &EditBuff[0] );    /* initialize */
  185.     dispatch();
  186.     freesegs();
  187. }
  188.  
  189.  
  190.  
  191.  
  192.  quit(n)              /* if we set 43 line mode from command line,  */
  193.     unsigned short n;          /* set it back to 25 line mode before exiting */
  194.     {
  195.     struct  ModeData    modedata;
  196.     struct  CursorData    cursordata;
  197.  
  198.     if( Mode43Set ) {
  199.     modedata.length = sizeof( modedata );
  200.     VIOGETMODE( &modedata, 0 );
  201.     modedata.row = 25;
  202.     VIOSETMODE( &modedata, 0 );
  203.     cursordata.cur_start = 12;
  204.     cursordata.cur_end = 13;
  205.     cursordata.cur_width = 1;
  206.     cursordata.cur_attribute = 0;
  207.     VIOSETCURTYPE( &cursordata, 0 );
  208.     BackNorm = 0;
  209.     ForeNorm = 0;
  210.     clearscr();
  211.     }
  212.     DOSEXIT(1,n);           /* exit with specified completion code */
  213.     }
  214.