114427Sedward #ifndef lint 2*14988Sedward static char *sccsid = "@(#)wwinschar.c 3.8 83/09/15"; 314427Sedward #endif 414427Sedward 514427Sedward #include "ww.h" 614650Sedward #include "tt.h" 714427Sedward 8*14988Sedward wwinschar(w, row, col, c) 914427Sedward register struct ww *w; 1014459Sedward short c; 1114427Sedward { 1214459Sedward register i; 1314459Sedward int nvis; 1414427Sedward 1514977Sedward /* 1614977Sedward * First, shift the line. 1714977Sedward */ 1814459Sedward { 1914459Sedward register union ww_char *p, *q; 2014459Sedward 21*14988Sedward p = &w->ww_buf[row][w->ww_b.r]; 2214459Sedward q = p - 1; 23*14988Sedward for (i = w->ww_b.r - col; --i > 0;) 2414459Sedward *--p = *--q; 2514459Sedward q->c_w = c; 2614459Sedward } 2714977Sedward 2814977Sedward /* 2914977Sedward * If can't see it, just return. 3014977Sedward */ 31*14988Sedward if (row < w->ww_i.t || row >= w->ww_i.b 32*14988Sedward || w->ww_i.r <= 0 || w->ww_i.r <= col) 3314459Sedward return; 3414977Sedward 35*14988Sedward if (col < w->ww_i.l) 36*14988Sedward col = w->ww_i.l; 3714977Sedward 3814977Sedward /* 3914977Sedward * Now find out how much is actually changed, and fix wwns. 4014977Sedward */ 4114459Sedward { 4214459Sedward register union ww_char *buf; 4314459Sedward register char *win; 4414459Sedward register union ww_char *ns; 4514459Sedward register char *smap; 4614663Sedward char *touched; 4714459Sedward 4814459Sedward nvis = 0; 49*14988Sedward smap = &wwsmap[row][col]; 50*14988Sedward for (i = w->ww_i.r - col; i > 0 && *smap++ != w->ww_index; i--) 51*14988Sedward col++; 5214459Sedward if (i <= 0) 5314459Sedward return; 54*14988Sedward buf = &w->ww_buf[row][col]; 5514459Sedward win = &w->ww_win[row][col]; 56*14988Sedward ns = &wwns[row][col]; 57*14988Sedward touched = &wwtouched[row]; 5814459Sedward c = buf->c_w ^ *win << WWC_MSHIFT; 5914459Sedward for (; --i >= 0;) { 6014459Sedward if (*win) { 6114459Sedward if ((*win & (WWM_COV|WWM_GLS)) != 0) { 6214459Sedward ns++; 6314459Sedward buf++; 6414663Sedward } else { 6514663Sedward *touched = 1; 6614459Sedward ns++->c_w = buf++->c_w 6714459Sedward ^ *win++ << WWC_MSHIFT; 6814663Sedward } 6914427Sedward } else { 7014663Sedward *touched = 1; 7114459Sedward *ns++ = *buf++; 7214459Sedward win++; 7314459Sedward nvis++; 7414427Sedward } 7514427Sedward } 7614427Sedward } 7714977Sedward 7814977Sedward /* 7914977Sedward * Can/Should we use delete character? 8014977Sedward */ 81*14988Sedward if (tt.tt_setinsert != 0 && nvis > (wwncol - col) / 2) { 8214459Sedward register union ww_char *p, *q; 8314459Sedward 8414459Sedward (*tt.tt_setinsert)(1); 85*14988Sedward (*tt.tt_move)(row, col); 8614459Sedward (*tt.tt_setmodes)(c >> WWC_MSHIFT); 8714459Sedward (*tt.tt_putc)(c & WWC_CMASK); 8814459Sedward (*tt.tt_setinsert)(0); 8914459Sedward 90*14988Sedward p = &wwos[row][wwncol]; 9114459Sedward q = p - 1; 92*14988Sedward for (i = wwncol - col; --i > 0;) 9314459Sedward *--p = *--q; 9414459Sedward q->c_w = c; 9514459Sedward } 9614427Sedward } 97