home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / emacs / src / splitwin.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-07-07  |  2.0 KB  |  80 lines

  1. #include    "stdio.h"
  2. #include    "ed.h"
  3.  
  4. /*
  5.  * Split the current window. A window
  6.  * smaller than 3 lines cannot be split.
  7.  * The only other error that is possible is
  8.  * a "malloc" failure allocating the structure
  9.  * for the new window. Bound to "C-X 2".
  10.  */
  11. ovmain( x, f, n )
  12. {
  13.     register WINDOW    *wp;
  14.     register LINE    *lp;
  15.     register int    ntru;
  16.     register int    ntrl;
  17.     register int    ntrd;
  18.     register WINDOW    *wp1;
  19.     register WINDOW    *wp2;
  20.  
  21.     if (curwp->w_ntrows < 3) {
  22.         mlwrite("Cannot split a %d line window", curwp->w_ntrows);
  23.         return (FALSE);
  24.     }
  25.     if ((wp = (WINDOW *) malloc(sizeof(WINDOW))) == NULL) {
  26.         mlwrite("Cannot allocate WINDOW block");
  27.         return (FALSE);
  28.     }
  29.     ++curbp->b_nwnd;            /* Displayed twice.    */
  30.     wp->w_bufp  = curbp;
  31.     wp->w_dotp  = curwp->w_dotp;
  32.     wp->w_doto  = curwp->w_doto;
  33.     wp->w_markp = curwp->w_markp;
  34.     wp->w_marko = curwp->w_marko;
  35.     wp->w_flag  = 0;
  36.     wp->w_force = 0;
  37.     ntru = (curwp->w_ntrows-1) / 2;        /* Upper size        */
  38.     ntrl = (curwp->w_ntrows-1) - ntru;    /* Lower size        */
  39.     lp = curwp->w_linep;
  40.     ntrd = 0;
  41.     while (lp != curwp->w_dotp) {
  42.         ++ntrd;
  43.         lp = lforw(lp);
  44.     }
  45.     lp = curwp->w_linep;
  46.     if (ntrd <= ntru) {            /* Old is upper window.    */
  47.         if (ntrd == ntru)        /* Hit mode line.    */
  48.             lp = lforw(lp);
  49.         curwp->w_ntrows = ntru;
  50.         wp->w_wndp = curwp->w_wndp;
  51.         curwp->w_wndp = wp;
  52.         wp->w_toprow = curwp->w_toprow+ntru+1;
  53.         wp->w_ntrows = ntrl;
  54.     } else {                /* Old is lower window    */
  55.         wp1 = NULL;
  56.         wp2 = wheadp;
  57.         while (wp2 != curwp) {
  58.             wp1 = wp2;
  59.             wp2 = wp2->w_wndp;
  60.         }
  61.         if (wp1 == NULL)
  62.             wheadp = wp;
  63.         else
  64.             wp1->w_wndp = wp;
  65.         wp->w_wndp   = curwp;
  66.         wp->w_toprow = curwp->w_toprow;
  67.         wp->w_ntrows = ntru;
  68.         ++ntru;                /* Mode line.        */
  69.         curwp->w_toprow += ntru;
  70.         curwp->w_ntrows  = ntrl;
  71.         while (ntru--)
  72.             lp = lforw(lp);
  73.     }
  74.     curwp->w_linep = lp;            /* Adjust the top lines    */
  75.     wp->w_linep = lp;            /* if necessary.    */
  76.     curwp->w_flag |= WFMODE|WFHARD;
  77.     wp->w_flag |= WFMODE|WFHARD;
  78.     return (TRUE);
  79. }
  80.