xref: /original-bsd/usr.bin/window/wwdelline.c (revision e74403ba)
1 #ifndef lint
2 static	char *sccsid = "@(#)wwdelline.c	3.5 83/09/15";
3 #endif
4 
5 #include "ww.h"
6 
7 wwdelline(w, row)
8 register struct ww *w;
9 int row;
10 {
11 	register i;
12 	register union ww_char **cpp, **cqq;
13 	register union ww_char *cp;
14 	int row1, row2;
15 	char deleted;
16 	int visible;
17 
18 	/*
19 	 * Scroll first.
20 	 */
21 	if ((row1 = row) < w->ww_i.t) {
22 		row1 = w->ww_i.t;
23 	}
24 	if ((row2 = w->ww_b.b) > w->ww_i.b) {
25 		row2 = w->ww_i.b;
26 		visible = 0;
27 	} else
28 		visible = 1;
29 	deleted = wwscroll1(w, row1, row2, 1, visible);
30 
31 	/*
32 	 * Fix the buffer.
33 	 * But leave clearing the last line for wwclreol().
34 	 */
35 	cpp = &w->ww_buf[row];
36 	cqq = cpp + 1;
37 	cp = *cpp;
38 	for (i = w->ww_b.b - row; --i > 0;)
39 		*cpp++ = *cqq++;
40 	*cpp = cp;
41 
42 	/*
43 	 * Now clear the last line.
44 	 */
45 	if (visible)
46 		wwclreol1(w, w->ww_b.b - 1, w->ww_b.l, deleted);
47 	else
48 		for (i = w->ww_b.nc; --i >= 0;)
49 			cp++->c_w = ' ';
50 }
51