1 /* $NetBSD: wwdelete.c,v 1.7 2003/08/07 11:17:38 agc Exp $ */ 2 3 /* 4 * Copyright (c) 1983, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * Edward Wang at The University of California, Berkeley. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. Neither the name of the University nor the names of its contributors 19 * may be used to endorse or promote products derived from this software 20 * without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 */ 34 35 #include <sys/cdefs.h> 36 #ifndef lint 37 #if 0 38 static char sccsid[] = "@(#)wwdelete.c 8.1 (Berkeley) 6/6/93"; 39 #else 40 __RCSID("$NetBSD: wwdelete.c,v 1.7 2003/08/07 11:17:38 agc Exp $"); 41 #endif 42 #endif /* not lint */ 43 44 #include "ww.h" 45 46 /* 47 * Pull w free from the cover list. 48 */ 49 void 50 wwdelete(struct ww *w) 51 { 52 int i; 53 54 for (i = w->ww_i.t; i < w->ww_i.b; i++) { 55 int j; 56 unsigned char *smap = wwsmap[i]; 57 union ww_char *ns = wwns[i]; 58 int nchanged = 0; 59 60 for (j = w->ww_i.l; j < w->ww_i.r; j++) 61 if (smap[j] == w->ww_index) { 62 smap[j] = WWX_NOBODY; 63 ns[j].c_w = ' '; 64 nchanged++; 65 } 66 if (nchanged > 0) 67 wwtouched[i] |= WWU_TOUCHED; 68 } 69 70 { 71 struct ww *wp; 72 73 for (wp = w->ww_forw; wp != &wwhead; wp = wp->ww_forw) 74 wp->ww_order--; 75 } 76 77 if (w->ww_forw != &wwhead) 78 wwdelete1(w->ww_forw, 79 w->ww_i.t, w->ww_i.b, w->ww_i.l, w->ww_i.r); 80 81 w->ww_back->ww_forw = w->ww_forw; 82 w->ww_forw->ww_back = w->ww_back; 83 w->ww_forw = w->ww_back = 0; 84 } 85 86 void 87 wwdelete1(struct ww *w, int t, int b, int l, int r) 88 { 89 int i; 90 int tt, bb, ll, rr; 91 char hasglass; 92 93 again: 94 hasglass = 0; 95 tt = MAX(t, w->ww_i.t); 96 bb = MIN(b, w->ww_i.b); 97 ll = MAX(l, w->ww_i.l); 98 rr = MIN(r, w->ww_i.r); 99 if (tt >= bb || ll >= rr) { 100 if ((w = w->ww_forw) == &wwhead) 101 return; 102 goto again; 103 } 104 for (i = tt; i < bb; i++) { 105 int j; 106 unsigned char *smap = wwsmap[i]; 107 union ww_char *ns = wwns[i]; 108 char *win = w->ww_win[i]; 109 union ww_char *buf = w->ww_buf[i]; 110 int nvis = w->ww_nvis[i]; 111 int nchanged = 0; 112 113 for (j = ll; j < rr; j++) { 114 if (smap[j] != WWX_NOBODY) 115 continue; 116 if (win[j] & WWM_GLS) { 117 hasglass = 1; 118 continue; 119 } 120 smap[j] = w->ww_index; 121 ns[j].c_w = buf[j].c_w ^ win[j] << WWC_MSHIFT; 122 nchanged++; 123 if (win[j] == 0) 124 nvis++; 125 } 126 if (nchanged > 0) 127 wwtouched[i] |= WWU_TOUCHED; 128 w->ww_nvis[i] = nvis; 129 } 130 if ((w = w->ww_forw) == &wwhead) 131 return; 132 if (hasglass) 133 goto again; 134 if (tt > t) 135 wwdelete1(w, t, tt, l, r); 136 if (bb < b) 137 wwdelete1(w, bb, b, l, r); 138 if (ll > l) 139 wwdelete1(w, tt, bb, l, ll); 140 if (rr < r) 141 wwdelete1(w, tt, bb, rr, r); 142 } 143