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[] = "@(#)wwinschar.c 3.20 (Berkeley) 06/06/90"; 1333514Sbostic #endif /* not lint */ 1433514Sbostic 1514427Sedward #include "ww.h" 1614650Sedward #include "tt.h" 1714427Sedward 1838749Sedward wwinschar(w, row, col, c, m) 1914427Sedward register struct ww *w; 2038749Sedward char c, m; 2114427Sedward { 2214459Sedward register i; 2314459Sedward int nvis; 2438749Sedward short x = c | m << WWC_MSHIFT; 2514427Sedward 2614977Sedward /* 2714977Sedward * First, shift the line. 2814977Sedward */ 2914459Sedward { 3014459Sedward register union ww_char *p, *q; 3114459Sedward 3214988Sedward p = &w->ww_buf[row][w->ww_b.r]; 3314459Sedward q = p - 1; 3414988Sedward for (i = w->ww_b.r - col; --i > 0;) 3514459Sedward *--p = *--q; 3638749Sedward q->c_w = x; 3714459Sedward } 3814977Sedward 3914977Sedward /* 4014977Sedward * If can't see it, just return. 4114977Sedward */ 4214988Sedward if (row < w->ww_i.t || row >= w->ww_i.b 4314988Sedward || w->ww_i.r <= 0 || w->ww_i.r <= col) 4414459Sedward return; 4514977Sedward 4614988Sedward if (col < w->ww_i.l) 4714988Sedward col = w->ww_i.l; 4814977Sedward 4914977Sedward /* 5014977Sedward * Now find out how much is actually changed, and fix wwns. 5114977Sedward */ 5214459Sedward { 5314459Sedward register union ww_char *buf; 5414459Sedward register char *win; 5514459Sedward register union ww_char *ns; 5614459Sedward register char *smap; 5715637Sedward char touched; 5814459Sedward 5914459Sedward nvis = 0; 6014988Sedward smap = &wwsmap[row][col]; 6115637Sedward for (i = col; i < w->ww_i.r && *smap++ != w->ww_index; i++) 6215637Sedward ; 6315637Sedward if (i >= w->ww_i.r) 6414459Sedward return; 6515637Sedward col = i; 6615637Sedward buf = w->ww_buf[row]; 6715637Sedward win = w->ww_win[row]; 6815637Sedward ns = wwns[row]; 6915637Sedward smap = &wwsmap[row][i]; 7015637Sedward touched = wwtouched[row]; 7115637Sedward for (; i < w->ww_i.r; i++) { 7215637Sedward if (*smap++ != w->ww_index) 7315637Sedward continue; 7415654Sedward touched |= WWU_TOUCHED; 7515637Sedward if (win[i]) 7615637Sedward ns[i].c_w = 7715637Sedward buf[i].c_w ^ win[i] << WWC_MSHIFT; 7815637Sedward else { 7914459Sedward nvis++; 8015637Sedward ns[i] = buf[i]; 8114427Sedward } 8215637Sedward } 8315637Sedward wwtouched[row] = touched; 8414427Sedward } 8514977Sedward 8614977Sedward /* 8714977Sedward * Can/Should we use delete character? 8814977Sedward */ 8938749Sedward if ((tt.tt_inschar || tt.tt_insspace) && nvis > (wwncol - col) / 2) { 9014459Sedward register union ww_char *p, *q; 9114459Sedward 9238749Sedward if (tt.tt_inschar) 9338749Sedward xxinschar(row, col, c, m); 9438749Sedward else { 9538749Sedward xxinsspace(row, col); 9638749Sedward x = ' '; 9738749Sedward } 9814988Sedward p = &wwos[row][wwncol]; 9914459Sedward q = p - 1; 10014988Sedward for (i = wwncol - col; --i > 0;) 10114459Sedward *--p = *--q; 10238749Sedward q->c_w = x; 10314459Sedward } 10414427Sedward } 105