Add define for Kirk Smith's USR Courier driver. Change default baud
[unix-history] / usr / src / usr.bin / window / wwdelete.c
... / ...
CommitLineData
1#ifndef lint
2static char sccsid[] = "@(#)wwdelete.c 3.13 %G%";
3#endif
4
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
11#include "ww.h"
12
13/*
14 * Pull w free from the cover list.
15 */
16wwdelete(w)
17register struct ww *w;
18{
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];
25 register int nchanged = 0;
26
27 for (j = w->ww_i.l; j < w->ww_i.r; j++)
28 if (smap[j] == w->ww_index) {
29 smap[j] = WWX_NOBODY;
30 ns[j].c_w = ' ';
31 nchanged++;
32 }
33 if (nchanged > 4)
34 wwtouched[i] |= WWU_MAJOR|WWU_TOUCHED;
35 else if (nchanged > 0)
36 wwtouched[i] |= WWU_TOUCHED;
37 }
38
39 {
40 register struct ww *wp;
41
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);
49
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}
54
55wwdelete1(w, t, b, l, r)
56register struct ww *w;
57{
58 int i;
59 int tt, bb, ll, rr;
60 char hasglass;
61
62again:
63 hasglass = 0;
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);
68 if (tt >= bb || ll >= rr) {
69 if ((w = w->ww_forw) == &wwhead)
70 return;
71 goto again;
72 }
73 for (i = tt; i < bb; i++) {
74 register j;
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];
80 int nchanged = 0;
81
82 for (j = ll; j < rr; j++) {
83 if (smap[j] != WWX_NOBODY)
84 continue;
85 if (win[j] & WWM_GLS) {
86 hasglass = 1;
87 continue;
88 }
89 smap[j] = w->ww_index;
90 ns[j].c_w = buf[j].c_w ^ win[j] << WWC_MSHIFT;
91 nchanged++;
92 if (win[j] == 0)
93 nvis++;
94 }
95 if (nchanged > 4)
96 wwtouched[i] |= WWU_MAJOR|WWU_TOUCHED;
97 else if (nchanged > 0)
98 wwtouched[i] |= WWU_TOUCHED;
99 w->ww_nvis[i] = nvis;
100 }
101 if ((w = w->ww_forw) == &wwhead)
102 return;
103 if (hasglass)
104 goto again;
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)
110 wwdelete1(w, tt, bb, l, ll);
111 if (rr < r)
112 wwdelete1(w, tt, bb, rr, r);
113}