114427Sedward #ifndef lint 2*14650Sedward static char *sccsid = "@(#)wwinschar.c 3.3 83/08/15"; 314427Sedward #endif 414427Sedward 514427Sedward #include "ww.h" 6*14650Sedward #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; 1414459Sedward int nvis; 1514427Sedward 1614459Sedward { 1714459Sedward register union ww_char *p, *q; 1814459Sedward 1914459Sedward p = &w->ww_buf[line][w->ww_w.nc]; 2014459Sedward q = p - 1; 2114459Sedward for (i = w->ww_w.nc - col - 1; --i >= 0;) 2214459Sedward *--p = *--q; 2314459Sedward q->c_w = c; 2414459Sedward } 2514459Sedward if (row < 0 || row >= w->ww_w.nr) 2614459Sedward return; 2714459Sedward { 2814459Sedward register union ww_char *buf; 2914459Sedward register char *win; 3014459Sedward register union ww_char *ns; 3114459Sedward register char *smap; 3214459Sedward 3314459Sedward nvis = 0; 3414459Sedward smap = &wwsmap[row + w->ww_w.t][col + w->ww_w.l]; 3514459Sedward for (i = w->ww_w.nc - col; i > 0; i--) 3614459Sedward if (*smap == w->ww_index) 3714459Sedward break; 3814459Sedward else { 3914459Sedward smap++; 4014459Sedward col++; 4114459Sedward } 4214459Sedward if (i <= 0) 4314459Sedward return; 4414459Sedward buf = &w->ww_buf[line][col]; 4514459Sedward win = &w->ww_win[row][col]; 4614459Sedward ns = &wwns[row + w->ww_w.t][col + w->ww_w.l]; 4714459Sedward c = buf->c_w ^ *win << WWC_MSHIFT; 4814459Sedward for (; --i >= 0;) { 4914459Sedward if (*win) { 5014459Sedward if ((*win & (WWM_COV|WWM_GLS)) != 0) { 5114459Sedward ns++; 5214459Sedward buf++; 5314459Sedward } else 5414459Sedward ns++->c_w = buf++->c_w 5514459Sedward ^ *win++ << WWC_MSHIFT; 5614427Sedward } else { 5714459Sedward *ns++ = *buf++; 5814459Sedward win++; 5914459Sedward nvis++; 6014427Sedward } 6114427Sedward } 6214427Sedward } 6314459Sedward col += w->ww_w.l; 6414459Sedward row += w->ww_w.t; 6514459Sedward if (nvis > (wwncol - col) / 2) { 6614459Sedward register union ww_char *p, *q; 6714459Sedward 6814459Sedward (*tt.tt_setinsert)(1); 6914459Sedward (*tt.tt_move)(row, col); 7014459Sedward (*tt.tt_setmodes)(c >> WWC_MSHIFT); 7114459Sedward (*tt.tt_putc)(c & WWC_CMASK); 7214459Sedward (*tt.tt_setinsert)(0); 7314459Sedward 7414459Sedward p = &wwos[row][wwncol]; 7514459Sedward q = p - 1; 7614459Sedward for (i = wwncol - col - 1; --i >= 0;) 7714459Sedward *--p = *--q; 7814459Sedward q->c_w = c; 7914459Sedward } 8014427Sedward } 81