- if (c >= ' ' && c < 0x7f) {
- if (w->ww_insert)
- Winschars(w->ww_win, 1);
- Wputc(c, w->ww_win);
+ if (!ISCTRL(c)) {
+ int i, j;
+ register union ww_char *bp;
+ union ww_char *bq;
+ register union ww_char *ns;
+ register char *smap;
+ register char *win;
+ char *touched;
+
+ if (w->ww_insert) {
+ wwinschar(w, w->ww_scroll + w->ww_cur.r,
+ w->ww_cur.c, c);
+ goto right;
+ }
+ i = w->ww_w.nc - w->ww_cur.c - 1;
+ bp = bq = &w->ww_buf[w->ww_scroll+w->ww_cur.r]
+ [w->ww_cur.c];
+ bp++->c_w = c | w->ww_modes << WWC_MSHIFT;
+ while (n > 0 && --i >= 0 && !ISCTRL(*p)) {
+ n--;
+ bp++->c_w = *p++ & 0x7f
+ | w->ww_modes << WWC_MSHIFT;
+ }
+ win = &w->ww_win[w->ww_cur.r][w->ww_cur.c];
+ i = wwcurrow(w);
+ j = wwcurcol(w);
+ smap = &wwsmap[i][j];
+ ns = &wwns[i][j];
+ touched = &wwtouched[i];
+ j = i = bp - bq;
+ bp = bq;
+ while (--i >= 0) {
+ if (*smap++ == w->ww_index) {
+ *touched = 1;
+ ns++->c_w = bp++->c_w
+ ^ *win++ << WWC_MSHIFT;
+ } else {
+ ns++;
+ bp++;
+ win++;
+ }
+ }
+ if ((w->ww_cur.c += j) >= w->ww_w.nc) {
+ w->ww_cur.c = 0;
+ goto lf;
+ }