|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * Edward Wang at The University of California, Berkeley. ! 7: * ! 8: * Redistribution and use in source and binary forms are permitted provided ! 9: * that: (1) source distributions retain this entire copyright notice and ! 10: * comment, and (2) distributions including binaries display the following ! 11: * acknowledgement: ``This product includes software developed by the ! 12: * University of California, Berkeley and its contributors'' in the ! 13: * documentation or other materials provided with the distribution and in ! 14: * all advertising materials mentioning features or use of this software. ! 15: * Neither the name of the University nor the names of its contributors may ! 16: * be used to endorse or promote products derived from this software without ! 17: * specific prior written permission. ! 18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 19: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 20: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 21: */ ! 22: ! 23: #ifndef lint ! 24: static char sccsid[] = "@(#)wwinschar.c 3.20 (Berkeley) 6/6/90"; ! 25: #endif /* not lint */ ! 26: ! 27: #include "ww.h" ! 28: #include "tt.h" ! 29: ! 30: wwinschar(w, row, col, c, m) ! 31: register struct ww *w; ! 32: char c, m; ! 33: { ! 34: register i; ! 35: int nvis; ! 36: short x = c | m << WWC_MSHIFT; ! 37: ! 38: /* ! 39: * First, shift the line. ! 40: */ ! 41: { ! 42: register union ww_char *p, *q; ! 43: ! 44: p = &w->ww_buf[row][w->ww_b.r]; ! 45: q = p - 1; ! 46: for (i = w->ww_b.r - col; --i > 0;) ! 47: *--p = *--q; ! 48: q->c_w = x; ! 49: } ! 50: ! 51: /* ! 52: * If can't see it, just return. ! 53: */ ! 54: if (row < w->ww_i.t || row >= w->ww_i.b ! 55: || w->ww_i.r <= 0 || w->ww_i.r <= col) ! 56: return; ! 57: ! 58: if (col < w->ww_i.l) ! 59: col = w->ww_i.l; ! 60: ! 61: /* ! 62: * Now find out how much is actually changed, and fix wwns. ! 63: */ ! 64: { ! 65: register union ww_char *buf; ! 66: register char *win; ! 67: register union ww_char *ns; ! 68: register char *smap; ! 69: char touched; ! 70: ! 71: nvis = 0; ! 72: smap = &wwsmap[row][col]; ! 73: for (i = col; i < w->ww_i.r && *smap++ != w->ww_index; i++) ! 74: ; ! 75: if (i >= w->ww_i.r) ! 76: return; ! 77: col = i; ! 78: buf = w->ww_buf[row]; ! 79: win = w->ww_win[row]; ! 80: ns = wwns[row]; ! 81: smap = &wwsmap[row][i]; ! 82: touched = wwtouched[row]; ! 83: for (; i < w->ww_i.r; i++) { ! 84: if (*smap++ != w->ww_index) ! 85: continue; ! 86: touched |= WWU_TOUCHED; ! 87: if (win[i]) ! 88: ns[i].c_w = ! 89: buf[i].c_w ^ win[i] << WWC_MSHIFT; ! 90: else { ! 91: nvis++; ! 92: ns[i] = buf[i]; ! 93: } ! 94: } ! 95: wwtouched[row] = touched; ! 96: } ! 97: ! 98: /* ! 99: * Can/Should we use delete character? ! 100: */ ! 101: if ((tt.tt_inschar || tt.tt_insspace) && nvis > (wwncol - col) / 2) { ! 102: register union ww_char *p, *q; ! 103: ! 104: if (tt.tt_inschar) ! 105: xxinschar(row, col, c, m); ! 106: else { ! 107: xxinsspace(row, col); ! 108: x = ' '; ! 109: } ! 110: p = &wwos[row][wwncol]; ! 111: q = p - 1; ! 112: for (i = wwncol - col; --i > 0;) ! 113: *--p = *--q; ! 114: q->c_w = x; ! 115: } ! 116: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.