xref: /original-bsd/usr.bin/window/wwdelline.c (revision c3e32dec)
1 /*
2  * Copyright (c) 1983, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Edward Wang at The University of California, Berkeley.
7  *
8  * %sccs.include.redist.c%
9  */
10 
11 #ifndef lint
12 static char sccsid[] = "@(#)wwdelline.c	8.1 (Berkeley) 06/06/93";
13 #endif /* not lint */
14 
15 #include "ww.h"
16 
17 wwdelline(w, row)
18 register struct ww *w;
19 int row;
20 {
21 	register i;
22 	register union ww_char **cpp, **cqq;
23 	register union ww_char *cp;
24 	int row1, row2;
25 	char deleted;
26 	int visible;
27 
28 	/*
29 	 * Scroll first.
30 	 */
31 	if ((row1 = row) < w->ww_i.t) {
32 		row1 = w->ww_i.t;
33 	}
34 	if ((row2 = w->ww_b.b) > w->ww_i.b) {
35 		row2 = w->ww_i.b;
36 		visible = 0;
37 	} else
38 		visible = 1;
39 	deleted = wwscroll1(w, row1, row2, 1, visible);
40 
41 	/*
42 	 * Fix the buffer.
43 	 * But leave clearing the last line for wwclreol().
44 	 */
45 	cpp = &w->ww_buf[row];
46 	cqq = cpp + 1;
47 	cp = *cpp;
48 	for (i = w->ww_b.b - row; --i > 0;)
49 		*cpp++ = *cqq++;
50 	*cpp = cp;
51 
52 	/*
53 	 * Now clear the last line.
54 	 */
55 	if (visible)
56 		wwclreol1(w, w->ww_b.b - 1, w->ww_b.l, deleted);
57 	else {
58 		cp += w->ww_b.l;
59 		for (i = w->ww_b.nc; --i >= 0;)
60 			cp++->c_w = ' ';
61 	}
62 }
63