|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * 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: * Redistribution and use in source and binary forms are permitted provided
9: * that: (1) source distributions retain this entire copyright notice and
10: * comment, and (2) distributions including binaries display the following
11: * acknowledgement: ``This product includes software developed by the
12: * University of California, Berkeley and its contributors'' in the
13: * documentation or other materials provided with the distribution and in
14: * all advertising materials mentioning features or use of this software.
15: * Neither the name of the University nor the names of its contributors may
16: * be used to endorse or promote products derived from this software without
17: * specific prior written permission.
18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
19: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
20: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21: */
22:
23: #ifndef lint
24: static char sccsid[] = "@(#)wwdelete.c 3.19 (Berkeley) 6/6/90";
25: #endif /* not lint */
26:
27: #include "ww.h"
28:
29: /*
30: * Pull w free from the cover list.
31: */
32: wwdelete(w)
33: register struct ww *w;
34: {
35: register i;
36:
37: for (i = w->ww_i.t; i < w->ww_i.b; i++) {
38: register j;
39: register char *smap = wwsmap[i];
40: register union ww_char *ns = wwns[i];
41: register int nchanged = 0;
42:
43: for (j = w->ww_i.l; j < w->ww_i.r; j++)
44: if (smap[j] == w->ww_index) {
45: smap[j] = WWX_NOBODY;
46: ns[j].c_w = ' ';
47: nchanged++;
48: }
49: if (nchanged > 0)
50: wwtouched[i] |= WWU_TOUCHED;
51: }
52:
53: {
54: register struct ww *wp;
55:
56: for (wp = w->ww_forw; wp != &wwhead; wp = wp->ww_forw)
57: wp->ww_order--;
58: }
59:
60: if (w->ww_forw != &wwhead)
61: wwdelete1(w->ww_forw,
62: w->ww_i.t, w->ww_i.b, w->ww_i.l, w->ww_i.r);
63:
64: w->ww_back->ww_forw = w->ww_forw;
65: w->ww_forw->ww_back = w->ww_back;
66: w->ww_forw = w->ww_back = 0;
67: }
68:
69: wwdelete1(w, t, b, l, r)
70: register struct ww *w;
71: {
72: int i;
73: int tt, bb, ll, rr;
74: char hasglass;
75:
76: again:
77: hasglass = 0;
78: tt = MAX(t, w->ww_i.t);
79: bb = MIN(b, w->ww_i.b);
80: ll = MAX(l, w->ww_i.l);
81: rr = MIN(r, w->ww_i.r);
82: if (tt >= bb || ll >= rr) {
83: if ((w = w->ww_forw) == &wwhead)
84: return;
85: goto again;
86: }
87: for (i = tt; i < bb; i++) {
88: register j;
89: register char *smap = wwsmap[i];
90: register union ww_char *ns = wwns[i];
91: register char *win = w->ww_win[i];
92: register union ww_char *buf = w->ww_buf[i];
93: int nvis = w->ww_nvis[i];
94: int nchanged = 0;
95:
96: for (j = ll; j < rr; j++) {
97: if (smap[j] != WWX_NOBODY)
98: continue;
99: if (win[j] & WWM_GLS) {
100: hasglass = 1;
101: continue;
102: }
103: smap[j] = w->ww_index;
104: ns[j].c_w = buf[j].c_w ^ win[j] << WWC_MSHIFT;
105: nchanged++;
106: if (win[j] == 0)
107: nvis++;
108: }
109: if (nchanged > 0)
110: wwtouched[i] |= WWU_TOUCHED;
111: w->ww_nvis[i] = nvis;
112: }
113: if ((w = w->ww_forw) == &wwhead)
114: return;
115: if (hasglass)
116: goto again;
117: if (tt > t)
118: wwdelete1(w, t, tt, l, r);
119: if (bb < b)
120: wwdelete1(w, bb, b, l, r);
121: if (ll > l)
122: wwdelete1(w, tt, bb, l, ll);
123: if (rr < r)
124: wwdelete1(w, tt, bb, rr, r);
125: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.