118740Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * All rights reserved. 433514Sbostic * 5*42954Sbostic * This code is derived from software contributed to Berkeley by 6*42954Sbostic * Edward Wang at The University of California, Berkeley. 7*42954Sbostic * 842835Sbostic * %sccs.include.redist.c% 918740Sedward */ 1018740Sedward 1133514Sbostic #ifndef lint 12*42954Sbostic static char sccsid[] = "@(#)wwdelchar.c 3.16 (Berkeley) 06/06/90"; 1333514Sbostic #endif /* not lint */ 1433514Sbostic 1514432Sedward #include "ww.h" 1614650Sedward #include "tt.h" 1714432Sedward 1814988Sedward wwdelchar(w, row, col) 1914432Sedward register struct ww *w; 2014432Sedward { 2114459Sedward register i; 2214459Sedward int nvis; 2314459Sedward 2414978Sedward /* 2514978Sedward * First, shift the line. 2614978Sedward */ 2714459Sedward { 2814459Sedward register union ww_char *p, *q; 2914459Sedward 3014988Sedward p = &w->ww_buf[row][col]; 3114459Sedward q = p + 1; 3214988Sedward for (i = w->ww_b.r - col; --i > 0;) 3314459Sedward *p++ = *q++; 3414459Sedward p->c_w = ' '; 3514459Sedward } 3614978Sedward 3714978Sedward /* 3814978Sedward * If can't see it, just return. 3914978Sedward */ 4014988Sedward if (row < w->ww_i.t || row >= w->ww_i.b 4114988Sedward || w->ww_i.r <= 0 || w->ww_i.r <= col) 4214459Sedward return; 4314978Sedward 4414988Sedward if (col < w->ww_i.l) 4514988Sedward col = w->ww_i.l; 4614978Sedward 4714978Sedward /* 4814978Sedward * Now find out how much is actually changed, and fix wwns. 4914978Sedward */ 5014459Sedward { 5114459Sedward register union ww_char *buf; 5214459Sedward register char *win; 5314459Sedward register union ww_char *ns; 5414459Sedward register char *smap; 5515638Sedward char touched; 5614459Sedward 5714459Sedward nvis = 0; 5814988Sedward smap = &wwsmap[row][col]; 5915638Sedward for (i = col; i < w->ww_i.r && *smap++ != w->ww_index; i++) 6015638Sedward ; 6115638Sedward if (i >= w->ww_i.r) 6214459Sedward return; 6315638Sedward col = i; 6415638Sedward buf = w->ww_buf[row]; 6515638Sedward win = w->ww_win[row]; 6615638Sedward ns = wwns[row]; 6715638Sedward smap = &wwsmap[row][i]; 6815638Sedward touched = wwtouched[row]; 6915638Sedward for (; i < w->ww_i.r; i++) { 7015638Sedward if (*smap++ != w->ww_index) 7115638Sedward continue; 7215654Sedward touched |= WWU_TOUCHED; 7315638Sedward if (win[i]) 7415638Sedward ns[i].c_w = 7515638Sedward buf[i].c_w ^ win[i] << WWC_MSHIFT; 7615638Sedward else { 7714459Sedward nvis++; 7815638Sedward ns[i] = buf[i]; 7914459Sedward } 8015638Sedward } 8115638Sedward wwtouched[row] = touched; 8214459Sedward } 8314978Sedward 8414978Sedward /* 8514978Sedward * Can/Should we use delete character? 8614978Sedward */ 8714988Sedward if (tt.tt_delchar != 0 && nvis > (wwncol - col) / 2) { 8814459Sedward register union ww_char *p, *q; 8914459Sedward 9037998Sedward xxdelchar(row, col); 9114988Sedward p = &wwos[row][col]; 9214459Sedward q = p + 1; 9314988Sedward for (i = wwncol - col; --i > 0;) 9414459Sedward *p++ = *q++; 9514459Sedward p->c_w = ' '; 9614459Sedward } 9714432Sedward } 98