home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / prof_c / 12sbuf / sb_scrl.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-08-11  |  2.1 KB  |  89 lines

  1. /*
  2.  *    sb_scrl -- scrolling routines
  3.  */
  4.  
  5. #include <local\sbuf.h>
  6.  
  7. extern struct BUFFER Sbuf;
  8. extern union CELL Scrnbuf[SB_ROWS][SB_COLS];
  9.  
  10.  
  11. /*
  12.  *    sb_scrl -- scroll the specified window
  13.  *    n lines (direction indicated by sign)
  14.  */
  15.  
  16. int
  17. sb_scrl(win, n)
  18. struct REGION *win;
  19. short n;        /* number of rows to scroll */
  20. {
  21.     register short r, c;
  22.  
  23.     if (n == 0)
  24.         /* clear the entire region to spaces */
  25.         sb_fillc(win, ' ');
  26.     else if (n > 0) {
  27.         /* scroll n rows up */
  28.         for (r = win->sr0; r <= win->sr1 - n; ++r) {
  29.             for (c = win->sc0; c <= win->sc1; ++c)
  30.                 Scrnbuf[r][c] = Scrnbuf[r + n][c];
  31.             if (win->sc0 < Sbuf.lcol[r])
  32.                 Sbuf.lcol[r] = win->sc0;
  33.             if (win->sc1 > Sbuf.rcol[r])
  34.                 Sbuf.rcol[r] = win->sc1;
  35.         }
  36.         for ( ; r <= win->sr1; ++r) {
  37.             for (c = win->sc0; c <= win->sc1; ++c)
  38.                 Scrnbuf[r][c].b.ch = ' ';
  39.             if (win->sc0 < Sbuf.lcol[r])
  40.                 Sbuf.lcol[r] = win->sc0;
  41.             if (win->sc1 > Sbuf.rcol[r])
  42.                 Sbuf.rcol[r] = win->sc1;
  43.         }
  44.     }
  45.     else {
  46.         /* scroll n rows down */
  47.         n = -n;
  48.         for (r = win->sr1; r >= win->sr0 + n; --r) {
  49.             for (c = win->sc0; c <= win->sc1; ++c)
  50.                 Scrnbuf[r][c] = Scrnbuf[r - n][c];
  51.             if (win->sc0 < Sbuf.lcol[r])
  52.                 Sbuf.lcol[r] = win->sc0;
  53.             if (win->sc1 > Sbuf.rcol[r])
  54.                 Sbuf.rcol[r] = win->sc1;
  55.         }
  56.         for ( ; r >= win->sr0; --r) {
  57.             for (c = win->sc0; c <= win->sc1; ++c)
  58.                 Scrnbuf[r][c].b.ch = ' ';
  59.             if (win->sc0 < Sbuf.lcol[r])
  60.                 Sbuf.lcol[r] = win->sc0;
  61.             if (win->sc1 > Sbuf.rcol[r])
  62.                 Sbuf.rcol[r] = win->sc1;
  63.         }
  64.     }
  65.     Sbuf.flags |= SB_DELTA;
  66.     return SB_OK;
  67. } /* end sb_scrl() */
  68.  
  69.  
  70. /*
  71.  *    sb_set_scrl -- set the scroll region boundaries
  72.  */
  73.  
  74. int
  75. sb_set_scrl(win, top, left, bottom, right)
  76. struct REGION *win;    /* window pointer */
  77. short top, left;    /* upper-left corner */
  78. short bottom, right;    /* lower-left corner */
  79. {
  80.     if (top < 0 || left < 0 ||
  81.         bottom > win->r1 - win->r0 || right > win->c1 - win->c0)
  82.         return SB_ERR;
  83.     win->sr0 = win->r0 + top;
  84.     win->sc0 = win->c0 + left;
  85.     win->sr1 = win->r0 + bottom - 1;
  86.     win->sc1 = win->c0 + right - 1;
  87.     return SB_OK;
  88. } /* end sb_set_scrl() */
  89.