home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume7 / rvi / part3 / rv_scroll_bk.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-04-09  |  1.6 KB  |  84 lines

  1. #include "rv.h"
  2.  
  3. void
  4. rv_scroll_backward(n)
  5. /*
  6.  * Scroll n lines backward
  7.  * Must be within window
  8.  * Cursor location is undefined
  9.  */
  10. register n;
  11. {
  12.     register struct li_line   *line, *newline;
  13.     register struct sc_screen *sc;
  14.     register INT    seg;
  15.     register struct wi_window *wi;
  16.     register struct fi_file      *fi;
  17.  
  18.     sc = &screen;
  19.     wi = &window;
  20.     fi = &file;
  21.     seg = 0;
  22.     for (line = sc->sc_topline-1; n > 0; --n, --line) {
  23.         if (line < wi->wi_topline) {
  24.             errflag = 1;
  25.             botprint(TRUE,
  26.                 "rv_scroll_backward - past top of window\n\n");
  27.             hitcr_continue();
  28.             return;
  29.         }
  30.         seg += line->li_segments;
  31.     }
  32.     ++line;
  33.     move(0,0);
  34.     seg -= sc->sc_abovetop;
  35.     rv_finsertln(seg);
  36.     move(0,0);
  37.     for (newline = line; newline < sc->sc_topline; ++newline) {
  38.         print_line(newline->li_text);
  39.         if (CURCOLUMN != 0 || newline->li_text[0] == '\0')
  40.             move(CURLINE+1, 0);
  41.     }
  42.     xmit_curline();
  43.     sc->sc_lineno = sc->sc_lineno - (sc->sc_curline - line);
  44.     sc->sc_topline = line;
  45.     sc->sc_curline = line;
  46.     sc->sc_column = 0;
  47.     sc->sc_abovetop = 0;
  48.  
  49.     /*
  50.      * Compute bottom line
  51.      */
  52.     for (seg = line->li_segments; seg < LINES;
  53.             seg += line->li_segments) {
  54.         ++line;
  55.         if (line > wi->wi_botline)
  56.             break;
  57.     }
  58.     sc->sc_botline = line-1;
  59.  
  60.     if (line <= wi->wi_botline)
  61.         seg -= line->li_segments;
  62.     move(seg, 0);
  63.     clrtobot();
  64.     move(seg, 0); /* Because clrtobot homes the cursor in 4bsd */
  65.     /*
  66.      * Append '~' or '@' lines to screen
  67.      */
  68.     if (seg < LINES-1) 
  69.         if (fi->fi_numlines > sc->sc_lineno +
  70.                 (sc->sc_botline - sc->sc_curline))
  71.         /*
  72.          * Undisplayed lines
  73.          */
  74.         while (seg < LINES-1)
  75.             mvaddch(seg++, 0, '@');
  76.     else
  77.         /*
  78.          * End of file
  79.          */
  80.         while (seg < LINES-1)
  81.             mvaddch(seg++, 0, '~');
  82.     move(0,0);
  83. }
  84.