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

  1. #include <ctype.h>
  2. #include <subcalls.h>
  3. #include "ssedefs.h"
  4.  
  5.  
  6.  
  7.  
  8. /*** creturn - handles carage return
  9.  *
  10.  *   creturn breaks the line reference by linenum at the
  11.  *     current cursor position and inserts the second half of
  12.  *     the 'line' one line below.
  13.  *
  14.  *   creturn()
  15.  *
  16.  *   ENTRY - none
  17.  *
  18.  *   creturn will EXIT the program by calling error25 if
  19.  *     it is unable to add a line to the file or the number
  20.  *     of lines in the file becomes greater than MAXLINES.
  21.  *
  22.  *   EFFECTS  TotalLines    - by incrementing it once or twice
  23.  *          EditBuffDirty - by clearing it if set
  24.  *          LinesMarked   - by clearing it if set
  25.  *          CharsMarked   - by clearing it if set
  26.  *          MarkedChar    - by clearing it if set
  27.  *          MarkedLine    - by clearing it if set
  28.  *          LineTable     - by insterting the second part of the line
  29.  *                 and via 'addline'
  30.  *          CurRow        - by incrementing it
  31.  *          TopRow        - by incrementing it
  32.  *          CurCol        - by setting it to zero
  33.  *          EditBuff        - by getting the second part of the line
  34.  *                 via 'getline'
  35.  *          SegTable        - by using free space for the both parts
  36.  *                 of the line via 'allocseg'
  37.  *                  by marking the segment containing the original
  38.  *                 line as needing compacting via 'deleteline'
  39.  *                  by marking the original line in the segment
  40.  *                 as being deleted. via 'deleteline'
  41.  *          TotalSegs     - via 'alloseg'
  42.  *          memory        - by allocating segments via 'allocseg'
  43.  *          the screen    - via 'drawscr'
  44.  */
  45.  
  46.  
  47. void creturn()
  48. {
  49.    register unsigned short i;
  50.    register unsigned short linenum;
  51.  
  52. /* clear flags if set */
  53.    if (EditBuffDirty) {               /* this call will change */
  54.        EditBuffDirty = 0;              /* cursor line, so flush */
  55.        flushline((TopRow + CurRow), EditBuff);      /* edit buffer if dirty  */
  56.    }
  57. /* clear flags if set */
  58.    if ( LinesMarked || CharsMarked ) {
  59.        LinesMarked = 0;                /* if there's marked text */
  60.        CharsMarked = 0;                /* around, clear it and     */
  61.        for ( i = 0; i < MAXLINES; i++ )        /* redraw the screen     */
  62.        MarkedLine[i] = 0;
  63.        for ( i = 0; i < LINESIZE; i++ )
  64.        MarkedChar[i] = 0;
  65.    }
  66.  
  67. /* expand LineTable for second part of line */
  68.    linenum = TopRow + CurRow;
  69.    if ( !(linenum == TotalLines)) {
  70.       deleteline(linenum);          /* mark orginal line as deleted */
  71.       for (i = TotalLines; i > (linenum +1); i--)
  72.       LineTable[i] = LineTable[i -1];
  73.       ++TotalLines;
  74.    }
  75.    else {
  76.       ++TotalLines;
  77.       ++TotalLines;
  78.    }
  79.  
  80. /* find first non blank in first part of line to set new line length to it */
  81.    for (i = (CurCol -1); !isgraph(EditBuff[i]) && inline(i, 0); i--);
  82.    if ( (addline(linenum, (i +1), EditBuff) != 0) || !(TotalLines < MAXLINES))
  83.       error25(7);
  84. /*    call error mesage to save or quit */
  85.  
  86.    ++linenum;
  87. /* find first non blank in second part of line to set new line length to it */
  88.    for (i = (LINESIZE -1); !(isgraph(EditBuff[i])) &&  inline(i, CurCol); i--);
  89.    if (addline(linenum, (i - CurCol +1), &EditBuff[CurCol]) != 0)
  90.       error25(7);
  91. /*    call error message to save or quit */
  92.  
  93. /* move cursor to begining of the second part of the line */
  94.    if (CurRow < (PageSize - 1))
  95.       ++CurRow;
  96.    else
  97.       ++TopRow;
  98.    CurCol = 0;
  99.    VIOSETCURPOS(CurRow, CurCol, 0);
  100.    drawscr(TopRow);
  101.  
  102.    getline(linenum, EditBuff);      /* set EditBuff to the current line */
  103.  
  104.    line25();
  105. }
  106.  
  107.  
  108.  
  109.  
  110. /***   ctrl_b - insert line below
  111.  *
  112.  *     ctrl_b inserts a blank line below the current line
  113.  *     and moves the cursor to the inserted line.
  114.  *
  115.  *     ctrl_b ()
  116.  *
  117.  *     ctrl_b expands LineTable to insert the new line below
  118.  *     the current line and then inserts the new line via
  119.  *     'addline' with a length of zero. Also ctrl_b places
  120.  *     the cursor on the insert line in the same column as
  121.  *     the current line.
  122.  *     ctrl_b will EXIT the program by calling error25 if
  123.  *     it is unable to add a line to the file or the number
  124.  *     of lines in the file becomes greater than MAXLINES.
  125.  *
  126.  *   EFFECTS  TotalLines    - by incrementing it once or twice
  127.  *          EditBuffDirty - by clearing it if set
  128.  *          LinesMarked   - by clearing it if set
  129.  *          CharsMarked   - by clearing it if set
  130.  *          MarkedChar    - by clearing it if set
  131.  *          MarkedLine    - by clearing it if set
  132.  *          LineTable     - by insterting the new line and via 'addline'
  133.  *          CurRow        - by incrementing it
  134.  *          TopRow        - by incrementing it
  135.  *          EditBuff        - by setting it to a line of blanks via 'getline'
  136.  *          SegTable        - by using free space for the new line
  137.  *                 via 'allocseg'
  138.  *                  by marking the current line in the segment
  139.  *                 as being deleted if it was changed. via
  140.  *                 'fushline' via 'deleteline'
  141.  *          TotalSegs     - via 'alloseg'
  142.  *          memory        - by allocating segments via 'allocseg'
  143.  *          the screen    - via 'drawscr'
  144.  */
  145.  
  146.  
  147. void ctrl_b()
  148.     {
  149.     register unsigned short i;
  150.  
  151.     if (EditBuffDirty) {              /* this call will change */
  152.     EditBuffDirty = 0;              /* cursor line, so flush */
  153.     flushline((TopRow + CurRow), EditBuff);   /* edit buffer if dirty  */
  154.     }
  155.  
  156.     if ( LinesMarked || CharsMarked ) {
  157.     LinesMarked = 0;               /* if there's marked text */
  158.     CharsMarked = 0;               /* around, clear it and     */
  159.     for ( i = 0; i < MAXLINES; i++ )       /* redraw the screen     */
  160.         MarkedLine[i] = 0;
  161.     for ( i = 0; i < LINESIZE; i++ )
  162.         MarkedChar[i] = 0;
  163.     }
  164.  
  165. /*   expand LineTable to insert the new line below */
  166.      for (i = TotalLines; i > (TopRow + CurRow +1); i--)
  167.        LineTable[i] = LineTable[i -1];
  168.      if ( (TopRow + CurRow) == TotalLines) {
  169.      ++TotalLines;
  170.      if ((addline(TopRow +CurRow, 0, 0) != 0) || !(TotalLines < MAXLINES))
  171.         error25(7);
  172. /*        call error message to save or quit */
  173.  
  174.      }
  175.      ++TotalLines;
  176.      if ((addline(TopRow + CurRow +1, 0, 0) != 0) || !(TotalLines < MAXLINES))
  177.      error25(7);
  178. /*     call error message to save or quit */
  179.  
  180. /*   place the cursor on the new line below */
  181.      if (CurRow < (PageSize - 1))
  182.        ++CurRow;
  183.      else
  184.        ++TopRow;
  185.  
  186. /*   redraw the screen with the new line below */
  187.      VIOSETCURPOS(CurRow, CurCol, 0);
  188.      drawscr(TopRow);
  189.  
  190.      getline( (TopRow + CurRow), &EditBuff[0] );
  191.  
  192.      line25();
  193.  
  194. }
  195.  
  196.  
  197.  
  198.  
  199. /***   ctrl_n - insert line above
  200.  *
  201.  *     ctrl_n inserts a blank line above the current line
  202.  *     and move the cursor to the inserted line.
  203.  *
  204.  *     ctrl_n ()
  205.  *
  206.  *     ctrl_n expands LineTable to insert the new line above
  207.  *     the current line and then inserts the new line via
  208.  *     'addline' with a length of zero. Also ctrl_n places
  209.  *     the cursor on the inserted line in the same column as
  210.  *     the current line.
  211.  *     ctrl_n will EXIT the program by calling error25 if
  212.  *     it is unable to add a line to the file or the number
  213.  *     of lines in the file becomes greater than MAXLINES.
  214.  *
  215.  *   EFFECTS  TotalLines    - by incrementing it once or twice
  216.  *          EditBuffDirty - by clearing it if set
  217.  *          LinesMarked   - by clearing it if set
  218.  *          CharsMarked   - by clearing it if set
  219.  *          MarkedChar    - by clearing it if set
  220.  *          MarkedLine    - by clearing it if set
  221.  *          LineTable     - by insterting the new line and via 'addline'
  222.  *          CurRow        - by decrementing it
  223.  *          TopRow        - by incrementing it
  224.  *          EditBuff        - by setting it to a line of blanks via 'getline'
  225.  *          SegTable        - by using free space for the new line
  226.  *                 via 'allocseg'
  227.  *                  by marking the current line in the segment
  228.  *                 as being deleted if it was changed. via
  229.  *                 'fushline' via 'deleteline'
  230.  *          TotalSegs     - via 'alloseg'
  231.  *          memory        - by allocating segments via 'allocseg'
  232.  *          the screen    - via 'drawscr'
  233.  */
  234.  
  235.  
  236. void ctrl_n()
  237. {
  238.     register unsigned short i;
  239.  
  240.     if (EditBuffDirty) {              /* this call will change */
  241.     EditBuffDirty = 0;              /* cursor line, so flush */
  242.     flushline((TopRow + CurRow), EditBuff);   /* edit buffer if dirty  */
  243.     }
  244.  
  245.     if ( LinesMarked || CharsMarked ) {
  246.     LinesMarked = 0;               /* if there's marked text */
  247.     CharsMarked = 0;               /* around, clear it and     */
  248.     for ( i = 0; i < MAXLINES; i++ )       /* redraw the screen     */
  249.         MarkedLine[i] = 0;
  250.     for ( i = 0; i < LINESIZE; i++ )
  251.         MarkedChar[i] = 0;
  252.     }
  253.  
  254.  /* expand LineTable to insert the new line above */
  255.     for (i = TotalLines; i > (TopRow + CurRow); i--)
  256.       LineTable[i] = LineTable[i -1];
  257.  /* insert the new line above current line */
  258.     if ( (TopRow + CurRow) == TotalLines) {
  259.       ++TotalLines;
  260.       if ((addline(TopRow + CurRow + 1, 0, 0) != 0) || !(TotalLines < MAXLINES))
  261.         error25(7);
  262. /*        call error message to save or quit */
  263.     }
  264.     ++TotalLines;
  265.     if ((addline(TopRow + CurRow, 0, 0) != 0) || !(TotalLines < MAXLINES))
  266.     error25(7);
  267. /*    call error message to save or quit */
  268.  
  269. /*  redraw the screen with the cursor on the insert line above */
  270.     if (CurRow > 0) {
  271.     --CurRow;
  272.     ++TopRow;
  273.     VIOSETCURPOS(CurRow, CurCol, 0);
  274.     }
  275.     drawscr(TopRow);
  276.     getline( (TopRow + CurRow), &EditBuff[0] );
  277.     line25();
  278. }
  279.  
  280.  
  281.  
  282.  
  283. /***   ctrl_y - delete current line
  284.  *
  285.  *     ctrl_y deletes the current line.
  286.  *
  287.  *     ctrl_y ()
  288.  *
  289.  *     ctrl_y marks the current line as deleted and
  290.  *     compacts the LineTable.
  291.  *
  292.  *
  293.  *   EFFECTS  TotalLines    - by decrementing it
  294.  *          EditBuffDirty - by clearing it if set
  295.  *          LinesMarked   - by clearing it if set
  296.  *          CharsMarked   - by clearing it if set
  297.  *          MarkedChar    - by clearing it if set
  298.  *          MarkedLine    - by clearing it if set
  299.  *          LineTable     - by marking the current as deleted via
  300.  *                 'deleteline'
  301.  *          EditBuff        - by replacing it with the line below the
  302.  *                 the current line via  'getline'
  303.  *          SegTable        - by marking the current line in the segment
  304.  *                 as being deleted  via 'deleteline'
  305.  *                  by marking the segment containing the
  306.  *                 line  as needing compacting via 'deleteline'
  307.  *          the screen    - via 'drawscr'
  308.  */
  309.  
  310.  
  311. void ctrl_y()
  312. {
  313.     register unsigned short i;
  314.  
  315.     if (EditBuffDirty) {              /* this call will change */
  316.     EditBuffDirty = 0;              /* cursor line, so flush */
  317.     flushline((TopRow + CurRow), EditBuff);   /* edit buffer if dirty  */
  318.     }
  319.  
  320.     if ( LinesMarked || CharsMarked ) {
  321.     LinesMarked = 0;               /* if there's marked text */
  322.     CharsMarked = 0;               /* around, clear it and     */
  323.     for ( i = 0; i < MAXLINES; i++ )       /* redraw the screen     */
  324.         MarkedLine[i] = 0;
  325.     for ( i = 0; i < LINESIZE; i++ )
  326.         MarkedChar[i] = 0;
  327.     }
  328.  
  329. /*  compact LineTable */
  330.     if( !((TopRow + CurRow) == TotalLines)) {
  331.     deleteline(TopRow + CurRow);
  332.     for(i = (TopRow + CurRow); i < TotalLines; i++)
  333.        LineTable[i] = LineTable[i + 1];
  334.     --TotalLines;
  335.     }
  336.  
  337. /*  redraw the screen */
  338.     drawscr(TopRow);
  339.     getline( (TopRow + CurRow), &EditBuff[0] );
  340.     line25();
  341. }
  342.  
  343.  
  344.  
  345.  
  346. /*** tab - moves cursor to next tab
  347.  *
  348.  *   tab insert spaces up to the next tab if it will
  349.  *     not cause the line to grow greater than line size.
  350.  *
  351.  *   tab()
  352.  *
  353.  *   ENTRY  -  none
  354.  *
  355.  *   EXIT   -  none
  356.  *
  357.  *   EFFECTS  LinesMarked   - by clearing it if set
  358.  *          CharsMarked   - by clearing it if set
  359.  *          MarkedChar    - by clearing it if set
  360.  *          MarkedLine    - by clearing it if set
  361.  *          EditBuffDirty - by setting if the tab is inserted
  362.  *          EditBuff        - by inserting the tab
  363.  *          CurCol        - by incrementing it by
  364.  */
  365.  
  366.  
  367. void tab()
  368. {
  369.     unsigned short ensp = FALSE;   /* enough space to add the tab */
  370.     unsigned short tabshift;       /* number of spaces to the next tab */
  371.     unsigned short i, j;       /* indexes */
  372.  
  373.  
  374.     if ( LinesMarked || CharsMarked ) {
  375.     LinesMarked = 0;               /* if there's marked text */
  376.     CharsMarked = 0;               /* around, clear it and     */
  377.     for ( i = 0; i < MAXLINES; i++ )       /* redraw the screen     */
  378.         MarkedLine[i] = 0;
  379.     for ( i = 0; i < LINESIZE; i++ )
  380.         MarkedChar[i] = 0;
  381.     }
  382.  
  383.     tabshift = (TABSIZE - (CurCol % TABSIZE)); /* number of spaces to next tab */
  384.  
  385. /*  is there enough space to insert the tab */
  386.     if ((CurCol + tabshift) < LINESIZE) {
  387.       for (i = (LINESIZE - tabshift);
  388.        (i < LINESIZE) && (ensp = !isgraph(EditBuff[i])); i++);
  389.  
  390.       if (ensp) {
  391. /*      enough space was found for the tab - now insert it */
  392.       for (i = (LINESIZE - tabshift -1), j = (LINESIZE - 1);
  393.         inline(i, CurCol);  i--, j--)  {
  394.           EditBuff[j] = EditBuff[i];
  395.           EditBuff[i] = ' ';
  396.       }
  397. /*      redraw the line with the tab */
  398.       drawline();
  399.       CurCol += tabshift;
  400.       VIOSETCURPOS(CurRow, CurCol, 0);
  401.       EditBuffDirty = TRUE;
  402.       }
  403.       else badkey();
  404.     }
  405.     else badkey();
  406. }
  407.