114427Sedward #ifndef lint 2*14977Sedward static char *sccsid = "@(#)wwinschar.c 3.7 83/09/14"; 314427Sedward #endif 414427Sedward 514427Sedward #include "ww.h" 614650Sedward #include "tt.h" 714427Sedward 814459Sedward wwinschar(w, line, col, c) 914427Sedward register struct ww *w; 1014459Sedward short c; 1114427Sedward { 1214459Sedward register i; 1314459Sedward int row = line - w->ww_scroll; 14*14977Sedward int srow = row + w->ww_w.t; 15*14977Sedward int scol = col + w->ww_w.l; 1614459Sedward int nvis; 1714427Sedward 18*14977Sedward /* 19*14977Sedward * First, shift the line. 20*14977Sedward */ 2114459Sedward { 2214459Sedward register union ww_char *p, *q; 2314459Sedward 2414459Sedward p = &w->ww_buf[line][w->ww_w.nc]; 2514459Sedward q = p - 1; 2614459Sedward for (i = w->ww_w.nc - col - 1; --i >= 0;) 2714459Sedward *--p = *--q; 2814459Sedward q->c_w = c; 2914459Sedward } 30*14977Sedward 31*14977Sedward /* 32*14977Sedward * If can't see it, just return. 33*14977Sedward */ 34*14977Sedward if (srow < w->ww_i.t || srow >= w->ww_i.b 35*14977Sedward || w->ww_i.r <= 0 || w->ww_i.r <= scol) 3614459Sedward return; 37*14977Sedward 38*14977Sedward if (scol < w->ww_i.l) 39*14977Sedward scol = w->ww_i.l; 40*14977Sedward col = scol - w->ww_w.l; 41*14977Sedward 42*14977Sedward /* 43*14977Sedward * Now find out how much is actually changed, and fix wwns. 44*14977Sedward */ 4514459Sedward { 4614459Sedward register union ww_char *buf; 4714459Sedward register char *win; 4814459Sedward register union ww_char *ns; 4914459Sedward register char *smap; 5014663Sedward char *touched; 5114459Sedward 5214459Sedward nvis = 0; 53*14977Sedward smap = &wwsmap[srow][scol]; 54*14977Sedward for (i = w->ww_i.r - scol; i > 0 && *smap++ != w->ww_index; i--) 55*14977Sedward col++, scol++; 5614459Sedward if (i <= 0) 5714459Sedward return; 5814459Sedward buf = &w->ww_buf[line][col]; 5914459Sedward win = &w->ww_win[row][col]; 60*14977Sedward ns = &wwns[srow][scol]; 61*14977Sedward touched = &wwtouched[srow]; 6214459Sedward c = buf->c_w ^ *win << WWC_MSHIFT; 6314459Sedward for (; --i >= 0;) { 6414459Sedward if (*win) { 6514459Sedward if ((*win & (WWM_COV|WWM_GLS)) != 0) { 6614459Sedward ns++; 6714459Sedward buf++; 6814663Sedward } else { 6914663Sedward *touched = 1; 7014459Sedward ns++->c_w = buf++->c_w 7114459Sedward ^ *win++ << WWC_MSHIFT; 7214663Sedward } 7314427Sedward } else { 7414663Sedward *touched = 1; 7514459Sedward *ns++ = *buf++; 7614459Sedward win++; 7714459Sedward nvis++; 7814427Sedward } 7914427Sedward } 8014427Sedward } 81*14977Sedward 82*14977Sedward /* 83*14977Sedward * Can/Should we use delete character? 84*14977Sedward */ 85*14977Sedward if (tt.tt_setinsert != 0 && nvis > (wwncol - scol) / 2) { 8614459Sedward register union ww_char *p, *q; 8714459Sedward 8814459Sedward (*tt.tt_setinsert)(1); 89*14977Sedward (*tt.tt_move)(srow, scol); 9014459Sedward (*tt.tt_setmodes)(c >> WWC_MSHIFT); 9114459Sedward (*tt.tt_putc)(c & WWC_CMASK); 9214459Sedward (*tt.tt_setinsert)(0); 9314459Sedward 94*14977Sedward p = &wwos[srow][wwncol]; 9514459Sedward q = p - 1; 96*14977Sedward for (i = wwncol - scol; --i > 0;) 9714459Sedward *--p = *--q; 9814459Sedward q->c_w = c; 9914459Sedward } 10014427Sedward } 101