added "more" command
[unix-history] / usr / src / usr.bin / window / wwdelete.c
CommitLineData
07662491 1#ifndef lint
60de5df9 2static char sccsid[] = "@(#)wwdelete.c 3.13 %G%";
07662491
EW
3#endif
4
60de5df9
EW
5/*
6 * Copyright (c) 1983 Regents of the University of California,
7 * All rights reserved. Redistribution permitted subject to
8 * the terms of the Berkeley Software License Agreement.
9 */
10
07662491
EW
11#include "ww.h"
12
13/*
14 * Pull w free from the cover list.
15 */
16wwdelete(w)
17register struct ww *w;
18{
c05972b9
EW
19 register i;
20
21 for (i = w->ww_i.t; i < w->ww_i.b; i++) {
22 register j;
23 register char *smap = wwsmap[i];
24 register struct ww_char *ns = wwns[i];
04d70db4 25 register int nchanged = 0;
84ad208b 26
84ad208b 27 for (j = w->ww_i.l; j < w->ww_i.r; j++)
c05972b9
EW
28 if (smap[j] == w->ww_index) {
29 smap[j] = WWX_NOBODY;
30 ns[j].c_w = ' ';
04d70db4 31 nchanged++;
84ad208b 32 }
04d70db4
EW
33 if (nchanged > 4)
34 wwtouched[i] |= WWU_MAJOR|WWU_TOUCHED;
35 else if (nchanged > 0)
36 wwtouched[i] |= WWU_TOUCHED;
c05972b9 37 }
84ad208b 38
c05972b9
EW
39 {
40 register struct ww *wp;
665bc9e7 41
c05972b9
EW
42 for (wp = w->ww_forw; wp != &wwhead; wp = wp->ww_forw)
43 wp->ww_order--;
44 }
45
46 if (w->ww_forw != &wwhead)
47 wwdelete1(w->ww_forw,
48 w->ww_i.t, w->ww_i.b, w->ww_i.l, w->ww_i.r);
861cd1ed 49
07662491
EW
50 w->ww_back->ww_forw = w->ww_forw;
51 w->ww_forw->ww_back = w->ww_back;
52 w->ww_forw = w->ww_back = 0;
53}
665bc9e7
EW
54
55wwdelete1(w, t, b, l, r)
56register struct ww *w;
57{
58 int i;
59 int tt, bb, ll, rr;
1ceeb7e2 60 char hasglass;
665bc9e7 61
1ceeb7e2
EW
62again:
63 hasglass = 0;
665bc9e7
EW
64 tt = MAX(t, w->ww_i.t);
65 bb = MIN(b, w->ww_i.b);
66 ll = MAX(l, w->ww_i.l);
67 rr = MIN(r, w->ww_i.r);
1ceeb7e2
EW
68 if (tt >= bb || ll >= rr) {
69 if ((w = w->ww_forw) == &wwhead)
70 return;
71 goto again;
72 }
665bc9e7 73 for (i = tt; i < bb; i++) {
c05972b9 74 register j;
665bc9e7
EW
75 register char *smap = wwsmap[i];
76 register union ww_char *ns = wwns[i];
77 register char *win = w->ww_win[i];
78 register union ww_char *buf = w->ww_buf[i];
79 int nvis = w->ww_nvis[i];
04d70db4 80 int nchanged = 0;
665bc9e7
EW
81
82 for (j = ll; j < rr; j++) {
1ceeb7e2
EW
83 if (smap[j] != WWX_NOBODY)
84 continue;
85 if (win[j] & WWM_GLS) {
86 hasglass = 1;
665bc9e7 87 continue;
1ceeb7e2 88 }
c05972b9
EW
89 smap[j] = w->ww_index;
90 ns[j].c_w = buf[j].c_w ^ win[j] << WWC_MSHIFT;
04d70db4 91 nchanged++;
c05972b9
EW
92 if (win[j] == 0)
93 nvis++;
665bc9e7 94 }
04d70db4
EW
95 if (nchanged > 4)
96 wwtouched[i] |= WWU_MAJOR|WWU_TOUCHED;
97 else if (nchanged > 0)
98 wwtouched[i] |= WWU_TOUCHED;
665bc9e7
EW
99 w->ww_nvis[i] = nvis;
100 }
101 if ((w = w->ww_forw) == &wwhead)
102 return;
1ceeb7e2
EW
103 if (hasglass)
104 goto again;
665bc9e7
EW
105 if (tt > t)
106 wwdelete1(w, t, tt, l, r);
107 if (bb < b)
108 wwdelete1(w, bb, b, l, r);
109 if (ll > l)
1ceeb7e2 110 wwdelete1(w, tt, bb, l, ll);
665bc9e7 111 if (rr < r)
1ceeb7e2 112 wwdelete1(w, tt, bb, rr, r);
665bc9e7 113}