|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)wwinschar.c 3.14 4/24/85"; ! 3: #endif ! 4: ! 5: /* ! 6: * Copyright (c) 1983 Regents of the University of California, ! 7: * All rights reserved. Redistribution permitted subject to ! 8: * the terms of the Berkeley Software License Agreement. ! 9: */ ! 10: ! 11: #include "ww.h" ! 12: #include "tt.h" ! 13: ! 14: wwinschar(w, row, col, c) ! 15: register struct ww *w; ! 16: short c; ! 17: { ! 18: register i; ! 19: int nvis; ! 20: ! 21: /* ! 22: * First, shift the line. ! 23: */ ! 24: { ! 25: register union ww_char *p, *q; ! 26: ! 27: p = &w->ww_buf[row][w->ww_b.r]; ! 28: q = p - 1; ! 29: for (i = w->ww_b.r - col; --i > 0;) ! 30: *--p = *--q; ! 31: q->c_w = c; ! 32: } ! 33: ! 34: /* ! 35: * If can't see it, just return. ! 36: */ ! 37: if (row < w->ww_i.t || row >= w->ww_i.b ! 38: || w->ww_i.r <= 0 || w->ww_i.r <= col) ! 39: return; ! 40: ! 41: if (col < w->ww_i.l) ! 42: col = w->ww_i.l; ! 43: ! 44: /* ! 45: * Now find out how much is actually changed, and fix wwns. ! 46: */ ! 47: { ! 48: register union ww_char *buf; ! 49: register char *win; ! 50: register union ww_char *ns; ! 51: register char *smap; ! 52: char touched; ! 53: ! 54: nvis = 0; ! 55: smap = &wwsmap[row][col]; ! 56: for (i = col; i < w->ww_i.r && *smap++ != w->ww_index; i++) ! 57: ; ! 58: if (i >= w->ww_i.r) ! 59: return; ! 60: col = i; ! 61: buf = w->ww_buf[row]; ! 62: win = w->ww_win[row]; ! 63: ns = wwns[row]; ! 64: smap = &wwsmap[row][i]; ! 65: touched = wwtouched[row]; ! 66: for (; i < w->ww_i.r; i++) { ! 67: if (*smap++ != w->ww_index) ! 68: continue; ! 69: touched |= WWU_TOUCHED; ! 70: if (win[i]) ! 71: ns[i].c_w = ! 72: buf[i].c_w ^ win[i] << WWC_MSHIFT; ! 73: else { ! 74: nvis++; ! 75: ns[i] = buf[i]; ! 76: } ! 77: } ! 78: wwtouched[row] = touched; ! 79: } ! 80: ! 81: /* ! 82: * Can/Should we use delete character? ! 83: */ ! 84: if (tt.tt_hasinsert && nvis > (wwncol - col) / 2) { ! 85: register union ww_char *p, *q; ! 86: ! 87: tt.tt_ninsert = 1; ! 88: tt.tt_nmodes = c >> WWC_MSHIFT & tt.tt_availmodes; ! 89: (*tt.tt_move)(row, col); ! 90: (*tt.tt_putc)(c & WWC_CMASK); ! 91: tt.tt_ninsert = 0; ! 92: ! 93: p = &wwos[row][wwncol]; ! 94: q = p - 1; ! 95: for (i = wwncol - col; --i > 0;) ! 96: *--p = *--q; ! 97: q->c_w = c; ! 98: } ! 99: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.